@scriptc/compiler 0.4.4 → 0.4.5

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 (775) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +198 -44
  2. package/ambient/scriptc-overrides.d.ts +21 -0
  3. package/dist/backend/executable-features.js +3 -0
  4. package/dist/backend/executable-features.js.map +1 -1
  5. package/dist/backend/library-pack.js +2 -1
  6. package/dist/backend/library-pack.js.map +1 -1
  7. package/dist/backend/linker.js +11 -1
  8. package/dist/backend/linker.js.map +1 -1
  9. package/dist/backend/lld.d.ts +9 -0
  10. package/dist/backend/lld.js +48 -0
  11. package/dist/backend/lld.js.map +1 -0
  12. package/dist/backend/lld.test.d.ts +1 -0
  13. package/dist/backend/lld.test.js +53 -0
  14. package/dist/backend/lld.test.js.map +1 -0
  15. package/dist/backend/llvm/appended-array-literals.d.ts +11 -1
  16. package/dist/backend/llvm/appended-array-literals.js +29 -0
  17. package/dist/backend/llvm/appended-array-literals.js.map +1 -1
  18. package/dist/backend/llvm/blocks.js +10 -1
  19. package/dist/backend/llvm/blocks.js.map +1 -1
  20. package/dist/backend/llvm/bytes-alias.d.ts +13 -4
  21. package/dist/backend/llvm/bytes-alias.js +16 -5
  22. package/dist/backend/llvm/bytes-alias.js.map +1 -1
  23. package/dist/backend/llvm/bytes-bounds.d.ts +5 -1
  24. package/dist/backend/llvm/bytes-bounds.js +199 -2
  25. package/dist/backend/llvm/bytes-bounds.js.map +1 -1
  26. package/dist/backend/llvm/bytes-loop-versions.d.ts +45 -3
  27. package/dist/backend/llvm/bytes-loop-versions.js +238 -20
  28. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  29. package/dist/backend/llvm/bytes-loop-versions.test.js +11 -4
  30. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  31. package/dist/backend/llvm/call-lifetimes.d.ts +8 -2
  32. package/dist/backend/llvm/call-lifetimes.js +87 -18
  33. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  34. package/dist/backend/llvm/call-lifetimes.test.js +132 -0
  35. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  36. package/dist/backend/llvm/classes.d.ts +3 -2
  37. package/dist/backend/llvm/classes.js +4 -4
  38. package/dist/backend/llvm/classes.js.map +1 -1
  39. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  40. package/dist/backend/llvm/counted-loops.js +54 -5
  41. package/dist/backend/llvm/counted-loops.js.map +1 -1
  42. package/dist/backend/llvm/debug-info.d.ts +42 -1
  43. package/dist/backend/llvm/debug-info.js +70 -1
  44. package/dist/backend/llvm/debug-info.js.map +1 -1
  45. package/dist/backend/llvm/dense-array-loops.js +2 -2
  46. package/dist/backend/llvm/dense-array-loops.js.map +1 -1
  47. package/dist/backend/llvm/dense-array-loops.test.js +1 -0
  48. package/dist/backend/llvm/dense-array-loops.test.js.map +1 -1
  49. package/dist/backend/llvm/dyn.d.ts +65 -8
  50. package/dist/backend/llvm/dyn.js +375 -40
  51. package/dist/backend/llvm/dyn.js.map +1 -1
  52. package/dist/backend/llvm/emit-function.js +28 -8
  53. package/dist/backend/llvm/emit-function.js.map +1 -1
  54. package/dist/backend/llvm/emit-journal.d.ts +8 -4
  55. package/dist/backend/llvm/emit-journal.js +75 -5
  56. package/dist/backend/llvm/emit-journal.js.map +1 -1
  57. package/dist/backend/llvm/emit-module.d.ts +4 -0
  58. package/dist/backend/llvm/emit-module.js +58 -23
  59. package/dist/backend/llvm/emit-module.js.map +1 -1
  60. package/dist/backend/llvm/emit-statements.js +297 -28
  61. package/dist/backend/llvm/emit-statements.js.map +1 -1
  62. package/dist/backend/llvm/emitter.d.ts +134 -13
  63. package/dist/backend/llvm/emitter.js +514 -87
  64. package/dist/backend/llvm/emitter.js.map +1 -1
  65. package/dist/backend/llvm/expr-bytes.d.ts +6 -4
  66. package/dist/backend/llvm/expr-bytes.js +31 -8
  67. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  68. package/dist/backend/llvm/expr-calls.js +13 -11
  69. package/dist/backend/llvm/expr-calls.js.map +1 -1
  70. package/dist/backend/llvm/expr-containers.d.ts +11 -0
  71. package/dist/backend/llvm/expr-containers.js +87 -9
  72. package/dist/backend/llvm/expr-containers.js.map +1 -1
  73. package/dist/backend/llvm/expr-context.d.ts +3 -0
  74. package/dist/backend/llvm/expr-control.js +83 -0
  75. package/dist/backend/llvm/expr-control.js.map +1 -1
  76. package/dist/backend/llvm/expr-dynamic.d.ts +1 -1
  77. package/dist/backend/llvm/expr-dynamic.js +22 -4
  78. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  79. package/dist/backend/llvm/expr-primitives.js +107 -9
  80. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  81. package/dist/backend/llvm/expr-stream-bridges.js +95 -22
  82. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  83. package/dist/backend/llvm/forked-analysis.d.ts +8 -0
  84. package/dist/backend/llvm/forked-analysis.js +43 -0
  85. package/dist/backend/llvm/forked-analysis.js.map +1 -0
  86. package/dist/backend/llvm/integer-values.d.ts +7 -0
  87. package/dist/backend/llvm/integer-values.js +42 -2
  88. package/dist/backend/llvm/integer-values.js.map +1 -1
  89. package/dist/backend/llvm/integer-views.d.ts +2 -1
  90. package/dist/backend/llvm/integer-views.js +12 -1
  91. package/dist/backend/llvm/integer-views.js.map +1 -1
  92. package/dist/backend/llvm/js-ic.d.ts +4 -0
  93. package/dist/backend/llvm/js-ic.js +133 -15
  94. package/dist/backend/llvm/js-ic.js.map +1 -1
  95. package/dist/backend/llvm/layouts.d.ts +1 -0
  96. package/dist/backend/llvm/layouts.js.map +1 -1
  97. package/dist/backend/llvm/lazy-captures.d.ts +6 -1
  98. package/dist/backend/llvm/lazy-captures.js +10 -5
  99. package/dist/backend/llvm/lazy-captures.js.map +1 -1
  100. package/dist/backend/llvm/lib-abi.d.ts +5 -0
  101. package/dist/backend/llvm/lib-abi.js +19 -0
  102. package/dist/backend/llvm/lib-abi.js.map +1 -1
  103. package/dist/backend/llvm/lib-dispatch.js +128 -42
  104. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  105. package/dist/backend/llvm/lib-filesystem.d.ts +10 -0
  106. package/dist/backend/llvm/lib-filesystem.js +32 -0
  107. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  108. package/dist/backend/llvm/lib-http2.js +2 -2
  109. package/dist/backend/llvm/lib-http2.js.map +1 -1
  110. package/dist/backend/llvm/lib-network.js +2 -0
  111. package/dist/backend/llvm/lib-network.js.map +1 -1
  112. package/dist/backend/llvm/lib-process.js +11 -0
  113. package/dist/backend/llvm/lib-process.js.map +1 -1
  114. package/dist/backend/llvm/lib-shared.js +43 -0
  115. package/dist/backend/llvm/lib-shared.js.map +1 -1
  116. package/dist/backend/llvm/lib-tls.js +28 -3
  117. package/dist/backend/llvm/lib-tls.js.map +1 -1
  118. package/dist/backend/llvm/local-union-storage.test.js +2 -1
  119. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  120. package/dist/backend/llvm/loop-array-borrows.d.ts +4 -1
  121. package/dist/backend/llvm/loop-array-borrows.js +11 -5
  122. package/dist/backend/llvm/loop-array-borrows.js.map +1 -1
  123. package/dist/backend/llvm/map-entry-fusion.d.ts +5 -3
  124. package/dist/backend/llvm/map-entry-fusion.js +20 -11
  125. package/dist/backend/llvm/map-entry-fusion.js.map +1 -1
  126. package/dist/backend/llvm/map-entry-fusion.test.js +14 -6
  127. package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -1
  128. package/dist/backend/llvm/map-number-lookup.d.ts +16 -6
  129. package/dist/backend/llvm/map-number-lookup.js +41 -9
  130. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  131. package/dist/backend/llvm/map-number-lookup.test.js +70 -2
  132. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  133. package/dist/backend/llvm/map-read-lifetimes.d.ts +25 -2
  134. package/dist/backend/llvm/map-read-lifetimes.js +136 -6
  135. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  136. package/dist/backend/llvm/map-read-lifetimes.test.js +8 -3
  137. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  138. package/dist/backend/llvm/nullable-unions.d.ts +5 -0
  139. package/dist/backend/llvm/nullable-unions.js +29 -2
  140. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  141. package/dist/backend/llvm/nullable-unions.test.js +25 -1
  142. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  143. package/dist/backend/llvm/record-union-keys.test.d.ts +1 -0
  144. package/dist/backend/llvm/record-union-keys.test.js +161 -0
  145. package/dist/backend/llvm/record-union-keys.test.js.map +1 -0
  146. package/dist/backend/llvm/serialized-ir-emission.test.js +2 -0
  147. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  148. package/dist/backend/llvm/shapes.d.ts +4 -5
  149. package/dist/backend/llvm/shapes.js +104 -51
  150. package/dist/backend/llvm/shapes.js.map +1 -1
  151. package/dist/backend/llvm/shapes.test.js +14 -2
  152. package/dist/backend/llvm/shapes.test.js.map +1 -1
  153. package/dist/backend/llvm/speculative-integers.d.ts +50 -3
  154. package/dist/backend/llvm/speculative-integers.js +411 -24
  155. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  156. package/dist/backend/llvm/speculative-integers.test.js +103 -1
  157. package/dist/backend/llvm/speculative-integers.test.js.map +1 -1
  158. package/dist/backend/llvm/split.d.ts +10 -1
  159. package/dist/backend/llvm/split.js +243 -59
  160. package/dist/backend/llvm/split.js.map +1 -1
  161. package/dist/backend/llvm/split.test.js +92 -13
  162. package/dist/backend/llvm/split.test.js.map +1 -1
  163. package/dist/backend/llvm/stack-objects.test.js +3 -2
  164. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  165. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  166. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  167. package/dist/backend/llvm/string-reads.d.ts +13 -0
  168. package/dist/backend/llvm/string-reads.js +22 -0
  169. package/dist/backend/llvm/string-reads.js.map +1 -1
  170. package/dist/backend/llvm/string-slices.d.ts +36 -2
  171. package/dist/backend/llvm/string-slices.js +308 -12
  172. package/dist/backend/llvm/string-slices.js.map +1 -1
  173. package/dist/backend/llvm/string-slices.test.js +182 -3
  174. package/dist/backend/llvm/string-slices.test.js.map +1 -1
  175. package/dist/backend/llvm/string-unit-versions.d.ts +11 -0
  176. package/dist/backend/llvm/string-unit-versions.js +191 -0
  177. package/dist/backend/llvm/string-unit-versions.js.map +1 -0
  178. package/dist/backend/llvm/string-unit-versions.test.d.ts +1 -0
  179. package/dist/backend/llvm/string-unit-versions.test.js +117 -0
  180. package/dist/backend/llvm/string-unit-versions.test.js.map +1 -0
  181. package/dist/backend/llvm/test-boxed-unions.d.ts +5 -2
  182. package/dist/backend/llvm/test-boxed-unions.js +24 -8
  183. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  184. package/dist/backend/llvm/unwind-abi.d.ts +52 -0
  185. package/dist/backend/llvm/unwind-abi.js +498 -0
  186. package/dist/backend/llvm/unwind-abi.js.map +1 -0
  187. package/dist/backend/llvm/unwind-abi.test.d.ts +1 -0
  188. package/dist/backend/llvm/unwind-abi.test.js +255 -0
  189. package/dist/backend/llvm/unwind-abi.test.js.map +1 -0
  190. package/dist/backend/llvm/wrapping-sums.d.ts +14 -10
  191. package/dist/backend/llvm/wrapping-sums.js +31 -14
  192. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  193. package/dist/backend/loop-polls.d.ts +6 -0
  194. package/dist/backend/loop-polls.js +24 -0
  195. package/dist/backend/loop-polls.js.map +1 -1
  196. package/dist/backend/may-throw.js +8 -8
  197. package/dist/backend/may-throw.js.map +1 -1
  198. package/dist/backend/native/contracts.d.ts +12 -2
  199. package/dist/backend/native/executable.js +48 -6
  200. package/dist/backend/native/executable.js.map +1 -1
  201. package/dist/backend/native/library.js +4 -3
  202. package/dist/backend/native/library.js.map +1 -1
  203. package/dist/backend/native/program-shards.d.ts +2 -2
  204. package/dist/backend/native/program-shards.js +2 -2
  205. package/dist/backend/native/program-shards.js.map +1 -1
  206. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  207. package/dist/backend/native/runtime-inputs.js +4 -1
  208. package/dist/backend/native/runtime-inputs.js.map +1 -1
  209. package/dist/backend/native/vendor.d.ts +1 -1
  210. package/dist/backend/native/vendor.js +1 -1
  211. package/dist/backend/native/vendor.js.map +1 -1
  212. package/dist/backend/native-codegen.d.ts +3 -1
  213. package/dist/backend/native-codegen.js +4 -3
  214. package/dist/backend/native-codegen.js.map +1 -1
  215. package/dist/backend/native-link-info-core.d.ts +8 -0
  216. package/dist/backend/native-link-info-core.js.map +1 -1
  217. package/dist/backend/native-profile.d.ts +14 -0
  218. package/dist/backend/native-profile.js +28 -0
  219. package/dist/backend/native-profile.js.map +1 -1
  220. package/dist/backend/native-profile.test.js +8 -1
  221. package/dist/backend/native-profile.test.js.map +1 -1
  222. package/dist/backend/native-toolchain.test.js +11 -11
  223. package/dist/backend/native-toolchain.test.js.map +1 -1
  224. package/dist/backend/runtime-abi.d.ts +2 -2
  225. package/dist/backend/runtime-abi.js +2 -2
  226. package/dist/backend/runtime-pack-core.d.ts +3 -1
  227. package/dist/backend/runtime-pack-core.js +2 -0
  228. package/dist/backend/runtime-pack-core.js.map +1 -1
  229. package/dist/backend/runtime-pack-native.d.ts +17 -5
  230. package/dist/backend/runtime-pack-native.js +186 -14
  231. package/dist/backend/runtime-pack-native.js.map +1 -1
  232. package/dist/backend/runtime-pack-native.test.js +160 -3
  233. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  234. package/dist/backend/runtime-pack-targets.test.js +2 -1
  235. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  236. package/dist/backend/runtime-pack.test.js +2 -1
  237. package/dist/backend/runtime-pack.test.js.map +1 -1
  238. package/dist/backend/vendor-archives.d.ts +4 -1
  239. package/dist/backend/vendor-archives.js +78 -4
  240. package/dist/backend/vendor-archives.js.map +1 -1
  241. package/dist/backend/vendor-inputs.d.ts +3 -1
  242. package/dist/backend/vendor-inputs.js +3 -1
  243. package/dist/backend/vendor-inputs.js.map +1 -1
  244. package/dist/backend/warm-cache.js +1 -0
  245. package/dist/backend/warm-cache.js.map +1 -1
  246. package/dist/cli/command.js +78 -11
  247. package/dist/cli/command.js.map +1 -1
  248. package/dist/cli/usage.d.ts +22 -1
  249. package/dist/cli/usage.js +33 -3
  250. package/dist/cli/usage.js.map +1 -1
  251. package/dist/compat/fetch-profile.d.ts +15 -6
  252. package/dist/compat/fetch-profile.js +519 -498
  253. package/dist/compat/fetch-profile.js.map +1 -1
  254. package/dist/compile-types.d.ts +7 -0
  255. package/dist/contracts/int32-elements.js +2 -1
  256. package/dist/contracts/int32-elements.js.map +1 -1
  257. package/dist/coverage/report.d.ts +14 -3
  258. package/dist/coverage/report.js +216 -0
  259. package/dist/coverage/report.js.map +1 -1
  260. package/dist/coverage/surface-manifest.js +25 -25
  261. package/dist/coverage/surface-manifest.js.map +1 -1
  262. package/dist/coverage/verdict-cache.d.ts +2 -0
  263. package/dist/coverage/verdict-cache.js +10 -1
  264. package/dist/coverage/verdict-cache.js.map +1 -1
  265. package/dist/diagnostics/diagnostic.d.ts +19 -0
  266. package/dist/diagnostics/diagnostic.js +52 -1
  267. package/dist/diagnostics/diagnostic.js.map +1 -1
  268. package/dist/diagnostics/envelope.d.ts +54 -0
  269. package/dist/diagnostics/envelope.js +7 -1
  270. package/dist/diagnostics/envelope.js.map +1 -1
  271. package/dist/diagnostics/render.d.ts +7 -0
  272. package/dist/diagnostics/render.js +15 -4
  273. package/dist/diagnostics/render.js.map +1 -1
  274. package/dist/executable/executable-cache.d.ts +3 -0
  275. package/dist/executable/executable-cache.js +1 -0
  276. package/dist/executable/executable-cache.js.map +1 -1
  277. package/dist/executable/executable-cache.test.js +1 -0
  278. package/dist/executable/executable-cache.test.js.map +1 -1
  279. package/dist/executable/prepare.js +5 -1
  280. package/dist/executable/prepare.js.map +1 -1
  281. package/dist/frontend/analysis.js +26 -2
  282. package/dist/frontend/analysis.js.map +1 -1
  283. package/dist/frontend/fork-target.js +67 -1
  284. package/dist/frontend/fork-target.js.map +1 -1
  285. package/dist/frontend/fork-target.test.js +43 -0
  286. package/dist/frontend/fork-target.test.js.map +1 -1
  287. package/dist/frontend/input-tracker.d.ts +4 -1
  288. package/dist/frontend/input-tracker.js +42 -4
  289. package/dist/frontend/input-tracker.js.map +1 -1
  290. package/dist/frontend/input-tracker.test.js +45 -0
  291. package/dist/frontend/input-tracker.test.js.map +1 -1
  292. package/dist/frontend/lowering/abstract-equality.js +38 -1
  293. package/dist/frontend/lowering/abstract-equality.js.map +1 -1
  294. package/dist/frontend/lowering/argument-counts.d.ts +36 -0
  295. package/dist/frontend/lowering/argument-counts.js +201 -0
  296. package/dist/frontend/lowering/argument-counts.js.map +1 -0
  297. package/dist/frontend/lowering/array-values.d.ts +27 -0
  298. package/dist/frontend/lowering/array-values.js +112 -0
  299. package/dist/frontend/lowering/array-values.js.map +1 -1
  300. package/dist/frontend/lowering/binding-analysis.d.ts +3 -0
  301. package/dist/frontend/lowering/binding-analysis.js +9 -3
  302. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  303. package/dist/frontend/lowering/builtin-namespaces.d.ts +13 -0
  304. package/dist/frontend/lowering/builtin-namespaces.js +238 -0
  305. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -0
  306. package/dist/frontend/lowering/builtins/compression.d.ts +4 -3
  307. package/dist/frontend/lowering/builtins/compression.js +86 -5
  308. package/dist/frontend/lowering/builtins/compression.js.map +1 -1
  309. package/dist/frontend/lowering/builtins/date-classes.js +17 -1
  310. package/dist/frontend/lowering/builtins/date-classes.js.map +1 -1
  311. package/dist/frontend/lowering/builtins/dates.d.ts +19 -5
  312. package/dist/frontend/lowering/builtins/dates.js +159 -8
  313. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  314. package/dist/frontend/lowering/builtins/filesystem-calls.js +26 -1
  315. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  316. package/dist/frontend/lowering/builtins/fs-streams.d.ts +4 -0
  317. package/dist/frontend/lowering/builtins/fs-streams.js +24 -1
  318. package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -1
  319. package/dist/frontend/lowering/builtins/json.d.ts +4 -1
  320. package/dist/frontend/lowering/builtins/json.js +9 -3
  321. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  322. package/dist/frontend/lowering/builtins/module-bindings.d.ts +6 -0
  323. package/dist/frontend/lowering/builtins/module-bindings.js +23 -1
  324. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  325. package/dist/frontend/lowering/builtins/module-resolution.d.ts +5 -0
  326. package/dist/frontend/lowering/builtins/module-resolution.js +95 -4
  327. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  328. package/dist/frontend/lowering/builtins/promises.js +144 -1
  329. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  330. package/dist/frontend/lowering/builtins/readline.d.ts +5 -1
  331. package/dist/frontend/lowering/builtins/readline.js +22 -11
  332. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  333. package/dist/frontend/lowering/builtins/reflection.d.ts +4 -1
  334. package/dist/frontend/lowering/builtins/reflection.js +41 -1
  335. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  336. package/dist/frontend/lowering/builtins/text-codecs.js +31 -2
  337. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  338. package/dist/frontend/lowering/builtins/webassembly.js +4 -1
  339. package/dist/frontend/lowering/builtins/webassembly.js.map +1 -1
  340. package/dist/frontend/lowering/builtins/x509.d.ts +33 -0
  341. package/dist/frontend/lowering/builtins/x509.js +431 -0
  342. package/dist/frontend/lowering/builtins/x509.js.map +1 -0
  343. package/dist/frontend/lowering/call-arguments.js +44 -0
  344. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  345. package/dist/frontend/lowering/call-signatures.js +1 -1
  346. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  347. package/dist/frontend/lowering/cjs-inline-require.js +1 -1
  348. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  349. package/dist/frontend/lowering/class-attributes.d.ts +7 -0
  350. package/dist/frontend/lowering/class-attributes.js +52 -10
  351. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  352. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +13 -0
  353. package/dist/frontend/lowering/class-dynamic-dispatch.js +174 -9
  354. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  355. package/dist/frontend/lowering/class-method-mutations.js +43 -8
  356. package/dist/frontend/lowering/class-method-mutations.js.map +1 -1
  357. package/dist/frontend/lowering/class-method-values.js +71 -1
  358. package/dist/frontend/lowering/class-method-values.js.map +1 -1
  359. package/dist/frontend/lowering/class-prototypes.d.ts +8 -0
  360. package/dist/frontend/lowering/class-prototypes.js +83 -2
  361. package/dist/frontend/lowering/class-prototypes.js.map +1 -1
  362. package/dist/frontend/lowering/class-to-primitive.d.ts +5 -0
  363. package/dist/frontend/lowering/class-to-primitive.js +79 -7
  364. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  365. package/dist/frontend/lowering/coercions/state.d.ts +1 -0
  366. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  367. package/dist/frontend/lowering/coercions/structural.js +89 -10
  368. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  369. package/dist/frontend/lowering/coercions/unions.d.ts +4 -2
  370. package/dist/frontend/lowering/coercions/unions.js +13 -6
  371. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  372. package/dist/frontend/lowering/containers/array-callbacks.js +51 -15
  373. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  374. package/dist/frontend/lowering/containers/array-construction.d.ts +4 -1
  375. package/dist/frontend/lowering/containers/array-construction.js +102 -9
  376. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  377. package/dist/frontend/lowering/containers/array-methods.js +85 -5
  378. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  379. package/dist/frontend/lowering/containers/array-pipelines.js +346 -77
  380. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  381. package/dist/frontend/lowering/containers/callback-arguments.js +11 -1
  382. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  383. package/dist/frontend/lowering/containers/collection-methods.js +12 -0
  384. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  385. package/dist/frontend/lowering/containers/indexed-objects.js +73 -25
  386. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  387. package/dist/frontend/lowering/containers/iterator-helpers.d.ts +4 -4
  388. package/dist/frontend/lowering/containers/iterator-helpers.js +8 -2
  389. package/dist/frontend/lowering/containers/iterator-helpers.js.map +1 -1
  390. package/dist/frontend/lowering/containers/replacer-params.d.ts +37 -0
  391. package/dist/frontend/lowering/containers/replacer-params.js +294 -0
  392. package/dist/frontend/lowering/containers/replacer-params.js.map +1 -0
  393. package/dist/frontend/lowering/containers/replacer-params.test.d.ts +1 -0
  394. package/dist/frontend/lowering/containers/replacer-params.test.js +61 -0
  395. package/dist/frontend/lowering/containers/replacer-params.test.js.map +1 -0
  396. package/dist/frontend/lowering/containers/string-and-regexp.js +2 -1
  397. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  398. package/dist/frontend/lowering/containers/string-replacement.js +7 -3
  399. package/dist/frontend/lowering/containers/string-replacement.js.map +1 -1
  400. package/dist/frontend/lowering/cycle-initialization.d.ts +4 -2
  401. package/dist/frontend/lowering/cycle-initialization.js +4 -1
  402. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  403. package/dist/frontend/lowering/date-values.d.ts +9 -6
  404. package/dist/frontend/lowering/date-values.js +63 -16
  405. package/dist/frontend/lowering/date-values.js.map +1 -1
  406. package/dist/frontend/lowering/deferred-module-initializers.js +16 -8
  407. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  408. package/dist/frontend/lowering/deferred-module-initializers.test.js +22 -6
  409. package/dist/frontend/lowering/deferred-module-initializers.test.js.map +1 -1
  410. package/dist/frontend/lowering/dispatch-sites.js +1 -0
  411. package/dist/frontend/lowering/dispatch-sites.js.map +1 -1
  412. package/dist/frontend/lowering/expressions/array-literals.d.ts +0 -8
  413. package/dist/frontend/lowering/expressions/array-literals.js +119 -26
  414. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  415. package/dist/frontend/lowering/expressions/binary.js +38 -0
  416. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  417. package/dist/frontend/lowering/expressions/element-access.js +50 -6
  418. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  419. package/dist/frontend/lowering/expressions/identifiers.js +35 -3
  420. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  421. package/dist/frontend/lowering/expressions/narrowing.d.ts +2 -1
  422. package/dist/frontend/lowering/expressions/narrowing.js +8 -1
  423. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  424. package/dist/frontend/lowering/expressions/object-literals.js +8 -2
  425. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  426. package/dist/frontend/lowering/expressions/property-access.js +65 -34
  427. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  428. package/dist/frontend/lowering/expressions/relational.js +76 -11
  429. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  430. package/dist/frontend/lowering/expressions/typeof.js +6 -1
  431. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  432. package/dist/frontend/lowering/expressions/updates.js +20 -11
  433. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  434. package/dist/frontend/lowering/f64-handles.d.ts +8 -0
  435. package/dist/frontend/lowering/f64-handles.js +16 -0
  436. package/dist/frontend/lowering/f64-handles.js.map +1 -0
  437. package/dist/frontend/lowering/frozen-records.d.ts +5 -0
  438. package/dist/frontend/lowering/frozen-records.js +12 -4
  439. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  440. package/dist/frontend/lowering/function-context.d.ts +3 -0
  441. package/dist/frontend/lowering/function-context.js.map +1 -1
  442. package/dist/frontend/lowering/function-returns.js +15 -0
  443. package/dist/frontend/lowering/function-returns.js.map +1 -1
  444. package/dist/frontend/lowering/generic-functions.js +17 -6
  445. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  446. package/dist/frontend/lowering/instantiation-path.d.ts +3 -2
  447. package/dist/frontend/lowering/instantiation-path.js.map +1 -1
  448. package/dist/frontend/lowering/instantiation-path.test.js +6 -4
  449. package/dist/frontend/lowering/instantiation-path.test.js.map +1 -1
  450. package/dist/frontend/lowering/iterator-adapters.d.ts +4 -2
  451. package/dist/frontend/lowering/iterator-adapters.js +26 -33
  452. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  453. package/dist/frontend/lowering/js-collection-types.d.ts +11 -0
  454. package/dist/frontend/lowering/js-collection-types.js +490 -0
  455. package/dist/frontend/lowering/js-collection-types.js.map +1 -0
  456. package/dist/frontend/lowering/lib-boundary.js +2 -2
  457. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  458. package/dist/frontend/lowering/lower-assert.d.ts +14 -0
  459. package/dist/frontend/lowering/lower-assert.js +283 -26
  460. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  461. package/dist/frontend/lowering/lower-builtin-values.js +3 -3
  462. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  463. package/dist/frontend/lowering/lower-calls.js +97 -7
  464. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  465. package/dist/frontend/lowering/lower-classes.d.ts +59 -7
  466. package/dist/frontend/lowering/lower-classes.js +647 -176
  467. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  468. package/dist/frontend/lowering/lower-console.js +2 -1
  469. package/dist/frontend/lowering/lower-console.js.map +1 -1
  470. package/dist/frontend/lowering/lower-exprs.d.ts +5 -0
  471. package/dist/frontend/lowering/lower-exprs.js +52 -5
  472. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  473. package/dist/frontend/lowering/lower-functions.js +7 -0
  474. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  475. package/dist/frontend/lowering/lower-generators.js +4 -3
  476. package/dist/frontend/lowering/lower-generators.js.map +1 -1
  477. package/dist/frontend/lowering/lower-inspect.js +264 -46
  478. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  479. package/dist/frontend/lowering/lower-modules.js +28 -17
  480. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  481. package/dist/frontend/lowering/lower-namespaces.d.ts +3 -0
  482. package/dist/frontend/lowering/lower-namespaces.js +44 -1
  483. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  484. package/dist/frontend/lowering/lower-node-module.js +1 -1
  485. package/dist/frontend/lowering/lower-node-module.js.map +1 -1
  486. package/dist/frontend/lowering/lower-server.js +126 -32
  487. package/dist/frontend/lowering/lower-server.js.map +1 -1
  488. package/dist/frontend/lowering/lower-stdlib.d.ts +4 -1
  489. package/dist/frontend/lowering/lower-stdlib.js +51 -37
  490. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  491. package/dist/frontend/lowering/lower-stmts.js +294 -46
  492. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  493. package/dist/frontend/lowering/lower-stream.js +515 -121
  494. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  495. package/dist/frontend/lowering/lowerer.d.ts +52 -10
  496. package/dist/frontend/lowering/lowerer.js +249 -37
  497. package/dist/frontend/lowering/lowerer.js.map +1 -1
  498. package/dist/frontend/lowering/lowerer.test.js +1 -1
  499. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  500. package/dist/frontend/lowering/module-namespace-elements.d.ts +13 -0
  501. package/dist/frontend/lowering/module-namespace-elements.js +118 -1
  502. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  503. package/dist/frontend/lowering/private-brands.d.ts +5 -0
  504. package/dist/frontend/lowering/private-brands.js +39 -0
  505. package/dist/frontend/lowering/private-brands.js.map +1 -1
  506. package/dist/frontend/lowering/runtime-optional-elements.d.ts +6 -0
  507. package/dist/frontend/lowering/runtime-optional-elements.js +14 -3
  508. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  509. package/dist/frontend/lowering/sanitize-class-types.js +2 -0
  510. package/dist/frontend/lowering/sanitize-class-types.js.map +1 -1
  511. package/dist/frontend/lowering/site-dependencies.d.ts +7 -2
  512. package/dist/frontend/lowering/site-dependencies.js +0 -15
  513. package/dist/frontend/lowering/site-dependencies.js.map +1 -1
  514. package/dist/frontend/lowering/site-dependencies.test.js +7 -5
  515. package/dist/frontend/lowering/site-dependencies.test.js.map +1 -1
  516. package/dist/frontend/lowering/string-index-bounds.d.ts +7 -4
  517. package/dist/frontend/lowering/string-index-bounds.js +21 -7
  518. package/dist/frontend/lowering/string-index-bounds.js.map +1 -1
  519. package/dist/frontend/lowering/surfaces.d.ts +12 -3
  520. package/dist/frontend/lowering/surfaces.js +1576 -1539
  521. package/dist/frontend/lowering/surfaces.js.map +1 -1
  522. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  523. package/dist/frontend/lowering/symbol-fields.js +45 -2
  524. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  525. package/dist/frontend/lowering/union-narrow.d.ts +5 -2
  526. package/dist/frontend/lowering/union-narrow.js +6 -3
  527. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  528. package/dist/frontend/lowering/union-narrow.test.js +10 -0
  529. package/dist/frontend/lowering/union-narrow.test.js.map +1 -1
  530. package/dist/frontend/npm-static-namespace-defaults.d.ts +6 -0
  531. package/dist/frontend/npm-static-namespace-defaults.js +163 -0
  532. package/dist/frontend/npm-static-namespace-defaults.js.map +1 -0
  533. package/dist/frontend/npm-static-namespace-defaults.test.d.ts +1 -0
  534. package/dist/frontend/npm-static-namespace-defaults.test.js +72 -0
  535. package/dist/frontend/npm-static-namespace-defaults.test.js.map +1 -0
  536. package/dist/frontend/npm-static-prune.js +152 -111
  537. package/dist/frontend/npm-static-prune.js.map +1 -1
  538. package/dist/frontend/npm-static.js +35 -32
  539. package/dist/frontend/npm-static.js.map +1 -1
  540. package/dist/frontend/package-shims.d.ts +7 -4
  541. package/dist/frontend/package-shims.js +39 -40
  542. package/dist/frontend/package-shims.js.map +1 -1
  543. package/dist/frontend/pipeline-native.d.ts +2 -2
  544. package/dist/frontend/pipeline-native.js +2 -2
  545. package/dist/frontend/pipeline-native.js.map +1 -1
  546. package/dist/frontend/pipeline.d.ts +19 -2
  547. package/dist/frontend/pipeline.js +102 -11
  548. package/dist/frontend/pipeline.js.map +1 -1
  549. package/dist/frontend/program-analysis.d.ts +2 -0
  550. package/dist/frontend/program-analysis.js +3 -0
  551. package/dist/frontend/program-analysis.js.map +1 -1
  552. package/dist/frontend/program.d.ts +15 -0
  553. package/dist/frontend/program.js +227 -64
  554. package/dist/frontend/program.js.map +1 -1
  555. package/dist/frontend/resolve.d.ts +2 -0
  556. package/dist/frontend/resolve.js +5 -0
  557. package/dist/frontend/resolve.js.map +1 -1
  558. package/dist/frontend/services.d.ts +3 -0
  559. package/dist/frontend/services.js +31 -4
  560. package/dist/frontend/services.js.map +1 -1
  561. package/dist/frontend/shape-inference/analyze.d.ts +93 -0
  562. package/dist/frontend/shape-inference/analyze.js +3138 -0
  563. package/dist/frontend/shape-inference/analyze.js.map +1 -0
  564. package/dist/frontend/shape-inference/constant-graphs.d.ts +54 -0
  565. package/dist/frontend/shape-inference/constant-graphs.js +357 -0
  566. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -0
  567. package/dist/frontend/shape-inference/domain.d.ts +32 -0
  568. package/dist/frontend/shape-inference/domain.js +104 -0
  569. package/dist/frontend/shape-inference/domain.js.map +1 -0
  570. package/dist/frontend/shape-inference/index.d.ts +7 -0
  571. package/dist/frontend/shape-inference/index.js +19 -0
  572. package/dist/frontend/shape-inference/index.js.map +1 -0
  573. package/dist/frontend/shape-inference/report.d.ts +21 -0
  574. package/dist/frontend/shape-inference/report.js +348 -0
  575. package/dist/frontend/shape-inference/report.js.map +1 -0
  576. package/dist/frontend/token-equivalence.d.ts +6 -0
  577. package/dist/frontend/token-equivalence.js +66 -9
  578. package/dist/frontend/token-equivalence.js.map +1 -1
  579. package/dist/frontend/token-equivalence.test.js +33 -1
  580. package/dist/frontend/token-equivalence.test.js.map +1 -1
  581. package/dist/frontend/ts7/checker-features.d.ts +15 -0
  582. package/dist/frontend/ts7/checker-features.js +45 -0
  583. package/dist/frontend/ts7/checker-features.js.map +1 -0
  584. package/dist/frontend/ts7/checker-features.test.d.ts +1 -0
  585. package/dist/frontend/ts7/checker-features.test.js +40 -0
  586. package/dist/frontend/ts7/checker-features.test.js.map +1 -0
  587. package/dist/frontend/ts7/checker-server.d.ts +19 -0
  588. package/dist/frontend/ts7/checker-server.js +46 -0
  589. package/dist/frontend/ts7/checker-server.js.map +1 -0
  590. package/dist/frontend/ts7/checker-server.test.d.ts +1 -0
  591. package/dist/frontend/ts7/checker-server.test.js +38 -0
  592. package/dist/frontend/ts7/checker-server.test.js.map +1 -0
  593. package/dist/frontend/ts7/lib-diagnostics.js +39 -13
  594. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  595. package/dist/frontend/ts7/lib-diagnostics.test.js +40 -0
  596. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  597. package/dist/frontend/ts7/native-api.d.ts +1 -0
  598. package/dist/frontend/ts7/native-api.js +25 -2
  599. package/dist/frontend/ts7/native-api.js.map +1 -1
  600. package/dist/frontend/ts7/native-process.d.ts +9 -2
  601. package/dist/frontend/ts7/native-process.js +22 -4
  602. package/dist/frontend/ts7/native-process.js.map +1 -1
  603. package/dist/frontend/ts7/program-host.d.ts +11 -0
  604. package/dist/frontend/ts7/program-host.js +36 -22
  605. package/dist/frontend/ts7/program-host.js.map +1 -1
  606. package/dist/frontend/ts7/semantic-json.d.ts +9 -0
  607. package/dist/frontend/ts7/semantic-json.js +25 -5
  608. package/dist/frontend/ts7/semantic-json.js.map +1 -1
  609. package/dist/frontend/ts7/semantic-model.js +3 -1
  610. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  611. package/dist/frontend/ts7/source-parser.js +3 -1
  612. package/dist/frontend/ts7/source-parser.js.map +1 -1
  613. package/dist/frontend/tsc-codes.js +10 -0
  614. package/dist/frontend/tsc-codes.js.map +1 -1
  615. package/dist/frontend/type-mapper.d.ts +18 -6
  616. package/dist/frontend/type-mapper.js +160 -28
  617. package/dist/frontend/type-mapper.js.map +1 -1
  618. package/dist/index.d.ts +44 -3
  619. package/dist/index.js +27 -8
  620. package/dist/index.js.map +1 -1
  621. package/dist/ir/builtin-effects.js +29 -0
  622. package/dist/ir/builtin-effects.js.map +1 -1
  623. package/dist/ir/builtin-signatures.d.ts +7 -2
  624. package/dist/ir/builtin-signatures.js +5104 -4950
  625. package/dist/ir/builtin-signatures.js.map +1 -1
  626. package/dist/ir/callback-specialization.d.ts +4 -2
  627. package/dist/ir/callback-specialization.js +24 -9
  628. package/dist/ir/callback-specialization.js.map +1 -1
  629. package/dist/ir/capture-values.js +4 -2
  630. package/dist/ir/capture-values.js.map +1 -1
  631. package/dist/ir/char-unit-locals.d.ts +12 -2
  632. package/dist/ir/char-unit-locals.js +400 -58
  633. package/dist/ir/char-unit-locals.js.map +1 -1
  634. package/dist/ir/char-unit-locals.test.js +111 -0
  635. package/dist/ir/char-unit-locals.test.js.map +1 -1
  636. package/dist/ir/constant-globals.js +18 -4
  637. package/dist/ir/constant-globals.js.map +1 -1
  638. package/dist/ir/expression-inlining.d.ts +15 -0
  639. package/dist/ir/expression-inlining.js +166 -0
  640. package/dist/ir/expression-inlining.js.map +1 -0
  641. package/dist/ir/expression-inlining.test.d.ts +1 -0
  642. package/dist/ir/expression-inlining.test.js +123 -0
  643. package/dist/ir/expression-inlining.test.js.map +1 -0
  644. package/dist/ir/function-references.js +2 -0
  645. package/dist/ir/function-references.js.map +1 -1
  646. package/dist/ir/function-references.test.js +6 -0
  647. package/dist/ir/function-references.test.js.map +1 -1
  648. package/dist/ir/int32-arrays.d.ts +27 -6
  649. package/dist/ir/int32-arrays.js +106 -18
  650. package/dist/ir/int32-arrays.js.map +1 -1
  651. package/dist/ir/int32-slots.d.ts +26 -1
  652. package/dist/ir/int32-slots.js +284 -5
  653. package/dist/ir/int32-slots.js.map +1 -1
  654. package/dist/ir/int32-slots.test.js +5 -0
  655. package/dist/ir/int32-slots.test.js.map +1 -1
  656. package/dist/ir/integer-loop-facts.d.ts +5 -0
  657. package/dist/ir/integer-loop-facts.js +90 -1
  658. package/dist/ir/integer-loop-facts.js.map +1 -1
  659. package/dist/ir/integer-loops.d.ts +14 -1
  660. package/dist/ir/integer-loops.js +93 -7
  661. package/dist/ir/integer-loops.js.map +1 -1
  662. package/dist/ir/integer-loops.test.js +70 -0
  663. package/dist/ir/integer-loops.test.js.map +1 -1
  664. package/dist/ir/integer-ranges.js +18 -2
  665. package/dist/ir/integer-ranges.js.map +1 -1
  666. package/dist/ir/integer-ranges.test.js +64 -4
  667. package/dist/ir/integer-ranges.test.js.map +1 -1
  668. package/dist/ir/ir.d.ts +50 -8
  669. package/dist/ir/ir.js +38 -12
  670. package/dist/ir/ir.js.map +1 -1
  671. package/dist/ir/js-ic.d.ts +25 -5
  672. package/dist/ir/js-ic.js +93 -13
  673. package/dist/ir/js-ic.js.map +1 -1
  674. package/dist/ir/js-ic.test.js +153 -0
  675. package/dist/ir/js-ic.test.js.map +1 -1
  676. package/dist/ir/node-index.d.ts +7 -0
  677. package/dist/ir/node-index.js +32 -0
  678. package/dist/ir/node-index.js.map +1 -1
  679. package/dist/ir/receiver-readers.d.ts +6 -1
  680. package/dist/ir/receiver-readers.js +53 -28
  681. package/dist/ir/receiver-readers.js.map +1 -1
  682. package/dist/ir/row-pairs.d.ts +15 -0
  683. package/dist/ir/row-pairs.js +373 -0
  684. package/dist/ir/row-pairs.js.map +1 -0
  685. package/dist/ir/row-pairs.test.d.ts +1 -0
  686. package/dist/ir/row-pairs.test.js +129 -0
  687. package/dist/ir/row-pairs.test.js.map +1 -0
  688. package/dist/ir/runtime-features.d.ts +17 -4
  689. package/dist/ir/runtime-features.js +69 -12
  690. package/dist/ir/runtime-features.js.map +1 -1
  691. package/dist/ir/scalar-records.d.ts +15 -0
  692. package/dist/ir/scalar-records.js +301 -1
  693. package/dist/ir/scalar-records.js.map +1 -1
  694. package/dist/ir/scalar-records.test.js +181 -1
  695. package/dist/ir/scalar-records.test.js.map +1 -1
  696. package/dist/ir/self-captures.js +8 -0
  697. package/dist/ir/self-captures.js.map +1 -1
  698. package/dist/ir/validate.js +37 -28
  699. package/dist/ir/validate.js.map +1 -1
  700. package/dist/library/fence-eval.js +4 -4
  701. package/dist/library/fence-eval.js.map +1 -1
  702. package/dist/library/ir-policy.js +4 -0
  703. package/dist/library/ir-policy.js.map +1 -1
  704. package/dist/library/library-cache.d.ts +1 -0
  705. package/dist/library/library-cache.js +1 -0
  706. package/dist/library/library-cache.js.map +1 -1
  707. package/dist/library/library-cache.test.js +13 -0
  708. package/dist/library/library-cache.test.js.map +1 -1
  709. package/dist/native/cache.d.ts +5 -1
  710. package/dist/native/cache.js +15 -3
  711. package/dist/native/cache.js.map +1 -1
  712. package/dist/native/cli.js +6 -0
  713. package/dist/native/cli.js.map +1 -1
  714. package/dist/native/compiler.d.ts +3 -0
  715. package/dist/native/compiler.js +72 -26
  716. package/dist/native/compiler.js.map +1 -1
  717. package/dist/native/compiler.test.js +87 -2
  718. package/dist/native/compiler.test.js.map +1 -1
  719. package/dist/native/executable-cache-open.test.d.ts +1 -0
  720. package/dist/native/executable-cache-open.test.js +80 -0
  721. package/dist/native/executable-cache-open.test.js.map +1 -0
  722. package/dist/native/executable-cache.d.ts +43 -3
  723. package/dist/native/executable-cache.js +177 -36
  724. package/dist/native/executable-cache.js.map +1 -1
  725. package/dist/native/executable-cache.test.js +103 -0
  726. package/dist/native/executable-cache.test.js.map +1 -1
  727. package/dist/native/prepare.js +38 -16
  728. package/dist/native/prepare.js.map +1 -1
  729. package/dist/native/prepare.test.js +51 -1
  730. package/dist/native/prepare.test.js.map +1 -1
  731. package/dist/native/sanitizer.d.ts +1 -1
  732. package/dist/native/sanitizer.js +17 -3
  733. package/dist/native/sanitizer.js.map +1 -1
  734. package/dist/native/sanitizer.test.js +4 -0
  735. package/dist/native/sanitizer.test.js.map +1 -1
  736. package/dist/node-islands/classify.d.ts +14 -0
  737. package/dist/node-islands/classify.js +114 -0
  738. package/dist/node-islands/classify.js.map +1 -0
  739. package/dist/node-islands/detect.d.ts +13 -0
  740. package/dist/node-islands/detect.js +805 -0
  741. package/dist/node-islands/detect.js.map +1 -0
  742. package/dist/node-islands/detect.test.d.ts +1 -0
  743. package/dist/node-islands/detect.test.js +136 -0
  744. package/dist/node-islands/detect.test.js.map +1 -0
  745. package/dist/node-islands/origin.d.ts +21 -0
  746. package/dist/node-islands/origin.js +60 -0
  747. package/dist/node-islands/origin.js.map +1 -0
  748. package/dist/node-islands/policy.d.ts +49 -0
  749. package/dist/node-islands/policy.js +130 -0
  750. package/dist/node-islands/policy.js.map +1 -0
  751. package/dist/node-islands/report.d.ts +22 -0
  752. package/dist/node-islands/report.js +326 -0
  753. package/dist/node-islands/report.js.map +1 -0
  754. package/dist/node-islands/report.test.d.ts +1 -0
  755. package/dist/node-islands/report.test.js +228 -0
  756. package/dist/node-islands/report.test.js.map +1 -0
  757. package/dist/node-islands/rules.d.ts +20 -0
  758. package/dist/node-islands/rules.js +91 -0
  759. package/dist/node-islands/rules.js.map +1 -0
  760. package/dist/node-islands/scan.d.ts +53 -0
  761. package/dist/node-islands/scan.js +104 -0
  762. package/dist/node-islands/scan.js.map +1 -0
  763. package/dist/node-islands/summary.d.ts +78 -0
  764. package/dist/node-islands/summary.js +26 -0
  765. package/dist/node-islands/summary.js.map +1 -0
  766. package/dist/project-config.d.ts +50 -0
  767. package/dist/project-config.js +372 -0
  768. package/dist/project-config.js.map +1 -0
  769. package/dist/project-config.test.d.ts +1 -0
  770. package/dist/project-config.test.js +154 -0
  771. package/dist/project-config.test.js.map +1 -0
  772. package/dist/wasm/discover.js +6 -31
  773. package/dist/wasm/discover.js.map +1 -1
  774. package/package.json +20 -20
  775. package/surface-manifest.json +20 -35
