@scriptc/compiler 0.4.5 → 0.4.6

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 (1200) hide show
  1. package/ambient/node-fallback/assert-strict.d.ts +47 -0
  2. package/ambient/node-fallback/assert.d.ts +86 -0
  3. package/ambient/node-fallback/async_hooks.d.ts +41 -0
  4. package/ambient/node-fallback/buffer.d.ts +23 -0
  5. package/ambient/node-fallback/child_process.d.ts +242 -0
  6. package/ambient/node-fallback/cluster.d.ts +17 -0
  7. package/ambient/node-fallback/constants.d.ts +15 -0
  8. package/ambient/node-fallback/crypto.d.ts +837 -0
  9. package/ambient/node-fallback/dgram.d.ts +58 -0
  10. package/ambient/node-fallback/diagnostics_channel.d.ts +87 -0
  11. package/ambient/node-fallback/dns-promises.d.ts +27 -0
  12. package/ambient/node-fallback/dns.d.ts +65 -0
  13. package/ambient/node-fallback/events.d.ts +60 -0
  14. package/ambient/node-fallback/fs-promises.d.ts +225 -0
  15. package/ambient/node-fallback/fs.d.ts +641 -0
  16. package/ambient/node-fallback/graceful-fs.d.ts +9 -0
  17. package/ambient/node-fallback/http.d.ts +326 -0
  18. package/ambient/node-fallback/http2.d.ts +816 -0
  19. package/ambient/node-fallback/https.d.ts +59 -0
  20. package/ambient/node-fallback/module.d.ts +10 -0
  21. package/ambient/node-fallback/net.d.ts +374 -0
  22. package/ambient/node-fallback/os.d.ts +288 -0
  23. package/ambient/node-fallback/path-posix.d.ts +22 -0
  24. package/ambient/node-fallback/path-win32.d.ts +22 -0
  25. package/ambient/node-fallback/path.d.ts +55 -0
  26. package/ambient/node-fallback/process.d.ts +11 -0
  27. package/ambient/node-fallback/punycode.d.ts +18 -0
  28. package/ambient/node-fallback/querystring.d.ts +55 -0
  29. package/ambient/node-fallback/stream-consumers.d.ts +21 -0
  30. package/ambient/node-fallback/stream-promises.d.ts +28 -0
  31. package/ambient/node-fallback/stream-web.d.ts +36 -0
  32. package/ambient/node-fallback/stream.d.ts +644 -0
  33. package/ambient/node-fallback/string_decoder.d.ts +20 -0
  34. package/ambient/node-fallback/test.d.ts +236 -0
  35. package/ambient/node-fallback/timers-promises.d.ts +31 -0
  36. package/ambient/node-fallback/timers.d.ts +28 -0
  37. package/ambient/node-fallback/tls.d.ts +169 -0
  38. package/ambient/node-fallback/url.d.ts +95 -0
  39. package/ambient/node-fallback/util-types.d.ts +50 -0
  40. package/ambient/node-fallback/util.d.ts +416 -0
  41. package/ambient/node-fallback/v8.d.ts +43 -0
  42. package/ambient/node-fallback/worker_threads.d.ts +113 -0
  43. package/ambient/node-fallback/zlib.d.ts +422 -0
  44. package/ambient/scriptc-node-fallback.d.ts +224 -6688
  45. package/dist/backend/cycle-analysis.js +4 -0
  46. package/dist/backend/cycle-analysis.js.map +1 -1
  47. package/dist/backend/executable-features.d.ts +1 -1
  48. package/dist/backend/executable-features.js +15 -2
  49. package/dist/backend/executable-features.js.map +1 -1
  50. package/dist/backend/huge-text.d.ts +16 -0
  51. package/dist/backend/huge-text.js +103 -0
  52. package/dist/backend/huge-text.js.map +1 -0
  53. package/dist/backend/huge-text.test.d.ts +1 -0
  54. package/dist/backend/huge-text.test.js +73 -0
  55. package/dist/backend/huge-text.test.js.map +1 -0
  56. package/dist/backend/library-pack.js +1 -1
  57. package/dist/backend/library-pack.js.map +1 -1
  58. package/dist/backend/link-plan-core.d.ts +10 -0
  59. package/dist/backend/link-plan-core.js +14 -2
  60. package/dist/backend/link-plan-core.js.map +1 -1
  61. package/dist/backend/link-plan-core.test.d.ts +1 -0
  62. package/dist/backend/link-plan-core.test.js +20 -0
  63. package/dist/backend/link-plan-core.test.js.map +1 -0
  64. package/dist/backend/link-plan.d.ts +8 -0
  65. package/dist/backend/link-plan.js +7 -0
  66. package/dist/backend/link-plan.js.map +1 -1
  67. package/dist/backend/linker.js +37 -14
  68. package/dist/backend/linker.js.map +1 -1
  69. package/dist/backend/lld.d.ts +13 -0
  70. package/dist/backend/lld.js +18 -1
  71. package/dist/backend/lld.js.map +1 -1
  72. package/dist/backend/lld.test.js +7 -1
  73. package/dist/backend/lld.test.js.map +1 -1
  74. package/dist/backend/llvm/alloc.d.ts +2 -0
  75. package/dist/backend/llvm/alloc.js +1 -1
  76. package/dist/backend/llvm/alloc.js.map +1 -1
  77. package/dist/backend/llvm/arenas.d.ts +78 -0
  78. package/dist/backend/llvm/arenas.js +313 -0
  79. package/dist/backend/llvm/arenas.js.map +1 -0
  80. package/dist/backend/llvm/arenas.test.d.ts +1 -0
  81. package/dist/backend/llvm/arenas.test.js +140 -0
  82. package/dist/backend/llvm/arenas.test.js.map +1 -0
  83. package/dist/backend/llvm/blocks.d.ts +11 -1
  84. package/dist/backend/llvm/blocks.js +23 -5
  85. package/dist/backend/llvm/blocks.js.map +1 -1
  86. package/dist/backend/llvm/bytes-headers.d.ts +19 -0
  87. package/dist/backend/llvm/bytes-headers.js +55 -0
  88. package/dist/backend/llvm/bytes-headers.js.map +1 -0
  89. package/dist/backend/llvm/bytes-loop-versions.d.ts +4 -3
  90. package/dist/backend/llvm/bytes-loop-versions.js +42 -7
  91. package/dist/backend/llvm/bytes-loop-versions.js.map +1 -1
  92. package/dist/backend/llvm/bytes-loop-versions.test.js +39 -4
  93. package/dist/backend/llvm/bytes-loop-versions.test.js.map +1 -1
  94. package/dist/backend/llvm/call-lifetimes.d.ts +5 -0
  95. package/dist/backend/llvm/call-lifetimes.js +43 -8
  96. package/dist/backend/llvm/call-lifetimes.js.map +1 -1
  97. package/dist/backend/llvm/call-lifetimes.test.js +26 -0
  98. package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
  99. package/dist/backend/llvm/checked-narrows.d.ts +3 -0
  100. package/dist/backend/llvm/checked-narrows.js +8 -1
  101. package/dist/backend/llvm/checked-narrows.js.map +1 -1
  102. package/dist/backend/llvm/class-unions.d.ts +21 -0
  103. package/dist/backend/llvm/class-unions.js +141 -0
  104. package/dist/backend/llvm/class-unions.js.map +1 -0
  105. package/dist/backend/llvm/class-unions.test.d.ts +1 -0
  106. package/dist/backend/llvm/class-unions.test.js +137 -0
  107. package/dist/backend/llvm/class-unions.test.js.map +1 -0
  108. package/dist/backend/llvm/classes.d.ts +46 -8
  109. package/dist/backend/llvm/classes.js +259 -32
  110. package/dist/backend/llvm/classes.js.map +1 -1
  111. package/dist/backend/llvm/classes.test.js +4 -0
  112. package/dist/backend/llvm/classes.test.js.map +1 -1
  113. package/dist/backend/llvm/common.d.ts +23 -0
  114. package/dist/backend/llvm/common.js +34 -0
  115. package/dist/backend/llvm/common.js.map +1 -1
  116. package/dist/backend/llvm/constant-callbacks.test.js +39 -0
  117. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  118. package/dist/backend/llvm/constant-choices.d.ts +32 -0
  119. package/dist/backend/llvm/constant-choices.js +209 -0
  120. package/dist/backend/llvm/constant-choices.js.map +1 -0
  121. package/dist/backend/llvm/constant-choices.test.d.ts +1 -0
  122. package/dist/backend/llvm/constant-choices.test.js +94 -0
  123. package/dist/backend/llvm/constant-choices.test.js.map +1 -0
  124. package/dist/backend/llvm/counted-loops.d.ts +14 -2
  125. package/dist/backend/llvm/counted-loops.js +60 -7
  126. package/dist/backend/llvm/counted-loops.js.map +1 -1
  127. package/dist/backend/llvm/counted-loops.test.d.ts +1 -0
  128. package/dist/backend/llvm/counted-loops.test.js +34 -0
  129. package/dist/backend/llvm/counted-loops.test.js.map +1 -0
  130. package/dist/backend/llvm/cpu-dispatch.d.ts +26 -0
  131. package/dist/backend/llvm/cpu-dispatch.js +279 -0
  132. package/dist/backend/llvm/cpu-dispatch.js.map +1 -0
  133. package/dist/backend/llvm/dense-array-access.d.ts +13 -2
  134. package/dist/backend/llvm/dense-array-access.js +60 -6
  135. package/dist/backend/llvm/dense-array-access.js.map +1 -1
  136. package/dist/backend/llvm/dyn-handle-tags.test.js +40 -14
  137. package/dist/backend/llvm/dyn-handle-tags.test.js.map +1 -1
  138. package/dist/backend/llvm/dyn.d.ts +28 -2
  139. package/dist/backend/llvm/dyn.js +176 -27
  140. package/dist/backend/llvm/dyn.js.map +1 -1
  141. package/dist/backend/llvm/emit-function.js +25 -3
  142. package/dist/backend/llvm/emit-function.js.map +1 -1
  143. package/dist/backend/llvm/emit-journal.d.ts +1 -0
  144. package/dist/backend/llvm/emit-journal.js.map +1 -1
  145. package/dist/backend/llvm/emit-module.d.ts +5 -3
  146. package/dist/backend/llvm/emit-module.js +362 -74
  147. package/dist/backend/llvm/emit-module.js.map +1 -1
  148. package/dist/backend/llvm/emit-statements.js +327 -59
  149. package/dist/backend/llvm/emit-statements.js.map +1 -1
  150. package/dist/backend/llvm/emitter.d.ts +223 -33
  151. package/dist/backend/llvm/emitter.js +713 -100
  152. package/dist/backend/llvm/emitter.js.map +1 -1
  153. package/dist/backend/llvm/emitter.test.js +20 -1
  154. package/dist/backend/llvm/emitter.test.js.map +1 -1
  155. package/dist/backend/llvm/expr-async.js +32 -6
  156. package/dist/backend/llvm/expr-async.js.map +1 -1
  157. package/dist/backend/llvm/expr-bytes.d.ts +9 -1
  158. package/dist/backend/llvm/expr-bytes.js +105 -9
  159. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  160. package/dist/backend/llvm/expr-callbacks.d.ts +1 -1
  161. package/dist/backend/llvm/expr-callbacks.js +29 -22
  162. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  163. package/dist/backend/llvm/expr-calls.d.ts +0 -4
  164. package/dist/backend/llvm/expr-calls.js +116 -14
  165. package/dist/backend/llvm/expr-calls.js.map +1 -1
  166. package/dist/backend/llvm/expr-containers.js +77 -12
  167. package/dist/backend/llvm/expr-containers.js.map +1 -1
  168. package/dist/backend/llvm/expr-context.d.ts +22 -0
  169. package/dist/backend/llvm/expr-control.d.ts +4 -0
  170. package/dist/backend/llvm/expr-control.js +485 -426
  171. package/dist/backend/llvm/expr-control.js.map +1 -1
  172. package/dist/backend/llvm/expr-dispatch.js +4 -0
  173. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  174. package/dist/backend/llvm/expr-dynamic.js +3 -3
  175. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  176. package/dist/backend/llvm/expr-primitives.d.ts +6 -0
  177. package/dist/backend/llvm/expr-primitives.js +119 -58
  178. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  179. package/dist/backend/llvm/expr-primitives.test.js +11 -2
  180. package/dist/backend/llvm/expr-primitives.test.js.map +1 -1
  181. package/dist/backend/llvm/expr-records.d.ts +36 -4
  182. package/dist/backend/llvm/expr-records.js +249 -37
  183. package/dist/backend/llvm/expr-records.js.map +1 -1
  184. package/dist/backend/llvm/expr-stream-bridges.js +124 -7
  185. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  186. package/dist/backend/llvm/expr-stream-bridges.test.js +1 -1
  187. package/dist/backend/llvm/expr-stream-bridges.test.js.map +1 -1
  188. package/dist/backend/llvm/expr-stream-callbacks.js +13 -14
  189. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  190. package/dist/backend/llvm/frame-escapes.d.ts +11 -0
  191. package/dist/backend/llvm/frame-escapes.js +219 -0
  192. package/dist/backend/llvm/frame-escapes.js.map +1 -0
  193. package/dist/backend/llvm/function-layout.d.ts +15 -0
  194. package/dist/backend/llvm/function-layout.js +40 -0
  195. package/dist/backend/llvm/function-layout.js.map +1 -0
  196. package/dist/backend/llvm/heap-census.d.ts +34 -0
  197. package/dist/backend/llvm/heap-census.js +163 -0
  198. package/dist/backend/llvm/heap-census.js.map +1 -0
  199. package/dist/backend/llvm/inline-arrays.d.ts +41 -0
  200. package/dist/backend/llvm/inline-arrays.js +195 -0
  201. package/dist/backend/llvm/inline-arrays.js.map +1 -0
  202. package/dist/backend/llvm/int32-kind-loops.js +2 -0
  203. package/dist/backend/llvm/int32-kind-loops.js.map +1 -1
  204. package/dist/backend/llvm/integer-clones.d.ts +32 -5
  205. package/dist/backend/llvm/integer-clones.js +237 -44
  206. package/dist/backend/llvm/integer-clones.js.map +1 -1
  207. package/dist/backend/llvm/integer-clones.test.js +120 -0
  208. package/dist/backend/llvm/integer-clones.test.js.map +1 -1
  209. package/dist/backend/llvm/iterative-teardown.test.d.ts +1 -0
  210. package/dist/backend/llvm/iterative-teardown.test.js +62 -0
  211. package/dist/backend/llvm/iterative-teardown.test.js.map +1 -0
  212. package/dist/backend/llvm/js-ic.js +246 -62
  213. package/dist/backend/llvm/js-ic.js.map +1 -1
  214. package/dist/backend/llvm/lib-connect.js +1 -1
  215. package/dist/backend/llvm/lib-connect.js.map +1 -1
  216. package/dist/backend/llvm/lib-datagram.js +2 -2
  217. package/dist/backend/llvm/lib-datagram.js.map +1 -1
  218. package/dist/backend/llvm/lib-dispatch.js +153 -16
  219. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  220. package/dist/backend/llvm/lib-filesystem.d.ts +8 -0
  221. package/dist/backend/llvm/lib-filesystem.js +48 -4
  222. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  223. package/dist/backend/llvm/lib-http2.js +4 -3
  224. package/dist/backend/llvm/lib-http2.js.map +1 -1
  225. package/dist/backend/llvm/lib-lookup.js +1 -1
  226. package/dist/backend/llvm/lib-lookup.js.map +1 -1
  227. package/dist/backend/llvm/lib-network.js +15 -1
  228. package/dist/backend/llvm/lib-network.js.map +1 -1
  229. package/dist/backend/llvm/lib-process.js +32 -8
  230. package/dist/backend/llvm/lib-process.js.map +1 -1
  231. package/dist/backend/llvm/lib-shared.d.ts +3 -0
  232. package/dist/backend/llvm/lib-shared.js +191 -28
  233. package/dist/backend/llvm/lib-shared.js.map +1 -1
  234. package/dist/backend/llvm/lib-stream.js +1 -1
  235. package/dist/backend/llvm/lib-stream.js.map +1 -1
  236. package/dist/backend/llvm/local-array-reads.js +15 -1
  237. package/dist/backend/llvm/local-array-reads.js.map +1 -1
  238. package/dist/backend/llvm/local-array-reads.test.js +1 -1
  239. package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
  240. package/dist/backend/llvm/local-extents.d.ts +22 -0
  241. package/dist/backend/llvm/local-extents.js +102 -0
  242. package/dist/backend/llvm/local-extents.js.map +1 -1
  243. package/dist/backend/llvm/local-union-storage.js +15 -2
  244. package/dist/backend/llvm/local-union-storage.js.map +1 -1
  245. package/dist/backend/llvm/local-union-storage.test.js +1 -1
  246. package/dist/backend/llvm/local-union-storage.test.js.map +1 -1
  247. package/dist/backend/llvm/loop-callees.d.ts +21 -0
  248. package/dist/backend/llvm/loop-callees.js +119 -0
  249. package/dist/backend/llvm/loop-callees.js.map +1 -0
  250. package/dist/backend/llvm/loop-callees.test.d.ts +1 -0
  251. package/dist/backend/llvm/loop-callees.test.js +65 -0
  252. package/dist/backend/llvm/loop-callees.test.js.map +1 -0
  253. package/dist/backend/llvm/loop-entry-versions.d.ts +17 -0
  254. package/dist/backend/llvm/loop-entry-versions.js +185 -0
  255. package/dist/backend/llvm/loop-entry-versions.js.map +1 -0
  256. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  257. package/dist/backend/llvm/map-number-lookup.test.js +13 -4
  258. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  259. package/dist/backend/llvm/map-read-lifetimes.d.ts +11 -0
  260. package/dist/backend/llvm/map-read-lifetimes.js +51 -1
  261. package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
  262. package/dist/backend/llvm/map-read-lifetimes.test.js +6 -3
  263. package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
  264. package/dist/backend/llvm/nullable-unions.d.ts +67 -10
  265. package/dist/backend/llvm/nullable-unions.js +218 -22
  266. package/dist/backend/llvm/nullable-unions.js.map +1 -1
  267. package/dist/backend/llvm/nullable-unions.test.js +124 -1
  268. package/dist/backend/llvm/nullable-unions.test.js.map +1 -1
  269. package/dist/backend/llvm/periodic-guards.d.ts +16 -0
  270. package/dist/backend/llvm/periodic-guards.js +91 -0
  271. package/dist/backend/llvm/periodic-guards.js.map +1 -0
  272. package/dist/backend/llvm/periodic-guards.test.d.ts +1 -0
  273. package/dist/backend/llvm/periodic-guards.test.js +64 -0
  274. package/dist/backend/llvm/periodic-guards.test.js.map +1 -0
  275. package/dist/backend/llvm/publish.d.ts +12 -2
  276. package/dist/backend/llvm/publish.js +15 -8
  277. package/dist/backend/llvm/publish.js.map +1 -1
  278. package/dist/backend/llvm/rebound-parameters.d.ts +4 -1
  279. package/dist/backend/llvm/rebound-parameters.js +17 -1
  280. package/dist/backend/llvm/rebound-parameters.js.map +1 -1
  281. package/dist/backend/llvm/receivers.d.ts +7 -0
  282. package/dist/backend/llvm/receivers.js +77 -10
  283. package/dist/backend/llvm/receivers.js.map +1 -1
  284. package/dist/backend/llvm/record-union-keys.test.js +29 -0
  285. package/dist/backend/llvm/record-union-keys.test.js.map +1 -1
  286. package/dist/backend/llvm/record-views.d.ts +29 -0
  287. package/dist/backend/llvm/record-views.js +249 -0
  288. package/dist/backend/llvm/record-views.js.map +1 -0
  289. package/dist/backend/llvm/record-views.test.d.ts +1 -0
  290. package/dist/backend/llvm/record-views.test.js +118 -0
  291. package/dist/backend/llvm/record-views.test.js.map +1 -0
  292. package/dist/backend/llvm/reference-writes.js +21 -0
  293. package/dist/backend/llvm/reference-writes.js.map +1 -1
  294. package/dist/backend/llvm/reference-writes.test.js +42 -0
  295. package/dist/backend/llvm/reference-writes.test.js.map +1 -1
  296. package/dist/backend/llvm/regex-matchers.d.ts +5 -1
  297. package/dist/backend/llvm/regex-matchers.js +173 -21
  298. package/dist/backend/llvm/regex-matchers.js.map +1 -1
  299. package/dist/backend/llvm/regex-matchers.test.js +39 -1
  300. package/dist/backend/llvm/regex-matchers.test.js.map +1 -1
  301. package/dist/backend/llvm/region-groups.d.ts +67 -0
  302. package/dist/backend/llvm/region-groups.js +1719 -0
  303. package/dist/backend/llvm/region-groups.js.map +1 -0
  304. package/dist/backend/llvm/region-groups.test.d.ts +1 -0
  305. package/dist/backend/llvm/region-groups.test.js +197 -0
  306. package/dist/backend/llvm/region-groups.test.js.map +1 -0
  307. package/dist/backend/llvm/region-ir.d.ts +31 -0
  308. package/dist/backend/llvm/region-ir.js +256 -0
  309. package/dist/backend/llvm/region-ir.js.map +1 -0
  310. package/dist/backend/llvm/region-sites.d.ts +20 -0
  311. package/dist/backend/llvm/region-sites.js +327 -0
  312. package/dist/backend/llvm/region-sites.js.map +1 -0
  313. package/dist/backend/llvm/region-sites.test.d.ts +1 -0
  314. package/dist/backend/llvm/region-sites.test.js +216 -0
  315. package/dist/backend/llvm/region-sites.test.js.map +1 -0
  316. package/dist/backend/llvm/repr-report.d.ts +9 -0
  317. package/dist/backend/llvm/repr-report.js +143 -0
  318. package/dist/backend/llvm/repr-report.js.map +1 -0
  319. package/dist/backend/llvm/repr-report.test.d.ts +1 -0
  320. package/dist/backend/llvm/repr-report.test.js +62 -0
  321. package/dist/backend/llvm/repr-report.test.js.map +1 -0
  322. package/dist/backend/llvm/runtime-registries.test.d.ts +1 -0
  323. package/dist/backend/llvm/runtime-registries.test.js +88 -0
  324. package/dist/backend/llvm/runtime-registries.test.js.map +1 -0
  325. package/dist/backend/llvm/serialized-ir-emission.test.js +1 -0
  326. package/dist/backend/llvm/serialized-ir-emission.test.js.map +1 -1
  327. package/dist/backend/llvm/shape-union-tags.test.d.ts +1 -0
  328. package/dist/backend/llvm/shape-union-tags.test.js +75 -0
  329. package/dist/backend/llvm/shape-union-tags.test.js.map +1 -0
  330. package/dist/backend/llvm/shapes.d.ts +60 -10
  331. package/dist/backend/llvm/shapes.js +233 -51
  332. package/dist/backend/llvm/shapes.js.map +1 -1
  333. package/dist/backend/llvm/shapes.test.js +37 -18
  334. package/dist/backend/llvm/shapes.test.js.map +1 -1
  335. package/dist/backend/llvm/speculative-integers.d.ts +3 -0
  336. package/dist/backend/llvm/speculative-integers.js +20 -8
  337. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  338. package/dist/backend/llvm/split.js +6 -1
  339. package/dist/backend/llvm/split.js.map +1 -1
  340. package/dist/backend/llvm/split.test.js +23 -0
  341. package/dist/backend/llvm/split.test.js.map +1 -1
  342. package/dist/backend/llvm/stack-callbacks.js +4 -2
  343. package/dist/backend/llvm/stack-callbacks.js.map +1 -1
  344. package/dist/backend/llvm/stack-objects.d.ts +12 -3
  345. package/dist/backend/llvm/stack-objects.js +110 -22
  346. package/dist/backend/llvm/stack-objects.js.map +1 -1
  347. package/dist/backend/llvm/stack-objects.test.js +144 -0
  348. package/dist/backend/llvm/stack-objects.test.js.map +1 -1
  349. package/dist/backend/llvm/stack-unions.test.js +24 -1
  350. package/dist/backend/llvm/stack-unions.test.js.map +1 -1
  351. package/dist/backend/llvm/string-lifetimes.js +2 -1
  352. package/dist/backend/llvm/string-lifetimes.js.map +1 -1
  353. package/dist/backend/llvm/string-lifetimes.test.js +1 -1
  354. package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
  355. package/dist/backend/llvm/string-reads.d.ts +4 -0
  356. package/dist/backend/llvm/string-reads.js +27 -0
  357. package/dist/backend/llvm/string-reads.js.map +1 -1
  358. package/dist/backend/llvm/test-boxed-unions.d.ts +10 -8
  359. package/dist/backend/llvm/test-boxed-unions.js +20 -25
  360. package/dist/backend/llvm/test-boxed-unions.js.map +1 -1
  361. package/dist/backend/llvm/union-repr.js +9 -8
  362. package/dist/backend/llvm/union-repr.js.map +1 -1
  363. package/dist/backend/llvm/union-retype.test.js +45 -2
  364. package/dist/backend/llvm/union-retype.test.js.map +1 -1
  365. package/dist/backend/llvm/unwind-abi.d.ts +20 -8
  366. package/dist/backend/llvm/unwind-abi.js +177 -70
  367. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  368. package/dist/backend/llvm/unwind-abi.test.js +90 -3
  369. package/dist/backend/llvm/unwind-abi.test.js.map +1 -1
  370. package/dist/backend/llvm/walk-borrows.d.ts +3 -2
  371. package/dist/backend/llvm/walk-borrows.js +2 -2
  372. package/dist/backend/llvm/walk-borrows.js.map +1 -1
  373. package/dist/backend/llvm/walk-borrows.test.js +18 -0
  374. package/dist/backend/llvm/walk-borrows.test.js.map +1 -1
  375. package/dist/backend/llvm/walkers.d.ts +14 -1
  376. package/dist/backend/llvm/walkers.js +103 -11
  377. package/dist/backend/llvm/walkers.js.map +1 -1
  378. package/dist/backend/llvm/wrapping-sums.d.ts +26 -6
  379. package/dist/backend/llvm/wrapping-sums.js +64 -12
  380. package/dist/backend/llvm/wrapping-sums.js.map +1 -1
  381. package/dist/backend/loop-polls.d.ts +4 -2
  382. package/dist/backend/loop-polls.js +11 -2
  383. package/dist/backend/loop-polls.js.map +1 -1
  384. package/dist/backend/mangle.d.ts +0 -5
  385. package/dist/backend/mangle.js +0 -9
  386. package/dist/backend/mangle.js.map +1 -1
  387. package/dist/backend/may-throw.d.ts +10 -9
  388. package/dist/backend/may-throw.js +189 -27
  389. package/dist/backend/may-throw.js.map +1 -1
  390. package/dist/backend/may-throw.test.js +44 -7
  391. package/dist/backend/may-throw.test.js.map +1 -1
  392. package/dist/backend/native/compiler-fingerprint.d.ts +5 -0
  393. package/dist/backend/native/compiler-fingerprint.js +62 -16
  394. package/dist/backend/native/compiler-fingerprint.js.map +1 -1
  395. package/dist/backend/native/contracts.d.ts +31 -8
  396. package/dist/backend/native/executable.js +56 -32
  397. package/dist/backend/native/executable.js.map +1 -1
  398. package/dist/backend/native/library.js +3 -4
  399. package/dist/backend/native/library.js.map +1 -1
  400. package/dist/backend/native/object-merge.d.ts +3 -1
  401. package/dist/backend/native/object-merge.js +24 -11
  402. package/dist/backend/native/object-merge.js.map +1 -1
  403. package/dist/backend/native/program-shards.js +6 -3
  404. package/dist/backend/native/program-shards.js.map +1 -1
  405. package/dist/backend/native/runtime-inputs.d.ts +1 -1
  406. package/dist/backend/native/runtime-inputs.js +3 -0
  407. package/dist/backend/native/runtime-inputs.js.map +1 -1
  408. package/dist/backend/native/vendor.d.ts +1 -1
  409. package/dist/backend/native-codegen-core.d.ts +15 -6
  410. package/dist/backend/native-codegen-core.js +20 -9
  411. package/dist/backend/native-codegen-core.js.map +1 -1
  412. package/dist/backend/native-codegen.js +51 -5
  413. package/dist/backend/native-codegen.js.map +1 -1
  414. package/dist/backend/native-codegen.test.js +82 -8
  415. package/dist/backend/native-codegen.test.js.map +1 -1
  416. package/dist/backend/native-link-info-core.d.ts +30 -0
  417. package/dist/backend/native-link-info-core.js.map +1 -1
  418. package/dist/backend/native-profile.d.ts +68 -4
  419. package/dist/backend/native-profile.js +86 -14
  420. package/dist/backend/native-profile.js.map +1 -1
  421. package/dist/backend/native-profile.test.js +127 -4
  422. package/dist/backend/native-profile.test.js.map +1 -1
  423. package/dist/backend/native-toolchain.d.ts +1 -1
  424. package/dist/backend/native-toolchain.js +1 -1
  425. package/dist/backend/native-toolchain.js.map +1 -1
  426. package/dist/backend/native-toolchain.test.js +58 -4
  427. package/dist/backend/native-toolchain.test.js.map +1 -1
  428. package/dist/backend/native-tools.d.ts +17 -3
  429. package/dist/backend/native-tools.js +12 -4
  430. package/dist/backend/native-tools.js.map +1 -1
  431. package/dist/backend/native-tools.test.d.ts +1 -0
  432. package/dist/backend/native-tools.test.js +76 -0
  433. package/dist/backend/native-tools.test.js.map +1 -0
  434. package/dist/backend/object-localize.js +69 -9
  435. package/dist/backend/object-localize.js.map +1 -1
  436. package/dist/backend/object-localize.test.js +99 -10
  437. package/dist/backend/object-localize.test.js.map +1 -1
  438. package/dist/backend/publication.d.ts +2 -0
  439. package/dist/backend/publication.js +4 -0
  440. package/dist/backend/publication.js.map +1 -1
  441. package/dist/backend/runtime-abi.d.ts +2 -2
  442. package/dist/backend/runtime-abi.js +2 -2
  443. package/dist/backend/runtime-pack-core.d.ts +19 -0
  444. package/dist/backend/runtime-pack-core.js +23 -3
  445. package/dist/backend/runtime-pack-core.js.map +1 -1
  446. package/dist/backend/runtime-pack-targets.test.js +1 -1
  447. package/dist/backend/runtime-pack.test.js +48 -2
  448. package/dist/backend/runtime-pack.test.js.map +1 -1
  449. package/dist/backend/target-cpu.d.ts +2 -0
  450. package/dist/backend/target-cpu.js +4 -0
  451. package/dist/backend/target-cpu.js.map +1 -1
  452. package/dist/backend/target-diagnostics.js +1 -19
  453. package/dist/backend/target-diagnostics.js.map +1 -1
  454. package/dist/backend/target-diagnostics.test.js +1 -1
  455. package/dist/backend/target-diagnostics.test.js.map +1 -1
  456. package/dist/backend/targets.d.ts +28 -0
  457. package/dist/backend/targets.js +70 -0
  458. package/dist/backend/targets.js.map +1 -1
  459. package/dist/backend/targets.test.js +75 -1
  460. package/dist/backend/targets.test.js.map +1 -1
  461. package/dist/backend/vendor-archives.d.ts +1 -1
  462. package/dist/backend/vendor-archives.js +25 -12
  463. package/dist/backend/vendor-archives.js.map +1 -1
  464. package/dist/backend/vendor-inputs.d.ts +15 -2
  465. package/dist/backend/vendor-inputs.js +59 -3
  466. package/dist/backend/vendor-inputs.js.map +1 -1
  467. package/dist/backend/vendor-inputs.test.d.ts +1 -0
  468. package/dist/backend/vendor-inputs.test.js +74 -0
  469. package/dist/backend/vendor-inputs.test.js.map +1 -0
  470. package/dist/cli/command.js +95 -5
  471. package/dist/cli/command.js.map +1 -1
  472. package/dist/cli/host.d.ts +3 -0
  473. package/dist/cli/output-options.d.ts +3 -0
  474. package/dist/cli/output-options.js +8 -2
  475. package/dist/cli/output-options.js.map +1 -1
  476. package/dist/cli/usage.d.ts +28 -1
  477. package/dist/cli/usage.js +56 -6
  478. package/dist/cli/usage.js.map +1 -1
  479. package/dist/compat/fetch-profile.d.ts +3 -0
  480. package/dist/compat/fetch-profile.js +23 -3
  481. package/dist/compat/fetch-profile.js.map +1 -1
  482. package/dist/compile-types.d.ts +45 -0
  483. package/dist/contracts/check.js +70 -2
  484. package/dist/contracts/check.js.map +1 -1
  485. package/dist/contracts/int32-elements.d.ts +2 -1
  486. package/dist/contracts/int32-elements.js.map +1 -1
  487. package/dist/coverage/report.d.ts +5 -1
  488. package/dist/coverage/report.js +83 -2
  489. package/dist/coverage/report.js.map +1 -1
  490. package/dist/coverage/verdict-cache.d.ts +2 -0
  491. package/dist/coverage/verdict-cache.js +5 -10
  492. package/dist/coverage/verdict-cache.js.map +1 -1
  493. package/dist/diagnostics/codes.d.ts +145 -0
  494. package/dist/diagnostics/codes.js +159 -0
  495. package/dist/diagnostics/codes.js.map +1 -0
  496. package/dist/diagnostics/codes.test.d.ts +1 -0
  497. package/dist/diagnostics/codes.test.js +78 -0
  498. package/dist/diagnostics/codes.test.js.map +1 -0
  499. package/dist/diagnostics/diagnostic.d.ts +101 -2
  500. package/dist/diagnostics/diagnostic.js +155 -0
  501. package/dist/diagnostics/diagnostic.js.map +1 -1
  502. package/dist/diagnostics/dynamic-slots.d.ts +23 -0
  503. package/dist/diagnostics/dynamic-slots.js +29 -0
  504. package/dist/diagnostics/dynamic-slots.js.map +1 -0
  505. package/dist/diagnostics/dynamic-tier.d.ts +6 -0
  506. package/dist/diagnostics/dynamic-tier.js +8 -1
  507. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  508. package/dist/diagnostics/envelope.d.ts +43 -1
  509. package/dist/diagnostics/envelope.js +19 -1
  510. package/dist/diagnostics/envelope.js.map +1 -1
  511. package/dist/diagnostics/envelope.test.js.map +1 -1
  512. package/dist/diagnostics/render.d.ts +3 -1
  513. package/dist/diagnostics/render.js +27 -6
  514. package/dist/diagnostics/render.js.map +1 -1
  515. package/dist/executable/executable-cache.d.ts +41 -0
  516. package/dist/executable/executable-cache.js +39 -1
  517. package/dist/executable/executable-cache.js.map +1 -1
  518. package/dist/executable/executable-cache.test.js +4 -1
  519. package/dist/executable/executable-cache.test.js.map +1 -1
  520. package/dist/executable/prepare.d.ts +2 -1
  521. package/dist/executable/prepare.js +421 -10
  522. package/dist/executable/prepare.js.map +1 -1
  523. package/dist/frontend/analysis.js +1 -0
  524. package/dist/frontend/analysis.js.map +1 -1
  525. package/dist/frontend/canon-map.d.ts +17 -0
  526. package/dist/frontend/canon-map.js +177 -0
  527. package/dist/frontend/canon-map.js.map +1 -0
  528. package/dist/frontend/canon.d.ts +122 -0
  529. package/dist/frontend/canon.js +462 -0
  530. package/dist/frontend/canon.js.map +1 -0
  531. package/dist/frontend/contract-types.d.ts +9 -1
  532. package/dist/frontend/contract-types.js +46 -4
  533. package/dist/frontend/contract-types.js.map +1 -1
  534. package/dist/frontend/decl-projection.d.ts +3 -0
  535. package/dist/frontend/decl-projection.js +121 -3
  536. package/dist/frontend/decl-projection.js.map +1 -1
  537. package/dist/frontend/dts-paths.d.ts +17 -4
  538. package/dist/frontend/dts-paths.js +149 -5
  539. package/dist/frontend/dts-paths.js.map +1 -1
  540. package/dist/frontend/fork-target.js +4 -4
  541. package/dist/frontend/fork-target.js.map +1 -1
  542. package/dist/frontend/fork-target.test.js +3 -3
  543. package/dist/frontend/fork-target.test.js.map +1 -1
  544. package/dist/frontend/heritage-elements.d.ts +15 -0
  545. package/dist/frontend/heritage-elements.js +18 -0
  546. package/dist/frontend/heritage-elements.js.map +1 -0
  547. package/dist/frontend/heritage-elements.test.d.ts +1 -0
  548. package/dist/frontend/heritage-elements.test.js +68 -0
  549. package/dist/frontend/heritage-elements.test.js.map +1 -0
  550. package/dist/frontend/input-tracker.d.ts +20 -0
  551. package/dist/frontend/input-tracker.js +74 -4
  552. package/dist/frontend/input-tracker.js.map +1 -1
  553. package/dist/frontend/input-tracker.test.js +66 -0
  554. package/dist/frontend/input-tracker.test.js.map +1 -1
  555. package/dist/frontend/lowering/any-collection-residue.d.ts +9 -0
  556. package/dist/frontend/lowering/any-collection-residue.js +42 -0
  557. package/dist/frontend/lowering/any-collection-residue.js.map +1 -0
  558. package/dist/frontend/lowering/array-values.d.ts +44 -2
  559. package/dist/frontend/lowering/array-values.js +193 -3
  560. package/dist/frontend/lowering/array-values.js.map +1 -1
  561. package/dist/frontend/lowering/builtin-namespaces.d.ts +6 -2
  562. package/dist/frontend/lowering/builtin-namespaces.js +28 -6
  563. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  564. package/dist/frontend/lowering/builtins/array-classes.d.ts +69 -0
  565. package/dist/frontend/lowering/builtins/array-classes.js +729 -0
  566. package/dist/frontend/lowering/builtins/array-classes.js.map +1 -0
  567. package/dist/frontend/lowering/builtins/callable-aliases.js +4 -0
  568. package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
  569. package/dist/frontend/lowering/builtins/child-process-methods.js +34 -0
  570. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  571. package/dist/frontend/lowering/builtins/disposable-stack.js +1 -3
  572. package/dist/frontend/lowering/builtins/disposable-stack.js.map +1 -1
  573. package/dist/frontend/lowering/builtins/errors.d.ts +13 -9
  574. package/dist/frontend/lowering/builtins/errors.js +136 -56
  575. package/dist/frontend/lowering/builtins/errors.js.map +1 -1
  576. package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +1 -0
  577. package/dist/frontend/lowering/builtins/filesystem-calls.js +85 -4
  578. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  579. package/dist/frontend/lowering/builtins/filesystem.d.ts +11 -6
  580. package/dist/frontend/lowering/builtins/filesystem.js +270 -24
  581. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  582. package/dist/frontend/lowering/builtins/json.js +7 -1
  583. package/dist/frontend/lowering/builtins/json.js.map +1 -1
  584. package/dist/frontend/lowering/builtins/mime.d.ts +25 -0
  585. package/dist/frontend/lowering/builtins/mime.js +167 -0
  586. package/dist/frontend/lowering/builtins/mime.js.map +1 -0
  587. package/dist/frontend/lowering/builtins/module-bindings.d.ts +3 -0
  588. package/dist/frontend/lowering/builtins/module-bindings.js +6 -0
  589. package/dist/frontend/lowering/builtins/module-bindings.js.map +1 -1
  590. package/dist/frontend/lowering/builtins/module-calls.js +79 -12
  591. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  592. package/dist/frontend/lowering/builtins/module-resolution.d.ts +7 -4
  593. package/dist/frontend/lowering/builtins/module-resolution.js +115 -13
  594. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  595. package/dist/frontend/lowering/builtins/navigator.d.ts +3 -1
  596. package/dist/frontend/lowering/builtins/navigator.js +22 -8
  597. package/dist/frontend/lowering/builtins/navigator.js.map +1 -1
  598. package/dist/frontend/lowering/builtins/process.js +49 -9
  599. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  600. package/dist/frontend/lowering/builtins/promises.js +18 -3
  601. package/dist/frontend/lowering/builtins/promises.js.map +1 -1
  602. package/dist/frontend/lowering/builtins/promisify-callback.d.ts +6 -2
  603. package/dist/frontend/lowering/builtins/promisify-callback.js +19 -6
  604. package/dist/frontend/lowering/builtins/promisify-callback.js.map +1 -1
  605. package/dist/frontend/lowering/builtins/properties.js +23 -5
  606. package/dist/frontend/lowering/builtins/properties.js.map +1 -1
  607. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +42 -0
  608. package/dist/frontend/lowering/builtins/web-streams-dyn.js +321 -0
  609. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -0
  610. package/dist/frontend/lowering/builtins/x509.js +35 -5
  611. package/dist/frontend/lowering/builtins/x509.js.map +1 -1
  612. package/dist/frontend/lowering/call-arguments.d.ts +14 -1
  613. package/dist/frontend/lowering/call-arguments.js +84 -70
  614. package/dist/frontend/lowering/call-arguments.js.map +1 -1
  615. package/dist/frontend/lowering/call-signatures.js +108 -24
  616. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  617. package/dist/frontend/lowering/class-attributes.js +6 -5
  618. package/dist/frontend/lowering/class-attributes.js.map +1 -1
  619. package/dist/frontend/lowering/class-dynamic-dispatch.js +40 -19
  620. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  621. package/dist/frontend/lowering/class-dynamic-dispatch.test.js +1 -0
  622. package/dist/frontend/lowering/class-dynamic-dispatch.test.js.map +1 -1
  623. package/dist/frontend/lowering/class-protocol-dispatch.js +4 -0
  624. package/dist/frontend/lowering/class-protocol-dispatch.js.map +1 -1
  625. package/dist/frontend/lowering/class-protocols.d.ts +61 -1
  626. package/dist/frontend/lowering/class-protocols.js +297 -21
  627. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  628. package/dist/frontend/lowering/class-to-primitive.d.ts +3 -2
  629. package/dist/frontend/lowering/class-to-primitive.js +15 -5
  630. package/dist/frontend/lowering/class-to-primitive.js.map +1 -1
  631. package/dist/frontend/lowering/coercions/asserted.d.ts +16 -0
  632. package/dist/frontend/lowering/coercions/asserted.js +79 -0
  633. package/dist/frontend/lowering/coercions/asserted.js.map +1 -0
  634. package/dist/frontend/lowering/coercions/function-adapters.d.ts +13 -0
  635. package/dist/frontend/lowering/coercions/function-adapters.js +70 -3
  636. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  637. package/dist/frontend/lowering/coercions/state.d.ts +23 -0
  638. package/dist/frontend/lowering/coercions/state.js +9 -0
  639. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  640. package/dist/frontend/lowering/coercions/structural-plans.js +67 -1
  641. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  642. package/dist/frontend/lowering/coercions/structural.d.ts +10 -0
  643. package/dist/frontend/lowering/coercions/structural.js +134 -4
  644. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  645. package/dist/frontend/lowering/coercions/unions.d.ts +11 -0
  646. package/dist/frontend/lowering/coercions/unions.js +83 -4
  647. package/dist/frontend/lowering/coercions/unions.js.map +1 -1
  648. package/dist/frontend/lowering/completion-callbacks.js +3 -2
  649. package/dist/frontend/lowering/completion-callbacks.js.map +1 -1
  650. package/dist/frontend/lowering/containers/array-callbacks.d.ts +10 -0
  651. package/dist/frontend/lowering/containers/array-callbacks.js +224 -81
  652. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  653. package/dist/frontend/lowering/containers/array-concat.d.ts +5 -2
  654. package/dist/frontend/lowering/containers/array-concat.js +76 -7
  655. package/dist/frontend/lowering/containers/array-concat.js.map +1 -1
  656. package/dist/frontend/lowering/containers/array-construction.d.ts +9 -4
  657. package/dist/frontend/lowering/containers/array-construction.js +112 -100
  658. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  659. package/dist/frontend/lowering/containers/array-methods.js +193 -45
  660. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  661. package/dist/frontend/lowering/containers/array-pipelines.d.ts +3 -0
  662. package/dist/frontend/lowering/containers/array-pipelines.js +81 -13
  663. package/dist/frontend/lowering/containers/array-pipelines.js.map +1 -1
  664. package/dist/frontend/lowering/containers/callback-arguments.d.ts +1 -0
  665. package/dist/frontend/lowering/containers/callback-arguments.js +28 -2
  666. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  667. package/dist/frontend/lowering/containers/collection-methods.js +13 -3
  668. package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
  669. package/dist/frontend/lowering/containers/filter-predicates.js +34 -3
  670. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  671. package/dist/frontend/lowering/containers/indexed-objects.d.ts +34 -1
  672. package/dist/frontend/lowering/containers/indexed-objects.js +131 -72
  673. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  674. package/dist/frontend/lowering/cycle-initialization.js +43 -6
  675. package/dist/frontend/lowering/cycle-initialization.js.map +1 -1
  676. package/dist/frontend/lowering/decl-origin.d.ts +49 -0
  677. package/dist/frontend/lowering/decl-origin.js +402 -0
  678. package/dist/frontend/lowering/decl-origin.js.map +1 -0
  679. package/dist/frontend/lowering/deferred-module-initializers.d.ts +2 -0
  680. package/dist/frontend/lowering/deferred-module-initializers.js +7 -0
  681. package/dist/frontend/lowering/deferred-module-initializers.js.map +1 -1
  682. package/dist/frontend/lowering/divergences.js +5 -0
  683. package/dist/frontend/lowering/divergences.js.map +1 -1
  684. package/dist/frontend/lowering/dynamic-tier.d.ts +8 -2
  685. package/dist/frontend/lowering/dynamic-tier.js +111 -3
  686. package/dist/frontend/lowering/dynamic-tier.js.map +1 -1
  687. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -1
  688. package/dist/frontend/lowering/expressions/array-literals.js +43 -5
  689. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  690. package/dist/frontend/lowering/expressions/asserted-receiver.d.ts +48 -0
  691. package/dist/frontend/lowering/expressions/asserted-receiver.js +233 -0
  692. package/dist/frontend/lowering/expressions/asserted-receiver.js.map +1 -0
  693. package/dist/frontend/lowering/expressions/binary.js +136 -1
  694. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  695. package/dist/frontend/lowering/expressions/element-access.d.ts +7 -0
  696. package/dist/frontend/lowering/expressions/element-access.js +363 -12
  697. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  698. package/dist/frontend/lowering/expressions/identifiers.d.ts +3 -0
  699. package/dist/frontend/lowering/expressions/identifiers.js +78 -62
  700. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  701. package/dist/frontend/lowering/expressions/message-listeners.d.ts +3 -0
  702. package/dist/frontend/lowering/expressions/message-listeners.js +19 -0
  703. package/dist/frontend/lowering/expressions/message-listeners.js.map +1 -0
  704. package/dist/frontend/lowering/expressions/narrowing.js +224 -6
  705. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  706. package/dist/frontend/lowering/expressions/nullish-assignment.js +5 -2
  707. package/dist/frontend/lowering/expressions/nullish-assignment.js.map +1 -1
  708. package/dist/frontend/lowering/expressions/object-literals.d.ts +1 -1
  709. package/dist/frontend/lowering/expressions/object-literals.js +282 -24
  710. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  711. package/dist/frontend/lowering/expressions/property-access.d.ts +15 -3
  712. package/dist/frontend/lowering/expressions/property-access.js +397 -74
  713. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  714. package/dist/frontend/lowering/expressions/relational.js +202 -70
  715. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  716. package/dist/frontend/lowering/expressions/typeof.js +9 -1
  717. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  718. package/dist/frontend/lowering/expressions/union-fields.d.ts +28 -8
  719. package/dist/frontend/lowering/expressions/union-fields.js +168 -14
  720. package/dist/frontend/lowering/expressions/union-fields.js.map +1 -1
  721. package/dist/frontend/lowering/frozen-records.d.ts +8 -0
  722. package/dist/frontend/lowering/frozen-records.js +56 -9
  723. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  724. package/dist/frontend/lowering/function-context.d.ts +3 -0
  725. package/dist/frontend/lowering/function-context.js +4 -1
  726. package/dist/frontend/lowering/function-context.js.map +1 -1
  727. package/dist/frontend/lowering/function-returns.d.ts +4 -0
  728. package/dist/frontend/lowering/function-returns.js +231 -2
  729. package/dist/frontend/lowering/function-returns.js.map +1 -1
  730. package/dist/frontend/lowering/generator-delegation.js +3 -2
  731. package/dist/frontend/lowering/generator-delegation.js.map +1 -1
  732. package/dist/frontend/lowering/generator-dynamic-dispatch.d.ts +26 -0
  733. package/dist/frontend/lowering/generator-dynamic-dispatch.js +294 -2
  734. package/dist/frontend/lowering/generator-dynamic-dispatch.js.map +1 -1
  735. package/dist/frontend/lowering/generic-functions.d.ts +10 -0
  736. package/dist/frontend/lowering/generic-functions.js +67 -7
  737. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  738. package/dist/frontend/lowering/global-values.d.ts +37 -0
  739. package/dist/frontend/lowering/global-values.js +395 -0
  740. package/dist/frontend/lowering/global-values.js.map +1 -0
  741. package/dist/frontend/lowering/handle-properties.js +3 -2
  742. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  743. package/dist/frontend/lowering/handle-properties.test.d.ts +1 -0
  744. package/dist/frontend/lowering/handle-properties.test.js +25 -0
  745. package/dist/frontend/lowering/handle-properties.test.js.map +1 -0
  746. package/dist/frontend/lowering/import-meta.d.ts +3 -0
  747. package/dist/frontend/lowering/import-meta.js +8 -3
  748. package/dist/frontend/lowering/import-meta.js.map +1 -1
  749. package/dist/frontend/lowering/iterator-adapters.js +3 -3
  750. package/dist/frontend/lowering/iterator-adapters.js.map +1 -1
  751. package/dist/frontend/lowering/key-order-witness.d.ts +2 -0
  752. package/dist/frontend/lowering/key-order-witness.js +10 -0
  753. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  754. package/dist/frontend/lowering/lower-array-sort.d.ts +5 -1
  755. package/dist/frontend/lowering/lower-array-sort.js +16 -2
  756. package/dist/frontend/lowering/lower-array-sort.js.map +1 -1
  757. package/dist/frontend/lowering/lower-builtin-values.d.ts +7 -0
  758. package/dist/frontend/lowering/lower-builtin-values.js +65 -16
  759. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  760. package/dist/frontend/lowering/lower-calls.js +222 -24
  761. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  762. package/dist/frontend/lowering/lower-classes.d.ts +6 -0
  763. package/dist/frontend/lowering/lower-classes.js +154 -20
  764. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  765. package/dist/frontend/lowering/lower-console.js +25 -2
  766. package/dist/frontend/lowering/lower-console.js.map +1 -1
  767. package/dist/frontend/lowering/lower-exprs.d.ts +29 -0
  768. package/dist/frontend/lowering/lower-exprs.js +544 -24
  769. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  770. package/dist/frontend/lowering/lower-functions.js +93 -18
  771. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  772. package/dist/frontend/lowering/lower-global-value.d.ts +4 -1
  773. package/dist/frontend/lowering/lower-global-value.js +10 -3
  774. package/dist/frontend/lowering/lower-global-value.js.map +1 -1
  775. package/dist/frontend/lowering/lower-inspect.d.ts +44 -4
  776. package/dist/frontend/lowering/lower-inspect.js +723 -26
  777. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  778. package/dist/frontend/lowering/lower-modules.d.ts +3 -1
  779. package/dist/frontend/lowering/lower-modules.js +189 -24
  780. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  781. package/dist/frontend/lowering/lower-namespaces.d.ts +7 -0
  782. package/dist/frontend/lowering/lower-namespaces.js +23 -0
  783. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  784. package/dist/frontend/lowering/lower-node-island.d.ts +74 -0
  785. package/dist/frontend/lowering/lower-node-island.js +1931 -0
  786. package/dist/frontend/lowering/lower-node-island.js.map +1 -0
  787. package/dist/frontend/lowering/lower-server.js +44 -0
  788. package/dist/frontend/lowering/lower-server.js.map +1 -1
  789. package/dist/frontend/lowering/lower-shared-modules.d.ts +27 -0
  790. package/dist/frontend/lowering/lower-shared-modules.js +611 -0
  791. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -0
  792. package/dist/frontend/lowering/lower-stdlib.js +85 -9
  793. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  794. package/dist/frontend/lowering/lower-stmts.d.ts +2 -6
  795. package/dist/frontend/lowering/lower-stmts.js +781 -143
  796. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  797. package/dist/frontend/lowering/lower-stream.js +548 -36
  798. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  799. package/dist/frontend/lowering/lower-timers.js +9 -0
  800. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  801. package/dist/frontend/lowering/lowerer.d.ts +514 -10
  802. package/dist/frontend/lowering/lowerer.js +2667 -163
  803. package/dist/frontend/lowering/lowerer.js.map +1 -1
  804. package/dist/frontend/lowering/lowerer.test.js +44 -1
  805. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  806. package/dist/frontend/lowering/maybe-promise.d.ts +6 -0
  807. package/dist/frontend/lowering/maybe-promise.js +13 -0
  808. package/dist/frontend/lowering/maybe-promise.js.map +1 -1
  809. package/dist/frontend/lowering/module-namespace-elements.d.ts +12 -0
  810. package/dist/frontend/lowering/module-namespace-elements.js +114 -18
  811. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  812. package/dist/frontend/lowering/nan-coded-reads.d.ts +11 -0
  813. package/dist/frontend/lowering/nan-coded-reads.js +45 -2
  814. package/dist/frontend/lowering/nan-coded-reads.js.map +1 -1
  815. package/dist/frontend/lowering/narrowing-stability.d.ts +4 -0
  816. package/dist/frontend/lowering/narrowing-stability.js +14 -6
  817. package/dist/frontend/lowering/narrowing-stability.js.map +1 -1
  818. package/dist/frontend/lowering/receiver-returns.d.ts +3 -0
  819. package/dist/frontend/lowering/receiver-returns.js +134 -0
  820. package/dist/frontend/lowering/receiver-returns.js.map +1 -0
  821. package/dist/frontend/lowering/record-inherited.d.ts +26 -0
  822. package/dist/frontend/lowering/record-inherited.js +807 -0
  823. package/dist/frontend/lowering/record-inherited.js.map +1 -0
  824. package/dist/frontend/lowering/runtime-optional-elements.d.ts +31 -1
  825. package/dist/frontend/lowering/runtime-optional-elements.js +105 -13
  826. package/dist/frontend/lowering/runtime-optional-elements.js.map +1 -1
  827. package/dist/frontend/lowering/runtime-optional-guards.d.ts +3 -0
  828. package/dist/frontend/lowering/runtime-optional-guards.js +35 -7
  829. package/dist/frontend/lowering/runtime-optional-guards.js.map +1 -1
  830. package/dist/frontend/lowering/runtime-optional-guards.test.js +59 -1
  831. package/dist/frontend/lowering/runtime-optional-guards.test.js.map +1 -1
  832. package/dist/frontend/lowering/stable-names.d.ts +8 -0
  833. package/dist/frontend/lowering/stable-names.js +22 -0
  834. package/dist/frontend/lowering/stable-names.js.map +1 -1
  835. package/dist/frontend/lowering/stable-names.test.d.ts +1 -0
  836. package/dist/frontend/lowering/stable-names.test.js +16 -0
  837. package/dist/frontend/lowering/stable-names.test.js.map +1 -0
  838. package/dist/frontend/lowering/static-typeof.d.ts +5 -4
  839. package/dist/frontend/lowering/static-typeof.js +10 -4
  840. package/dist/frontend/lowering/static-typeof.js.map +1 -1
  841. package/dist/frontend/lowering/structural-instances.d.ts +22 -0
  842. package/dist/frontend/lowering/structural-instances.js +282 -0
  843. package/dist/frontend/lowering/structural-instances.js.map +1 -0
  844. package/dist/frontend/lowering/surfaces.d.ts +3 -0
  845. package/dist/frontend/lowering/surfaces.js +108 -12
  846. package/dist/frontend/lowering/surfaces.js.map +1 -1
  847. package/dist/frontend/lowering/symbol-fields.d.ts +7 -0
  848. package/dist/frontend/lowering/symbol-fields.js +32 -0
  849. package/dist/frontend/lowering/symbol-fields.js.map +1 -1
  850. package/dist/frontend/lowering/type-failure.d.ts +17 -0
  851. package/dist/frontend/lowering/type-failure.js +163 -0
  852. package/dist/frontend/lowering/type-failure.js.map +1 -0
  853. package/dist/frontend/lowering/typed-arguments.d.ts +5 -6
  854. package/dist/frontend/lowering/typed-arguments.js +10 -2
  855. package/dist/frontend/lowering/typed-arguments.js.map +1 -1
  856. package/dist/frontend/lowering/union-narrow.d.ts +9 -1
  857. package/dist/frontend/lowering/union-narrow.js +31 -2
  858. package/dist/frontend/lowering/union-narrow.js.map +1 -1
  859. package/dist/frontend/lowering/union-retag.test.js +42 -2
  860. package/dist/frontend/lowering/union-retag.test.js.map +1 -1
  861. package/dist/frontend/lowering/unit-journal.d.ts +194 -0
  862. package/dist/frontend/lowering/unit-journal.js +556 -0
  863. package/dist/frontend/lowering/unit-journal.js.map +1 -0
  864. package/dist/frontend/lowering/unit-journal.test.d.ts +1 -0
  865. package/dist/frontend/lowering/unit-journal.test.js +335 -0
  866. package/dist/frontend/lowering/unit-journal.test.js.map +1 -0
  867. package/dist/frontend/lowering/width-lift.d.ts +19 -0
  868. package/dist/frontend/node-api-import.d.ts +21 -0
  869. package/dist/frontend/node-api-import.js +88 -0
  870. package/dist/frontend/node-api-import.js.map +1 -0
  871. package/dist/frontend/npm-static-type-exports-host.js +4 -3
  872. package/dist/frontend/npm-static-type-exports-host.js.map +1 -1
  873. package/dist/frontend/npm-static.js +9 -2
  874. package/dist/frontend/npm-static.js.map +1 -1
  875. package/dist/frontend/package-shims.d.ts +6 -2
  876. package/dist/frontend/package-shims.js +13 -2
  877. package/dist/frontend/package-shims.js.map +1 -1
  878. package/dist/frontend/pipeline.d.ts +11 -4
  879. package/dist/frontend/pipeline.js +249 -26
  880. package/dist/frontend/pipeline.js.map +1 -1
  881. package/dist/frontend/process-fork.d.ts +3 -0
  882. package/dist/frontend/process-fork.js.map +1 -1
  883. package/dist/frontend/program-analysis.d.ts +6 -0
  884. package/dist/frontend/program-analysis.js +4 -0
  885. package/dist/frontend/program-analysis.js.map +1 -1
  886. package/dist/frontend/program.d.ts +12 -1
  887. package/dist/frontend/program.js +256 -36
  888. package/dist/frontend/program.js.map +1 -1
  889. package/dist/frontend/resolve.js +8 -2
  890. package/dist/frontend/resolve.js.map +1 -1
  891. package/dist/frontend/shape-inference/analyze.d.ts +23 -1
  892. package/dist/frontend/shape-inference/analyze.js +982 -97
  893. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  894. package/dist/frontend/shape-inference/constant-graphs.d.ts +2 -0
  895. package/dist/frontend/shape-inference/constant-graphs.js +39 -4
  896. package/dist/frontend/shape-inference/constant-graphs.js.map +1 -1
  897. package/dist/frontend/shape-inference/domain.d.ts +2 -0
  898. package/dist/frontend/shape-inference/domain.js.map +1 -1
  899. package/dist/frontend/shape-inference/fallback.d.ts +17 -0
  900. package/dist/frontend/shape-inference/fallback.js +303 -0
  901. package/dist/frontend/shape-inference/fallback.js.map +1 -0
  902. package/dist/frontend/shape-inference/index.d.ts +75 -1
  903. package/dist/frontend/shape-inference/index.js +531 -2
  904. package/dist/frontend/shape-inference/index.js.map +1 -1
  905. package/dist/frontend/shape-inference/inferred-checks.d.ts +2 -0
  906. package/dist/frontend/shape-inference/inferred-checks.js +90 -0
  907. package/dist/frontend/shape-inference/inferred-checks.js.map +1 -0
  908. package/dist/frontend/shape-inference/memo.d.ts +30 -0
  909. package/dist/frontend/shape-inference/memo.js +99 -0
  910. package/dist/frontend/shape-inference/memo.js.map +1 -0
  911. package/dist/frontend/shape-inference/overlay.d.ts +81 -0
  912. package/dist/frontend/shape-inference/overlay.js +1160 -0
  913. package/dist/frontend/shape-inference/overlay.js.map +1 -0
  914. package/dist/frontend/shape-inference/registry.test.d.ts +1 -0
  915. package/dist/frontend/shape-inference/registry.test.js +34 -0
  916. package/dist/frontend/shape-inference/registry.test.js.map +1 -0
  917. package/dist/frontend/shape-inference/report.js +42 -8
  918. package/dist/frontend/shape-inference/report.js.map +1 -1
  919. package/dist/frontend/shape-inference/static-objects.d.ts +29 -0
  920. package/dist/frontend/shape-inference/static-objects.js +1951 -0
  921. package/dist/frontend/shape-inference/static-objects.js.map +1 -0
  922. package/dist/frontend/tier-analysis.d.ts +53 -1
  923. package/dist/frontend/tier-analysis.js +133 -0
  924. package/dist/frontend/tier-analysis.js.map +1 -1
  925. package/dist/frontend/ts7/api.js +4 -2
  926. package/dist/frontend/ts7/api.js.map +1 -1
  927. package/dist/frontend/ts7/ast-node.d.ts +9 -0
  928. package/dist/frontend/ts7/ast-node.js +42 -10
  929. package/dist/frontend/ts7/ast-node.js.map +1 -1
  930. package/dist/frontend/ts7/ast-node.test.js +23 -0
  931. package/dist/frontend/ts7/ast-node.test.js.map +1 -1
  932. package/dist/frontend/ts7/ast-wire-protocols.test.d.ts +1 -0
  933. package/dist/frontend/ts7/ast-wire-protocols.test.js +93 -0
  934. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -0
  935. package/dist/frontend/ts7/ast-wire.d.ts +18 -0
  936. package/dist/frontend/ts7/ast-wire.js +66 -4
  937. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  938. package/dist/frontend/ts7/checker-server.d.ts +12 -11
  939. package/dist/frontend/ts7/checker-server.js +28 -12
  940. package/dist/frontend/ts7/checker-server.js.map +1 -1
  941. package/dist/frontend/ts7/checker-server.test.js +8 -3
  942. package/dist/frontend/ts7/checker-server.test.js.map +1 -1
  943. package/dist/frontend/ts7/checker.d.ts +4 -0
  944. package/dist/frontend/ts7/checker.js +9 -0
  945. package/dist/frontend/ts7/checker.js.map +1 -1
  946. package/dist/frontend/ts7/checker.test.js +216 -205
  947. package/dist/frontend/ts7/checker.test.js.map +1 -1
  948. package/dist/frontend/ts7/lib-diagnostics.d.ts +71 -4
  949. package/dist/frontend/ts7/lib-diagnostics.js +337 -20
  950. package/dist/frontend/ts7/lib-diagnostics.js.map +1 -1
  951. package/dist/frontend/ts7/lib-diagnostics.test.js +268 -5
  952. package/dist/frontend/ts7/lib-diagnostics.test.js.map +1 -1
  953. package/dist/frontend/ts7/native-api.d.ts +4 -0
  954. package/dist/frontend/ts7/native-api.js +36 -1
  955. package/dist/frontend/ts7/native-api.js.map +1 -1
  956. package/dist/frontend/ts7/program-host.d.ts +19 -2
  957. package/dist/frontend/ts7/program-host.js +69 -9
  958. package/dist/frontend/ts7/program-host.js.map +1 -1
  959. package/dist/frontend/ts7/program-host.test.js +42 -1
  960. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  961. package/dist/frontend/ts7/rpc-filesystem.d.ts +4 -2
  962. package/dist/frontend/ts7/rpc-filesystem.js +23 -2
  963. package/dist/frontend/ts7/rpc-filesystem.js.map +1 -1
  964. package/dist/frontend/ts7/rpc-filesystem.test.js +28 -2
  965. package/dist/frontend/ts7/rpc-filesystem.test.js.map +1 -1
  966. package/dist/frontend/ts7/semantic-checker.js +73 -5
  967. package/dist/frontend/ts7/semantic-checker.js.map +1 -1
  968. package/dist/frontend/ts7/semantic-checker.test.js +106 -74
  969. package/dist/frontend/ts7/semantic-checker.test.js.map +1 -1
  970. package/dist/frontend/ts7/semantic-json.d.ts +2 -6
  971. package/dist/frontend/ts7/semantic-model-71.test.d.ts +1 -0
  972. package/dist/frontend/ts7/semantic-model-71.test.js +131 -0
  973. package/dist/frontend/ts7/semantic-model-71.test.js.map +1 -0
  974. package/dist/frontend/ts7/semantic-model.d.ts +121 -3
  975. package/dist/frontend/ts7/semantic-model.js +245 -8
  976. package/dist/frontend/ts7/semantic-model.js.map +1 -1
  977. package/dist/frontend/ts7/session.d.ts +19 -1
  978. package/dist/frontend/ts7/session.js +111 -11
  979. package/dist/frontend/ts7/session.js.map +1 -1
  980. package/dist/frontend/ts7/session.test.js +259 -239
  981. package/dist/frontend/ts7/session.test.js.map +1 -1
  982. package/dist/frontend/ts7/test-servers.d.ts +12 -0
  983. package/dist/frontend/ts7/test-servers.js +16 -0
  984. package/dist/frontend/ts7/test-servers.js.map +1 -0
  985. package/dist/frontend/tsc-codes.js +6 -3
  986. package/dist/frontend/tsc-codes.js.map +1 -1
  987. package/dist/frontend/type-mapper.d.ts +61 -1
  988. package/dist/frontend/type-mapper.js +577 -28
  989. package/dist/frontend/type-mapper.js.map +1 -1
  990. package/dist/frontend/type-patches/command.d.ts +19 -0
  991. package/dist/frontend/type-patches/command.js +352 -0
  992. package/dist/frontend/type-patches/command.js.map +1 -0
  993. package/dist/frontend/type-patches/layer.d.ts +45 -0
  994. package/dist/frontend/type-patches/layer.js +409 -0
  995. package/dist/frontend/type-patches/layer.js.map +1 -0
  996. package/dist/frontend/type-patches/locate.d.ts +41 -0
  997. package/dist/frontend/type-patches/locate.js +914 -0
  998. package/dist/frontend/type-patches/locate.js.map +1 -0
  999. package/dist/frontend/type-patches/locate.test.d.ts +1 -0
  1000. package/dist/frontend/type-patches/locate.test.js +179 -0
  1001. package/dist/frontend/type-patches/locate.test.js.map +1 -0
  1002. package/dist/frontend/type-patches/selector.d.ts +43 -0
  1003. package/dist/frontend/type-patches/selector.js +126 -0
  1004. package/dist/frontend/type-patches/selector.js.map +1 -0
  1005. package/dist/frontend/type-patches/selector.test.d.ts +1 -0
  1006. package/dist/frontend/type-patches/selector.test.js +56 -0
  1007. package/dist/frontend/type-patches/selector.test.js.map +1 -0
  1008. package/dist/frontend/type-patches/semver.d.ts +19 -0
  1009. package/dist/frontend/type-patches/semver.js +221 -0
  1010. package/dist/frontend/type-patches/semver.js.map +1 -0
  1011. package/dist/frontend/type-patches/semver.test.d.ts +1 -0
  1012. package/dist/frontend/type-patches/semver.test.js +47 -0
  1013. package/dist/frontend/type-patches/semver.test.js.map +1 -0
  1014. package/dist/frontend/worker-target.test.js +2 -2
  1015. package/dist/frontend/worker-target.test.js.map +1 -1
  1016. package/dist/index.d.ts +4 -1
  1017. package/dist/index.js +292 -27
  1018. package/dist/index.js.map +1 -1
  1019. package/dist/ir/builtin-effects.js +51 -5
  1020. package/dist/ir/builtin-effects.js.map +1 -1
  1021. package/dist/ir/builtin-signatures.d.ts +4 -3
  1022. package/dist/ir/builtin-signatures.js +277 -12
  1023. package/dist/ir/builtin-signatures.js.map +1 -1
  1024. package/dist/ir/callback-specialization.js +108 -67
  1025. package/dist/ir/callback-specialization.js.map +1 -1
  1026. package/dist/ir/capture-values.d.ts +7 -1
  1027. package/dist/ir/capture-values.js +28 -5
  1028. package/dist/ir/capture-values.js.map +1 -1
  1029. package/dist/ir/char-unit-locals.js +38 -42
  1030. package/dist/ir/char-unit-locals.js.map +1 -1
  1031. package/dist/ir/expression-inlining.js +12 -6
  1032. package/dist/ir/expression-inlining.js.map +1 -1
  1033. package/dist/ir/fields.generated.d.ts +751 -0
  1034. package/dist/ir/fields.generated.js +2071 -0
  1035. package/dist/ir/fields.generated.js.map +1 -0
  1036. package/dist/ir/fields.test.d.ts +1 -0
  1037. package/dist/ir/fields.test.js +113 -0
  1038. package/dist/ir/fields.test.js.map +1 -0
  1039. package/dist/ir/function-references.js +4 -0
  1040. package/dist/ir/function-references.js.map +1 -1
  1041. package/dist/ir/function-references.test.js +25 -0
  1042. package/dist/ir/function-references.test.js.map +1 -1
  1043. package/dist/ir/inline-array-sources.d.ts +15 -0
  1044. package/dist/ir/inline-array-sources.js +1825 -0
  1045. package/dist/ir/inline-array-sources.js.map +1 -0
  1046. package/dist/ir/inline-arrays.d.ts +41 -0
  1047. package/dist/ir/inline-arrays.js +533 -0
  1048. package/dist/ir/inline-arrays.js.map +1 -0
  1049. package/dist/ir/inline-arrays.test.d.ts +1 -0
  1050. package/dist/ir/inline-arrays.test.js +225 -0
  1051. package/dist/ir/inline-arrays.test.js.map +1 -0
  1052. package/dist/ir/int32-slots.d.ts +6 -0
  1053. package/dist/ir/int32-slots.js +154 -16
  1054. package/dist/ir/int32-slots.js.map +1 -1
  1055. package/dist/ir/int32-slots.test.js +48 -0
  1056. package/dist/ir/int32-slots.test.js.map +1 -1
  1057. package/dist/ir/integer-loops.d.ts +12 -0
  1058. package/dist/ir/integer-loops.js +23 -0
  1059. package/dist/ir/integer-loops.js.map +1 -1
  1060. package/dist/ir/integer-ranges.d.ts +7 -1
  1061. package/dist/ir/integer-ranges.js +29 -2
  1062. package/dist/ir/integer-ranges.js.map +1 -1
  1063. package/dist/ir/intrinsic-signatures.js +2 -1
  1064. package/dist/ir/intrinsic-signatures.js.map +1 -1
  1065. package/dist/ir/ir.d.ts +103 -5
  1066. package/dist/ir/ir.js +38 -4
  1067. package/dist/ir/ir.js.map +1 -1
  1068. package/dist/ir/ir.test.js +134 -1
  1069. package/dist/ir/ir.test.js.map +1 -1
  1070. package/dist/ir/jsval.js +211 -29
  1071. package/dist/ir/jsval.js.map +1 -1
  1072. package/dist/ir/jsval.test.js +120 -0
  1073. package/dist/ir/jsval.test.js.map +1 -1
  1074. package/dist/ir/loop-entry-ranges.d.ts +38 -0
  1075. package/dist/ir/loop-entry-ranges.js +259 -0
  1076. package/dist/ir/loop-entry-ranges.js.map +1 -0
  1077. package/dist/ir/loop-entry-ranges.test.d.ts +1 -0
  1078. package/dist/ir/loop-entry-ranges.test.js +191 -0
  1079. package/dist/ir/loop-entry-ranges.test.js.map +1 -0
  1080. package/dist/ir/node-index.d.ts +3 -0
  1081. package/dist/ir/node-index.js +6 -0
  1082. package/dist/ir/node-index.js.map +1 -1
  1083. package/dist/ir/numeric-call-specialization.d.ts +9 -6
  1084. package/dist/ir/numeric-call-specialization.js +164 -34
  1085. package/dist/ir/numeric-call-specialization.js.map +1 -1
  1086. package/dist/ir/paired-while-loops.js +23 -19
  1087. package/dist/ir/paired-while-loops.js.map +1 -1
  1088. package/dist/ir/parameter-versions.js +6 -3
  1089. package/dist/ir/parameter-versions.js.map +1 -1
  1090. package/dist/ir/receiver-readers.d.ts +10 -0
  1091. package/dist/ir/receiver-readers.js +65 -28
  1092. package/dist/ir/receiver-readers.js.map +1 -1
  1093. package/dist/ir/row-pairs.d.ts +9 -1
  1094. package/dist/ir/row-pairs.js +136 -43
  1095. package/dist/ir/row-pairs.js.map +1 -1
  1096. package/dist/ir/row-pairs.test.js +25 -5
  1097. package/dist/ir/row-pairs.test.js.map +1 -1
  1098. package/dist/ir/runtime-features.d.ts +33 -1
  1099. package/dist/ir/runtime-features.js +104 -6
  1100. package/dist/ir/runtime-features.js.map +1 -1
  1101. package/dist/ir/runtime-features.test.js +13 -0
  1102. package/dist/ir/runtime-features.test.js.map +1 -1
  1103. package/dist/ir/saturating-loop-jams.d.ts +24 -0
  1104. package/dist/ir/saturating-loop-jams.js +420 -0
  1105. package/dist/ir/saturating-loop-jams.js.map +1 -0
  1106. package/dist/ir/saturating-loop-jams.test.d.ts +1 -0
  1107. package/dist/ir/saturating-loop-jams.test.js +196 -0
  1108. package/dist/ir/saturating-loop-jams.test.js.map +1 -0
  1109. package/dist/ir/scalar-records.js +9 -3
  1110. package/dist/ir/scalar-records.js.map +1 -1
  1111. package/dist/ir/self-captures.js +2 -1
  1112. package/dist/ir/self-captures.js.map +1 -1
  1113. package/dist/ir/serialize.d.ts +5 -1
  1114. package/dist/ir/serialize.js +7 -1
  1115. package/dist/ir/serialize.js.map +1 -1
  1116. package/dist/ir/traverse.js +3 -0
  1117. package/dist/ir/traverse.js.map +1 -1
  1118. package/dist/ir/validate.js +91 -9
  1119. package/dist/ir/validate.js.map +1 -1
  1120. package/dist/library/ir-policy.js +1 -0
  1121. package/dist/library/ir-policy.js.map +1 -1
  1122. package/dist/native/cache.js +2 -0
  1123. package/dist/native/cache.js.map +1 -1
  1124. package/dist/native/cli.js +54 -7
  1125. package/dist/native/cli.js.map +1 -1
  1126. package/dist/native/compiler.d.ts +3 -0
  1127. package/dist/native/compiler.js +173 -36
  1128. package/dist/native/compiler.js.map +1 -1
  1129. package/dist/native/compiler.test.js +86 -3
  1130. package/dist/native/compiler.test.js.map +1 -1
  1131. package/dist/native/executable-cache.d.ts +20 -2
  1132. package/dist/native/executable-cache.js +17 -10
  1133. package/dist/native/executable-cache.js.map +1 -1
  1134. package/dist/native/executable-cache.test.js +38 -1
  1135. package/dist/native/executable-cache.test.js.map +1 -1
  1136. package/dist/native/linker-job.d.ts +71 -0
  1137. package/dist/native/linker-job.js +242 -0
  1138. package/dist/native/linker-job.js.map +1 -0
  1139. package/dist/native/linker-job.test.d.ts +1 -0
  1140. package/dist/native/linker-job.test.js +349 -0
  1141. package/dist/native/linker-job.test.js.map +1 -0
  1142. package/dist/native/prepare.js +15 -2
  1143. package/dist/native/prepare.js.map +1 -1
  1144. package/dist/native/sanitizer.js +10 -15
  1145. package/dist/native/sanitizer.js.map +1 -1
  1146. package/dist/native/sanitizer.test.js +152 -66
  1147. package/dist/native/sanitizer.test.js.map +1 -1
  1148. package/dist/native/toolchain.d.ts +11 -2
  1149. package/dist/native/toolchain.js +43 -17
  1150. package/dist/native/toolchain.js.map +1 -1
  1151. package/dist/native/toolchain.test.js +75 -0
  1152. package/dist/native/toolchain.test.js.map +1 -1
  1153. package/dist/node-islands/boundary.d.ts +37 -0
  1154. package/dist/node-islands/boundary.js +135 -0
  1155. package/dist/node-islands/boundary.js.map +1 -0
  1156. package/dist/node-islands/classify.js +1 -1
  1157. package/dist/node-islands/classify.js.map +1 -1
  1158. package/dist/node-islands/effect-gate.d.ts +11 -0
  1159. package/dist/node-islands/effect-gate.js +746 -0
  1160. package/dist/node-islands/effect-gate.js.map +1 -0
  1161. package/dist/node-islands/effect-gate.test.d.ts +1 -0
  1162. package/dist/node-islands/effect-gate.test.js +152 -0
  1163. package/dist/node-islands/effect-gate.test.js.map +1 -0
  1164. package/dist/node-islands/libnode-pack.d.ts +68 -0
  1165. package/dist/node-islands/libnode-pack.js +199 -0
  1166. package/dist/node-islands/libnode-pack.js.map +1 -0
  1167. package/dist/node-islands/libnode-pack.test.d.ts +1 -0
  1168. package/dist/node-islands/libnode-pack.test.js +258 -0
  1169. package/dist/node-islands/libnode-pack.test.js.map +1 -0
  1170. package/dist/node-islands/libnode.d.ts +32 -0
  1171. package/dist/node-islands/libnode.js +212 -0
  1172. package/dist/node-islands/libnode.js.map +1 -0
  1173. package/dist/node-islands/libnode.test.d.ts +1 -0
  1174. package/dist/node-islands/libnode.test.js +170 -0
  1175. package/dist/node-islands/libnode.test.js.map +1 -0
  1176. package/dist/node-islands/modules.d.ts +96 -0
  1177. package/dist/node-islands/modules.js +803 -0
  1178. package/dist/node-islands/modules.js.map +1 -0
  1179. package/dist/node-islands/modules.test.d.ts +1 -0
  1180. package/dist/node-islands/modules.test.js +276 -0
  1181. package/dist/node-islands/modules.test.js.map +1 -0
  1182. package/dist/node-islands/resolve.d.ts +8 -0
  1183. package/dist/node-islands/resolve.js +10 -0
  1184. package/dist/node-islands/resolve.js.map +1 -0
  1185. package/dist/node-islands/snapshot.d.ts +16 -0
  1186. package/dist/node-islands/snapshot.js +486 -0
  1187. package/dist/node-islands/snapshot.js.map +1 -0
  1188. package/dist/node-islands/snapshot.test.d.ts +1 -0
  1189. package/dist/node-islands/snapshot.test.js +56 -0
  1190. package/dist/node-islands/snapshot.test.js.map +1 -0
  1191. package/dist/project-config.d.ts +37 -1
  1192. package/dist/project-config.js +159 -7
  1193. package/dist/project-config.js.map +1 -1
  1194. package/dist/project-config.test.js +153 -0
  1195. package/dist/project-config.test.js.map +1 -1
  1196. package/dist/startup-cache.d.ts +1 -0
  1197. package/dist/startup-cache.js +1 -0
  1198. package/dist/startup-cache.js.map +1 -1
  1199. package/package.json +24 -21
  1200. package/surface-manifest.json +47 -7