@@ -5,11 +5,11 @@ import { lowerDateStaticCall } from "./builtins/dates.js";
5
5
  import { keyedHelperName } from "./stable-names.js";
6
6
  import { lowerValueReturningConstructorNew } from "./js-dynamic-objects.js";
7
7
  import { adaptPromiseExecutor } from "./promise-executor-adapter.js";
8
- import { dynUndefinedExpr, nodeThrowExpr, varRef } from "../../ir/build.js";
8
+ import { dynUndefinedExpr, nodeThrowExpr, strLit, varRef } from "../../ir/build.js";
9
9
  import { constructedFromValue, constructedValue, superIntoResultSlot, } from "./constructor-returns.js";
10
10
  import { checkedIterableSpread } from "./checked-iterable-spread.js";
11
- import { lowerReadlineUiNew } from "./builtins/readline.js";
12
- import { builtinMemberRequireDecl } from "./builtins/module-bindings.js";
11
+ import { lowerReadlineInterfaceNew, lowerReadlineUiNew } from "./builtins/readline.js";
12
+ import { builtinMemberBindingTarget, builtinMemberRequireDecl, } from "./builtins/module-bindings.js";
13
13
  import { checkedClassUnionAssertion } from "./class-assertions.js";
14
14
  import { collectClassMethodMutations } from "./class-method-mutations.js";
15
15
  import { InternalCompilerError } from "../../errors.js";
@@ -26,7 +26,7 @@ import { lowerZlibStreamNew, zlibClassName, zlibStreamModeOf } from "./builtins/
26
26
  import { everyStmtList } from "../../ir/traverse.js";
27
27
  import { builtinClassAliasOf, builtinClassRefOf, } from "./builtins/class-values.js";
28
28
  import { inlineNamespaceRequireOf, lowerWithInlineRequireInit } from "./cjs-inline-require.js";
29
- import { BOOL, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
29
+ import { BOOL, BYTES_U8, canDynCheckTo, DATE_T, DYN, F64, RUNTIME_EMITTER_CLASS, RUNTIME_ERROR_CLASSES, RUNTIME_STREAM_CLASSES, STRING, classValueConstructor, UNDEFINED_T, VOID, arrayOf, isSupportedMapKey, isSupportedMapValue, isSupportedSetElem, isUnitType, typeEquals, } from "../../ir/ir.js";
30
30
  import { genericCallInstance, implicitAnyParamSymbolsOf, implicitCallInstance, implicitMonoFile, genericLocalClassResult, } from "./generic-functions.js";
31
31
  import { extendInstantiationPath, MAX_INSTANTIATION_RECURSION, } from "./instantiation-path.js";
32
32
  import { appendImplicitUndefinedReturn, hasExplicitJsDocReturn } from "./function-returns.js";
@@ -34,19 +34,20 @@ import { bodyReadsArguments } from "../arguments-usage.js";
34
34
  import { errorNameAfterField, errorViewFields } from "./error-name-order.js";
35
35
  import { checkedJsDocumentedParameter, documentedParameter, generatorMeta, } from "./call-signatures.js";
36
36
  import { omittedArgFor } from "./call-arguments.js";
37
- import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, } from "../type-mapper.js";
37
+ import { checkerTypeDescription, isGenericCallableMemberType, jsOpenObjectType, typeKey, withUnitArm, X509_DER_FIELD, X509_PUBLIC_KEY_FIELD, } from "../type-mapper.js";
38
38
  import { canonicalBuiltinModule, cjsClassExprWholeExportOf, isCjsJsFile, isJsSourceFile, isModuleExportsAccess, locOf, requireSpecOf, } from "../program.js";