@@ -0,0 +1,1931 @@
1
+ /* Calls into Node islands. Milestone NI-1 of the scope-B plan has one kind:
2
+ * the explicit @scriptc/node API, `callSync(specifier, name, ...args)` and
3
+ * `call(...)`, which run an export of a module in Node.js loaded into the
4
+ * program (scr_node_island.c, libnode) and copy JSON data both ways. The
5
+ * libCalls are the only `nodeIsland.*` operations, so a program without
6
+ * them links none of that runtime (the `nodeIsland` runtime feature).
7
+ *
8
+ * Semantics, shared with packages/node/index.js (the Node implementation):
9
+ * the arguments are copied with JSON.stringify of the argument array; the
10
+ * module loads with require() from the calling module, so relative
11
+ * specifiers resolve from it. The specifier is a string literal: the build
12
+ * collects the module and what it loads into the executable
13
+ * (node-islands/modules.ts), and the call names its caller by its path in
14
+ * that tree, never by a path on the build machine. The result crosses as
15
+ * its JSON copy and is
16
+ * checked against the declared result type, like `JSON.parse(s) as T`; a
17
+ * thrown Error crosses as its nearest intrinsic class with its message and
18
+ * string `code`. */
19
+ import { readFileSync, realpathSync } from "node:fs";
20
+ import { resolveFrom } from "../../node-islands/resolve.js";
21
+ import { dirname, isAbsolute, join } from "node:path";
22
+ import * as ts from "../ts7/adapter.js";
23
+ import { locOf } from "../program.js";
24
+ import { PoisonError, newFnCtx } from "./lowerer.js";
25
+ import { BOOL, DYN, FOREIGN, STRING, VOID, } from "../../ir/ir.js";
26
+ import { dynUndefinedExpr, varRef } from "../../ir/build.js";
27
+ import { classMethodValue } from "./class-method-values.js";
28
+ import { funcTypeFromParamShapes } from "./call-signatures.js";
29
+ import { resolveBareModule } from "../resolve.js";
30
+ import { nativeSubclassOfIslandDiag, nodeIslandBoundaryDiag, nodeIslandModuleDiag, } from "../../diagnostics/diagnostic.js";
31
+ import { crossingOf, isForeignType, isIslandSubclassDecl, markIslandSubclass, islandPackageOfFile, } from "../../node-islands/boundary.js";
32
+ import { stripTypeWrappers } from "./typed-arguments.js";
33
+ import { thenReader } from "./checked-promise-all.js";
34
+ import { dynCompoundValue } from "./lower-exprs.js";
35
+ import { COMPOUND_ASSIGN_OPS } from "./surfaces.js";
36
+ const JSON_HINT = "only JSON data (numbers, strings, booleans, null, arrays, plain objects of those, and unknown) crosses into Node.js in this version";
37
+ /** The first part of `t` that is not JSON data, or null. `seen` holds the
38
+ * records and unions already being checked, so a recursive type (a JSON
39
+ * value type that contains arrays or records of itself) ends there. */
40
+ function nonJsonPart(lowerer, t, seen) {
41
+ switch (t.kind) {
42
+ case "f64":
43
+ case "string":
44
+ case "bool":
45
+ case "nullT":
46
+ case "undefinedT":
47
+ case "dyn":
48
+ return null;
49
+ case "array":
50
+ return nonJsonPart(lowerer, t.elem, seen);
51
+ case "record": {
52
+ if (seen.has(`record:${t.shapeId}`))
53
+ return null;
54
+ seen.add(`record:${t.shapeId}`);
55
+ const shape = lowerer.shapes.get(t.shapeId);
56
+ if (shape === undefined)
57
+ return t;
58
+ for (const field of shape.fields) {
59
+ const bad = nonJsonPart(lowerer, field.type, seen);
60
+ if (bad !== null)
61
+ return bad;
62
+ }
63
+ return shape.indexValue === undefined ? null : nonJsonPart(lowerer, shape.indexValue, seen);
64
+ }
65
+ case "union": {
66
+ if (seen.has(`union:${t.unionId}`))
67
+ return null;
68
+ seen.add(`union:${t.unionId}`);
69
+ const def = lowerer.unions.get(t.unionId);
70
+ if (def === undefined)
71
+ return t;
72
+ for (const arm of def.arms) {
73
+ const bad = nonJsonPart(lowerer, arm, seen);
74
+ if (bad !== null)
75
+ return bad;
76
+ }
77
+ return null;
78
+ }
79
+ default:
80
+ return t;
81
+ }
82
+ }
83
+ /** The calling module's real path: relative specifiers resolve from it,
84
+ * as Node's own loader resolves them from the real path of the module. */
85
+ function callerPath(node) {
86
+ const file = ts.getSourceFileOfNode(node).fileName;
87
+ try {
88
+ return realpathSync(file);
89
+ }
90
+ catch {
91
+ return file;
92
+ }
93
+ }
94
+ export function lowerNodeApiCall(lowerer, call, member) {
95
+ const loc = locOf(call);
96
+ const surface = `${member} (@scriptc/node)`;
97
+ const argNodes = call.arguments.nodes;
98
+ if (member === "requireModule")
99
+ return lowerRequireModule(lowerer, call, surface);
100
+ if (call.questionDotToken || argNodes.length < 2 || argNodes.some(ts.isSpreadElement)) {
101
+ lowerer.noLowering(`${surface} without a specifier and an export name, or with spread arguments`, call, "pass the module specifier, the export name and each argument explicitly");
102
+ }
103
+ const specifierNode = argNodes[0];
104
+ if (!ts.isStringLiteral(specifierNode) && !ts.isNoSubstitutionTemplateLiteral(specifierNode)) {
105
+ lowerer.pushDiag(nodeIslandModuleDiag(`${surface} with a computed module specifier`, locOf(specifierNode)));
106
+ throw new PoisonError();
107
+ }
108
+ const caller = callerPath(call);
109
+ const problem = lowerer.nodeIslandModules.add(caller, specifierNode.text);
110
+ if (problem !== null) {
111
+ lowerer.pushDiag(nodeIslandModuleDiag(`${surface}: ${problem}`, locOf(specifierNode)));
112
+ throw new PoisonError();
113
+ }
114
+ const specifier = lowerer.lowerExprExpecting(specifierNode, STRING);
115
+ // An absolute specifier names a file of the build machine: the call names
116
+ // the shipped copy, relative to the caller inside the tree.
117
+ if (isAbsolute(specifierNode.text) && specifier.kind === "strLit") {
118
+ const target = lowerer.nodeIslandModules.resolvedPath(caller, specifierNode.text);
119
+ if (target !== null)
120
+ lowerer.nodeIslandSpecifiers.push({ literal: specifier, caller, target });
121
+ }
122
+ const name = lowerer.lowerExprExpecting(argNodes[1], STRING);
123
+ const values = argNodes.slice(2).map((arg) => {
124
+ const value = lowerer.lowerExpr(arg);
125
+ const bad = nonJsonPart(lowerer, value.type, new Set());
126
+ if (bad !== null)
127
+ lowerer.noLowering(`passing '${lowerer.fmt(bad)}' values to ${surface}`, arg, JSON_HINT);
128
+ return lowerer.coerceToExpected(value, DYN);
129
+ });
130
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(call));
131
+ const result = member === "call" && declared?.kind === "promise" ? declared.inner : declared;
132
+ if (declared === null || result === null || result === undefined) {
133
+ lowerer.noLowering(`${surface} with an unrepresentable result type`, call, JSON_HINT);
134
+ }
135
+ if (result.kind !== "void") {
136
+ const bad = nonJsonPart(lowerer, result, new Set());
137
+ if (bad !== null)
138
+ lowerer.noLowering(`'${lowerer.fmt(bad)}' results of ${surface}`, call, JSON_HINT);
139
+ }
140
+ lowerer.usesNodeIsland = true;
141
+ // The caller's tree path is known once every call is collected (Lowerer).
142
+ const callerLiteral = {
143
+ kind: "strLit",
144
+ value: caller,
145
+ type: STRING,
146
+ loc,
147
+ };
148
+ lowerer.nodeIslandCallers.push({ literal: callerLiteral, caller });
149
+ const raw = {
150
+ kind: "libCall",
151
+ fn: member === "call" ? "nodeIsland.call" : "nodeIsland.callSync",
152
+ args: [callerLiteral, specifier, name, { kind: "dynArrLit", elems: values, type: DYN, loc }],
153
+ type: member === "call" ? { kind: "promise", inner: DYN } : DYN,
154
+ loc,
155
+ };
156
+ // A void result is discarded, unchecked like any void call's value.
157
+ if (declared.kind === "void")
158
+ return raw;
159
+ // The JSON copy meets the declared type through the checked boundary of
160
+ // `JSON.parse(s) as T`: types don't lie, a mismatch throws.
161
+ return lowerer.coerceToExpected(raw, declared);
162
+ }
163
+ /** requireModule(specifier): Node's require() from the calling module, run
164
+ * in the island; the exports cross by reference (scope-B NI-4: an island
165
+ * handle the program uses as an `any` value). The specifier must be a
166
+ * string literal: it resolves at build time exactly as require.resolve
167
+ * resolves it from the caller, and the island loads that file, shipped
168
+ * with the program (islandLoadPath). */
169
+ function lowerRequireModule(lowerer, call, surface) {
170
+ const loc = locOf(call);
171
+ const argNodes = call.arguments.nodes;
172
+ const arg = argNodes[0];
173
+ if (call.questionDotToken ||
174
+ argNodes.length !== 1 ||
175
+ arg === undefined ||
176
+ !ts.isStringLiteral(arg)) {
177
+ lowerer.noLowering(`${surface} without exactly one string-literal specifier`, call, "pass the module specifier as a string literal");
178
+ }
179
+ const from = callerPath(call);
180
+ let path;
181
+ try {
182
+ path = resolveFrom(from, arg.text);
183
+ }
184
+ catch {
185
+ lowerer.noLowering(`${surface} of '${arg.text}', which does not resolve from ${from}`, call, "install the module or fix the specifier");
186
+ }
187
+ lowerer.usesNodeIsland = true;
188
+ const raw = {
189
+ kind: "libCall",
190
+ fn: "nodeIsland.require",
191
+ args: [islandLoadPath(lowerer, path, loc)],
192
+ type: DYN,
193
+ loc,
194
+ };
195
+ const declared = lowerer.mapTypeOf(lowerer.typeOf(call));
196
+ if (declared === null || declared === undefined || declared.kind === "dyn")
197
+ return raw;
198
+ return lowerer.coerceToExpected(raw, declared);
199
+ }
200
+ function boundaryFail(lowerer, what, node) {
201
+ lowerer.pushDiag(nodeIslandBoundaryDiag(what, locOf(node)));
202
+ throw new PoisonError();
203
+ }
204
+ /** Whether the JavaScript file is an ES module by Node's rules. */
205
+ export function isEsmFile(file) {
206
+ if (file.endsWith(".mjs"))
207
+ return true;
208
+ if (file.endsWith(".cjs"))
209
+ return false;
210
+ for (let dir = dirname(file);;) {
211
+ try {
212
+ const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
213
+ return pkg.type === "module";
214
+ }
215
+ catch {
216
+ /* no package.json here */
217
+ }
218
+ const parent = dirname(dir);
219
+ if (parent === dir)
220
+ return false;
221
+ dir = parent;
222
+ }
223
+ }
224
+ /** The island module file `spec` names from `fromFile`, or null when the
225
+ * specifier does not resolve into an island package. */
226
+ export function islandModuleFile(islands, fromFile, spec, kind) {
227
+ const js = resolveBareModule(fromFile, spec, "js-only", kind);
228
+ if (js === null)
229
+ return null;
230
+ if (islandPackageOfFile(islands, js.typesFile) === null)
231
+ return null;
232
+ try {
233
+ return realpathSync(js.typesFile);
234
+ }
235
+ catch {
236
+ return js.typesFile;
237
+ }
238
+ }
239
+ /** The module global of the island module at `path`, created on first use. */
240
+ function islandModuleGlobal(lowerer, path) {
241
+ let binding = lowerer.islandModules.get(path);
242
+ if (binding === undefined) {
243
+ const global = {
244
+ id: `%g.island.${lowerer.globalsList.length}`,
245
+ name: path.split("/").at(-1) ?? "island",
246
+ type: DYN,
247
+ mutable: true,
248
+ };
249
+ lowerer.globalsList.push(global);
250
+ binding = { global, path, esm: isEsmFile(path), snapshots: new Map() };
251
+ lowerer.islandModules.set(path, binding);
252
+ }
253
+ return binding;
254
+ }
255
+ /** The path literal of a load of the file at `path`. The build ships the
256
+ * file with the program (node-islands/modules.ts): the literal names it by
257
+ * its path in the shipped tree once lowering ends. A built-in module keeps
258
+ * its name. */
259
+ function islandLoadPath(lowerer, path, loc) {
260
+ const literal = { kind: "strLit", value: path, type: STRING, loc };
261
+ if (!isAbsolute(path))
262
+ return literal;
263
+ let real = path;
264
+ try {
265
+ real = realpathSync(path);
266
+ }
267
+ catch {
268
+ /* the resolved path */
269
+ }
270
+ const problem = lowerer.nodeIslandModules.addLoaded(real);
271
+ if (problem !== null) {
272
+ lowerer.pushDiag(nodeIslandModuleDiag(problem, loc));
273
+ throw new PoisonError();
274
+ }
275
+ lowerer.nodeIslandLoads.push({ literal, path: real });
276
+ return literal;
277
+ }
278
+ /** The path literal of a module the program shares with its islands
279
+ * (lower-shared-modules.ts), named by its path in the shipped tree like a
280
+ * load's. */
281
+ export function islandSharedPath(lowerer, path, loc) {
282
+ const literal = { kind: "strLit", value: path, type: STRING, loc };
283
+ lowerer.nodeIslandModules.addProvided(path);
284
+ lowerer.nodeIslandLoads.push({ literal, path });
285
+ return literal;
286
+ }
287
+ function loadIslandModule(lowerer, path, loc) {
288
+ return {
289
+ kind: "libCall",
290
+ fn: "nodeIsland.require",
291
+ args: [islandLoadPath(lowerer, path, loc)],
292
+ type: DYN,
293
+ loc,
294
+ };
295
+ }
296
+ /** A static import's load: `nodeIsland.defer(path, snapshot)`, which the
297
+ * build decides after lowering (node-islands/snapshot.ts, scope-B NI-7):
298
+ * a module proved effect-free at load keeps it with its interface snapshot
299
+ * and evaluates on first use; any other becomes nodeIsland.require. */
300
+ function deferIslandModule(lowerer, path, loc) {
301
+ return {
302
+ kind: "libCall",
303
+ fn: "nodeIsland.defer",
304
+ args: [islandLoadPath(lowerer, path, loc), { kind: "strLit", value: "", type: STRING, loc }],
305
+ type: DYN,
306
+ loc,
307
+ };
308
+ }
309
+ /** A static import (or re-export) of an island package: loads the module
310
+ * in the importer's %init prelude. Returns false when `spec` is not an
311
+ * island module. */
312
+ export function collectIslandImport(lowerer, sf, stmt, spec) {
313
+ const islands = lowerer.nodeIslands;
314
+ if (islands === null)
315
+ return false;
316
+ const path = islandModuleFile(islands, sf.fileName, spec, "import");
317
+ if (path === null)
318
+ return false;
319
+ if (ts.isExportDeclaration(stmt)) {
320
+ lowerer.pushDiag(nodeIslandBoundaryDiag(`re-exporting the Node island module '${spec}'`, locOf(stmt)));
321
+ return true;
322
+ }
323
+ lowerer.usesNodeIsland = true;
324
+ const loc = locOf(stmt);
325
+ const binding = islandModuleGlobal(lowerer, path);
326
+ const actions = lowerer.jsonInitActions.get(sf) ?? [];
327
+ lowerer.jsonInitActions.set(sf, actions);
328
+ actions.push({
329
+ kind: "assign",
330
+ localId: binding.global.id,
331
+ value: deferIslandModule(lowerer, path, loc),
332
+ loc,
333
+ });
334
+ // CommonJS named imports: Node's namespace snapshots them once the
335
+ // module evaluated.
336
+ const clause = ts.isImportDeclaration(stmt) ? stmt.importClause : undefined;
337
+ const named = clause?.namedBindings;
338
+ const snapshotNames = [];
339
+ if (!binding.esm && named !== undefined && ts.isNamedImports(named)) {
340
+ for (const el of named.elements.nodes) {
341
+ if (el.isTypeOnly)
342
+ continue;
343
+ snapshotNames.push(el.propertyName?.text ?? el.name.text);
344
+ }
345
+ }
346
+ // A CommonJS namespace import's members are the same snapshot: the
347
+ // members the file reads (`ns.name`).
348
+ if (!binding.esm && named !== undefined && ts.isNamespaceImport(named)) {
349
+ const nsSymbol = lowerer.checker.getSymbolAtLocation(named.name);
350
+ ts.walkPreorder(sf, (node) => {
351
+ if (ts.isPropertyAccessExpression(node) &&
352
+ ts.isIdentifier(node.expression) &&
353
+ ts.isIdentifier(node.name) &&
354
+ node.expression.text === named.name.text &&
355
+ lowerer.checker.getSymbolAtLocation(node.expression) === nsSymbol &&
356
+ !snapshotNames.includes(node.name.text))
357
+ snapshotNames.push(node.name.text);
358
+ return undefined;
359
+ });
360
+ }
361
+ {
362
+ for (const name of snapshotNames) {
363
+ if (name === "default")
364
+ continue;
365
+ let g = binding.snapshots.get(name);
366
+ if (g === undefined) {
367
+ g = {
368
+ id: `%g.island.${lowerer.globalsList.length}`,
369
+ name,
370
+ type: DYN,
371
+ mutable: true,
372
+ };
373
+ lowerer.globalsList.push(g);
374
+ binding.snapshots.set(name, g);
375
+ }
376
+ actions.push({
377
+ kind: "assign",
378
+ localId: g.id,
379
+ value: islandGet(varRef(binding.global.id, DYN, loc), name, loc),
380
+ loc,
381
+ });
382
+ }
383
+ }
384
+ return true;
385
+ }
386
+ function islandGet(target, key, loc) {
387
+ return {
388
+ kind: "libCall",
389
+ fn: "nodeIsland.get",
390
+ args: [target, { kind: "strLit", value: key, type: STRING, loc }],
391
+ type: DYN,
392
+ loc,
393
+ };
394
+ }
395
+ function moduleSpecifierOf(decl) {
396
+ return ts.isImportDeclaration(decl) && ts.isStringLiteral(decl.moduleSpecifier)
397
+ ? decl.moduleSpecifier.text
398
+ : null;
399
+ }
400
+ /** What an identifier binds from an island module, or null. */
401
+ /** Whether `ident` names an import of a Node island module: its value
402
+ * comes from the island, whatever the package's declarations say. */
403
+ export function isIslandImportBinding(lowerer, ident) {
404
+ return islandBindingOf(lowerer, ident) !== null;
405
+ }
406
+ function islandBindingOf(lowerer, ident) {
407
+ const islands = lowerer.nodeIslands;
408
+ if (islands === null)
409
+ return null;
410
+ const symbol = lowerer.checker.getSymbolAtLocation(ident);
411
+ const decl = symbol ? symbol.declarations[0] : undefined;
412
+ if (decl === undefined)
413
+ return null;
414
+ let importDecl;
415
+ let binding;
416
+ if (ts.isNamespaceImport(decl)) {
417
+ importDecl = decl.parent?.parent;
418
+ binding = "namespace";
419
+ }
420
+ else if (ts.isImportClause(decl)) {
421
+ importDecl = decl.parent;
422
+ binding = "default";
423
+ }
424
+ else if (ts.isImportSpecifier(decl)) {
425
+ importDecl = decl.parent?.parent?.parent;
426
+ const name = decl.propertyName?.text ?? decl.name.text;
427
+ binding = name === "default" ? "default" : { name };
428
+ }
429
+ else {
430
+ // `const x = require("pkg")` (a CommonJS module of a native package
431
+ // requiring an island package): x is module.exports.
432
+ const spec = requireSpecOf(lowerer, decl);
433
+ if (spec === null)
434
+ return null;
435
+ const path = islandModuleFile(islands, ts.getSourceFileOfNode(decl).fileName, spec, "require");
436
+ const module = path === null ? undefined : lowerer.islandModules.get(path);
437
+ return module === undefined ? null : { kind: "required", module };
438
+ }
439
+ const spec = moduleSpecifierOf(importDecl);
440
+ if (spec === null || importDecl === undefined)
441
+ return null;
442
+ const path = islandModuleFile(islands, ts.getSourceFileOfNode(importDecl).fileName, spec, "import");
443
+ if (path === null)
444
+ return null;
445
+ const module = lowerer.islandModules.get(path);
446
+ if (module === undefined)
447
+ return null;
448
+ if (binding === "namespace")
449
+ return { kind: "namespace", module };
450
+ if (binding === "default")
451
+ return { kind: "default", module };
452
+ return { kind: "named", module, name: binding.name };
453
+ }
454
+ /** The raw (dyn) value an island import binding reads. */
455
+ function islandBindingValue(lowerer, b, node, loc) {
456
+ const ns = varRef(b.module.global.id, DYN, loc);
457
+ switch (b.kind) {
458
+ case "required":
459
+ return ns;
460
+ case "namespace":
461
+ if (!b.module.esm)
462
+ boundaryFail(lowerer, "the namespace object of a CommonJS island module as a value", node);
463
+ return ns;
464
+ case "default":
465
+ return b.module.esm ? islandGet(ns, "default", loc) : ns;
466
+ case "named": {
467
+ if (b.module.esm)
468
+ return islandGet(ns, b.name, loc);
469
+ const g = b.module.snapshots.get(b.name);
470
+ return g === undefined ? islandGet(ns, b.name, loc) : varRef(g.id, DYN, loc);
471
+ }
472
+ }
473
+ }
474
+ /** An island value (dyn) at the declared type of `node`: island handles
475
+ * stay dyn (FOREIGN), primitives and strings meet their declared type
476
+ * through the checked conversion. */
477
+ function fromIsland(lowerer, raw, node) {
478
+ const tsType = lowerer.typeOf(node);
479
+ const islands = lowerer.nodeIslands;
480
+ if (isForeignType(islands, tsType, lowerer.checker))
481
+ return raw;
482
+ if ((tsType.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
483
+ return raw;
484
+ if ((tsType.flags & (ts.TypeFlags.Void | ts.TypeFlags.Undefined)) !== 0 && isDiscarded(node))
485
+ return raw;
486
+ const mapped = lowerer.mapTypeOf(tsType);
487
+ if (mapped === null)
488
+ boundaryFail(lowerer, `an island value of type '${lowerer.checker.typeToString(tsType)}'`, node);
489
+ if (mapped.kind === "dyn")
490
+ return raw;
491
+ if (mapped.kind === "void")
492
+ return raw;
493
+ // An island promise is the same promise on both sides (the runtime keeps
494
+ // one ScrPromise per V8 promise): PromiseResolve of the dyn value, whose
495
+ // settlement value meets the declared type when it is awaited.
496
+ if (mapped.kind === "promise" &&
497
+ (mapped.inner.kind === "dyn" || copiedType(lowerer, mapped.inner))) {
498
+ const promise = {
499
+ kind: "libCall",
500
+ fn: "dyn.promiseResolve",
501
+ args: [raw, thenReader(lowerer, raw.loc)],
502
+ type: { kind: "promise", inner: DYN },
503
+ loc: raw.loc,
504
+ };
505
+ return mapped.inner.kind === "dyn" ? promise : lowerer.coerceToExpected(promise, mapped);
506
+ }
507
+ // Arrays of copied values (or arrays of those) cross as copies of the
508
+ // island array as an awaited promise's value, and directly where they do
509
+ // not stay handles (below); the checked cast then meets the copy. A
510
+ // native array that crossed in comes back as itself.
511
+ if (mapped.kind === "promise" && copiedArrayType(lowerer, mapped.inner)) {
512
+ const promise = {
513
+ kind: "libCall",
514
+ fn: "nodeIsland.awaitCopy",
515
+ args: [raw],
516
+ type: { kind: "promise", inner: DYN },
517
+ loc: raw.loc,
518
+ };
519
+ return lowerer.coerceToExpected(promise, mapped);
520
+ }
521
+ // NI-5: a native value the program passed in comes back as itself (an
522
+ // export); the checked cast unboxes it, and anything else fails the cast
523
+ // (types don't lie).
524
+ // An array, tuple, Map or Set the island does not declare stays a handle
525
+ // where the program only uses it through island operations (a native
526
+ // array that crossed in and came back answers them too: member
527
+ // operations follow the value).
528
+ if (!copiedType(lowerer, mapped) && containerType(lowerer, tsType) && handleUseOk(lowerer, node))
529
+ return raw;
530
+ // Otherwise an array of copied values is a copy (above).
531
+ if (copiedArrayType(lowerer, mapped)) {
532
+ const copy = {
533
+ kind: "libCall",
534
+ fn: "nodeIsland.copyArrays",
535
+ args: [raw],
536
+ type: DYN,
537
+ loc: raw.loc,
538
+ };
539
+ return lowerer.coerceToExpected(copy, mapped);
540
+ }
541
+ if (!copiedType(lowerer, mapped) && exportedByReference(lowerer, tsType))
542
+ return lowerer.coerceToExpected(raw, mapped);
543
+ if (!copiedType(lowerer, mapped))
544
+ boundaryFail(lowerer, `an island value of type '${lowerer.checker.typeToString(tsType)}' (only primitives and strings are copied; objects of types the island does not declare stay handles from NI-5 on)`, node);
545
+ return lowerer.coerceToExpected(raw, mapped);
546
+ }
547
+ /** An array whose elements are copied values or such arrays. */
548
+ function copiedArrayType(lowerer, t) {
549
+ if (t.kind !== "array")
550
+ return false;
551
+ return copiedType(lowerer, t.elem) || copiedArrayType(lowerer, t.elem);
552
+ }
553
+ /** Whether a value of IR type `t` is copied at the boundary: primitives,
554
+ * strings, null/undefined, and unions of those. */
555
+ function copiedType(lowerer, t) {
556
+ switch (t.kind) {
557
+ case "f64":
558
+ case "string":
559
+ case "bool":
560
+ case "bigint":
561
+ case "nullT":
562
+ case "undefinedT":
563
+ // Buffers and typed arrays share their memory with the V8 view.
564
+ case "bytes":
565
+ return true;
566
+ case "union": {
567
+ const def = lowerer.unions.get(t.unionId);
568
+ return def !== undefined && def.arms.every((a) => copiedType(lowerer, a));
569
+ }
570
+ default:
571
+ return false;
572
+ }
573
+ }
574
+ function isDiscarded(node) {
575
+ let n = node;
576
+ while (n.parent && ts.isParenthesizedExpression(n.parent))
577
+ n = n.parent;
578
+ return (n.parent !== undefined && (ts.isExpressionStatement(n.parent) || ts.isVoidExpression(n.parent)));
579
+ }
580
+ /** Whether `node` evaluates to an island handle (by its declared type) or
581
+ * is an island namespace binding. */
582
+ function isForeignExpr(lowerer, node) {
583
+ const islands = lowerer.nodeIslands;
584
+ if (islands === null)
585
+ return false;
586
+ const inner = stripTypeWrappers(node);
587
+ // super(...) and super.m(...) of an island subclass lower on their own.
588
+ if (inner.kind === ts.SyntaxKind.SuperKeyword)
589
+ return false;
590
+ // `this` in an island subclass member (its checker type is the
591
+ // polymorphic `this` type parameter).
592
+ if (inner.kind === ts.SyntaxKind.ThisKeyword && islandSubclassMember(inner) !== null)
593
+ return true;
594
+ if (ts.isIdentifier(inner) && islandBindingOf(lowerer, inner) !== null)
595
+ return true;
596
+ if (isIslandPromisifyCall(lowerer, inner))
597
+ return true;
598
+ if (ts.isIdentifier(inner)) {
599
+ // `const f = util.promisify(islandFn)`: f is an island function.
600
+ const decl = lowerer.resolveValueSymbol(inner)?.declarations[0];
601
+ if (decl !== undefined &&
602
+ ts.isVariableDeclaration(decl) &&
603
+ decl.initializer !== undefined &&
604
+ (ts.getCombinedNodeFlags(decl) & ts.NodeFlags.Const) !== 0 &&
605
+ isIslandPromisifyCall(lowerer, stripTypeWrappers(decl.initializer)))
606
+ return true;
607
+ }
608
+ if (isForeignType(islands, lowerer.typeOf(inner), lowerer.checker))
609
+ return true;
610
+ if (ts.isIdentifier(inner))
611
+ return islandHandleBinding(lowerer, inner);
612
+ return isIslandHandleExpr(lowerer, inner);
613
+ }
614
+ /** Whether a value of TypeScript type `type` coming out of an island is
615
+ * an object the island does not declare and the program cannot take by
616
+ * reference natively (arrays, tuples, Maps, Sets): it stays a handle. */
617
+ function undeclaredHandleType(lowerer, type) {
618
+ if ((type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0)
619
+ return false;
620
+ if (isForeignType(lowerer.nodeIslands, type, lowerer.checker))
621
+ return false;
622
+ const mapped = lowerer.mapTypeOf(type);
623
+ if (mapped === null || mapped.kind === "dyn" || mapped.kind === "void")
624
+ return false;
625
+ if (mapped.kind === "promise" || copiedType(lowerer, mapped))
626
+ return false;
627
+ return containerType(lowerer, type);
628
+ }
629
+ /** Arrays, tuples, Maps and Sets (every arm of a union, nullish arms
630
+ * aside): the object types an island hands back without declaring them. */
631
+ function containerType(lowerer, type) {
632
+ if (type.isUnionType())
633
+ return ts
634
+ .constituentTypes(type)
635
+ .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
636
+ containerType(lowerer, t));
637
+ if ((type.flags & ts.TypeFlags.Object) === 0)
638
+ return false;
639
+ if (lowerer.checker.isArrayType(type) || lowerer.checker.isTupleType(type))
640
+ return true;
641
+ const name = type.getSymbol()?.escapedName;
642
+ return name === "Map" || name === "Set";
643
+ }
644
+ /** A member read, call, index or `new` whose receiver or callee is an
645
+ * island value. */
646
+ function islandRooted(lowerer, node) {
647
+ const e = stripTypeWrappers(node);
648
+ if (ts.isCallExpression(e)) {
649
+ if (e.expression.kind === ts.SyntaxKind.ImportKeyword)
650
+ return false;
651
+ const callee = stripTypeWrappers(e.expression);
652
+ if (ts.isPropertyAccessExpression(callee) || ts.isElementAccessExpression(callee))
653
+ return isForeignExpr(lowerer, callee.expression);
654
+ return isForeignExpr(lowerer, callee);
655
+ }
656
+ if (ts.isPropertyAccessExpression(e) || ts.isElementAccessExpression(e) || ts.isNewExpression(e))
657
+ return isForeignExpr(lowerer, e.expression);
658
+ return false;
659
+ }
660
+ /** An island operation whose result is an undeclared object (a handle). */
661
+ function isIslandHandleExpr(lowerer, node) {
662
+ return islandRooted(lowerer, node) && undeclaredHandleType(lowerer, lowerer.typeOf(node));
663
+ }
664
+ /** Whether `name` names a `const` initialized with an undeclared island
665
+ * object (`const files = pkg.list()`): the binding holds the handle, and
666
+ * every use goes through island operations. */
667
+ export function islandHandleBinding(lowerer, name) {
668
+ if (lowerer.nodeIslands === null)
669
+ return false;
670
+ const symbol = lowerer.resolveValueSymbol(name) ?? lowerer.checker.getSymbolAtLocation(name);
671
+ if (symbol === undefined || symbol === null)
672
+ return false;
673
+ const known = lowerer.islandHandleBindings.get(symbol);
674
+ if (known !== undefined)
675
+ return known;
676
+ lowerer.islandHandleBindings.set(symbol, false);
677
+ const d = symbol.valueDeclaration;
678
+ const result = d !== undefined &&
679
+ ts.isVariableDeclaration(d) &&
680
+ ts.isIdentifier(d.name) &&
681
+ d.initializer !== undefined &&
682
+ ts.isVariableDeclarationList(d.parent) &&
683
+ (d.parent.flags & ts.NodeFlags.Const) !== 0 &&
684
+ isIslandHandleExpr(lowerer, d.initializer);
685
+ lowerer.islandHandleBindings.set(symbol, result);
686
+ return result;
687
+ }
688
+ /** `a === b` / `a !== b` where both sides are island values and one is
689
+ * an undeclared island object (a handle): handle identity. */
690
+ function isIslandIdentityTest(lowerer, e) {
691
+ const op = e.operatorToken.kind;
692
+ if (op !== ts.SyntaxKind.EqualsEqualsEqualsToken &&
693
+ op !== ts.SyntaxKind.ExclamationEqualsEqualsToken)
694
+ return false;
695
+ const handle = (x) => {
696
+ const inner = stripTypeWrappers(x);
697
+ return ((ts.isIdentifier(inner) && islandHandleBinding(lowerer, inner)) ||
698
+ isIslandHandleExpr(lowerer, inner));
699
+ };
700
+ return ((handle(e.left) || handle(e.right)) &&
701
+ isForeignExpr(lowerer, e.left) &&
702
+ isForeignExpr(lowerer, e.right));
703
+ }
704
+ /** Whether an island handle at `node` is used only through island
705
+ * operations: as a receiver or callee, an argument of an island call, a
706
+ * spread the island lowering flattens, a handle binding's initializer, or
707
+ * a discarded value. */
708
+ function handleUseOk(lowerer, node) {
709
+ let n = node;
710
+ while (n.parent !== undefined &&
711
+ (ts.isParenthesizedExpression(n.parent) ||
712
+ ts.isAsExpression(n.parent) ||
713
+ ts.isNonNullExpression(n.parent) ||
714
+ ts.isSatisfiesExpression(n.parent)))
715
+ n = n.parent;
716
+ const p = n.parent;
717
+ if (p === undefined)
718
+ return false;
719
+ if ((ts.isPropertyAccessExpression(p) || ts.isElementAccessExpression(p)) && p.expression === n)
720
+ return true;
721
+ const islandCallee = (callee) => {
722
+ const c = stripTypeWrappers(callee);
723
+ if (ts.isPropertyAccessExpression(c) || ts.isElementAccessExpression(c))
724
+ return isForeignExpr(lowerer, c.expression);
725
+ return isForeignExpr(lowerer, c);
726
+ };
727
+ if (ts.isCallExpression(p) || ts.isNewExpression(p))
728
+ return p.expression === n || islandCallee(p.expression);
729
+ if (ts.isSpreadElement(p)) {
730
+ const q = p.parent;
731
+ if (ts.isArrayLiteralExpression(q))
732
+ return true;
733
+ return (ts.isCallExpression(q) || ts.isNewExpression(q)) && islandCallee(q.expression);
734
+ }
735
+ if (ts.isVariableDeclaration(p) && p.initializer === n && ts.isIdentifier(p.name))
736
+ return islandHandleBinding(lowerer, p.name);
737
+ if (ts.isBinaryExpression(p) && isIslandIdentityTest(lowerer, p))
738
+ return true;
739
+ return ts.isExpressionStatement(p) || ts.isVoidExpression(p);
740
+ }
741
+ /** `util.promisify(f)` (or the named `promisify` import of node:util) of an
742
+ * island function: Node's own promisify runs in the island, so the result
743
+ * is an island function too (custom promisify symbols, callback order). */
744
+ export function isIslandPromisifyCall(lowerer, node) {
745
+ if (lowerer.nodeIslands === null)
746
+ return false;
747
+ if (!ts.isCallExpression(node) || node.questionDotToken || node.arguments.nodes.length !== 1)
748
+ return false;
749
+ const callee = node.expression;
750
+ const bi = ts.isIdentifier(callee)
751
+ ? lowerer.builtinImportOf(callee)
752
+ : ts.isPropertyAccessExpression(callee)
753
+ ? lowerer.builtinMemberOf(callee)
754
+ : null;
755
+ if (!bi || bi.module !== "util" || bi.member !== "promisify")
756
+ return false;
757
+ return isForeignExpr(lowerer, node.arguments.nodes[0]);
758
+ }
759
+ /** A value crossing INTO the island (an argument or an assigned value), as
760
+ * dyn. */
761
+ function toIsland(lowerer, node) {
762
+ const islands = lowerer.nodeIslands;
763
+ const inner = stripTypeWrappers(node);
764
+ if (ts.isObjectLiteralExpression(inner) || ts.isArrayLiteralExpression(inner)) {
765
+ return freshLiteral(lowerer, inner);
766
+ }
767
+ if ((ts.isIdentifier(inner) && islandHandleBinding(lowerer, inner)) ||
768
+ isIslandHandleExpr(lowerer, inner))
769
+ return lowerer.coerceToExpected(lowerer.lowerExpr(node), DYN);
770
+ const crossing = crossingOf(islands, lowerer.typeOf(node), lowerer.checker);
771
+ switch (crossing) {
772
+ case "copy":
773
+ case "handle":
774
+ return lowerer.coerceToExpected(lowerer.lowerExpr(node), DYN);
775
+ case "dyn":
776
+ // NI-5: the runtime exports dyn objects by reference and copies only
777
+ // primitives, strings and (for now) arrays.
778
+ return lowerer.coerceToExpected(lowerer.lowerExpr(node), DYN);
779
+ case "refused": {
780
+ const type = lowerer.typeOf(node);
781
+ // A type parameter the instance binds to dyn (a generic function
782
+ // over island types, `<T extends TSchema>`): its values are dyn
783
+ // values, and they cross the way `any` values do.
784
+ if ((type.flags & ts.TypeFlags.TypeParameter) !== 0 &&
785
+ lowerer.typeParamResolver(type)?.kind === "dyn")
786
+ return lowerer.coerceToExpected(lowerer.lowerExpr(node), DYN);
787
+ // NI-5: closures, promises, records and class instances cross by
788
+ // reference (scr_node_island_export.c): their dyn boxes keep the
789
+ // native referent, and the closure's thunk checks its arguments.
790
+ if (exportedByReference(lowerer, type)) {
791
+ const lowered = lowerer.lowerExpr(node);
792
+ const value = lowerer.coerceToExpected(lowered, DYN);
793
+ return lowered.type.kind === "object"
794
+ ? withClassMethods(lowerer, value, lowered.type.className, node)
795
+ : value;
796
+ }
797
+ return boundaryFail(lowerer, `a '${lowerer.checker.typeToString(type)}' value (a native object would cross as a copy and lose its identity)`, node);
798
+ }
799
+ }
800
+ }
801
+ /** Whether an island reads the lowered method `name` by that name: a
802
+ * public, string-keyed prototype method. The constructor, #private methods,
803
+ * accessor halves (`get:x`, `set:x`) and symbol-keyed slots (`sym:iterator`)
804
+ * are not properties an island can name. */
805
+ function islandMethodName(name) {
806
+ return name !== "constructor" && !name.startsWith("#") && !/^(?:get|set|sym):/.test(name);
807
+ }
808
+ /** A class instance crossing into an island: its capsule answers island
809
+ * reads of its fields, and its prototype methods come from a table the
810
+ * runtime builds once per class (nodeIsland.classMethods): the unbound
811
+ * method values, whose thunks check the receiver Node calls them on. */
812
+ function withClassMethods(lowerer, value, className, blame) {
813
+ const builder = classMethodsBuilderOf(lowerer, className, blame, value.loc);
814
+ if (builder === null)
815
+ return value;
816
+ return {
817
+ kind: "libCall",
818
+ fn: "nodeIsland.classMethods",
819
+ args: [value, builder],
820
+ type: DYN,
821
+ loc: value.loc,
822
+ };
823
+ }
824
+ /** The builder of a class's method table (a dyn closure answering
825
+ * {name: unbound method value}), or null for a class without methods. */
826
+ function classMethodsBuilderOf(lowerer, className, blame, loc) {
827
+ const info = lowerer.classes.get(className);
828
+ if (info === undefined || info.def.runtime)
829
+ return null;
830
+ const names = [];
831
+ for (let c = info; c !== undefined; c = c.def.base ? lowerer.classes.get(c.def.base) : undefined) {
832
+ for (const m of c.def.methods ?? [])
833
+ if (!names.includes(m) && islandMethodName(m))
834
+ names.push(m);
835
+ }
836
+ if (names.length === 0)
837
+ return null;
838
+ const builder = `%island.methods:${className}`;
839
+ if (!lowerer.classMethodValueHelpers.has(builder)) {
840
+ lowerer.classMethodValueHelpers.add(builder);
841
+ const fields = [];
842
+ for (const m of names) {
843
+ const method = classMethodValue(lowerer, blame, info, m, loc);
844
+ if (method === null)
845
+ continue;
846
+ fields.push({
847
+ key: { kind: "strLit", value: m, type: STRING, loc },
848
+ value: lowerer.coerceToExpected(method, DYN),
849
+ });
850
+ }
851
+ lowerer.liftedFns.push({
852
+ name: builder,
853
+ params: [],
854
+ returnType: DYN,
855
+ locals: [],
856
+ body: [{ kind: "return", value: { kind: "dynObjLit", fields, type: DYN, loc }, loc }],
857
+ loc,
858
+ });
859
+ }
860
+ const closure = {
861
+ kind: "closure",
862
+ fnName: builder,
863
+ captures: [],
864
+ type: funcTypeFromParamShapes([], DYN),
865
+ loc,
866
+ };
867
+ return lowerer.coerceToExpected(closure, DYN);
868
+ }
869
+ /** NI-6: the method-table builder of the class a shared module exports
870
+ * (`ident` is its declaration's name), or null. */
871
+ export function classMethodsBuilder(lowerer, ident, loc) {
872
+ const decl = ident.parent;
873
+ if (decl === undefined || !ts.isClassDeclaration(decl))
874
+ return null;
875
+ return classMethodsBuilderOf(lowerer, lowerer.classNamer(decl), ident, loc);
876
+ }
877
+ /** NI-6: `new C(...)` from island code for the class a shared module
878
+ * exports: a function with the constructor's parameters (its dyn thunk
879
+ * checks the island's arguments) that constructs an instance, as a dyn
880
+ * closure, or null when the constructor's shape is not a plain list of
881
+ * parameters (the island's `new` then throws). */
882
+ export function classConstructHelper(lowerer, ident, loc) {
883
+ const decl = ident.parent;
884
+ if (decl === undefined || !ts.isClassDeclaration(decl))
885
+ return null;
886
+ const className = lowerer.classNamer(decl);
887
+ const info = lowerer.classes.get(className);
888
+ if (info === undefined || info.def.runtime || info.localClass || info.generic)
889
+ return null;
890
+ for (let c = info; c; c = c.base)
891
+ if (c.def.baseValueGlobal)
892
+ return null;
893
+ if (lowerer.inheritsBuiltinErrorCtor(info))
894
+ return null;
895
+ const shapes = info.ctorParams;
896
+ if (shapes.some((s) => s.mode !== "required" && s.mode !== "omittable"))
897
+ return null;
898
+ const name = `%island.new:${className}`;
899
+ if (!lowerer.classMethodValueHelpers.has(name)) {
900
+ lowerer.classMethodValueHelpers.add(name);
901
+ lowerer.noteEdge(`%${className}.constructor`);
902
+ const params = shapes.map((s, i) => ({ localId: `p${i}`, name: `p${i}`, type: s.type }));
903
+ const objectType = { kind: "object", className };
904
+ lowerer.liftedFns.push({
905
+ name,
906
+ params,
907
+ returnType: objectType,
908
+ locals: params.map((p) => ({ id: p.localId, name: p.name, type: p.type, mutable: false })),
909
+ body: [
910
+ {
911
+ kind: "return",
912
+ value: {
913
+ kind: "new",
914
+ className,
915
+ args: params.map((p) => varRef(p.localId, p.type, loc)),
916
+ type: objectType,
917
+ loc,
918
+ },
919
+ loc,
920
+ },
921
+ ],
922
+ loc,
923
+ });
924
+ }
925
+ const closure = {
926
+ kind: "closure",
927
+ fnName: name,
928
+ captures: [],
929
+ type: funcTypeFromParamShapes(shapes, { kind: "object", className }),
930
+ loc,
931
+ };
932
+ return lowerer.coerceToExpected(closure, DYN);
933
+ }
934
+ /** Native values NI-5 exports into the island by reference: functions,
935
+ * promises, and object types other than arrays, tuples, Maps and Sets
936
+ * (records, interfaces, class instances). A union qualifies when every
937
+ * arm does or is copied. */
938
+ function exportedByReference(lowerer, type) {
939
+ const checker = lowerer.checker;
940
+ if (type.isUnionType())
941
+ return ts
942
+ .constituentTypes(type)
943
+ .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
944
+ exportedByReference(lowerer, t));
945
+ if ((type.flags & ts.TypeFlags.Object) === 0)
946
+ return false;
947
+ // Arrays and tuples cross as Proxies over the native array (NI-5b).
948
+ void checker;
949
+ const name = type.getSymbol()?.escapedName;
950
+ if (name === "WeakMap" || name === "WeakSet")
951
+ return false;
952
+ return true;
953
+ }
954
+ /** A fresh object or array literal crosses as a copy (a plain dyn object
955
+ * or array the runtime copies into V8): nothing native can alias it. Its
956
+ * members cross by the same rules (toIsland). */
957
+ function freshLiteral(lowerer, node) {
958
+ const loc = locOf(node);
959
+ // Spreads, methods, accessors and computed keys: the literal lowers as
960
+ // the program's own object, which crosses by reference (NI-5 exports);
961
+ // nothing else holds it, so that is exact.
962
+ if (!plainLiteral(node))
963
+ return lowerer.coerceToExpected(lowerer.lowerExprExpecting(node, DYN), DYN);
964
+ if (ts.isArrayLiteralExpression(node)) {
965
+ const elems = node.elements.nodes.map((el) => {
966
+ if (ts.isSpreadElement(el) || ts.isOmittedExpression(el))
967
+ boundaryFail(lowerer, "a spread or hole in an array literal", el);
968
+ return toIsland(lowerer, el);
969
+ });
970
+ return { kind: "dynArrLit", elems, type: DYN, loc };
971
+ }
972
+ const fields = node.properties.nodes.map((p) => {
973
+ let key;
974
+ let value;
975
+ if (ts.isPropertyAssignment(p) && (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name))) {
976
+ key = p.name.text;
977
+ value = toIsland(lowerer, p.initializer);
978
+ }
979
+ else if (ts.isShorthandPropertyAssignment(p)) {
980
+ const name = p.name;
981
+ key = name.text;
982
+ value = toIsland(lowerer, name);
983
+ }
984
+ else {
985
+ return boundaryFail(lowerer, "a computed key, method, accessor or spread in an object literal", p);
986
+ }
987
+ return { key: { kind: "strLit", value: key, type: STRING, loc }, value };
988
+ });
989
+ return { kind: "dynObjLit", fields, type: DYN, loc };
990
+ }
991
+ /** Whether evaluating an argument runs no code that could change the
992
+ * receiver: literals, names, `this`, functions it creates, object and
993
+ * array literals of those, and operators over those. A unary operator
994
+ * (`+`, `-`, `~`) converts its operand with ToNumber, which calls a
995
+ * user-defined `valueOf`: only a numeric literal operand is inert. */
996
+ function inertArgument(node) {
997
+ const e = stripTypeWrappers(node);
998
+ if (ts.isIdentifier(e) ||
999
+ ts.isLiteralExpression(e) ||
1000
+ ts.isNoSubstitutionTemplateLiteral(e) ||
1001
+ ts.isArrowFunction(e) ||
1002
+ ts.isFunctionExpression(e) ||
1003
+ e.kind === ts.SyntaxKind.ThisKeyword ||
1004
+ e.kind === ts.SyntaxKind.TrueKeyword ||
1005
+ e.kind === ts.SyntaxKind.FalseKeyword ||
1006
+ e.kind === ts.SyntaxKind.NullKeyword)
1007
+ return true;
1008
+ if (ts.isParenthesizedExpression(e))
1009
+ return inertArgument(e.expression);
1010
+ if (ts.isArrayLiteralExpression(e))
1011
+ return e.elements.nodes.every((el) => !ts.isSpreadElement(el) && inertArgument(el));
1012
+ if (ts.isObjectLiteralExpression(e))
1013
+ return e.properties.nodes.every((p) => ts.isShorthandPropertyAssignment(p) ||
1014
+ ts.isMethodDeclaration(p) ||
1015
+ (ts.isPropertyAssignment(p) &&
1016
+ !ts.isComputedPropertyName(p.name) &&
1017
+ inertArgument(p.initializer)));
1018
+ if (ts.isPrefixUnaryExpression(e)) {
1019
+ // `!x` runs no conversion on its operand. `+`, `-` and `~` convert it
1020
+ // with ToNumber, which calls a user-defined `valueOf` on an object:
1021
+ // that can replace the method being called, so only a numeric literal
1022
+ // is inert.
1023
+ if (e.operator === ts.SyntaxKind.ExclamationToken)
1024
+ return inertArgument(e.operand);
1025
+ return e.operand.kind === ts.SyntaxKind.NumericLiteral;
1026
+ }
1027
+ return false;
1028
+ }
1029
+ function argsOf(lowerer, args, loc) {
1030
+ if (args.some((a) => ts.isSpreadElement(a)))
1031
+ return spreadPack(lowerer, args, loc);
1032
+ return { kind: "dynArrLit", elems: args.map((a) => toIsland(lowerer, a)), type: DYN, loc };
1033
+ }
1034
+ /** A fresh dyn array of `items` with their spreads flattened in order
1035
+ * (JavaScript's ArgumentListEvaluation / array literal spread): plain
1036
+ * items cross as island arguments, spread sources (native arrays or
1037
+ * island iterables) flatten through the runtime's spread walk. */
1038
+ function spreadPack(lowerer, items, loc) {
1039
+ const pack = lowerer.declareHiddenLocal("%islandSpread", DYN);
1040
+ const ref = varRef(pack.id, DYN, loc);
1041
+ const stmts = [
1042
+ {
1043
+ kind: "varDecl",
1044
+ localId: pack.id,
1045
+ init: { kind: "dynArrLit", elems: [], type: DYN, loc },
1046
+ loc,
1047
+ },
1048
+ ];
1049
+ for (const item of items) {
1050
+ if (ts.isOmittedExpression(item))
1051
+ boundaryFail(lowerer, "a hole in an array literal", item);
1052
+ const spread = ts.isSpreadElement(item);
1053
+ const value = spread
1054
+ ? lowerer.coerceToExpected(lowerer.lowerExpr(item.expression), DYN)
1055
+ : toIsland(lowerer, item);
1056
+ stmts.push({
1057
+ kind: "exprStmt",
1058
+ expr: {
1059
+ kind: "libCall",
1060
+ fn: spread ? "dyn.packPushSpreadIter" : "dyn.packPush",
1061
+ args: [ref, value],
1062
+ type: { kind: "void" },
1063
+ loc,
1064
+ },
1065
+ loc,
1066
+ });
1067
+ }
1068
+ return { kind: "seqExpr", stmts, result: ref, type: DYN, loc };
1069
+ }
1070
+ /** Optional-chain dots on island receivers the island lowering is
1071
+ * currently lowering the guarded body of. */
1072
+ const handledDots = new Set();
1073
+ /** The outermost unhandled `?.` in `expr`'s access spine whose receiver
1074
+ * is an island value: that dot guards the whole chain. */
1075
+ function islandChainDot(lowerer, expr) {
1076
+ let cur = expr;
1077
+ for (;;) {
1078
+ if (lowerer.chainRecvByNode.has(cur))
1079
+ return null;
1080
+ if (ts.isNonNullExpression(cur)) {
1081
+ cur = cur.expression;
1082
+ continue;
1083
+ }
1084
+ if (ts.isCallExpression(cur) ||
1085
+ ts.isPropertyAccessExpression(cur) ||
1086
+ ts.isElementAccessExpression(cur)) {
1087
+ if (cur.questionDotToken && !handledDots.has(cur)) {
1088
+ return isForeignExpr(lowerer, cur.expression) ? { dot: cur, recv: cur.expression } : null;
1089
+ }
1090
+ cur = cur.expression;
1091
+ continue;
1092
+ }
1093
+ return null;
1094
+ }
1095
+ }
1096
+ /** An optional chain guarded by an island receiver: the receiver
1097
+ * evaluates once; nullish answers undefined, anything else runs the
1098
+ * whole chain with the receiver read back from the guard. */
1099
+ function lowerIslandChain(lowerer, expr, chain, loc) {
1100
+ lowerer.usesNodeIsland = true;
1101
+ const stmts = [];
1102
+ const run = (lower) => {
1103
+ // `x.m?.()`: the method's receiver evaluates once, before the guard.
1104
+ const recv = stripTypeWrappers(chain.recv);
1105
+ if (ts.isCallExpression(chain.dot) &&
1106
+ (ts.isPropertyAccessExpression(recv) || ts.isElementAccessExpression(recv))) {
1107
+ const object = lowerer.coerceToExpected(lowerer.lowerExpr(recv.expression), DYN);
1108
+ const local = lowerer.declareHiddenLocal("%islandThis", DYN);
1109
+ stmts.push({ kind: "varDecl", localId: local.id, init: object, loc });
1110
+ return lowerer.withExpressionOverride(recv.expression, varRef(local.id, DYN, loc), lower);
1111
+ }
1112
+ return lower();
1113
+ };
1114
+ const value = run(() => {
1115
+ const id = lowerer.closureName(loc, "", "chain");
1116
+ const receiver = lowerer.coerceToExpected(lowerer.lowerExpr(chain.recv), DYN);
1117
+ const ref = { kind: "chainRecv", id, type: DYN, loc };
1118
+ handledDots.add(chain.dot);
1119
+ let body;
1120
+ try {
1121
+ body = lowerer.withExpressionOverride(chain.recv, ref, () => lowerer.lowerExpr(expr));
1122
+ }
1123
+ finally {
1124
+ handledDots.delete(chain.dot);
1125
+ }
1126
+ return {
1127
+ kind: "optChain",
1128
+ id,
1129
+ receiver,
1130
+ body: lowerer.coerceToExpected(body, DYN),
1131
+ type: DYN,
1132
+ loc,
1133
+ };
1134
+ });
1135
+ const result = fromIsland(lowerer, value, expr);
1136
+ return stmts.length > 0 ? { kind: "seqExpr", stmts, result, type: result.type, loc } : result;
1137
+ }
1138
+ /** Expressions on island values (the lowerExpr hook; null: not an island
1139
+ * expression, the ordinary lowering applies). */
1140
+ export function lowerIslandExpr(lowerer, expr) {
1141
+ if (lowerer.nodeIslands === null)
1142
+ return null;
1143
+ const loc = locOf(expr);
1144
+ if (ts.isIdentifier(expr)) {
1145
+ const subclass = islandSubclassGlobal(lowerer, expr);
1146
+ if (subclass !== null) {
1147
+ lowerer.usesNodeIsland = true;
1148
+ return varRef(subclass.id, DYN, loc);
1149
+ }
1150
+ const b = islandBindingOf(lowerer, expr);
1151
+ if (b === null) {
1152
+ if (!islandHandleBinding(lowerer, expr))
1153
+ return null;
1154
+ if (!handleUseOk(lowerer, expr))
1155
+ boundaryFail(lowerer, `an island value of type '${lowerer.checker.typeToString(lowerer.typeOf(expr))}' used as a native value (island arrays, Maps and Sets stay handles: read members, call methods, index or spread them)`, expr);
1156
+ lowerer.usesNodeIsland = true;
1157
+ const g = lowerer.globalOf(expr);
1158
+ if (g === null)
1159
+ return null; // the local is declared dyn
1160
+ g.type = DYN;
1161
+ return varRef(g.id, DYN, loc);
1162
+ }
1163
+ lowerer.usesNodeIsland = true;
1164
+ return fromIsland(lowerer, islandBindingValue(lowerer, b, expr, loc), expr);
1165
+ }
1166
+ if (ts.isPropertyAccessExpression(expr) ||
1167
+ ts.isElementAccessExpression(expr) ||
1168
+ ts.isCallExpression(expr)) {
1169
+ const chain = islandChainDot(lowerer, expr);
1170
+ if (chain !== null)
1171
+ return lowerIslandChain(lowerer, expr, chain, loc);
1172
+ }
1173
+ if (ts.isArrayLiteralExpression(expr)) {
1174
+ if (!expr.elements.nodes.some((el) => ts.isSpreadElement(el) && isForeignExpr(lowerer, el.expression)))
1175
+ return null;
1176
+ lowerer.usesNodeIsland = true;
1177
+ const mapped = lowerer.mapTypeOf(lowerer.typeOf(expr));
1178
+ if (mapped === null)
1179
+ boundaryFail(lowerer, "an array literal spreading an island value", expr);
1180
+ const pack = spreadPack(lowerer, expr.elements.nodes, loc);
1181
+ return mapped.kind === "dyn" ? pack : lowerer.coerceToExpected(pack, mapped);
1182
+ }
1183
+ if (ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.name)) {
1184
+ const caughtRead = islandCaughtRead(lowerer, expr);
1185
+ if (caughtRead !== null)
1186
+ return caughtRead;
1187
+ if (!isForeignExpr(lowerer, expr.expression))
1188
+ return null;
1189
+ lowerer.usesNodeIsland = true;
1190
+ const target = islandReceiver(lowerer, expr.expression, expr.name.text, loc);
1191
+ if (target.direct !== undefined)
1192
+ return fromIsland(lowerer, target.direct, expr);
1193
+ return fromIsland(lowerer, islandGet(target.value, expr.name.text, loc), expr);
1194
+ }
1195
+ if (ts.isElementAccessExpression(expr)) {
1196
+ if (!isForeignExpr(lowerer, expr.expression))
1197
+ return null;
1198
+ lowerer.usesNodeIsland = true;
1199
+ const target = lowerer.lowerExpr(expr.expression);
1200
+ const key = toIsland(lowerer, expr.argumentExpression);
1201
+ return fromIsland(lowerer, { kind: "libCall", fn: "nodeIsland.getKey", args: [target, key], type: DYN, loc }, expr);
1202
+ }
1203
+ if (ts.isCallExpression(expr) && isIslandPromisifyCall(lowerer, expr)) {
1204
+ lowerer.usesNodeIsland = true;
1205
+ return {
1206
+ kind: "libCall",
1207
+ fn: "nodeIsland.promisify",
1208
+ args: [lowerer.coerceToExpected(lowerer.lowerExpr(expr.arguments.nodes[0]), DYN)],
1209
+ type: DYN,
1210
+ loc,
1211
+ };
1212
+ }
1213
+ if (ts.isCallExpression(expr)) {
1214
+ const dynamicLoad = lowerIslandLoadCall(lowerer, expr, loc);
1215
+ if (dynamicLoad !== undefined)
1216
+ return dynamicLoad;
1217
+ const callee = stripTypeWrappers(expr.expression);
1218
+ if (expr.questionDotToken && !handledDots.has(expr))
1219
+ return null;
1220
+ const args = expr.arguments.nodes;
1221
+ if (ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.name)) {
1222
+ if (!isForeignExpr(lowerer, callee.expression))
1223
+ return null;
1224
+ lowerer.usesNodeIsland = true;
1225
+ const target = islandReceiver(lowerer, callee.expression, callee.name.text, loc, true);
1226
+ if (target.direct !== undefined) {
1227
+ return fromIsland(lowerer, {
1228
+ kind: "libCall",
1229
+ fn: "nodeIsland.apply",
1230
+ args: [target.direct, argsOf(lowerer, args, loc)],
1231
+ type: DYN,
1232
+ loc,
1233
+ }, expr);
1234
+ }
1235
+ const name = { kind: "strLit", value: callee.name.text, type: STRING, loc };
1236
+ if (args.every((a) => inertArgument(a))) {
1237
+ return fromIsland(lowerer, {
1238
+ kind: "libCall",
1239
+ fn: "nodeIsland.invoke",
1240
+ args: [target.value, name, argsOf(lowerer, args, loc)],
1241
+ type: DYN,
1242
+ loc,
1243
+ }, expr);
1244
+ }
1245
+ // An argument that runs code could replace the method: JavaScript
1246
+ // reads the method first, then evaluates the arguments.
1247
+ const stmts = [];
1248
+ const receiver = lowerer.declareHiddenLocal("%islandRecv", target.value.type);
1249
+ stmts.push({ kind: "varDecl", localId: receiver.id, init: target.value, loc });
1250
+ const recv = varRef(receiver.id, target.value.type, loc);
1251
+ const method = lowerer.declareHiddenLocal("%islandMethod", DYN);
1252
+ stmts.push({
1253
+ kind: "varDecl",
1254
+ localId: method.id,
1255
+ init: { kind: "libCall", fn: "nodeIsland.get", args: [recv, name], type: DYN, loc },
1256
+ loc,
1257
+ });
1258
+ const call = {
1259
+ kind: "libCall",
1260
+ fn: "nodeIsland.applyTo",
1261
+ args: [varRef(method.id, DYN, loc), recv, argsOf(lowerer, args, loc)],
1262
+ type: DYN,
1263
+ loc,
1264
+ };
1265
+ const result = fromIsland(lowerer, call, expr);
1266
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1267
+ }
1268
+ if (!isForeignExpr(lowerer, callee))
1269
+ return null;
1270
+ lowerer.usesNodeIsland = true;
1271
+ const fn = lowerer.lowerExpr(callee);
1272
+ return fromIsland(lowerer, {
1273
+ kind: "libCall",
1274
+ fn: "nodeIsland.apply",
1275
+ args: [fn, argsOf(lowerer, args, loc)],
1276
+ type: DYN,
1277
+ loc,
1278
+ }, expr);
1279
+ }
1280
+ if (ts.isNewExpression(expr)) {
1281
+ if (!isForeignExpr(lowerer, expr.expression))
1282
+ return null;
1283
+ lowerer.usesNodeIsland = true;
1284
+ const ctor = lowerer.lowerExpr(expr.expression);
1285
+ return fromIsland(lowerer, {
1286
+ kind: "libCall",
1287
+ fn: "nodeIsland.construct",
1288
+ args: [ctor, argsOf(lowerer, expr.arguments?.nodes ?? [], loc)],
1289
+ type: DYN,
1290
+ loc,
1291
+ }, expr);
1292
+ }
1293
+ if (ts.isBinaryExpression(expr)) {
1294
+ const op = expr.operatorToken.kind;
1295
+ if (op === ts.SyntaxKind.InstanceOfKeyword) {
1296
+ const global = intrinsicErrorClassOf(lowerer, expr.right);
1297
+ if (global !== null && !lowerer.islandInstanceofHandled.has(expr)) {
1298
+ const name = { kind: "strLit", value: global, type: STRING, loc };
1299
+ // An island value (an instance of a native subclass of an island
1300
+ // error class, say) answers as in Node.
1301
+ if (isForeignExpr(lowerer, expr.left)) {
1302
+ lowerer.usesNodeIsland = true;
1303
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.left), DYN);
1304
+ return {
1305
+ kind: "libCall",
1306
+ fn: "nodeIsland.instanceofGlobal",
1307
+ args: [value, name],
1308
+ type: BOOL,
1309
+ loc,
1310
+ };
1311
+ }
1312
+ // A dyn or caught value may hold one: the native test, else Node's.
1313
+ const left = stripTypeWrappers(expr.left);
1314
+ if (ts.isIdentifier(left)) {
1315
+ const probe = lowerer.lowerExpr(left);
1316
+ if (probe.type.kind === "dyn" || probe.type.kind === "caught") {
1317
+ lowerer.islandInstanceofHandled.add(expr);
1318
+ let native;
1319
+ try {
1320
+ native = lowerer.lowerExpr(expr);
1321
+ }
1322
+ finally {
1323
+ lowerer.islandInstanceofHandled.delete(expr);
1324
+ }
1325
+ lowerer.usesNodeIsland = true;
1326
+ return {
1327
+ kind: "logical",
1328
+ op: "||",
1329
+ left: native,
1330
+ right: {
1331
+ kind: "libCall",
1332
+ fn: "nodeIsland.instanceofGlobal",
1333
+ args: [lowerer.coerceToExpected(probe, DYN), name],
1334
+ type: BOOL,
1335
+ loc,
1336
+ },
1337
+ type: BOOL,
1338
+ loc,
1339
+ };
1340
+ }
1341
+ }
1342
+ }
1343
+ }
1344
+ if (op === ts.SyntaxKind.InstanceOfKeyword && isForeignExpr(lowerer, expr.right)) {
1345
+ lowerer.usesNodeIsland = true;
1346
+ const value = lowerer.coerceToExpected(lowerer.lowerExpr(expr.left), DYN);
1347
+ const ctor = lowerer.lowerExpr(expr.right);
1348
+ return { kind: "libCall", fn: "nodeIsland.instanceof", args: [value, ctor], type: BOOL, loc };
1349
+ }
1350
+ if (isIslandIdentityTest(lowerer, expr)) {
1351
+ lowerer.usesNodeIsland = true;
1352
+ return {
1353
+ kind: "dynScalarEq",
1354
+ left: lowerer.coerceToExpected(lowerer.lowerExpr(expr.left), DYN),
1355
+ right: lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN),
1356
+ ...(op === ts.SyntaxKind.ExclamationEqualsEqualsToken ? { negated: true } : {}),
1357
+ type: BOOL,
1358
+ loc,
1359
+ };
1360
+ }
1361
+ if (op === ts.SyntaxKind.EqualsToken) {
1362
+ const left = stripTypeWrappers(expr.left);
1363
+ if ((ts.isPropertyAccessExpression(left) && ts.isIdentifier(left.name)) ||
1364
+ ts.isElementAccessExpression(left)) {
1365
+ if (!isForeignExpr(lowerer, left.expression))
1366
+ return null;
1367
+ lowerer.usesNodeIsland = true;
1368
+ // JavaScript's order: the receiver, then the key, then the value.
1369
+ const stmts = [];
1370
+ const hold = (name, init, type) => {
1371
+ const local = lowerer.declareHiddenLocal(name, type);
1372
+ stmts.push({ kind: "varDecl", localId: local.id, init, loc });
1373
+ return varRef(local.id, type, loc);
1374
+ };
1375
+ const target = lowerer.lowerExpr(left.expression);
1376
+ const receiver = hold("%islandSetTarget", target, target.type);
1377
+ const key = ts.isPropertyAccessExpression(left)
1378
+ ? null
1379
+ : hold("%islandSetKey", toIsland(lowerer, left.argumentExpression), DYN);
1380
+ const v = hold("%islandSet", toIsland(lowerer, expr.right), DYN);
1381
+ stmts.push({
1382
+ kind: "exprStmt",
1383
+ expr: key === null
1384
+ ? {
1385
+ kind: "libCall",
1386
+ fn: "nodeIsland.set",
1387
+ args: [
1388
+ receiver,
1389
+ {
1390
+ kind: "strLit",
1391
+ value: left.name.text,
1392
+ type: STRING,
1393
+ loc,
1394
+ },
1395
+ v,
1396
+ ],
1397
+ type: { kind: "void" },
1398
+ loc,
1399
+ }
1400
+ : {
1401
+ kind: "libCall",
1402
+ fn: "nodeIsland.setKey",
1403
+ args: [receiver, key, v],
1404
+ type: { kind: "void" },
1405
+ loc,
1406
+ },
1407
+ loc,
1408
+ });
1409
+ const result = fromIsland(lowerer, v, expr);
1410
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1411
+ }
1412
+ return null;
1413
+ }
1414
+ const left = stripTypeWrappers(expr.left);
1415
+ if (op >= ts.SyntaxKind.FirstCompoundAssignment &&
1416
+ op <= ts.SyntaxKind.LastCompoundAssignment &&
1417
+ (ts.isPropertyAccessExpression(left) || ts.isElementAccessExpression(left)) &&
1418
+ isForeignExpr(lowerer, left.expression)) {
1419
+ const cop = COMPOUND_ASSIGN_OPS[op];
1420
+ if (cop === undefined)
1421
+ boundaryFail(lowerer, "a logical assignment to an island object's member", expr);
1422
+ return islandCompoundAssign(lowerer, expr, left, cop, loc);
1423
+ }
1424
+ }
1425
+ return null;
1426
+ }
1427
+ /** `obj.k op= v` / `obj[k] op= v` on an island object: the receiver and
1428
+ * key evaluate once, then the read, the right side, the operator (with
1429
+ * JavaScript's ToPrimitive order, in the runtime) and the write. */
1430
+ function islandCompoundAssign(lowerer, expr, left, op, loc) {
1431
+ lowerer.usesNodeIsland = true;
1432
+ const stmts = [];
1433
+ const hold = (name, init) => {
1434
+ const local = lowerer.declareHiddenLocal(name, DYN);
1435
+ stmts.push({ kind: "varDecl", localId: local.id, init, loc });
1436
+ return varRef(local.id, DYN, loc);
1437
+ };
1438
+ const target = hold("%islandObj", lowerer.coerceToExpected(lowerer.lowerExpr(left.expression), DYN));
1439
+ const key = ts.isPropertyAccessExpression(left)
1440
+ ? null
1441
+ : hold("%islandKey", toIsland(lowerer, left.argumentExpression));
1442
+ const name = ts.isPropertyAccessExpression(left)
1443
+ ? { kind: "strLit", value: left.name.text, type: STRING, loc }
1444
+ : null;
1445
+ const old = name !== null
1446
+ ? { kind: "libCall", fn: "nodeIsland.get", args: [target, name], type: DYN, loc }
1447
+ : { kind: "libCall", fn: "nodeIsland.getKey", args: [target, key], type: DYN, loc };
1448
+ const rhs = lowerer.coerceToExpected(lowerer.lowerExpr(expr.right), DYN);
1449
+ const next = hold("%islandNext", dynCompoundValue(op, old, rhs, loc));
1450
+ stmts.push({
1451
+ kind: "exprStmt",
1452
+ expr: name !== null
1453
+ ? {
1454
+ kind: "libCall",
1455
+ fn: "nodeIsland.set",
1456
+ args: [target, name, next],
1457
+ type: { kind: "void" },
1458
+ loc,
1459
+ }
1460
+ : {
1461
+ kind: "libCall",
1462
+ fn: "nodeIsland.setKey",
1463
+ args: [target, key, next],
1464
+ type: { kind: "void" },
1465
+ loc,
1466
+ },
1467
+ loc,
1468
+ });
1469
+ const result = fromIsland(lowerer, next, expr);
1470
+ return { kind: "seqExpr", stmts, result, type: result.type, loc };
1471
+ }
1472
+ /** The receiver of a member operation on an island value. A CommonJS
1473
+ * namespace binding's members are module.exports' (and `default` is
1474
+ * module.exports itself), answered directly; a call of a member keeps
1475
+ * module.exports as its receiver, so it goes through the method call. */
1476
+ function islandReceiver(lowerer, receiver, member, loc, call = false) {
1477
+ const inner = stripTypeWrappers(receiver);
1478
+ if (ts.isIdentifier(inner)) {
1479
+ const b = islandBindingOf(lowerer, inner);
1480
+ if (b !== null && b.kind === "namespace" && !b.module.esm) {
1481
+ const exports = varRef(b.module.global.id, DYN, loc);
1482
+ if (member === "default")
1483
+ return { value: exports, direct: exports };
1484
+ const snapshot = b.module.snapshots.get(member);
1485
+ if (snapshot !== undefined && !call)
1486
+ return { value: exports, direct: varRef(snapshot.id, DYN, loc) };
1487
+ return { value: exports };
1488
+ }
1489
+ }
1490
+ return { value: lowerer.coerceToExpected(lowerer.lowerExpr(receiver), FOREIGN) };
1491
+ }
1492
+ /** `require("pkg")` (the global require, anywhere) and `import("pkg")` of
1493
+ * an island module: load it at the call. Undefined: not such a call. */
1494
+ function lowerIslandLoadCall(lowerer, expr, loc) {
1495
+ const islands = lowerer.nodeIslands;
1496
+ const arg = expr.arguments.nodes[0];
1497
+ if (expr.arguments.nodes.length !== 1 || arg === undefined || !ts.isStringLiteralLike(arg))
1498
+ return undefined;
1499
+ const isImport = expr.expression.kind === ts.SyntaxKind.ImportKeyword;
1500
+ const isRequire = ts.isIdentifier(expr.expression) &&
1501
+ expr.expression.text === "require" &&
1502
+ !lowerer.checker
1503
+ .getSymbolAtLocation(expr.expression)
1504
+ ?.declarations.some((d) => !ts.getSourceFileOfNode(d).isDeclarationFile);
1505
+ if (!isImport && !isRequire)
1506
+ return undefined;
1507
+ const file = ts.getSourceFileOfNode(expr).fileName;
1508
+ const path = islandModuleFile(islands, file, arg.text, isImport ? "import" : "require");
1509
+ if (path === null)
1510
+ return undefined;
1511
+ lowerer.usesNodeIsland = true;
1512
+ if (isImport) {
1513
+ return {
1514
+ kind: "libCall",
1515
+ fn: "nodeIsland.import",
1516
+ args: [islandLoadPath(lowerer, path, loc)],
1517
+ type: { kind: "promise", inner: DYN },
1518
+ loc,
1519
+ };
1520
+ }
1521
+ return fromIsland(lowerer, loadIslandModule(lowerer, path, loc), expr);
1522
+ }
1523
+ /* ── native classes extending island classes (scope-B NI-5b) ───────────
1524
+ * `class Sub extends IslandBase { ... }` at module top level: the class is
1525
+ * a JavaScript constructor (nodeIsland.subclass) whose instances
1526
+ * Reflect.construct makes through the island base, so island code sees an
1527
+ * instance of the base and `instanceof` holds on both sides. Its
1528
+ * constructor, field initializers, methods and accessors are native
1529
+ * closures (receivers read through dyn.this); `Sub` and its instances are
1530
+ * island values (boundary.ts marks the declaration foreign), so member
1531
+ * operations on them, `this.x` included, are island operations. */
1532
+ /** The extends clause of a top-level class whose base is an island class
1533
+ * (or another such subclass), or null. */
1534
+ export function islandSubclassHeritage(lowerer, decl) {
1535
+ const islands = lowerer.nodeIslands;
1536
+ if (islands === null || decl.name === undefined || !ts.isSourceFile(decl.parent))
1537
+ return null;
1538
+ const t = decl.heritageClauses?.nodes.find((c) => c.token === ts.SyntaxKind.ExtendsKeyword)?.types
1539
+ ?.nodes[0];
1540
+ if (t === undefined)
1541
+ return null;
1542
+ if (!isForeignType(islands, lowerer.typeOf(t.expression), lowerer.checker))
1543
+ return null;
1544
+ return t;
1545
+ }
1546
+ /** Registers a top-level island subclass (splitFiles, before any type
1547
+ * maps): true when `decl` is one. */
1548
+ export function noteIslandSubclass(lowerer, decl) {
1549
+ if (isIslandSubclassDecl(decl))
1550
+ return true;
1551
+ if (islandSubclassHeritage(lowerer, decl) === null)
1552
+ return false;
1553
+ markIslandSubclass(decl);
1554
+ return true;
1555
+ }
1556
+ function islandSubclassGlobal(lowerer, ident) {
1557
+ const symbol = lowerer.resolveValueSymbol(ident);
1558
+ const decl = symbol?.declarations.find(ts.isClassDeclaration);
1559
+ if (decl === undefined || !isIslandSubclassDecl(decl))
1560
+ return null;
1561
+ return lowerer.globalsByDeclNode.get(decl) ?? null;
1562
+ }
1563
+ function memberName(m) {
1564
+ const name = m.name;
1565
+ if (name === undefined)
1566
+ return null;
1567
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name))
1568
+ return name.text;
1569
+ return null;
1570
+ }
1571
+ /** What NI-5b does not build yet, or null. */
1572
+ function islandSubclassRefusal(decl) {
1573
+ for (const m of decl.members.nodes) {
1574
+ if (ts.isSemicolonClassElement(m))
1575
+ continue;
1576
+ const mods = m.modifiers?.nodes ?? [];
1577
+ if (mods.some((x) => x.kind === ts.SyntaxKind.StaticKeyword))
1578
+ return { node: m, what: "static members" };
1579
+ if (mods.some((x) => x.kind === ts.SyntaxKind.Decorator))
1580
+ return { node: m, what: "decorators" };
1581
+ if (ts.isConstructorDeclaration(m)) {
1582
+ if (m.parameters.nodes.some((p) => (p.modifiers?.nodes.length ?? 0) > 0))
1583
+ return { node: m, what: "constructor parameter properties" };
1584
+ continue;
1585
+ }
1586
+ if (ts.isIndexSignatureDeclaration(m))
1587
+ continue;
1588
+ if (ts.isMethodDeclaration(m) ||
1589
+ ts.isPropertyDeclaration(m) ||
1590
+ ts.isGetAccessorDeclaration(m) ||
1591
+ ts.isSetAccessorDeclaration(m)) {
1592
+ if (memberName(m) === null)
1593
+ return { node: m, what: "private or computed member names" };
1594
+ continue;
1595
+ }
1596
+ return { node: m, what: "this kind of member" };
1597
+ }
1598
+ return null;
1599
+ }
1600
+ /** A closure over a fresh native function whose body `build` makes, with
1601
+ * `this` read from the call's receiver (dyn.this). */
1602
+ function receiverFn(lowerer, name, loc, build) {
1603
+ const type = funcTypeFromParamShapes([], VOID);
1604
+ const ctx = newFnCtx(true, null, type, VOID);
1605
+ lowerer.fnStack.push(ctx);
1606
+ try {
1607
+ const self = lowerer.declareThis(DYN);
1608
+ const body = [
1609
+ {
1610
+ kind: "varDecl",
1611
+ localId: self.id,
1612
+ init: { kind: "libCall", fn: "dyn.this", args: [], type: DYN, loc },
1613
+ loc,
1614
+ },
1615
+ ...build(varRef(self.id, DYN, loc)),
1616
+ { kind: "return", value: null, loc },
1617
+ ];
1618
+ lowerer.liftedFns.push({
1619
+ name,
1620
+ params: [],
1621
+ returnType: VOID,
1622
+ locals: ctx.locals,
1623
+ captures: ctx.captures,
1624
+ body,
1625
+ loc,
1626
+ });
1627
+ return { kind: "closure", fnName: name, captures: ctx.captureSources, type, loc };
1628
+ }
1629
+ finally {
1630
+ lowerer.fnStack.pop();
1631
+ }
1632
+ }
1633
+ /** The statement that creates the class: its module global assigned the
1634
+ * JavaScript constructor. */
1635
+ export function lowerIslandSubclass(lowerer, decl) {
1636
+ const loc = locOf(decl);
1637
+ const heritage = islandSubclassHeritage(lowerer, decl);
1638
+ const global = lowerer.globalsByDeclNode.get(decl);
1639
+ const refusal = islandSubclassRefusal(decl);
1640
+ if (refusal !== null || global === undefined) {
1641
+ lowerer.pushDiag(nativeSubclassOfIslandDiag(locOf(refusal?.node ?? heritage), refusal?.what ?? "this declaration form"));
1642
+ throw new PoisonError();
1643
+ }
1644
+ lowerer.usesNodeIsland = true;
1645
+ const className = decl.name.text;
1646
+ const base = lowerer.coerceToExpected(lowerer.lowerExpr(heritage.expression), DYN);
1647
+ const methods = [];
1648
+ const getters = [];
1649
+ const setters = [];
1650
+ const fields = [];
1651
+ let ctor = dynUndefinedExpr(loc);
1652
+ const key = (name) => ({ kind: "strLit", value: name, type: STRING, loc });
1653
+ for (const m of decl.members.nodes) {
1654
+ if (ts.isConstructorDeclaration(m)) {
1655
+ if (m.body === undefined)
1656
+ continue;
1657
+ ctor = lowerer.coerceToExpected(lowerer.lowerLambda(m, true), DYN);
1658
+ }
1659
+ else if (ts.isMethodDeclaration(m)) {
1660
+ if (m.body === undefined)
1661
+ continue;
1662
+ methods.push({
1663
+ key: key(memberName(m)),
1664
+ value: lowerer.coerceToExpected(lowerer.lowerLambda(m, true), DYN),
1665
+ });
1666
+ }
1667
+ else if (ts.isGetAccessorDeclaration(m)) {
1668
+ if (m.body === undefined)
1669
+ continue;
1670
+ getters.push({
1671
+ key: key(memberName(m)),
1672
+ value: lowerer.coerceToExpected(lowerer.lowerLambda(m, true), DYN),
1673
+ });
1674
+ }
1675
+ else if (ts.isSetAccessorDeclaration(m)) {
1676
+ if (m.body === undefined)
1677
+ continue;
1678
+ setters.push({
1679
+ key: key(memberName(m)),
1680
+ value: lowerer.coerceToExpected(lowerer.lowerLambda(m, true), DYN),
1681
+ });
1682
+ }
1683
+ else if (ts.isPropertyDeclaration(m)) {
1684
+ const mods = m.modifiers?.nodes ?? [];
1685
+ if (mods.some((x) => x.kind === ts.SyntaxKind.DeclareKeyword))
1686
+ continue;
1687
+ fields.push(m);
1688
+ }
1689
+ }
1690
+ const fieldsFn = fields.length === 0
1691
+ ? dynUndefinedExpr(loc)
1692
+ : lowerer.coerceToExpected(receiverFn(lowerer, `%island.fields:${className}`, loc, (self) => fields.map((f) => ({
1693
+ kind: "exprStmt",
1694
+ expr: {
1695
+ kind: "libCall",
1696
+ fn: "nodeIsland.defineField",
1697
+ args: [
1698
+ self,
1699
+ key(memberName(f)),
1700
+ f.initializer !== undefined
1701
+ ? toIsland(lowerer, f.initializer)
1702
+ : dynUndefinedExpr(locOf(f)),
1703
+ ],
1704
+ type: VOID,
1705
+ loc: locOf(f),
1706
+ },
1707
+ loc: locOf(f),
1708
+ }))), DYN);
1709
+ const obj = (entries) => ({
1710
+ kind: "dynObjLit",
1711
+ fields: entries,
1712
+ type: DYN,
1713
+ loc,
1714
+ });
1715
+ return {
1716
+ kind: "assign",
1717
+ localId: global.id,
1718
+ value: {
1719
+ kind: "libCall",
1720
+ fn: "nodeIsland.subclass",
1721
+ args: [base, key(className), ctor, fieldsFn, obj(methods), obj(getters), obj(setters)],
1722
+ type: DYN,
1723
+ loc,
1724
+ },
1725
+ loc,
1726
+ };
1727
+ }
1728
+ /** The function whose `this` an expression inside a class member sees,
1729
+ * when that class is an island subclass. */
1730
+ function islandSubclassMember(node) {
1731
+ let n = node.parent;
1732
+ while (n !== undefined && ts.isArrowFunction(n))
1733
+ n = n.parent;
1734
+ while (n !== undefined && !ts.isFunctionLike(n)) {
1735
+ n = n.parent;
1736
+ while (n !== undefined && ts.isArrowFunction(n))
1737
+ n = n.parent;
1738
+ }
1739
+ if (n === undefined || !ts.isClassDeclaration(n.parent) || !isIslandSubclassDecl(n.parent))
1740
+ return null;
1741
+ return n;
1742
+ }
1743
+ /** super(...) in an island subclass's constructor: the instance comes from
1744
+ * the island base (Reflect.construct with the subclass as new.target) and
1745
+ * becomes `this`. */
1746
+ export function lowerIslandSuperCall(lowerer, call) {
1747
+ if (lowerer.nodeIslands === null)
1748
+ return null;
1749
+ const member = islandSubclassMember(call);
1750
+ if (member === null || !ts.isConstructorDeclaration(member))
1751
+ return null;
1752
+ const self = lowerer.resolveThis(call);
1753
+ if (self === null)
1754
+ return null;
1755
+ self.mutable = true;
1756
+ const loc = locOf(call);
1757
+ const value = {
1758
+ kind: "libCall",
1759
+ fn: "nodeIsland.superConstruct",
1760
+ args: [varRef(self.id, DYN, loc), argsOf(lowerer, call.arguments.nodes, loc)],
1761
+ type: DYN,
1762
+ loc,
1763
+ };
1764
+ return {
1765
+ kind: "seqExpr",
1766
+ stmts: [{ kind: "assign", localId: self.id, value, loc }],
1767
+ result: varRef(self.id, DYN, loc),
1768
+ type: DYN,
1769
+ loc,
1770
+ };
1771
+ }
1772
+ /** super.name(...) in an island subclass member: the base prototype's
1773
+ * method on this instance. */
1774
+ export function lowerIslandSuperMethodCall(lowerer, call, access) {
1775
+ if (lowerer.nodeIslands === null || !ts.isIdentifier(access.name))
1776
+ return null;
1777
+ const member = islandSubclassMember(call);
1778
+ if (member === null)
1779
+ return null;
1780
+ const heritage = islandSubclassHeritage(lowerer, member.parent);
1781
+ const self = lowerer.resolveThis(call);
1782
+ if (heritage === null || self === null)
1783
+ return null;
1784
+ const loc = locOf(call);
1785
+ const raw = {
1786
+ kind: "libCall",
1787
+ fn: "nodeIsland.superMethod",
1788
+ args: [
1789
+ lowerer.coerceToExpected(lowerer.lowerExpr(heritage.expression), DYN),
1790
+ varRef(self.id, DYN, loc),
1791
+ { kind: "strLit", value: access.name.text, type: STRING, loc },
1792
+ argsOf(lowerer, call.arguments.nodes, loc),
1793
+ ],
1794
+ type: DYN,
1795
+ loc,
1796
+ };
1797
+ return fromIsland(lowerer, raw, call);
1798
+ }
1799
+ /** A literal freshLiteral copies member by member: identifier or string
1800
+ * keys with values, shorthand properties, array elements without spreads
1801
+ * or holes. */
1802
+ function plainLiteral(node) {
1803
+ if (ts.isArrayLiteralExpression(node))
1804
+ return node.elements.nodes.every((el) => !ts.isSpreadElement(el) && !ts.isOmittedExpression(el));
1805
+ return node.properties.nodes.every((p) => (ts.isPropertyAssignment(p) && (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name))) ||
1806
+ ts.isShorthandPropertyAssignment(p));
1807
+ }
1808
+ /** The specifier of `x = require("spec")` (a variable declaration binding
1809
+ * an identifier to a literal require), or null. */
1810
+ function requireSpecOf(lowerer, decl) {
1811
+ if (!ts.isVariableDeclaration(decl) ||
1812
+ !ts.isIdentifier(decl.name) ||
1813
+ decl.initializer === undefined)
1814
+ return null;
1815
+ // Only a const keeps the module: a let or var can be reassigned.
1816
+ const list = decl.parent;
1817
+ if (!ts.isVariableDeclarationList(list) || (list.flags & ts.NodeFlags.Const) === 0)
1818
+ return null;
1819
+ let init = decl.initializer;
1820
+ while (ts.isParenthesizedExpression(init))
1821
+ init = init.expression;
1822
+ if (!ts.isCallExpression(init) ||
1823
+ !ts.isIdentifier(init.expression) ||
1824
+ init.expression.text !== "require" ||
1825
+ init.arguments.nodes.length !== 1)
1826
+ return null;
1827
+ // The global require, not a function of the program named require.
1828
+ if (lowerer.checker
1829
+ .getSymbolAtLocation(init.expression)
1830
+ ?.declarations.some((d) => !ts.getSourceFileOfNode(d).isDeclarationFile))
1831
+ return null;
1832
+ const arg = init.arguments.nodes[0];
1833
+ return ts.isStringLiteralLike(arg) ? arg.text : null;
1834
+ }
1835
+ /** Top-level `const x = require("pkg")` statements of island packages in a
1836
+ * compiled module (a native package requiring an island package): load the
1837
+ * island module in the module's %init prelude (shortcut: before the body,
1838
+ * not at the statement). */
1839
+ export function collectIslandRequires(lowerer, sf) {
1840
+ const islands = lowerer.nodeIslands;
1841
+ if (islands === null)
1842
+ return;
1843
+ for (const stmt of sf.statements.nodes) {
1844
+ if (!ts.isVariableStatement(stmt))
1845
+ continue;
1846
+ for (const decl of stmt.declarationList.declarations.nodes) {
1847
+ const spec = requireSpecOf(lowerer, decl);
1848
+ if (spec === null)
1849
+ continue;
1850
+ const path = islandModuleFile(islands, sf.fileName, spec, "require");
1851
+ if (path === null)
1852
+ continue;
1853
+ lowerer.usesNodeIsland = true;
1854
+ const loc = locOf(decl);
1855
+ const binding = islandModuleGlobal(lowerer, path);
1856
+ const actions = lowerer.jsonInitActions.get(sf) ?? [];
1857
+ lowerer.jsonInitActions.set(sf, actions);
1858
+ actions.push({
1859
+ kind: "assign",
1860
+ localId: binding.global.id,
1861
+ value: loadIslandModule(lowerer, path, loc),
1862
+ loc,
1863
+ });
1864
+ }
1865
+ }
1866
+ }
1867
+ /* `x instanceof Error` for values that may be island objects (NI-5c). */
1868
+ const INTRINSIC_ERRORS = new Set([
1869
+ "Error",
1870
+ "TypeError",
1871
+ "RangeError",
1872
+ "SyntaxError",
1873
+ "ReferenceError",
1874
+ "EvalError",
1875
+ "URIError",
1876
+ "AggregateError",
1877
+ ]);
1878
+ /** The name of the builtin Error class an expression names (the global, not
1879
+ * a shadowing binding), or null. */
1880
+ function intrinsicErrorClassOf(lowerer, node) {
1881
+ const inner = stripTypeWrappers(node);
1882
+ if (!ts.isIdentifier(inner) || !INTRINSIC_ERRORS.has(inner.text))
1883
+ return null;
1884
+ const decl = lowerer.checker.getSymbolAtLocation(inner)?.declarations[0];
1885
+ if (decl === undefined || !ts.getSourceFileOfNode(decl).isDeclarationFile)
1886
+ return null;
1887
+ return inner.text;
1888
+ }
1889
+ /** `e.message` on a catch binding narrowed to a native type (`if (e
1890
+ * instanceof Error)`): the thrown value may be an island object (an
1891
+ * instance of a native subclass of an island error class), whose members
1892
+ * are island reads; anything else takes the ordinary narrowed read. */
1893
+ function islandCaughtRead(lowerer, expr) {
1894
+ if (lowerer.islandInstanceofHandled.has(expr) || expr.questionDotToken)
1895
+ return null;
1896
+ const receiver = stripTypeWrappers(expr.expression);
1897
+ if (!ts.isIdentifier(receiver))
1898
+ return null;
1899
+ const caught = lowerer.caughtLocalOf(receiver);
1900
+ if (caught === null || isForeignExpr(lowerer, receiver))
1901
+ return null;
1902
+ const tsType = lowerer.typeOf(expr);
1903
+ const mapped = lowerer.mapTypeOf(tsType);
1904
+ if (mapped === null || !copiedType(lowerer, mapped))
1905
+ return null;
1906
+ lowerer.islandInstanceofHandled.add(expr);
1907
+ let ordinary;
1908
+ try {
1909
+ ordinary = lowerer.lowerExpr(expr);
1910
+ }
1911
+ finally {
1912
+ lowerer.islandInstanceofHandled.delete(expr);
1913
+ }
1914
+ const loc = locOf(expr);
1915
+ const value = {
1916
+ kind: "caughtToDyn",
1917
+ value: varRef(caught.id, caught.type, loc),
1918
+ type: DYN,
1919
+ loc,
1920
+ };
1921
+ lowerer.usesNodeIsland = true;
1922
+ return {
1923
+ kind: "ternary",
1924
+ cond: { kind: "libCall", fn: "nodeIsland.isHandle", args: [value], type: BOOL, loc },
1925
+ then: lowerer.coerceToExpected(islandGet(value, expr.name.text, loc), ordinary.type),
1926
+ else_: ordinary,
1927
+ type: ordinary.type,
1928
+ loc,
1929
+ };
1930
+ }
1931
+ //# sourceMappingURL=lower-node-island.js.map