39
39
  import { PoisonError, dynFallbackType, jsFuncNameOf, newFnCtx, own } from "./lowerer.js";
40
40
  import { isAssertClassNew } from "./assert-instances.js";
41
41
  import { isCjsRequireGlobal } from "./lower-node-module.js";
42
42
  import { lowerArrayConstructor } from "./containers/array-construction.js";
43
+ import { initializedCollectionType } from "./js-collection-types.js";
43
44
  import { lowerMapSeedNew, lowerSetSeedNew } from "./containers/collection-methods.js";
44
45
  import { lowerObjectConstructor } from "./containers/indexed-objects.js";
45
46
  import { knownBufEncoding, lowerBufferConstruct } from "./containers/bytes.js";
46
47
  import { lowerSearchParamsNew } from "./builtins/url.js";
47
48
  import { lowerTextCodecNew } from "./builtins/text-codecs.js";
48
49
  import { lowerBroadcastChannelNew, lowerMessageChannelNew, lowerWorkerNew, } from "./builtins/workers.js";
49
- import { unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
50
+ import { noLoweringDiag, unsupportedPackageValueDiag, unsupportedDiag, } from "../../diagnostics/diagnostic.js";
50
51
  import { STREAM_API_MEMBERS, STREAM_PROP_MEMBERS, STREAM_COMPLETION_CALLBACK_INDEX, UNDERSCORE_METHODS, streamExtraCallbacks, lowerStreamNew, lowerStreamSuperCall, streamCtorShape, } from "./lower-stream.js";
51
52
  import { builtinEventTargetBaseOf, eventTargetApiMembers, eventTargetApiMethod, eventTargetRootOf, eventTargetSuperCall, lowerEventTargetMethodCall, } from "./lower-event-target.js";
52
53
  import { emitOverrideShapeReason, emitSpecSuperForward, emitterRooted, lowerEmitterSuperCall, } from "./lower-event-emitter.js";
@@ -63,11 +64,11 @@ import { accessorInterceptsBase, accessorNames, construction, constructionPrefix
63
64
  import { lowerObjectFactoryNew } from "./object-factory-new.js";
64
65
  import { tryLowerExpression } from "./expressions/try-lower-expression.js";
65
66
  import { lowerInstanceConstructorNew } from "./class-instance-constructor.js";
66
- import { classPrototypeData } from "./class-prototypes.js";
67
+ import { classPrototypeData, reflectClassPrototype } from "./class-prototypes.js";
67
68
  import { constructionEscape } from "./construction-escapes.js";
68
69
  import { checkedClassConstruction, checkedClassConstructionPacked } from "./class-construction.js";
69
70
  import { initializeRuntimeStatics, hasRuntimeStatics } from "./class-runtime-statics.js";
70
- import { reflectedClassStaticMethodValue } from "./class-method-values.js";
71
+ import { reflectedClassMethodValue, reflectedClassStaticMethodValue, } from "./class-method-values.js";
71
72
  import { identifierReadSymbol } from "./surfaces.js";
72
73
  export function returnsOnlyThis(member) {
73
74
  const body = member.body;
@@ -3431,6 +3432,11 @@ mixin) {
3431
3432
  // INSTANTIATION prints its family's name — JS has one `Box`.
3432
3433
  jsName: jsNameOverride ?? decl.name?.text ?? "",
3433
3434
  ...(base ? { base: base.def.name } : {}),
3435
+ ...(decl.members.nodes.some((member) => ts.isPropertyDeclaration(member) &&
3436
+ !ts.isPrivateIdentifier(member.name) &&
3437
+ member.modifiers?.nodes.some((m) => m.kind === ts.SyntaxKind.StaticKeyword))
3438
+ ? { ownStaticFields: true }
3439
+ : {}),
3434
3440
  jsLength: ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) === -1
3435
3441
  ? ctor.parameters.nodes.length
3436
3442
  : Math.max(0, ctor?.parameters?.nodes.findIndex((parameter) => parameter.initializer || parameter.dotDotDotToken) ?? 0),
@@ -4600,20 +4606,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
4600
4606
  return null;
4601
4607
  if (expr.questionDotToken)
4602
4608
  return null;
4603
- if (!ts.isIdentifier(expr.expression) &&
4604
- expr.expression.kind !== ts.SyntaxKind.ThisKeyword &&
4605
- exactClassOfReceiver(lowerer, expr.expression) === null)
4609
+ const info = staticReceiverClass(lowerer, expr.expression);
4610
+ if (!info)
4606
4611
  return null;
4607
- const symbol = ts.isIdentifier(expr.expression)
4608
- ? lowerer.resolveValueSymbol(expr.expression)
4609
- : null;
4612
+ return lowerClassStaticRead(lowerer, info, expr.name.text, expr.expression, expr);
4613
+ }
4614
+ /** The class a static member read through `receiver` reads exactly: the
4615
+ * class a name binds (directly, through a require binding, or through a
4616
+ * const alias), or null. */
4617
+ export function staticReceiverClass(lowerer, receiver) {
4618
+ if (!ts.isIdentifier(receiver) &&
4619
+ receiver.kind !== ts.SyntaxKind.ThisKeyword &&
4620
+ exactClassOfReceiver(lowerer, receiver) === null)
4621
+ return null;
4622
+ const symbol = ts.isIdentifier(receiver) ? lowerer.resolveValueSymbol(receiver) : null;
4610
4623
  const info = (symbol ? lowerer.classBySymbol.get(symbol) : undefined) ??
4611
4624
  // A require binding over `module.exports = class {…}` (the alias
4612
4625
  // lands on the expression's own symbol): resolve/collect on demand,
4613
4626
  // or `C.name` below would fall through to paths that answer for
4614
4627
  // stdlib globals instead of this class.
4615
4628
  propertyAssignedClassInfoOf(lowerer, symbol) ??
4616
- exactClassOfReceiver(lowerer, expr.expression) ??
4629
+ exactClassOfReceiver(lowerer, receiver) ??
4617
4630
  undefined;
4618
4631
  if (!info)
4619
4632
  return null;
@@ -4624,20 +4637,27 @@ export function lowerStaticFieldRead(lowerer, expr) {
4624
4637
  // runtime value.
4625
4638
  if (info.classDecorators?.valueGlobalId !== undefined)
4626
4639
  return null;
4627
- const loc = locOf(expr);
4628
- const found = findStaticOn(lowerer, info, expr.name.text);
4640
+ return info;
4641
+ }
4642
+ /** The static member `name` of `info` read through `receiver` (an exact
4643
+ * reference to the class, see staticReceiverClass): `C.name` for the
4644
+ * property access `site`, or a destructuring element over `C` whose
4645
+ * initializer is `site`. Null when the class has no such member. */
4646
+ export function lowerClassStaticRead(lowerer, info, name, receiver, site) {
4647
+ const loc = locOf(site);
4648
+ const found = findStaticOn(lowerer, info, name);
4629
4649
  // A Date static read as a value through a class declared `extends Date`:
4630
4650
  // the statics lower only as calls.
4631
4651
  if (!found &&
4632
4652
  dateRootOf(info) &&
4633
- ["now", "parse", "UTC"].includes(expr.name.text) &&
4634
- !(ts.isCallExpression(expr.parent) && expr.parent.expression === expr))
4635
- lowerer.noLowering(`Date.${expr.name.text} read through a class that extends Date`, expr);
4653
+ ["now", "parse", "UTC"].includes(name) &&
4654
+ !(ts.isCallExpression(site.parent) && site.parent.expression === site))
4655
+ lowerer.noLowering(`Date.${name} read through a class that extends Date`, site);
4636
4656
  if (hasRuntimeStatics(info) && !found?.field)
4637
4657
  return {
4638
4658
  kind: "dynKeyGet",
4639
- value: lowerer.coerceToExpected(classValueRef(lowerer, info, expr.expression), DYN),
4640
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4659
+ value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
4660
+ key: { kind: "strLit", value: name, type: STRING, loc },
4641
4661
  type: DYN,
4642
4662
  loc,
4643
4663
  };
@@ -4645,8 +4665,8 @@ export function lowerStaticFieldRead(lowerer, expr) {
4645
4665
  // name: in JS the brand lives on that one constructor object, so
4646
4666
  // `D.#s` (a subclass receiver) throws Node's TypeError instead of
4647
4667
  // reaching up the chain — reported as SC1090 instead of resolved.
4648
- if (found && expr.name.text.startsWith("#") && found.declarer !== info) {
4649
- lowerer.unsupported("SC1090", expr, `reading the private static '${expr.name.text}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
4668
+ if (found && name.startsWith("#") && found.declarer !== info) {
4669
+ lowerer.unsupported("SC1090", site, `reading the private static '${name}' through the subclass '${info.def.name.replace(/^%|^%m\d+\./, "")}' (JS brands the declaring class object alone — Node throws a TypeError here; spell the declaring class's name)`);
4650
4670
  }
4651
4671
  if (found?.field !== undefined) {
4652
4672
  const value = {
@@ -4655,30 +4675,32 @@ export function lowerStaticFieldRead(lowerer, expr) {
4655
4675
  type: found.field.type,
4656
4676
  loc,
4657
4677
  };
4658
- return found.field.runtimeOptional ? value : lowerer.maybeNarrow(value, expr);
4678
+ return found.field.runtimeOptional || !ts.isPropertyAccessExpression(site)
4679
+ ? value
4680
+ : lowerer.maybeNarrow(value, site);
4659
4681
  }
4660
4682
  if (found) {
4661
- return staticMethodValue(lowerer, found.declarer, expr.name.text, found.method, expr, loc);
4683
+ return staticMethodValue(lowerer, found.declarer, name, found.method, site, loc);
4662
4684
  }
4663
4685
  // A GENERIC static method as a VALUE: the pinned-value rule verbatim
4664
4686
  // (lowerGenericFnValue) — a slot spelling one concrete signature names
4665
4687
  // an instance, an unpinned reference fences by name.
4666
4688
  {
4667
- const gfound = findGenericStaticOn(lowerer, info, expr.name.text);
4689
+ const gfound = findGenericStaticOn(lowerer, info, name);
4668
4690
  if (gfound)
4669
- return lowerer.lowerGenericFnValue(expr, gfound.info);
4691
+ return lowerer.lowerGenericFnValue(site, gfound.info);
4670
4692
  }
4671
4693
  // `C.name` — the JS-observable class name, a compile-time constant on
4672
4694
  // the direct spelling (tsc rejects user statics named `name`, so the
4673
4695
  // chain above can never shadow it in TypeScript sources). A class of an
4674
4696
  // import cycle reads it from its class object instead, whose reference
4675
4697
  // checks the class's initialization (checkCycleBindingAccesses).
4676
- if (expr.name.text === "name" && info.def.jsName !== undefined) {
4698
+ if (name === "name" && info.def.jsName !== undefined) {
4677
4699
  if (lowerer.classInitFlags.get(info.def.name)?.cycle === true)
4678
4700
  return {
4679
4701
  kind: "libCall",
4680
4702
  fn: "class.name",
4681
- args: [classValueRef(lowerer, info, expr.expression)],
4703
+ args: [classValueRef(lowerer, info, receiver)],
4682
4704
  type: STRING,
4683
4705
  loc,
4684
4706
  };
@@ -4687,26 +4709,26 @@ export function lowerStaticFieldRead(lowerer, expr) {
4687
4709
  if (info.callableBase)
4688
4710
  return {
4689
4711
  kind: "dynKeyGet",
4690
- value: lowerer.coerceToExpected(classValueRef(lowerer, info, expr.expression), DYN),
4691
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4712
+ value: lowerer.coerceToExpected(classValueRef(lowerer, info, receiver), DYN),
4713
+ key: { kind: "strLit", value: name, type: STRING, loc },
4692
4714
  type: DYN,
4693
4715
  loc,
4694
4716
  };
4695
- const data = classStaticDataFor(lowerer, info, expr.name.text, loc);
4717
+ const data = classStaticDataFor(lowerer, info, name, loc);
4696
4718
  if (data) {
4697
4719
  const value = {
4698
4720
  kind: "dynKeyGet",
4699
4721
  value: data,
4700
- key: { kind: "strLit", value: expr.name.text, type: STRING, loc },
4722
+ key: { kind: "strLit", value: name, type: STRING, loc },
4701
4723
  type: DYN,
4702
4724
  loc,
4703
4725
  };
4704
4726
  // JavaScript often assigns public statics after the class declaration.
4705
4727
  // Their storage stays mutable and checked, while reads retain the
4706
4728
  // checker's concrete type instead of losing the method receiver.
4707
- const type = isJsSourceFile(ts.getSourceFileOfNode(expr))
4729
+ const type = isJsSourceFile(ts.getSourceFileOfNode(site))
4708
4730
  ? null
4709
- : lowerer.mapTypeOf(lowerer.typeOf(expr));
4731
+ : lowerer.mapTypeOf(lowerer.typeOf(site));
4710
4732
  return type ? lowerer.coerceToExpected(value, type) : value;
4711
4733
  }
4712
4734
  return null;
@@ -5453,7 +5475,7 @@ function staticCallOn(lowerer, call, access, info, throughValue) {
5453
5475
  kind: "dynInvoke",
5454
5476
  recv: lowerer.lowerExprExpecting(access.expression, DYN),
5455
5477
  method: access.name.text,
5456
- calleeName: access.name.text,
5478
+ calleeName: ts.getTextOfNode(access),
5457
5479
  args: call.arguments.nodes.map((argument) => lowerer.lowerExprExpecting(argument, DYN)),
5458
5480
  type: DYN,
5459
5481
  loc,
@@ -5756,8 +5778,8 @@ function capturesEnclosingScope(lowerer, member, classDecl) {
5756
5778
  * reflection: the member a runtime lookup finds can then differ. */
5757
5779
  function memberAssigned(lowerer, member, name) {
5758
5780
  let found = false;
5759
- for (const sf of lowerer.program.getSourceFiles()) {
5760
- if (sf.isDeclarationFile || found)
5781
+ for (const sf of lowerer.program.getImplementationSourceFiles()) {
5782
+ if (found)
5761
5783
  continue;
5762
5784
  if (!sf.text.includes(name))
5763
5785
  continue;
@@ -6807,14 +6829,23 @@ export function classMemberNameOf(lowerer, name) {
6807
6829
  member === "asyncIterator" ||
6808
6830
  member === "dispose" ||
6809
6831
  member === "asyncDispose" ||
6810
- member === "toPrimitive") {
6832
+ member === "toPrimitive" ||
6833
+ // A toStringTag field keeps its symbol field name; its accessor and
6834
+ // method forms take the method slot name.
6835
+ (member === "toStringTag" && !ts.isPropertyDeclaration(name.parent))) {
6811
6836
  return `sym:${member}`;
6812
6837
  }
6813
6838
  }
6814
6839
  return (classSymbolKeyOf(lowerer, name.expression)?.fieldName ??
6815
6840
  lowerer.foldedStringKeyOf(name.expression));
6816
6841
  }
6817
- export function classIteratorOf(lowerer, t) {
6842
+ /** A return() result type that is always an object: IteratorClose after a
6843
+ * break throws a TypeError for any other result, which these desugars do
6844
+ * not model. */
6845
+ function objectResult(t) {
6846
+ return t.kind === "record" || t.kind === "object";
6847
+ }
6848
+ export function classIteratorOf(lowerer, t, options = {}) {
6818
6849
  if (t.kind !== "object")
6819
6850
  return null;
6820
6851
  const info = lowerer.classes.get(t.className);
@@ -6824,19 +6855,48 @@ export function classIteratorOf(lowerer, t) {
6824
6855
  if (!iter || iter.sig.params.length !== 0 || iter.sig.abstract === true)
6825
6856
  return null;
6826
6857
  const iterT = iter.sig.ret;
6827
- if (iterT.kind !== "object")
6828
- return null;
6829
- const itInfo = lowerer.classes.get(iterT.className);
6830
- if (!itInfo)
6831
- return null;
6832
- // IteratorClose honesty: a declared return()/throw() would be called
6833
- // by JS on abrupt completion; these desugars never close.
6834
- if (findMethodOn(lowerer, itInfo, "return") || findMethodOn(lowerer, itInfo, "throw"))
6835
- return null;
6836
- const next = findMethodOn(lowerer, itInfo, "next");
6837
- if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
6858
+ let resultT;
6859
+ let hasReturn;
6860
+ if (iterT.kind === "object") {
6861
+ const itInfo = lowerer.classes.get(iterT.className);
6862
+ if (!itInfo)
6863
+ return null;
6864
+ // IteratorClose honesty: a declared return() would be called by JS on
6865
+ // abrupt completion, so only a consumer that closes takes it; for-of
6866
+ // never calls throw(), the other consumers refuse it.
6867
+ const close = findMethodOn(lowerer, itInfo, "return");
6868
+ if (close &&
6869
+ (!options.close ||
6870
+ close.sig.abstract === true ||
6871
+ close.sig.params.length !== 0 ||
6872
+ !objectResult(close.sig.ret)))
6873
+ return null;
6874
+ if (findMethodOn(lowerer, itInfo, "throw") && !options.close)
6875
+ return null;
6876
+ const next = findMethodOn(lowerer, itInfo, "next");
6877
+ if (!next || next.sig.params.length !== 0 || next.sig.abstract === true)
6878
+ return null;
6879
+ resultT = next.sig.ret;
6880
+ hasReturn = !!close;
6881
+ }
6882
+ else if (iterT.kind === "record" && options.records) {
6883
+ const fields = lowerer.shapes.get(iterT.shapeId)?.fields;
6884
+ const next = fields?.find((f) => f.name === "next")?.type;
6885
+ if (!next || next.kind !== "func" || next.params.length !== 0 || next.rest)
6886
+ return null;
6887
+ const close = fields?.find((f) => f.name === "return")?.type;
6888
+ if (close &&
6889
+ (!options.close ||
6890
+ close.kind !== "func" ||
6891
+ close.params.length !== 0 ||
6892
+ close.rest ||
6893
+ !objectResult(close.ret)))
6894
+ return null;
6895
+ resultT = next.ret;
6896
+ hasReturn = close !== undefined;
6897
+ }
6898
+ else
6838
6899
  return null;
6839
- const resultT = next.sig.ret;
6840
6900
  if (resultT.kind !== "record")
6841
6901
  return null;
6842
6902
  const shape = lowerer.shapes.get(resultT.shapeId);
@@ -6852,12 +6912,62 @@ export function classIteratorOf(lowerer, t) {
6852
6912
  resultT,
6853
6913
  valueT: value.type,
6854
6914
  hasDone: done !== undefined,
6915
+ hasReturn,
6855
6916
  };
6856
6917
  }
6857
- /** The `it.next()` step of a class iterator as an ordinary (possibly
6858
- * virtual) method call. */
6859
- export function classIteratorNextCall(lowerer, cit, itRef, loc) {
6860
- return accessorCall(lowerer, cit.iterT.className, "next", itRef, [], cit.resultT, loc);
6918
+ /** The `next` an object-literal iterator's protocol calls, read once when
6919
+ * the iterator opens: JS keeps the `next` it reads then in the iterator
6920
+ * record, so a `next` the iterator assigns while it runs is not called.
6921
+ * Null for an iterator class, whose `next` is a method. */
6922
+ export function classIteratorNextRead(lowerer, cit, itRef, loc) {
6923
+ const iterT = cit.iterT;
6924
+ if (iterT.kind === "object")
6925
+ return null;
6926
+ const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === "next");
6927
+ return {
6928
+ kind: "recordGet",
6929
+ obj: itRef,
6930
+ shapeId: iterT.shapeId,
6931
+ field: "next",
6932
+ type: field.type,
6933
+ loc,
6934
+ };
6935
+ }
6936
+ /** The `it.next()` step of a class iterator: an ordinary (possibly
6937
+ * virtual) method call, or the call of `next`, the object-literal
6938
+ * iterator's `next` that classIteratorNextRead read when it opened. */
6939
+ export function classIteratorNextCall(lowerer, cit, itRef, next, loc) {
6940
+ if (next === null || next.type.kind !== "func")
6941
+ return classIteratorMethodCall(lowerer, cit, "next", itRef, loc);
6942
+ return { kind: "callValue", callee: next, args: [], type: next.type.ret, loc };
6943
+ }
6944
+ /** `it.next()` or `it.return()` of a class iterator: a (possibly virtual)
6945
+ * method call of an iterator class, or the call of an object-literal
6946
+ * iterator's function field. */
6947
+ export function classIteratorMethodCall(lowerer, cit, method, itRef, loc) {
6948
+ const iterT = cit.iterT;
6949
+ if (iterT.kind === "object") {
6950
+ const ret = method === "next"
6951
+ ? cit.resultT
6952
+ : findMethodOn(lowerer, lowerer.classes.get(iterT.className), "return").sig.ret;
6953
+ return accessorCall(lowerer, iterT.className, method, itRef, [], ret, loc);
6954
+ }
6955
+ const field = lowerer.shapes.get(iterT.shapeId).fields.find((f) => f.name === method);
6956
+ const fnT = field.type;
6957
+ return {
6958
+ kind: "callValue",
6959
+ callee: {
6960
+ kind: "recordGet",
6961
+ obj: itRef,
6962
+ shapeId: iterT.shapeId,
6963
+ field: method,
6964
+ type: fnT,
6965
+ loc,
6966
+ },
6967
+ args: [],
6968
+ type: fnT.ret,
6969
+ loc,
6970
+ };
6861
6971
  }
6862
6972
  /** `recv[Symbol.iterator]()` as an ordinary method call. */
6863
6973
  export function classIteratorOpenCall(lowerer, cit, recv, loc) {
@@ -6873,13 +6983,16 @@ export function classIteratorOpenCall(lowerer, cit, recv, loc) {
6873
6983
  * when the value isn't a recognized class iterable or the element
6874
6984
  * doesn't coerce — spread fences stay. */
6875
6985
  export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6876
- const cit = classIteratorOf(lowerer, src.type);
6986
+ // A spread takes every value, so it never closes the iterator.
6987
+ const cit = classIteratorOf(lowerer, src.type, { records: true, close: true });
6877
6988
  if (!cit)
6878
6989
  return null;
6879
6990
  const outElem = elemT ?? cit.valueT;
6880
6991
  // Probe the element coercion purely: identical types, or an arm of a
6881
6992
  // union destination (the wrap coerceToExpected applies below).
6882
- if (!typeEquals(outElem, cit.valueT)) {
6993
+ // A checked-dynamic value (`IteratorResult<T>`'s value is `T | any`)
6994
+ // converts to the destination element with a check.
6995
+ if (!typeEquals(outElem, cit.valueT) && cit.valueT.kind !== "dyn") {
6883
6996
  if (outElem.kind !== "union" || lowerer.armTag(outElem.unionId, cit.valueT) < 0)
6884
6997
  return null;
6885
6998
  }
@@ -6892,6 +7005,8 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6892
7005
  const recvT = { kind: "object", className: cit.className };
6893
7006
  const recvRef = { kind: "varRef", localId: "r.0", type: recvT, loc };
6894
7007
  const itRef = { kind: "varRef", localId: "it.0", type: cit.iterT, loc };
7008
+ const nextRead = classIteratorNextRead(lowerer, cit, itRef, loc);
7009
+ const nextRef = nextRead ? varRef("next.0", nextRead.type, loc) : null;
6895
7010
  const outRef = { kind: "varRef", localId: "out.0", type: outT, loc };
6896
7011
  const resRef = { kind: "varRef", localId: "res.0", type: cit.resultT, loc };
6897
7012
  const valueRead = {
@@ -6906,7 +7021,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6906
7021
  {
6907
7022
  kind: "varDecl",
6908
7023
  localId: "res.0",
6909
- init: classIteratorNextCall(lowerer, cit, itRef, loc),
7024
+ init: classIteratorNextCall(lowerer, cit, itRef, nextRef, loc),
6910
7025
  loc,
6911
7026
  },
6912
7027
  ...(cit.hasDone
@@ -6947,6 +7062,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6947
7062
  locals: [
6948
7063
  { id: "r.0", name: "r", type: recvT, mutable: false },
6949
7064
  { id: "it.0", name: "it", type: cit.iterT, mutable: false },
7065
+ ...(nextRead ? [{ id: "next.0", name: "next", type: nextRead.type, mutable: false }] : []),
6950
7066
  { id: "out.0", name: "out", type: outT, mutable: false },
6951
7067
  { id: "res.0", name: "res", type: cit.resultT, mutable: true },
6952
7068
  ],
@@ -6963,6 +7079,9 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6963
7079
  init: classIteratorOpenCall(lowerer, cit, recvRef, loc),
6964
7080
  loc,
6965
7081
  },
7082
+ ...(nextRead
7083
+ ? [{ kind: "varDecl", localId: "next.0", init: nextRead, loc }]
7084
+ : []),
6966
7085
  {
6967
7086
  kind: "while",
6968
7087
  cond: { kind: "boolLit", value: true, type: BOOL, loc },
@@ -6992,7 +7111,7 @@ export function classIteratorDrainCall(lowerer, src, loc, elemT) {
6992
7111
  * next() still yields): the drain loop keyed by the iterator class. */
6993
7112
  export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
6994
7113
  const outT = arrayOf(cit.valueT);
6995
- const key = `it:${cit.iterT.className}`;
7114
+ const key = `it:${cit.iterT.kind === "object" ? cit.iterT.className : typeKey(cit.iterT)}`;
6996
7115
  let name = lowerer.iterDrainHelpers.get(key);
6997
7116
  if (!name) {
6998
7117
  name = keyedHelperName(lowerer, "%iter.drain", key);
@@ -7004,7 +7123,7 @@ export function classIteratorRestDrainCall(lowerer, cit, itVal, loc) {
7004
7123
  {
7005
7124
  kind: "varDecl",
7006
7125
  localId: "res.0",
7007
- init: classIteratorNextCall(lowerer, cit, itRef, loc),
7126
+ init: classIteratorNextCall(lowerer, cit, itRef, null, loc),
7008
7127
  loc,
7009
7128
  },
7010
7129
  ...(cit.hasDone
@@ -7906,22 +8025,51 @@ export function lowerSuperMethodCall(lowerer, call, access) {
7906
8025
  lowerer.unsupported("SC1080", access);
7907
8026
  const loc = locOf(call);
7908
8027
  const thisRef = { kind: "varRef", localId: thisLocal.id, type: thisLocal.type, loc };
7909
- if (lowerer.prototypeMethodAccesses.has(access.name.text)) {
7910
- const prototype = classPrototypeData(lowerer, cls.base, loc);
7911
- if (prototype) {
7912
- const callee = {
7913
- kind: "dynKeyGet",
7914
- value: prototype,
7915
- key: { kind: "strLit", value: access.name.text, type: STRING, loc },
7916
- type: DYN,
7917
- loc,
7918
- };
8028
+ // A method whose `this` is the call-site receiver (a JavaScript class's
8029
+ // receiver-independent method value, reflectedClassMethodValue) looks the
8030
+ // method up on the base class's complete prototype, as `super` reads
8031
+ // [[HomeObject]].[[Prototype]], and calls it with that receiver.
8032
+ const dynamicThis = thisRef.type.kind === "dyn";
8033
+ // While no code reads a prototype method by name (which could replace it),
8034
+ // that method is the declaring class's own: its receiver-independent value
8035
+ // is called directly. Reflecting the base's whole prototype instead would
8036
+ // put its members on the prototype chain of every subclass instance's
8037
+ // property bag, ahead of the subclasses' own compiled overrides.
8038
+ const declared = dynamicThis && !lowerer.prototypeMethodAccesses.has(access.name.text)
8039
+ ? reflectedClassMethodValue(lowerer, found.declarer, access.name.text)
8040
+ : null;
8041
+ if (dynamicThis || lowerer.prototypeMethodAccesses.has(access.name.text)) {
8042
+ const prototype = declared
8043
+ ? null
8044
+ : dynamicThis && cls.base.decl
8045
+ ? reflectClassPrototype(lowerer, cls.base, loc, classValueRef(lowerer, cls.base, access))
8046
+ : classPrototypeData(lowerer, cls.base, loc);
8047
+ if (declared || prototype) {
8048
+ const callee = declared
8049
+ ? lowerer.coerceToExpected(declared, DYN)
8050
+ : {
8051
+ kind: "dynKeyGet",
8052
+ value: prototype,
8053
+ key: { kind: "strLit", value: access.name.text, type: STRING, loc },
8054
+ type: DYN,
8055
+ loc,
8056
+ };
8057
+ // Spread arguments are spread into the dynamic call, as in a dynamic method call.
8058
+ const spreads = [];
8059
+ const args = call.arguments.nodes.map((arg, index) => {
8060
+ if (!ts.isSpreadElement(arg))
8061
+ return lowerer.lowerExprExpecting(arg, DYN);
8062
+ const spelling = ts.getTextOfNode(arg.expression);
8063
+ spreads.push({ arg: index, what: spelling });
8064
+ return checkedIterableSpread(lowerer, lowerer.lowerExpr(arg.expression), spelling, loc);
8065
+ });
7919
8066
  const value = {
7920
8067
  kind: "dynCall",
7921
8068
  callee,
7922
8069
  receiver: lowerer.coerceToExpected(thisRef, DYN),
7923
8070
  calleeName: ts.getTextOfNode(access),
7924
- args: call.arguments.nodes.map((arg) => lowerer.lowerExprExpecting(arg, DYN)),
8071
+ args,
8072
+ ...(spreads.length > 0 ? { spreads } : {}),
7925
8073
  type: DYN,
7926
8074
  loc,
7927
8075
  };
@@ -8239,6 +8387,59 @@ function assignedThisFieldType(lowerer, expr) {
8239
8387
  }
8240
8388
  return lowerer.currentClass?.fields.get(parent.left.name.text) ?? null;
8241
8389
  }
8390
+ /** `new arr[i](args)` through a narrowed element read: an interned lifted
8391
+ * function takes the read and the completed arguments, which evaluate in
8392
+ * that order as call arguments, then runs the check and constructs. JS
8393
+ * evaluates the arguments before it checks that the callee constructs, and
8394
+ * the arguments stay in the one call, where a spread's argument pack lives
8395
+ * until every argument has read it. */
8396
+ function checkedElementConstruction(lowerer, info, narrowed, args, loc) {
8397
+ const type = { kind: "object", className: info.def.name };
8398
+ const key = `newChecked:${narrowed.check}:${info.def.name}:${args.map((a) => typeKey(a.type)).join(",")}`;
8399
+ let name = lowerer.valueHelpers.get(key);
8400
+ if (!name) {
8401
+ name = keyedHelperName(lowerer, "%new.checked", key);
8402
+ lowerer.valueHelpers.set(key, name);
8403
+ const params = [
8404
+ { localId: "value", name: "value", type: narrowed.unionT },
8405
+ { localId: "message", name: "message", type: STRING },
8406
+ ...args.map((arg, i) => ({ localId: `arg.${i}`, name: `arg${i}`, type: arg.type })),
8407
+ ];
8408
+ lowerer.liftedFns.push({
8409
+ name,
8410
+ params,
8411
+ returnType: type,
8412
+ locals: params.map((p) => ({ id: p.localId, name: p.name, type: p.type, mutable: false })),
8413
+ body: [
8414
+ {
8415
+ kind: "return",
8416
+ value: {
8417
+ kind: "newValue",
8418
+ callee: {
8419
+ kind: "call",
8420
+ callee: narrowed.check,
8421
+ args: [varRef("value", narrowed.unionT, loc), varRef("message", STRING, loc)],
8422
+ type: narrowed.calleeT,
8423
+ loc,
8424
+ },
8425
+ args: params.slice(2).map((p) => varRef(p.localId, p.type, loc)),
8426
+ type,
8427
+ loc,
8428
+ },
8429
+ loc,
8430
+ },
8431
+ ],
8432
+ loc,
8433
+ });
8434
+ }
8435
+ return {
8436
+ kind: "call",
8437
+ callee: name,
8438
+ args: [narrowed.read, narrowed.message, ...args],
8439
+ type,
8440
+ loc,
8441
+ };
8442
+ }
8242
8443
  /** Map, Set and the error classes construct in lowerNew's identifier
8243
8444
  * branch, which a module member alias of one (`new mod.M()`) also takes. */
8244
8445
  function isCollectionOrErrorClass(ref) {
@@ -8276,7 +8477,7 @@ export function lowerNew(lowerer, expr) {
8276
8477
  const worker = lowerWorkerNew(lowerer, expr);
8277
8478
  if (worker)
8278
8479
  return worker;
8279
- const readlineUi = lowerReadlineUiNew(lowerer, expr);
8480
+ const readlineUi = lowerReadlineUiNew(lowerer, expr) ?? lowerReadlineInterfaceNew(lowerer, expr);
8280
8481
  if (readlineUi)
8281
8482
  return readlineUi;
8282
8483
  const channel = lowerMessageChannelNew(lowerer, expr) ?? lowerBroadcastChannelNew(lowerer, expr);
@@ -8347,19 +8548,39 @@ export function lowerNew(lowerer, expr) {
8347
8548
  lowerer.isStdlibGlobal(expr.expression.expression, "Intl")) {
8348
8549
  const args = expr.arguments?.nodes ?? [];
8349
8550
  const undefinedArg = (arg) => (lowerer.typeOf(arg).flags & ts.TypeFlags.Undefined) !== 0;
8350
- if (args.length > 2 || (args[0] && !undefinedArg(args[0]))) {
8351
- lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale or pass undefined for default Unicode grapheme segmentation");
8352
- }
8551
+ // A literal language tag: Unicode grapheme clusters have no locale
8552
+ // tailoring. Only tags of the form language[-script][-region] are
8553
+ // accepted; each is well-formed, so Node constructs the segmenter
8554
+ // without the RangeError a malformed tag throws.
8555
+ const literalLocale = (arg) => ts.isStringLiteralLike(arg) &&
8556
+ /^[A-Za-z]{2,3}(-[A-Za-z]{4})?(-([A-Za-z]{2}|[0-9]{3}))?$/.test(arg.text);
8557
+ if (args.length > 2 || (args[0] && !undefinedArg(args[0]) && !literalLocale(args[0]))) {
8558
+ lowerer.noLowering("Intl.Segmenter locale negotiation", expr, "omit the locale, pass undefined, or pass one language tag as a string literal");
8559
+ }
8560
+ // JavaScript dependencies may construct word and sentence segmenters
8561
+ // that they use only on some paths (pi-tui's shared word segmenter):
8562
+ // the construction compiles and their segment() throws SC2020.
8563
+ // TypeScript sources keep the build-time refusal.
8564
+ const granularities = isJsSourceFile(ts.getSourceFileOfNode(expr))
8565
+ ? ["grapheme", "word", "sentence"]
8566
+ : ["grapheme"];
8353
8567
  const options = args[1];
8354
- if (options &&
8355
- !undefinedArg(options) &&
8356
- !(ts.isObjectLiteralExpression(options) &&
8357
- options.properties.nodes.every((property) => ts.isPropertyAssignment(property) &&
8358
- (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&
8359
- property.name.text === "granularity" &&
8360
- ts.isStringLiteral(property.initializer) &&
8361
- property.initializer.text === "grapheme"))) {
8362
- lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8568
+ let granularity = "grapheme";
8569
+ if (options && !undefinedArg(options)) {
8570
+ // An object literal of `granularity` entries (none: the default; a
8571
+ // repeated key: the last one, as in JavaScript).
8572
+ if (!ts.isObjectLiteralExpression(options))
8573
+ lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8574
+ for (const property of options.properties.nodes) {
8575
+ if (!ts.isPropertyAssignment(property) ||
8576
+ !(ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ||
8577
+ property.name.text !== "granularity" ||
8578
+ !ts.isStringLiteral(property.initializer) ||
8579
+ !granularities.includes(property.initializer.text)) {
8580
+ lowerer.noLowering("Intl.Segmenter options", options, 'the native segmenter supports default options and { granularity: "grapheme" }; word and sentence segmentation remain unsupported');
8581
+ }
8582
+ granularity = property.initializer.text;
8583
+ }
8363
8584
  }
8364
8585
  // Explicit undefined expressions can carry effects; retain argument order.
8365
8586
  const stmts = args.map((arg) => {
@@ -8370,7 +8591,22 @@ export function lowerNew(lowerer, expr) {
8370
8591
  loc: locOf(arg),
8371
8592
  };
8372
8593
  });
8373
- const result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
8594
+ let result = { kind: "libCall", fn: "intl.segmenterNew", args: [], type: DYN, loc };
8595
+ // A word or sentence segmenter carries its segment() refusal, which
8596
+ // coverage lists as deferred to runtime.
8597
+ if (granularity !== "grapheme") {
8598
+ const surface = `Intl.Segmenter segmentation with granularity '${granularity}'`;
8599
+ lowerer.runtimeFences.push(noLoweringDiag(surface, loc, "only grapheme segmenters segment; word and sentence segmenters construct"));
8600
+ const line = ts.getLineAndCharacterOfPosition(ts.getSourceFileOfNode(expr), loc.start).line;
8601
+ const refusal = `${surface} is not supported yet [SC2020 at ${loc.file}:${line + 1}]`;
8602
+ result = {
8603
+ kind: "libCall",
8604
+ fn: "intl.segmenterRefusing",
8605
+ args: [strLit(refusal, loc)],
8606
+ type: DYN,
8607
+ loc,
8608
+ };
8609
+ }
8374
8610
  return stmts.length ? { kind: "seqExpr", stmts, result, type: DYN, loc } : result;
8375
8611
  }
8376
8612
  // A package declaration without a compiled constructor cannot provide
@@ -8534,6 +8770,47 @@ export function lowerNew(lowerer, expr) {
8534
8770
  if (agent)
8535
8771
  return agent;
8536
8772
  }
8773
+ // `new crypto.X509Certificate(data)` — the Dirent-style data record:
8774
+ // the certificate's lowered members (fingerprint — the SHA-1 of the
8775
+ // DER, uppercase colon-separated — plus the validFrom/validTo
8776
+ // validity window in Node's ASN1_TIME_print shape) compute AT
8777
+ // CONSTRUCTION, when Node parses too, so unparseable input throws
8778
+ // Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
8779
+ // handle never exists. Both import forms (`crypto.X509Certificate`
8780
+ // through the namespace, named `X509Certificate`); Buffer input only
8781
+ // — the readFileSync idiom. mapType interns the matching record, so
8782
+ // locals and the composed member reads all flow. The data argument
8783
+ // feeds THREE field computations, so construction goes through an
8784
+ // interned helper whose parameter evaluates it exactly once.
8785
+ // It runs before the standard-library constructor fence below, which
8786
+ // also sees `const X = require("crypto").X509Certificate` as the
8787
+ // builtin class.
8788
+ {
8789
+ const callee = expr.expression;
8790
+ const isX509 = (ts.isPropertyAccessExpression(callee) &&
8791
+ callee.name.text === "X509Certificate" &&
8792
+ lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
8793
+ (ts.isIdentifier(callee) &&
8794
+ (() => {
8795
+ const bi = lowerer.builtinImportOf(callee);
8796
+ return bi?.module === "crypto" && bi.member === "X509Certificate";
8797
+ })());
8798
+ if (isX509) {
8799
+ const args = expr.arguments?.nodes ?? [];
8800
+ if (args.length !== 1) {
8801
+ lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
8802
+ }
8803
+ const data = lowerer.lowerExpr(args[0]);
8804
+ const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
8805
+ if (!isBytes && data.type.kind !== "string") {
8806
+ lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
8807
+ }
8808
+ const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
8809
+ if (t?.kind !== "record")
8810
+ lowerer.badType(expr, lowerer.typeOf(expr));
8811
+ return x509RecordCall(lowerer, data, t, loc);
8812
+ }
8813
+ }
8537
8814
  if (ts.isIdentifier(expr.expression) ||
8538
8815
  (ts.isPropertyAccessExpression(expr.expression) &&
8539
8816
  ts.isIdentifier(expr.expression.name) &&
@@ -8546,7 +8823,9 @@ export function lowerNew(lowerer, expr) {
8546
8823
  if (ts.isIdentifier(expr.expression))
8547
8824
  fenceEarlyAliasUse(lowerer, expr.expression, expr);
8548
8825
  const identifier = ts.isIdentifier(expr.expression) ? expr.expression : expr.expression.name;
8549
- const symbol = ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null;
8826
+ // `const SD = require("string_decoder").StringDecoder; new SD()`
8827
+ // constructs the member, as a named import of it does.
8828
+ const symbol = builtinMemberBindingTarget(lowerer, ts.isIdentifier(identifier) ? lowerer.resolveValueSymbol(identifier) : null);
8550
8829
  if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Array")) {
8551
8830
  return lowerArrayConstructor(lowerer, expr, expr.arguments?.nodes ?? []);
8552
8831
  }
@@ -8829,6 +9108,27 @@ export function lowerNew(lowerer, expr) {
8829
9108
  const time = { kind: "libCall", fn: "date.getTime", args: [arg], type: F64, loc };
8830
9109
  return { kind: "libCall", fn: "date.newMs", args: [time], type: DATE_T, loc };
8831
9110
  }
9111
+ // A union (`Date | string | number`) or checked-dynamic value: the
9112
+ // runtime's constructor reads a Date's time value, parses a string
9113
+ // and converts anything else to a primitive and a number.
9114
+ if ((arg.type.kind === "union" || arg.type.kind === "dyn") &&
9115
+ lowerer.dynConvertible(arg.type)) {
9116
+ const value = {
9117
+ kind: "libCall",
9118
+ fn: "date.nativeNewValue",
9119
+ args: [
9120
+ {
9121
+ kind: "dynArrLit",
9122
+ elems: [lowerer.coerceToExpected(arg, DYN)],
9123
+ type: DYN,
9124
+ loc,
9125
+ },
9126
+ ],
9127
+ type: DYN,
9128
+ loc,
9129
+ };
9130
+ return { kind: "libCall", fn: "date.checkedValue", args: [value], type: DATE_T, loc };
9131
+ }
8832
9132
  lowerer.noLowering(`new Date of '${lowerer.fmt(arg.type)}' values`, args[0], "pass milliseconds, a date string, or another Date value", symbol);
8833
9133
  }
8834
9134
  // `new StringDecoder(encoding?)` (node:string_decoder): the decoder
@@ -8953,7 +9253,12 @@ export function lowerNew(lowerer, expr) {
8953
9253
  // expression). The CONTEXTUAL type carries the annotation — adopt
8954
9254
  // it when it is a supported map. TS type arguments keep winning:
8955
9255
  // their expression type already maps.
8956
- if (mapped?.kind !== "map" || contextualSeed) {
9256
+ const inferred = initializedCollectionType(lowerer, expr);
9257
+ if (inferred) {
9258
+ tsType = inferred;
9259
+ mapped = lowerer.mapTypeOf(inferred);
9260
+ }
9261
+ else if (mapped?.kind !== "map" || contextualSeed) {
8957
9262
  const ctx = lowerer.checker.getContextualType(expr);
8958
9263
  const ctxMapped = ctx ? lowerer.mapTypeOf(ctx) : null;
8959
9264
  if (ctx && ctxMapped?.kind === "map") {
@@ -9063,7 +9368,8 @@ export function lowerNew(lowerer, expr) {
9063
9368
  // `new Set<T>()`: construct + bulk add from supported values,
9064
9369
  // including live collection cursors. Duplicates collapse in insertion order.
9065
9370
  if (ts.isIdentifier(identifier) && lowerer.isStdlibGlobal(identifier, "Set")) {
9066
- const tsType = lowerer.typeOf(expr);
9371
+ const inferred = initializedCollectionType(lowerer, expr);
9372
+ const tsType = inferred ?? lowerer.typeOf(expr);
9067
9373
  let mapped = lowerer.mapTypeOf(tsType);
9068
9374
  const fieldType = assignedThisFieldType(lowerer, expr);
9069
9375
  if (mapped?.kind !== "set" && fieldType?.kind === "set")
@@ -9222,79 +9528,6 @@ export function lowerNew(lowerer, expr) {
9222
9528
  lowerer.noLowering(`new ${expr.expression.text}`, expr, ctorHints[ts.isIdentifier(expr.expression) ? expr.expression.text : expr.expression.name.text], symbol);
9223
9529
  }
9224
9530
  }
9225
- // `new crypto.X509Certificate(data)` — the Dirent-style data record:
9226
- // the certificate's lowered members (fingerprint — the SHA-1 of the
9227
- // DER, uppercase colon-separated — plus the validFrom/validTo
9228
- // validity window in Node's ASN1_TIME_print shape) compute AT
9229
- // CONSTRUCTION, when Node parses too, so unparseable input throws
9230
- // Node's exact PEM error here (ERR_OSSL_PEM_NO_START_LINE) and the
9231
- // handle never exists. Both import forms (`crypto.X509Certificate`
9232
- // through the namespace, named `X509Certificate`); Buffer input only
9233
- // — the readFileSync idiom. mapType interns the matching record, so
9234
- // locals and the composed member reads all flow. The data argument
9235
- // feeds THREE field computations, so construction goes through an
9236
- // interned helper whose parameter evaluates it exactly once.
9237
- {
9238
- const callee = expr.expression;
9239
- const isX509 = (ts.isPropertyAccessExpression(callee) &&
9240
- callee.name.text === "X509Certificate" &&
9241
- lowerer.builtinNamespaceModuleOf(callee.expression) === "crypto") ||
9242
- (ts.isIdentifier(callee) &&
9243
- (() => {
9244
- const bi = lowerer.builtinImportOf(callee);
9245
- return bi?.module === "crypto" && bi.member === "X509Certificate";
9246
- })());
9247
- if (isX509) {
9248
- const args = expr.arguments?.nodes ?? [];
9249
- if (args.length !== 1) {
9250
- lowerer.noLowering("X509Certificate with this argument shape", expr, "the supported form is new X509Certificate(readFileSync(path))");
9251
- }
9252
- const data = lowerer.lowerExpr(args[0]);
9253
- const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
9254
- if (!isBytes && data.type.kind !== "string") {
9255
- lowerer.noLowering(`X509Certificate over '${lowerer.fmt(data.type)}' data`, args[0], "pass the certificate Buffer or PEM string (an fs.readFileSync result)");
9256
- }
9257
- const t = lowerer.mapTypeOf(lowerer.typeOf(expr));
9258
- if (t?.kind !== "record")
9259
- lowerer.badType(expr, lowerer.typeOf(expr));
9260
- const key = `x509.record:${isBytes ? "bytes" : "str"}`;
9261
- let helper = lowerer.valueHelpers.get(key);
9262
- if (!helper) {
9263
- helper = keyedHelperName(lowerer, "%x509.record", key);
9264
- lowerer.valueHelpers.set(key, helper);
9265
- const dataT = data.type;
9266
- const dRef = { kind: "varRef", localId: "d.0", type: dataT, loc };
9267
- const field = (name, fn) => ({
9268
- name,
9269
- value: { kind: "libCall", fn, args: [dRef], type: STRING, loc },
9270
- });
9271
- lowerer.liftedFns.push({
9272
- name: helper,
9273
- params: [{ localId: "d.0", name: "d", type: dataT }],
9274
- returnType: t,
9275
- locals: [{ id: "d.0", name: "d", type: dataT, mutable: false }],
9276
- body: [
9277
- {
9278
- kind: "return",
9279
- value: {
9280
- kind: "recordLit",
9281
- fields: [
9282
- field("fingerprint", isBytes ? "crypto.x509Fingerprint" : "crypto.x509FingerprintStr"),
9283
- field("validFrom", isBytes ? "crypto.x509ValidFrom" : "crypto.x509ValidFromStr"),
9284
- field("validTo", isBytes ? "crypto.x509ValidTo" : "crypto.x509ValidToStr"),
9285
- ],
9286
- type: t,
9287
- loc,
9288
- },
9289
- loc,
9290
- },
9291
- ],
9292
- loc,
9293
- });
9294
- }
9295
- return { kind: "call", callee: helper, args: [data], type: t, loc };
9296
- }
9297
- }
9298
9531
  // `new X(...)` through a class VALUE (a classval-typed binding, array
9299
9532
  // element, map read, param): the newValue dispatch through the class
9300
9533
  // object's construct thunk. Arguments complete against the STATIC
@@ -9333,9 +9566,108 @@ export function lowerNew(lowerer, expr) {
9333
9566
  if (info.generic) {
9334
9567
  lowerer.unsupported("SC1090", expr, "constructing through a class value of an uninstantiated generic type (annotate the slot with a concrete instantiation — e.g. 'new (v: number) => Box<number>')");
9335
9568
  }
9336
- const callee = lowerer.lowerExpr(expr.expression);
9569
+ let callee = lowerer.lowerExpr(expr.expression);
9337
9570
  if (callee.type.kind === "dyn")
9338
9571
  return lowerCheckedConstructor(lowerer, expr, callee);
9572
+ /** The union-typed element read a narrowing check guards, and the
9573
+ * check (`%new.callee`) that yields the class value or throws. */
9574
+ let narrowedCallee = null;
9575
+ // An array element read (`new T[0]()` over `[Dog, Animal]`, whose
9576
+ // checker type is the common base) keeps the undefined an index past
9577
+ // the end reads: the class value is narrowed out with a check, which
9578
+ // throws a TypeError for undefined.
9579
+ if (callee.type.kind === "union") {
9580
+ const arms = lowerer.unions.get(callee.type.unionId)?.arms ?? [];
9581
+ const classArms = arms.filter((arm) => arm.kind === "classval");
9582
+ if (classArms.length === 1 &&
9583
+ classArms[0].kind === "classval" &&
9584
+ classArms[0].className === calleeT.className &&
9585
+ arms.every((arm) => arm.kind === "classval" || arm.kind === "undefinedT")) {
9586
+ const unionT = callee.type;
9587
+ const helper = lowerer.narrowedArmHelper(unionT.unionId, calleeT, callee.loc);
9588
+ if (helper) {
9589
+ const loc = callee.loc;
9590
+ const name = `%new.callee:${unionT.unionId}`;
9591
+ if (!lowerer.liftedFns.some((fn) => fn.name === name)) {
9592
+ const undefinedTag = lowerer.armTag(unionT.unionId, UNDEFINED_T);
9593
+ const value = { kind: "varRef", localId: "value", type: unionT, loc };
9594
+ lowerer.liftedFns.push({
9595
+ name,
9596
+ params: [
9597
+ { localId: "value", name: "value", type: unionT },
9598
+ { localId: "message", name: "message", type: STRING },
9599
+ ],
9600
+ locals: [
9601
+ { id: "value", name: "value", type: unionT, mutable: false },
9602
+ { id: "message", name: "message", type: STRING, mutable: false },
9603
+ ],
9604
+ returnType: calleeT,
9605
+ body: [
9606
+ ...(undefinedTag >= 0
9607
+ ? [
9608
+ {
9609
+ kind: "if",
9610
+ cond: {
9611
+ kind: "unionIsTag",
9612
+ unionId: unionT.unionId,
9613
+ tag: undefinedTag,
9614
+ negated: false,
9615
+ value,
9616
+ type: BOOL,
9617
+ loc,
9618
+ },
9619
+ then: [
9620
+ {
9621
+ kind: "throw",
9622
+ value: {
9623
+ kind: "libCall",
9624
+ fn: "error.new",
9625
+ args: [{ kind: "varRef", localId: "message", type: STRING, loc }],
9626
+ type: { kind: "object", className: "%TypeError" },
9627
+ loc,
9628
+ },
9629
+ loc,
9630
+ },
9631
+ ],
9632
+ else_: null,
9633
+ loc,
9634
+ },
9635
+ ]
9636
+ : []),
9637
+ {
9638
+ kind: "return",
9639
+ value: lowerer.checkedNarrowCall(helper, value, calleeT, loc),
9640
+ loc,
9641
+ },
9642
+ ],
9643
+ loc,
9644
+ });
9645
+ }
9646
+ // JavaScript evaluates the arguments before it checks that the
9647
+ // callee constructs, so the check runs at the construction
9648
+ // (checkedElementConstruction).
9649
+ narrowedCallee = {
9650
+ read: callee,
9651
+ check: name,
9652
+ unionT,
9653
+ calleeT,
9654
+ message: {
9655
+ kind: "strLit",
9656
+ value: `${expr.expression.getText()} is not a constructor`,
9657
+ type: STRING,
9658
+ loc,
9659
+ },
9660
+ };
9661
+ callee = {
9662
+ kind: "call",
9663
+ callee: name,
9664
+ args: [callee, narrowedCallee.message],
9665
+ type: calleeT,
9666
+ loc,
9667
+ };
9668
+ }
9669
+ }
9670
+ }
9339
9671
  if (callee.type.kind !== "classval")
9340
9672
  lowerer.badType(expr.expression, lowerer.typeOf(expr.expression));
9341
9673
  lowerer.noteEdge(classValueConstructor(info.def).fn);
@@ -9361,13 +9693,15 @@ export function lowerNew(lowerer, expr) {
9361
9693
  refuseInheritedBuiltinCtorArgs(lowerer, info, expr);
9362
9694
  defineClassValueConstruct(lowerer, info);
9363
9695
  const args = lowerer.completeArgs(expr.arguments?.nodes ?? [], classValueParams(info), loc, expr);
9364
- const built = constructedFromValue(lowerer, info, {
9365
- kind: "newValue",
9366
- callee,
9367
- args,
9368
- type: { kind: "object", className: info.def.name },
9369
- loc,
9370
- }, expr);
9696
+ const built = constructedFromValue(lowerer, info, narrowedCallee !== null
9697
+ ? checkedElementConstruction(lowerer, info, narrowedCallee, args, loc)
9698
+ : {
9699
+ kind: "newValue",
9700
+ callee,
9701
+ args,
9702
+ type: { kind: "object", className: info.def.name },
9703
+ loc,
9704
+ }, expr);
9371
9705
  // A runtime class slot widened from a union (`[Readable, Writable]`'s
9372
9706
  // elements hold EventEmitter values): the checker types the result as
9373
9707
  // the union of the arms' instances, which the checked class view
@@ -9502,14 +9836,149 @@ function genericFieldFnNodeOf(member) {
9502
9836
  }
9503
9837
  return null;
9504
9838
  }
9839
+ /** The lifted `new crypto.X509Certificate(d)` constructor: raw decodes the
9840
+ * input once (Node's PEM error throws here), and every other field reads
9841
+ * raw. subjectAltName, infoAccess and signatureAlgorithm hold undefined
9842
+ * where the runtime answers "". */
9843
+ /** The X509Certificate record `t` built from `data`, a certificate Buffer
9844
+ * (PEM or DER) or PEM string, through the interned constructor helper.
9845
+ * `der` marks a Buffer known to hold a certificate's DER (a TLS socket's),
9846
+ * which is read without looking for PEM armor inside it. */
9847
+ export function x509RecordCall(lowerer, data, t, loc, der = false) {
9848
+ const isBytes = data.type.kind === "bytes" && data.type.elem === "u8";
9849
+ const key = `x509.record:${der ? "der" : isBytes ? "bytes" : "str"}`;
9850
+ let helper = lowerer.valueHelpers.get(key);
9851
+ if (!helper) {
9852
+ helper = keyedHelperName(lowerer, "%x509.record", key);
9853
+ lowerer.valueHelpers.set(key, helper);
9854
+ lowerer.liftedFns.push(x509RecordHelper(lowerer, helper, data.type, t, isBytes, der, loc));
9855
+ }
9856
+ return { kind: "call", callee: helper, args: [data], type: t, loc };
9857
+ }
9858
+ function x509RecordHelper(lowerer, name, dataT, t, isBytes, der, loc) {
9859
+ const shape = lowerer.shapes.get(t.shapeId);
9860
+ if (!shape)
9861
+ throw new InternalCompilerError("lowerer bug: X509Certificate shape unregistered");
9862
+ const raw = { kind: "varRef", localId: "raw.0", type: BYTES_U8, loc };
9863
+ const call = (fn, type) => ({
9864
+ kind: "libCall",
9865
+ fn,
9866
+ args: [raw],
9867
+ type,
9868
+ loc,
9869
+ });
9870
+ const locals = [
9871
+ { id: "d.0", name: "d", type: dataT, mutable: false },
9872
+ { id: "raw.0", name: "raw", type: BYTES_U8, mutable: false },
9873
+ ];
9874
+ const decls = [
9875
+ {
9876
+ kind: "varDecl",
9877
+ localId: "raw.0",
9878
+ init: {
9879
+ kind: "libCall",
9880
+ fn: der ? "crypto.x509RawDer" : isBytes ? "crypto.x509Raw" : "crypto.x509RawStr",
9881
+ args: [{ kind: "varRef", localId: "d.0", type: dataT, loc }],
9882
+ type: BYTES_U8,
9883
+ loc,
9884
+ },
9885
+ loc,
9886
+ },
9887
+ ];
9888
+ const validTime = (fn) => ({
9889
+ kind: "libCall",
9890
+ fn: "date.newString",
9891
+ args: [call(fn, STRING)],
9892
+ type: DATE_T,
9893
+ loc,
9894
+ });
9895
+ const values = {
9896
+ ca: () => call("crypto.x509Ca", BOOL),
9897
+ fingerprint: () => call("crypto.x509Fingerprint", STRING),
9898
+ fingerprint256: () => call("crypto.x509Fingerprint256", STRING),
9899
+ fingerprint512: () => call("crypto.x509Fingerprint512", STRING),
9900
+ subject: () => call("crypto.x509Subject", STRING),
9901
+ subjectAltName: (type) => optionalText("san", "crypto.x509SubjectAltName", type),
9902
+ infoAccess: (type) => optionalText("access", "crypto.x509InfoAccess", type),
9903
+ issuer: () => call("crypto.x509Issuer", STRING),
9904
+ raw: () => raw,
9905
+ serialNumber: () => call("crypto.x509SerialNumber", STRING),
9906
+ signatureAlgorithm: (type) => optionalText("sigalg", "crypto.x509SignatureAlgorithm", type),
9907
+ signatureAlgorithmOid: () => call("crypto.x509SignatureAlgorithmOid", STRING),
9908
+ validFrom: () => call("crypto.x509ValidFrom", STRING),
9909
+ validFromDate: () => validTime("crypto.x509ValidFrom"),
9910
+ validTo: () => call("crypto.x509ValidTo", STRING),
9911
+ validToDate: () => validTime("crypto.x509ValidTo"),
9912
+ [X509_PUBLIC_KEY_FIELD]: () => ({
9913
+ kind: "dynFrom",
9914
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
9915
+ type: DYN,
9916
+ loc,
9917
+ }),
9918
+ // A copy: writes into `raw` must not reach the methods.
9919
+ [X509_DER_FIELD]: () => call("crypto.x509RawDer", BYTES_U8),
9920
+ };
9921
+ /** A string | undefined field: the runtime's text, or undefined for "". */
9922
+ function optionalText(local, fn, type) {
9923
+ if (type.kind !== "union")
9924
+ throw new InternalCompilerError("lowerer bug: X509Certificate optional field type");
9925
+ const def = lowerer.unions.get(type.unionId);
9926
+ const stringTag = def ? def.arms.findIndex((a) => a.kind === "string") : -1;
9927
+ const undefinedTag = def ? def.arms.findIndex((a) => a.kind === "undefinedT") : -1;
9928
+ if (stringTag < 0 || undefinedTag < 0)
9929
+ throw new InternalCompilerError("lowerer bug: X509Certificate optional field arms");
9930
+ const id = `${local}.0`;
9931
+ locals.push({ id, name: local, type: STRING, mutable: false });
9932
+ decls.push({ kind: "varDecl", localId: id, init: call(fn, STRING), loc });
9933
+ const text = { kind: "varRef", localId: id, type: STRING, loc };
9934
+ return {
9935
+ kind: "ternary",
9936
+ cond: {
9937
+ kind: "strEq",
9938
+ negated: false,
9939
+ left: text,
9940
+ right: { kind: "strLit", value: "", type: STRING, loc },
9941
+ type: BOOL,
9942
+ loc,
9943
+ },
9944
+ then: {
9945
+ kind: "unionWrap",
9946
+ unionId: type.unionId,
9947
+ tag: undefinedTag,
9948
+ value: { kind: "unitLit", unit: "undefined", type: UNDEFINED_T, loc },
9949
+ type,
9950
+ loc,
9951
+ },
9952
+ else_: { kind: "unionWrap", unionId: type.unionId, tag: stringTag, value: text, type, loc },
9953
+ type,
9954
+ loc,
9955
+ };
9956
+ }
9957
+ const fields = shape.fields.map((f) => {
9958
+ const value = values[f.name];
9959
+ if (!value)
9960
+ throw new InternalCompilerError(`lowerer bug: X509Certificate field ${f.name}`);
9961
+ return { name: f.name, value: value(f.type) };
9962
+ });
9963
+ return {
9964
+ name,
9965
+ params: [{ localId: "d.0", name: "d", type: dataT }],
9966
+ returnType: t,
9967
+ locals,
9968
+ body: [...decls, { kind: "return", value: { kind: "recordLit", fields, type: t, loc }, loc }],
9969
+ loc,
9970
+ };
9971
+ }
9505
9972
  /** Whether a JavaScript class's own binding is the target of
9506
- * `Object.defineProperty`/`defineProperties` in its file
9507
- * (`Object.defineProperty(Definition, "name", { value })`): its constructor
9973
+ * `Object.defineProperty`/`defineProperties` or `Reflect.deleteProperty` in
9974
+ * its file (`Object.defineProperty(Definition, "name", { value })`,
9975
+ * `Reflect.deleteProperty(Response, "getResponseState")`): its constructor
9508
9976
  * then needs a live own-property table. */
9509
9977
  function definedThroughReflection(lowerer, decl) {
9510
9978
  const name = decl.name;
9511
9979
  const sf = ts.getSourceFileOfNode(decl);
9512
- if (name === undefined || !sf.text.includes("definePropert"))
9980
+ if (name === undefined ||
9981
+ (!sf.text.includes("definePropert") && !sf.text.includes("deleteProperty")))
9513
9982
  return false;
9514
9983
  const symbol = lowerer.checker.getSymbolAtLocation(name);
9515
9984
  if (symbol === undefined)
@@ -9520,9 +9989,11 @@ function definedThroughReflection(lowerer, decl) {
9520
9989
  return "stop";
9521
9990
  if (ts.isCallExpression(node) &&
9522
9991
  ts.isPropertyAccessExpression(node.expression) &&
9523
- (node.expression.name.text === "defineProperty" ||
9992
+ (((node.expression.name.text === "defineProperty" ||
9524
9993
  node.expression.name.text === "defineProperties") &&
9525
- lowerer.stdlibGlobalMember(node.expression, "Object") !== null) {
9994
+ lowerer.stdlibGlobalMember(node.expression, "Object") !== null) ||
9995
+ (node.expression.name.text === "deleteProperty" &&
9996
+ lowerer.stdlibGlobalMember(node.expression, "Reflect") !== null))) {
9526
9997
  const target = node.arguments.nodes[0];
9527
9998
  if (target !== undefined &&
9528
9999
  ts.isIdentifier(target) &&