@scriptc/compiler 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/ambient/node-fallback/events.d.ts +6 -1
  2. package/ambient/node-fallback/fs-promises.d.ts +1 -1
  3. package/ambient/node-fallback/fs.d.ts +54 -10
  4. package/ambient/node-fallback/http.d.ts +3 -1
  5. package/ambient/node-fallback/net.d.ts +19 -0
  6. package/ambient/node-fallback/querystring.d.ts +3 -3
  7. package/ambient/scriptc-node-fallback.d.ts +58 -13
  8. package/dist/backend/executable-features.js +13 -0
  9. package/dist/backend/executable-features.js.map +1 -1
  10. package/dist/backend/immutability.d.ts +12 -1
  11. package/dist/backend/immutability.js +50 -4
  12. package/dist/backend/immutability.js.map +1 -1
  13. package/dist/backend/immutability.test.js +95 -1
  14. package/dist/backend/immutability.test.js.map +1 -1
  15. package/dist/backend/library-pack.js +2 -0
  16. package/dist/backend/library-pack.js.map +1 -1
  17. package/dist/backend/linker.d.ts +11 -0
  18. package/dist/backend/linker.js +31 -3
  19. package/dist/backend/linker.js.map +1 -1
  20. package/dist/backend/lld.d.ts +7 -2
  21. package/dist/backend/lld.js +5 -3
  22. package/dist/backend/lld.js.map +1 -1
  23. package/dist/backend/lld.test.js +10 -4
  24. package/dist/backend/lld.test.js.map +1 -1
  25. package/dist/backend/llvm/constant-callbacks.test.js +50 -1
  26. package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
  27. package/dist/backend/llvm/cpu-dispatch.js +6 -5
  28. package/dist/backend/llvm/cpu-dispatch.js.map +1 -1
  29. package/dist/backend/llvm/dyn.d.ts +53 -1
  30. package/dist/backend/llvm/dyn.js +221 -9
  31. package/dist/backend/llvm/dyn.js.map +1 -1
  32. package/dist/backend/llvm/emit-function.js +1 -1
  33. package/dist/backend/llvm/emit-function.js.map +1 -1
  34. package/dist/backend/llvm/emit-module.js +148 -50
  35. package/dist/backend/llvm/emit-module.js.map +1 -1
  36. package/dist/backend/llvm/emit-statements.js +39 -19
  37. package/dist/backend/llvm/emit-statements.js.map +1 -1
  38. package/dist/backend/llvm/emitter.d.ts +29 -2
  39. package/dist/backend/llvm/emitter.js +86 -7
  40. package/dist/backend/llvm/emitter.js.map +1 -1
  41. package/dist/backend/llvm/expr-calls.d.ts +4 -1
  42. package/dist/backend/llvm/expr-calls.js +20 -4
  43. package/dist/backend/llvm/expr-calls.js.map +1 -1
  44. package/dist/backend/llvm/expr-dynamic.js +209 -16
  45. package/dist/backend/llvm/expr-dynamic.js.map +1 -1
  46. package/dist/backend/llvm/expr-primitives.js +94 -11
  47. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  48. package/dist/backend/llvm/expr-stream-bridges.d.ts +8 -0
  49. package/dist/backend/llvm/expr-stream-bridges.js +42 -2
  50. package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
  51. package/dist/backend/llvm/expr-stream-callbacks.d.ts +16 -0
  52. package/dist/backend/llvm/expr-stream-callbacks.js +206 -20
  53. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  54. package/dist/backend/llvm/integer-values.d.ts +2 -0
  55. package/dist/backend/llvm/integer-values.js +6 -0
  56. package/dist/backend/llvm/integer-values.js.map +1 -1
  57. package/dist/backend/llvm/js-ic.d.ts +38 -0
  58. package/dist/backend/llvm/js-ic.js +295 -1
  59. package/dist/backend/llvm/js-ic.js.map +1 -1
  60. package/dist/backend/llvm/lib-dispatch.js +20 -0
  61. package/dist/backend/llvm/lib-dispatch.js.map +1 -1
  62. package/dist/backend/llvm/lib-filesystem.js +116 -11
  63. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  64. package/dist/backend/llvm/lib-process.js +136 -24
  65. package/dist/backend/llvm/lib-process.js.map +1 -1
  66. package/dist/backend/llvm/lib-shared.js +70 -0
  67. package/dist/backend/llvm/lib-shared.js.map +1 -1
  68. package/dist/backend/llvm/lib-stream.js +67 -0
  69. package/dist/backend/llvm/lib-stream.js.map +1 -1
  70. package/dist/backend/llvm/loop-entry-versions.d.ts +2 -2
  71. package/dist/backend/llvm/loop-entry-versions.js +43 -21
  72. package/dist/backend/llvm/loop-entry-versions.js.map +1 -1
  73. package/dist/backend/llvm/loop-state.d.ts +7 -1
  74. package/dist/backend/llvm/loop-state.js +20 -2
  75. package/dist/backend/llvm/loop-state.js.map +1 -1
  76. package/dist/backend/llvm/map-number-lookup.d.ts +3 -1
  77. package/dist/backend/llvm/map-number-lookup.js +7 -3
  78. package/dist/backend/llvm/map-number-lookup.js.map +1 -1
  79. package/dist/backend/llvm/map-number-lookup.test.js +52 -11
  80. package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
  81. package/dist/backend/llvm/receiver-brackets.test.d.ts +1 -0
  82. package/dist/backend/llvm/receiver-brackets.test.js +68 -0
  83. package/dist/backend/llvm/receiver-brackets.test.js.map +1 -0
  84. package/dist/backend/llvm/record-views.d.ts +22 -2
  85. package/dist/backend/llvm/record-views.js +139 -10
  86. package/dist/backend/llvm/record-views.js.map +1 -1
  87. package/dist/backend/llvm/record-views.test.js +76 -0
  88. package/dist/backend/llvm/record-views.test.js.map +1 -1
  89. package/dist/backend/llvm/reference-writes.js +1 -0
  90. package/dist/backend/llvm/reference-writes.js.map +1 -1
  91. package/dist/backend/llvm/shapes.d.ts +3 -0
  92. package/dist/backend/llvm/shapes.js +18 -3
  93. package/dist/backend/llvm/shapes.js.map +1 -1
  94. package/dist/backend/llvm/shapes.test.js +4 -0
  95. package/dist/backend/llvm/shapes.test.js.map +1 -1
  96. package/dist/backend/llvm/speculative-integers.d.ts +10 -1
  97. package/dist/backend/llvm/speculative-integers.js +59 -8
  98. package/dist/backend/llvm/speculative-integers.js.map +1 -1
  99. package/dist/backend/llvm/unwind-abi.d.ts +3 -3
  100. package/dist/backend/llvm/unwind-abi.js +8 -3
  101. package/dist/backend/llvm/unwind-abi.js.map +1 -1
  102. package/dist/backend/llvm/walkers.js +1 -1
  103. package/dist/backend/llvm/walkers.js.map +1 -1
  104. package/dist/backend/native/contracts.d.ts +54 -0
  105. package/dist/backend/native/executable.js +87 -5
  106. package/dist/backend/native/executable.js.map +1 -1
  107. package/dist/backend/native/library.js +1 -1
  108. package/dist/backend/native/library.js.map +1 -1
  109. package/dist/backend/native/runtime-inputs.js +5 -1
  110. package/dist/backend/native/runtime-inputs.js.map +1 -1
  111. package/dist/backend/native/vendor.d.ts +1 -1
  112. package/dist/backend/native/vendor.js +1 -1
  113. package/dist/backend/native/vendor.js.map +1 -1
  114. package/dist/backend/native-codegen.js +3 -0
  115. package/dist/backend/native-codegen.js.map +1 -1
  116. package/dist/backend/native-link-info-core.d.ts +43 -0
  117. package/dist/backend/native-link-info-core.js.map +1 -1
  118. package/dist/backend/native-link-info.js +1 -0
  119. package/dist/backend/native-link-info.js.map +1 -1
  120. package/dist/backend/native-profile.d.ts +4 -1
  121. package/dist/backend/native-profile.js +12 -1
  122. package/dist/backend/native-profile.js.map +1 -1
  123. package/dist/backend/native-profile.test.js +10 -0
  124. package/dist/backend/native-profile.test.js.map +1 -1
  125. package/dist/backend/publication.d.ts +4 -1
  126. package/dist/backend/publication.js +4 -2
  127. package/dist/backend/publication.js.map +1 -1
  128. package/dist/backend/runtime-abi.d.ts +2 -2
  129. package/dist/backend/runtime-abi.js +2 -2
  130. package/dist/backend/runtime-pack-core.d.ts +31 -7
  131. package/dist/backend/runtime-pack-core.js +21 -1
  132. package/dist/backend/runtime-pack-core.js.map +1 -1
  133. package/dist/backend/runtime-pack-native.d.ts +18 -1
  134. package/dist/backend/runtime-pack-native.js +138 -29
  135. package/dist/backend/runtime-pack-native.js.map +1 -1
  136. package/dist/backend/runtime-pack-native.test.js +166 -4
  137. package/dist/backend/runtime-pack-native.test.js.map +1 -1
  138. package/dist/backend/runtime-pack-targets.test.js +3 -1
  139. package/dist/backend/runtime-pack-targets.test.js.map +1 -1
  140. package/dist/backend/runtime-pack.d.ts +7 -0
  141. package/dist/backend/runtime-pack.js +25 -3
  142. package/dist/backend/runtime-pack.js.map +1 -1
  143. package/dist/backend/runtime-pack.test.js +3 -11
  144. package/dist/backend/runtime-pack.test.js.map +1 -1
  145. package/dist/backend/vendor-archives.d.ts +4 -1
  146. package/dist/backend/vendor-archives.js +264 -3
  147. package/dist/backend/vendor-archives.js.map +1 -1
  148. package/dist/backend/vendor-inputs.d.ts +36 -0
  149. package/dist/backend/vendor-inputs.js +42 -0
  150. package/dist/backend/vendor-inputs.js.map +1 -1
  151. package/dist/backend/vendor-inputs.test.js +28 -1
  152. package/dist/backend/vendor-inputs.test.js.map +1 -1
  153. package/dist/backend/warm-cache.js +2 -0
  154. package/dist/backend/warm-cache.js.map +1 -1
  155. package/dist/compat/fetch-profile.d.ts +7 -1
  156. package/dist/compat/fetch-profile.js +23 -10
  157. package/dist/compat/fetch-profile.js.map +1 -1
  158. package/dist/compile-types.d.ts +7 -0
  159. package/dist/contracts/check.d.ts +3 -0
  160. package/dist/contracts/check.js +18 -5
  161. package/dist/contracts/check.js.map +1 -1
  162. package/dist/coverage/surface-manifest.js +1 -1
  163. package/dist/coverage/surface-manifest.js.map +1 -1
  164. package/dist/diagnostics/codes.d.ts +6 -0
  165. package/dist/diagnostics/codes.js +6 -0
  166. package/dist/diagnostics/codes.js.map +1 -1
  167. package/dist/diagnostics/diagnostic.d.ts +50 -0
  168. package/dist/diagnostics/diagnostic.js +142 -3
  169. package/dist/diagnostics/diagnostic.js.map +1 -1
  170. package/dist/diagnostics/dynamic-tier.js +3 -1
  171. package/dist/diagnostics/dynamic-tier.js.map +1 -1
  172. package/dist/executable/executable-cache.d.ts +29 -0
  173. package/dist/executable/executable-cache.js +18 -0
  174. package/dist/executable/executable-cache.js.map +1 -1
  175. package/dist/executable/executable-cache.test.js +5 -1
  176. package/dist/executable/executable-cache.test.js.map +1 -1
  177. package/dist/executable/prepare.d.ts +13 -3
  178. package/dist/executable/prepare.js +271 -18
  179. package/dist/executable/prepare.js.map +1 -1
  180. package/dist/frontend/early-errors.d.ts +14 -0
  181. package/dist/frontend/early-errors.js +305 -0
  182. package/dist/frontend/early-errors.js.map +1 -0
  183. package/dist/frontend/early-errors.test.d.ts +1 -0
  184. package/dist/frontend/early-errors.test.js +42 -0
  185. package/dist/frontend/early-errors.test.js.map +1 -0
  186. package/dist/frontend/inferred-js-diagnostics.test.js +23 -0
  187. package/dist/frontend/inferred-js-diagnostics.test.js.map +1 -1
  188. package/dist/frontend/input-tracker.d.ts +47 -0
  189. package/dist/frontend/input-tracker.js +173 -36
  190. package/dist/frontend/input-tracker.js.map +1 -1
  191. package/dist/frontend/input-tracker.test.js +86 -2
  192. package/dist/frontend/input-tracker.test.js.map +1 -1
  193. package/dist/frontend/js-inference.d.ts +2 -0
  194. package/dist/frontend/js-inference.js +18 -0
  195. package/dist/frontend/js-inference.js.map +1 -0
  196. package/dist/frontend/lowering/binding-analysis.d.ts +2 -1
  197. package/dist/frontend/lowering/binding-analysis.js +65 -1
  198. package/dist/frontend/lowering/binding-analysis.js.map +1 -1
  199. package/dist/frontend/lowering/builtin-calls.js +9 -0
  200. package/dist/frontend/lowering/builtin-calls.js.map +1 -1
  201. package/dist/frontend/lowering/builtin-namespaces.d.ts +1 -1
  202. package/dist/frontend/lowering/builtin-namespaces.js +19 -2
  203. package/dist/frontend/lowering/builtin-namespaces.js.map +1 -1
  204. package/dist/frontend/lowering/builtins/child-process-methods.d.ts +7 -0
  205. package/dist/frontend/lowering/builtins/child-process-methods.js +50 -10
  206. package/dist/frontend/lowering/builtins/child-process-methods.js.map +1 -1
  207. package/dist/frontend/lowering/builtins/child-process.js +5 -1
  208. package/dist/frontend/lowering/builtins/child-process.js.map +1 -1
  209. package/dist/frontend/lowering/builtins/dates.d.ts +1 -1
  210. package/dist/frontend/lowering/builtins/dates.js +23 -1
  211. package/dist/frontend/lowering/builtins/dates.js.map +1 -1
  212. package/dist/frontend/lowering/builtins/environment.d.ts +55 -0
  213. package/dist/frontend/lowering/builtins/environment.js +213 -2
  214. package/dist/frontend/lowering/builtins/environment.js.map +1 -1
  215. package/dist/frontend/lowering/builtins/filesystem-calls.js +47 -16
  216. package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
  217. package/dist/frontend/lowering/builtins/filesystem.d.ts +25 -7
  218. package/dist/frontend/lowering/builtins/filesystem.js +185 -16
  219. package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
  220. package/dist/frontend/lowering/builtins/module-calls.js +39 -2
  221. package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
  222. package/dist/frontend/lowering/builtins/module-resolution.d.ts +8 -0
  223. package/dist/frontend/lowering/builtins/module-resolution.js +31 -5
  224. package/dist/frontend/lowering/builtins/module-resolution.js.map +1 -1
  225. package/dist/frontend/lowering/builtins/operating-system.d.ts +3 -2
  226. package/dist/frontend/lowering/builtins/operating-system.js +5 -4
  227. package/dist/frontend/lowering/builtins/operating-system.js.map +1 -1
  228. package/dist/frontend/lowering/builtins/process.d.ts +17 -1
  229. package/dist/frontend/lowering/builtins/process.js +285 -19
  230. package/dist/frontend/lowering/builtins/process.js.map +1 -1
  231. package/dist/frontend/lowering/builtins/querystring.d.ts +8 -0
  232. package/dist/frontend/lowering/builtins/querystring.js +202 -18
  233. package/dist/frontend/lowering/builtins/querystring.js.map +1 -1
  234. package/dist/frontend/lowering/builtins/readline.js +21 -3
  235. package/dist/frontend/lowering/builtins/readline.js.map +1 -1
  236. package/dist/frontend/lowering/builtins/reflection.js +60 -1
  237. package/dist/frontend/lowering/builtins/reflection.js.map +1 -1
  238. package/dist/frontend/lowering/builtins/text-codecs.js +208 -59
  239. package/dist/frontend/lowering/builtins/text-codecs.js.map +1 -1
  240. package/dist/frontend/lowering/builtins/url.js +20 -1
  241. package/dist/frontend/lowering/builtins/url.js.map +1 -1
  242. package/dist/frontend/lowering/builtins/v8.d.ts +5 -5
  243. package/dist/frontend/lowering/builtins/v8.js +7 -5
  244. package/dist/frontend/lowering/builtins/v8.js.map +1 -1
  245. package/dist/frontend/lowering/builtins/web-streams-dyn.d.ts +17 -2
  246. package/dist/frontend/lowering/builtins/web-streams-dyn.js +97 -9
  247. package/dist/frontend/lowering/builtins/web-streams-dyn.js.map +1 -1
  248. package/dist/frontend/lowering/call-signatures.js +77 -0
  249. package/dist/frontend/lowering/call-signatures.js.map +1 -1
  250. package/dist/frontend/lowering/cjs-exports-object.d.ts +3 -0
  251. package/dist/frontend/lowering/cjs-exports-object.js +1 -1
  252. package/dist/frontend/lowering/cjs-exports-object.js.map +1 -1
  253. package/dist/frontend/lowering/cjs-inline-require.js +5 -0
  254. package/dist/frontend/lowering/cjs-inline-require.js.map +1 -1
  255. package/dist/frontend/lowering/class-dynamic-dispatch.d.ts +5 -0
  256. package/dist/frontend/lowering/class-dynamic-dispatch.js +114 -0
  257. package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
  258. package/dist/frontend/lowering/class-protocols.js +59 -10
  259. package/dist/frontend/lowering/class-protocols.js.map +1 -1
  260. package/dist/frontend/lowering/class-runtime-statics.js +15 -0
  261. package/dist/frontend/lowering/class-runtime-statics.js.map +1 -1
  262. package/dist/frontend/lowering/class-views.d.ts +13 -0
  263. package/dist/frontend/lowering/class-views.js +51 -0
  264. package/dist/frontend/lowering/class-views.js.map +1 -0
  265. package/dist/frontend/lowering/coercions/function-adapters.d.ts +15 -1
  266. package/dist/frontend/lowering/coercions/function-adapters.js +54 -10
  267. package/dist/frontend/lowering/coercions/function-adapters.js.map +1 -1
  268. package/dist/frontend/lowering/coercions/state.d.ts +7 -0
  269. package/dist/frontend/lowering/coercions/state.js +7 -0
  270. package/dist/frontend/lowering/coercions/state.js.map +1 -1
  271. package/dist/frontend/lowering/coercions/structural-plans.js +60 -3
  272. package/dist/frontend/lowering/coercions/structural-plans.js.map +1 -1
  273. package/dist/frontend/lowering/coercions/structural.js +29 -1
  274. package/dist/frontend/lowering/coercions/structural.js.map +1 -1
  275. package/dist/frontend/lowering/containers/array-callbacks.d.ts +8 -1
  276. package/dist/frontend/lowering/containers/array-callbacks.js +132 -28
  277. package/dist/frontend/lowering/containers/array-callbacks.js.map +1 -1
  278. package/dist/frontend/lowering/containers/array-construction.js +16 -5
  279. package/dist/frontend/lowering/containers/array-construction.js.map +1 -1
  280. package/dist/frontend/lowering/containers/array-methods.js +16 -0
  281. package/dist/frontend/lowering/containers/array-methods.js.map +1 -1
  282. package/dist/frontend/lowering/containers/bytes.js +4 -0
  283. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  284. package/dist/frontend/lowering/containers/callback-arguments.d.ts +11 -0
  285. package/dist/frontend/lowering/containers/callback-arguments.js +53 -0
  286. package/dist/frontend/lowering/containers/callback-arguments.js.map +1 -1
  287. package/dist/frontend/lowering/containers/filter-predicates.d.ts +10 -0
  288. package/dist/frontend/lowering/containers/filter-predicates.js +69 -3
  289. package/dist/frontend/lowering/containers/filter-predicates.js.map +1 -1
  290. package/dist/frontend/lowering/containers/indexed-objects.js +46 -2
  291. package/dist/frontend/lowering/containers/indexed-objects.js.map +1 -1
  292. package/dist/frontend/lowering/expressions/array-literals.d.ts +14 -0
  293. package/dist/frontend/lowering/expressions/array-literals.js +26 -10
  294. package/dist/frontend/lowering/expressions/array-literals.js.map +1 -1
  295. package/dist/frontend/lowering/expressions/binary.js +104 -12
  296. package/dist/frontend/lowering/expressions/binary.js.map +1 -1
  297. package/dist/frontend/lowering/expressions/element-access.js +121 -4
  298. package/dist/frontend/lowering/expressions/element-access.js.map +1 -1
  299. package/dist/frontend/lowering/expressions/identifiers.js +143 -3
  300. package/dist/frontend/lowering/expressions/identifiers.js.map +1 -1
  301. package/dist/frontend/lowering/expressions/keyed-field-targets.d.ts +11 -1
  302. package/dist/frontend/lowering/expressions/keyed-field-targets.js +22 -1
  303. package/dist/frontend/lowering/expressions/keyed-field-targets.js.map +1 -1
  304. package/dist/frontend/lowering/expressions/narrowing.js +25 -1
  305. package/dist/frontend/lowering/expressions/narrowing.js.map +1 -1
  306. package/dist/frontend/lowering/expressions/object-literals.d.ts +5 -1
  307. package/dist/frontend/lowering/expressions/object-literals.js +778 -229
  308. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  309. package/dist/frontend/lowering/expressions/optional-chains.js +66 -20
  310. package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
  311. package/dist/frontend/lowering/expressions/property-access.d.ts +31 -0
  312. package/dist/frontend/lowering/expressions/property-access.js +796 -12
  313. package/dist/frontend/lowering/expressions/property-access.js.map +1 -1
  314. package/dist/frontend/lowering/expressions/relational.js +29 -1
  315. package/dist/frontend/lowering/expressions/relational.js.map +1 -1
  316. package/dist/frontend/lowering/expressions/typeof.js +17 -0
  317. package/dist/frontend/lowering/expressions/typeof.js.map +1 -1
  318. package/dist/frontend/lowering/expressions/updates.js +132 -17
  319. package/dist/frontend/lowering/expressions/updates.js.map +1 -1
  320. package/dist/frontend/lowering/frozen-records.d.ts +6 -0
  321. package/dist/frontend/lowering/frozen-records.js +10 -4
  322. package/dist/frontend/lowering/frozen-records.js.map +1 -1
  323. package/dist/frontend/lowering/frozen-records.test.d.ts +1 -0
  324. package/dist/frontend/lowering/frozen-records.test.js +44 -0
  325. package/dist/frontend/lowering/frozen-records.test.js.map +1 -0
  326. package/dist/frontend/lowering/function-names.d.ts +9 -0
  327. package/dist/frontend/lowering/function-names.js +95 -0
  328. package/dist/frontend/lowering/function-names.js.map +1 -0
  329. package/dist/frontend/lowering/function-returns.js +5 -3
  330. package/dist/frontend/lowering/function-returns.js.map +1 -1
  331. package/dist/frontend/lowering/generic-functions.d.ts +49 -0
  332. package/dist/frontend/lowering/generic-functions.js +365 -7
  333. package/dist/frontend/lowering/generic-functions.js.map +1 -1
  334. package/dist/frontend/lowering/global-values.d.ts +9 -0
  335. package/dist/frontend/lowering/global-values.js +44 -0
  336. package/dist/frontend/lowering/global-values.js.map +1 -1
  337. package/dist/frontend/lowering/handle-properties.js +34 -1
  338. package/dist/frontend/lowering/handle-properties.js.map +1 -1
  339. package/dist/frontend/lowering/key-order-witness.d.ts +54 -0
  340. package/dist/frontend/lowering/key-order-witness.js +546 -5
  341. package/dist/frontend/lowering/key-order-witness.js.map +1 -1
  342. package/dist/frontend/lowering/lib-boundary.js +14 -0
  343. package/dist/frontend/lowering/lib-boundary.js.map +1 -1
  344. package/dist/frontend/lowering/lower-assert.js +110 -1
  345. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  346. package/dist/frontend/lowering/lower-builtin-values.d.ts +36 -6
  347. package/dist/frontend/lowering/lower-builtin-values.js +332 -58
  348. package/dist/frontend/lowering/lower-builtin-values.js.map +1 -1
  349. package/dist/frontend/lowering/lower-calls.d.ts +22 -1
  350. package/dist/frontend/lowering/lower-calls.js +427 -48
  351. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  352. package/dist/frontend/lowering/lower-calls.test.d.ts +1 -0
  353. package/dist/frontend/lowering/lower-calls.test.js +78 -0
  354. package/dist/frontend/lowering/lower-calls.test.js.map +1 -0
  355. package/dist/frontend/lowering/lower-classes.d.ts +16 -5
  356. package/dist/frontend/lowering/lower-classes.js +168 -51
  357. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  358. package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -0
  359. package/dist/frontend/lowering/lower-event-emitter.js +383 -41
  360. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  361. package/dist/frontend/lowering/lower-exprs.d.ts +14 -0
  362. package/dist/frontend/lowering/lower-exprs.js +25 -0
  363. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  364. package/dist/frontend/lowering/lower-functions.js +2 -0
  365. package/dist/frontend/lowering/lower-functions.js.map +1 -1
  366. package/dist/frontend/lowering/lower-inspect.js +80 -33
  367. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  368. package/dist/frontend/lowering/lower-modules.js +87 -25
  369. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  370. package/dist/frontend/lowering/lower-node-island.d.ts +35 -4
  371. package/dist/frontend/lowering/lower-node-island.js +456 -61
  372. package/dist/frontend/lowering/lower-node-island.js.map +1 -1
  373. package/dist/frontend/lowering/lower-server.js +160 -9
  374. package/dist/frontend/lowering/lower-server.js.map +1 -1
  375. package/dist/frontend/lowering/lower-shared-modules.js +13 -1
  376. package/dist/frontend/lowering/lower-shared-modules.js.map +1 -1
  377. package/dist/frontend/lowering/lower-stdlib.d.ts +3 -2
  378. package/dist/frontend/lowering/lower-stdlib.js +32 -18
  379. package/dist/frontend/lowering/lower-stdlib.js.map +1 -1
  380. package/dist/frontend/lowering/lower-stmts.d.ts +21 -4
  381. package/dist/frontend/lowering/lower-stmts.js +580 -103
  382. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  383. package/dist/frontend/lowering/lower-stream.js +126 -8
  384. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  385. package/dist/frontend/lowering/lower-timers.js +133 -21
  386. package/dist/frontend/lowering/lower-timers.js.map +1 -1
  387. package/dist/frontend/lowering/lowerer.d.ts +139 -3
  388. package/dist/frontend/lowering/lowerer.js +579 -43
  389. package/dist/frontend/lowering/lowerer.js.map +1 -1
  390. package/dist/frontend/lowering/lowerer.test.js +1 -1
  391. package/dist/frontend/lowering/lowerer.test.js.map +1 -1
  392. package/dist/frontend/lowering/module-namespace-elements.js +15 -0
  393. package/dist/frontend/lowering/module-namespace-elements.js.map +1 -1
  394. package/dist/frontend/lowering/new-target.js +2 -2
  395. package/dist/frontend/lowering/nullish-empty-pattern.d.ts +17 -0
  396. package/dist/frontend/lowering/nullish-empty-pattern.js +118 -0
  397. package/dist/frontend/lowering/nullish-empty-pattern.js.map +1 -0
  398. package/dist/frontend/lowering/partial-assertions.d.ts +39 -0
  399. package/dist/frontend/lowering/partial-assertions.js +195 -0
  400. package/dist/frontend/lowering/partial-assertions.js.map +1 -0
  401. package/dist/frontend/lowering/primitive-wrappers.d.ts +34 -0
  402. package/dist/frontend/lowering/primitive-wrappers.js +220 -0
  403. package/dist/frontend/lowering/primitive-wrappers.js.map +1 -0
  404. package/dist/frontend/lowering/private-statics.d.ts +46 -0
  405. package/dist/frontend/lowering/private-statics.js +322 -0
  406. package/dist/frontend/lowering/private-statics.js.map +1 -0
  407. package/dist/frontend/lowering/record-sources.d.ts +12 -1
  408. package/dist/frontend/lowering/record-sources.js +60 -0
  409. package/dist/frontend/lowering/record-sources.js.map +1 -1
  410. package/dist/frontend/lowering/strict-equality.d.ts +4 -0
  411. package/dist/frontend/lowering/strict-equality.js +14 -0
  412. package/dist/frontend/lowering/strict-equality.js.map +1 -1
  413. package/dist/frontend/lowering/surfaces.d.ts +27 -0
  414. package/dist/frontend/lowering/surfaces.js +135 -62
  415. package/dist/frontend/lowering/surfaces.js.map +1 -1
  416. package/dist/frontend/lowering/unit-journal.d.ts +128 -17
  417. package/dist/frontend/lowering/unit-journal.js +310 -53
  418. package/dist/frontend/lowering/unit-journal.js.map +1 -1
  419. package/dist/frontend/lowering/unit-journal.test.js +91 -3
  420. package/dist/frontend/lowering/unit-journal.test.js.map +1 -1
  421. package/dist/frontend/lowering/unit-reuse.d.ts +92 -0
  422. package/dist/frontend/lowering/unit-reuse.js +1008 -0
  423. package/dist/frontend/lowering/unit-reuse.js.map +1 -0
  424. package/dist/frontend/lowering/width-lift.d.ts +12 -0
  425. package/dist/frontend/npm-file-import.test.d.ts +1 -0
  426. package/dist/frontend/npm-file-import.test.js +76 -0
  427. package/dist/frontend/npm-file-import.test.js.map +1 -0
  428. package/dist/frontend/npm-static.js +17 -2
  429. package/dist/frontend/npm-static.js.map +1 -1
  430. package/dist/frontend/npm.d.ts +9 -0
  431. package/dist/frontend/npm.js +82 -0
  432. package/dist/frontend/npm.js.map +1 -1
  433. package/dist/frontend/pipeline-native.js +2 -1
  434. package/dist/frontend/pipeline-native.js.map +1 -1
  435. package/dist/frontend/pipeline.d.ts +4 -0
  436. package/dist/frontend/pipeline.js +68 -7
  437. package/dist/frontend/pipeline.js.map +1 -1
  438. package/dist/frontend/program-node.d.ts +3 -0
  439. package/dist/frontend/program-node.js +13 -6
  440. package/dist/frontend/program-node.js.map +1 -1
  441. package/dist/frontend/program.d.ts +9 -0
  442. package/dist/frontend/program.js +159 -7
  443. package/dist/frontend/program.js.map +1 -1
  444. package/dist/frontend/provenance-core.js +4 -0
  445. package/dist/frontend/provenance-core.js.map +1 -1
  446. package/dist/frontend/services.d.ts +14 -0
  447. package/dist/frontend/services.js +52 -2
  448. package/dist/frontend/services.js.map +1 -1
  449. package/dist/frontend/services.test.js +61 -1
  450. package/dist/frontend/services.test.js.map +1 -1
  451. package/dist/frontend/shape-inference/analyze.d.ts +5 -0
  452. package/dist/frontend/shape-inference/analyze.js +104 -4
  453. package/dist/frontend/shape-inference/analyze.js.map +1 -1
  454. package/dist/frontend/shape-inference/domain.js +0 -1
  455. package/dist/frontend/shape-inference/domain.js.map +1 -1
  456. package/dist/frontend/shape-inference/index.js +5 -1
  457. package/dist/frontend/shape-inference/index.js.map +1 -1
  458. package/dist/frontend/shape-inference/memo.d.ts +2 -1
  459. package/dist/frontend/shape-inference/memo.js +6 -2
  460. package/dist/frontend/shape-inference/memo.js.map +1 -1
  461. package/dist/frontend/shape-inference/overlay.d.ts +1 -1
  462. package/dist/frontend/shape-inference/overlay.js +116 -2
  463. package/dist/frontend/shape-inference/overlay.js.map +1 -1
  464. package/dist/frontend/shape-inference/static-objects.js +11 -6
  465. package/dist/frontend/shape-inference/static-objects.js.map +1 -1
  466. package/dist/frontend/source-phase-imports.test.d.ts +1 -0
  467. package/dist/frontend/source-phase-imports.test.js +37 -0
  468. package/dist/frontend/source-phase-imports.test.js.map +1 -0
  469. package/dist/frontend/ts7/ast-node.d.ts +6 -1
  470. package/dist/frontend/ts7/ast-node.js +12 -0
  471. package/dist/frontend/ts7/ast-node.js.map +1 -1
  472. package/dist/frontend/ts7/ast-wire-protocols.test.js +11 -3
  473. package/dist/frontend/ts7/ast-wire-protocols.test.js.map +1 -1
  474. package/dist/frontend/ts7/ast-wire.js +3 -5
  475. package/dist/frontend/ts7/ast-wire.js.map +1 -1
  476. package/dist/frontend/ts7/checker-backend.d.ts +13 -0
  477. package/dist/frontend/ts7/checker-backend.js +84 -2
  478. package/dist/frontend/ts7/checker-backend.js.map +1 -1
  479. package/dist/frontend/ts7/checker-backend.test.js +126 -2
  480. package/dist/frontend/ts7/checker-backend.test.js.map +1 -1
  481. package/dist/frontend/ts7/program-host.d.ts +22 -1
  482. package/dist/frontend/ts7/program-host.js +49 -4
  483. package/dist/frontend/ts7/program-host.js.map +1 -1
  484. package/dist/frontend/ts7/program-host.test.js +83 -0
  485. package/dist/frontend/ts7/program-host.test.js.map +1 -1
  486. package/dist/frontend/ts7/rpc-process.d.ts +16 -1
  487. package/dist/frontend/ts7/rpc-process.js +170 -92
  488. package/dist/frontend/ts7/rpc-process.js.map +1 -1
  489. package/dist/frontend/ts7/rpc-process.test.js +49 -21
  490. package/dist/frontend/ts7/rpc-process.test.js.map +1 -1
  491. package/dist/frontend/tsc-codes.js +70 -0
  492. package/dist/frontend/tsc-codes.js.map +1 -1
  493. package/dist/frontend/type-mapper.d.ts +7 -2
  494. package/dist/frontend/type-mapper.js +148 -1
  495. package/dist/frontend/type-mapper.js.map +1 -1
  496. package/dist/index.d.ts +1 -1
  497. package/dist/index.js +152 -8
  498. package/dist/index.js.map +1 -1
  499. package/dist/ir/api.d.ts +1 -1
  500. package/dist/ir/api.js +1 -1
  501. package/dist/ir/api.js.map +1 -1
  502. package/dist/ir/build.d.ts +3 -2
  503. package/dist/ir/build.js +4 -2
  504. package/dist/ir/build.js.map +1 -1
  505. package/dist/ir/builtin-effects.js +53 -0
  506. package/dist/ir/builtin-effects.js.map +1 -1
  507. package/dist/ir/builtin-signatures.d.ts +1 -1
  508. package/dist/ir/builtin-signatures.js +211 -10
  509. package/dist/ir/builtin-signatures.js.map +1 -1
  510. package/dist/ir/codec.d.ts +82 -0
  511. package/dist/ir/codec.generated.d.ts +13 -0
  512. package/dist/ir/codec.generated.js +5274 -0
  513. package/dist/ir/codec.generated.js.map +1 -0
  514. package/dist/ir/codec.js +325 -0
  515. package/dist/ir/codec.js.map +1 -0
  516. package/dist/ir/codec.test.d.ts +1 -0
  517. package/dist/ir/codec.test.js +225 -0
  518. package/dist/ir/codec.test.js.map +1 -0
  519. package/dist/ir/fields.generated.d.ts +20 -10
  520. package/dist/ir/fields.generated.js +1031 -11
  521. package/dist/ir/fields.generated.js.map +1 -1
  522. package/dist/ir/fields.test.js +46 -2
  523. package/dist/ir/fields.test.js.map +1 -1
  524. package/dist/ir/function-references.d.ts +5 -4
  525. package/dist/ir/function-references.js +8 -4
  526. package/dist/ir/function-references.js.map +1 -1
  527. package/dist/ir/function-references.test.js +7 -0
  528. package/dist/ir/function-references.test.js.map +1 -1
  529. package/dist/ir/inline-array-sources.js +4 -1
  530. package/dist/ir/inline-array-sources.js.map +1 -1
  531. package/dist/ir/inline-array-views.d.ts +13 -0
  532. package/dist/ir/inline-array-views.js +944 -0
  533. package/dist/ir/inline-array-views.js.map +1 -0
  534. package/dist/ir/inline-arrays.d.ts +7 -0
  535. package/dist/ir/inline-arrays.js +190 -55
  536. package/dist/ir/inline-arrays.js.map +1 -1
  537. package/dist/ir/inline-arrays.test.js +140 -2
  538. package/dist/ir/inline-arrays.test.js.map +1 -1
  539. package/dist/ir/integer-ranges.js +16 -6
  540. package/dist/ir/integer-ranges.js.map +1 -1
  541. package/dist/ir/ir.d.ts +75 -44
  542. package/dist/ir/ir.js.map +1 -1
  543. package/dist/ir/js-ic.d.ts +10 -9
  544. package/dist/ir/js-ic.js +28 -20
  545. package/dist/ir/js-ic.js.map +1 -1
  546. package/dist/ir/js-ic.test.js +10 -2
  547. package/dist/ir/js-ic.test.js.map +1 -1
  548. package/dist/ir/jsval.js +374 -63
  549. package/dist/ir/jsval.js.map +1 -1
  550. package/dist/ir/jsval.test.js +96 -2
  551. package/dist/ir/jsval.test.js.map +1 -1
  552. package/dist/ir/loop-entry-ranges.js +112 -9
  553. package/dist/ir/loop-entry-ranges.js.map +1 -1
  554. package/dist/ir/loop-entry-ranges.test.js +40 -0
  555. package/dist/ir/loop-entry-ranges.test.js.map +1 -1
  556. package/dist/ir/parameter-versions.d.ts +2 -1
  557. package/dist/ir/parameter-versions.js +3 -1
  558. package/dist/ir/parameter-versions.js.map +1 -1
  559. package/dist/ir/receiver-readers.js +58 -2
  560. package/dist/ir/receiver-readers.js.map +1 -1
  561. package/dist/ir/runtime-features.d.ts +60 -1
  562. package/dist/ir/runtime-features.js +277 -2
  563. package/dist/ir/runtime-features.js.map +1 -1
  564. package/dist/ir/runtime-features.test.js +165 -1
  565. package/dist/ir/runtime-features.test.js.map +1 -1
  566. package/dist/ir/saturating-loop-jams.d.ts +8 -1
  567. package/dist/ir/saturating-loop-jams.js +46 -7
  568. package/dist/ir/saturating-loop-jams.js.map +1 -1
  569. package/dist/ir/saturating-loop-jams.test.js +39 -1
  570. package/dist/ir/saturating-loop-jams.test.js.map +1 -1
  571. package/dist/ir/self-captures.js +8 -1
  572. package/dist/ir/self-captures.js.map +1 -1
  573. package/dist/ir/self-captures.test.js +15 -0
  574. package/dist/ir/self-captures.test.js.map +1 -1
  575. package/dist/ir/serialize.d.ts +3 -2
  576. package/dist/ir/serialize.js +6 -2
  577. package/dist/ir/serialize.js.map +1 -1
  578. package/dist/ir/validate.js +82 -4
  579. package/dist/ir/validate.js.map +1 -1
  580. package/dist/ir/validate.test.js +46 -0
  581. package/dist/ir/validate.test.js.map +1 -1
  582. package/dist/library/ir-policy.js +3 -0
  583. package/dist/library/ir-policy.js.map +1 -1
  584. package/dist/native/cache.js +2 -0
  585. package/dist/native/cache.js.map +1 -1
  586. package/dist/native/cli.js +2 -0
  587. package/dist/native/cli.js.map +1 -1
  588. package/dist/native/compiler.js +8 -2
  589. package/dist/native/compiler.js.map +1 -1
  590. package/dist/native/prepare.js +32 -3
  591. package/dist/native/prepare.js.map +1 -1
  592. package/dist/native/sanitizer.js +53 -3
  593. package/dist/native/sanitizer.js.map +1 -1
  594. package/dist/native/sanitizer.test.js +88 -2
  595. package/dist/native/sanitizer.test.js.map +1 -1
  596. package/dist/native/toolchain.js +9 -2
  597. package/dist/native/toolchain.js.map +1 -1
  598. package/dist/node-islands/boundary.d.ts +25 -1
  599. package/dist/node-islands/boundary.js +28 -2
  600. package/dist/node-islands/boundary.js.map +1 -1
  601. package/dist/node-islands/detect.d.ts +18 -1
  602. package/dist/node-islands/detect.js +365 -40
  603. package/dist/node-islands/detect.js.map +1 -1
  604. package/dist/node-islands/detect.test.js +151 -4
  605. package/dist/node-islands/detect.test.js.map +1 -1
  606. package/dist/node-islands/effect-gate.js +30 -20
  607. package/dist/node-islands/effect-gate.js.map +1 -1
  608. package/dist/node-islands/effect-gate.test.js +4 -1
  609. package/dist/node-islands/effect-gate.test.js.map +1 -1
  610. package/dist/node-islands/libnode.d.ts +1 -1
  611. package/dist/node-islands/libnode.js +1 -1
  612. package/dist/node-islands/libnode.js.map +1 -1
  613. package/dist/node-islands/modules.d.ts +28 -0
  614. package/dist/node-islands/modules.js +156 -0
  615. package/dist/node-islands/modules.js.map +1 -1
  616. package/dist/node-islands/modules.test.js +105 -1
  617. package/dist/node-islands/modules.test.js.map +1 -1
  618. package/dist/node-islands/policy.js +2 -3
  619. package/dist/node-islands/policy.js.map +1 -1
  620. package/dist/node-islands/probe-recorder.d.ts +1 -0
  621. package/dist/node-islands/probe-recorder.js +596 -0
  622. package/dist/node-islands/probe-recorder.js.map +1 -0
  623. package/dist/node-islands/probe-recorder.test.d.ts +1 -0
  624. package/dist/node-islands/probe-recorder.test.js +80 -0
  625. package/dist/node-islands/probe-recorder.test.js.map +1 -0
  626. package/dist/node-islands/report.test.js +2 -0
  627. package/dist/node-islands/report.test.js.map +1 -1
  628. package/dist/node-islands/rules.js +4 -0
  629. package/dist/node-islands/rules.js.map +1 -1
  630. package/dist/node-islands/scan.d.ts +7 -1
  631. package/dist/node-islands/scan.js +51 -2
  632. package/dist/node-islands/scan.js.map +1 -1
  633. package/dist/node-islands/snapshot.d.ts +38 -1
  634. package/dist/node-islands/snapshot.js +165 -161
  635. package/dist/node-islands/snapshot.js.map +1 -1
  636. package/dist/node-islands/snapshot.test.js +63 -2
  637. package/dist/node-islands/snapshot.test.js.map +1 -1
  638. package/dist/node-islands/summary.js +8 -0
  639. package/dist/node-islands/summary.js.map +1 -1
  640. package/dist/node-islands/type-strip.d.ts +11 -0
  641. package/dist/node-islands/type-strip.js +157 -0
  642. package/dist/node-islands/type-strip.js.map +1 -0
  643. package/dist/node-islands/type-strip.test.d.ts +1 -0
  644. package/dist/node-islands/type-strip.test.js +31 -0
  645. package/dist/node-islands/type-strip.test.js.map +1 -0
  646. package/dist/project-config.d.ts +4 -0
  647. package/dist/project-config.js +19 -0
  648. package/dist/project-config.js.map +1 -1
  649. package/dist/project-config.test.js +10 -0
  650. package/dist/project-config.test.js.map +1 -1
  651. package/package.json +20 -20
  652. package/surface-manifest.json +43 -11
@@ -16,19 +16,20 @@
16
16
  * checked against the declared result type, like `JSON.parse(s) as T`; a
17
17
  * thrown Error crosses as its nearest intrinsic class with its message and
18
18
  * string `code`. */
19
- import { readFileSync, realpathSync } from "node:fs";
19
+ import { readFileSync, realpathSync, statSync } from "node:fs";
20
20
  import { resolveFrom } from "../../node-islands/resolve.js";
21
- import { dirname, isAbsolute, join } from "node:path";
21
+ import { dirname, isAbsolute, join, resolve } from "node:path";
22
22
  import * as ts from "../ts7/adapter.js";
23
- import { locOf } from "../program.js";
23
+ import { isJsSourceFile, locOf } from "../program.js";
24
+ import { isRelativeSpecifier } from "../workspace-registry.js";
24
25
  import { PoisonError, newFnCtx } from "./lowerer.js";
25
26
  import { BOOL, DYN, FOREIGN, STRING, VOID, } from "../../ir/ir.js";
26
27
  import { dynUndefinedExpr, varRef } from "../../ir/build.js";
27
28
  import { classMethodValue } from "./class-method-values.js";
28
29
  import { funcTypeFromParamShapes } from "./call-signatures.js";
29
30
  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";
31
+ import { nativeSubclassOfIslandDiag, nodeIslandBoundaryDiag, nodeIslandDataFileDiag, nodeIslandModuleDiag, } from "../../diagnostics/diagnostic.js";
32
+ import { crossingOf, isForeignType, isIslandProgramModule, isIslandSubclassDecl, markIslandSubclass, islandOwnerOfFile, } from "../../node-islands/boundary.js";
32
33
  import { stripTypeWrappers } from "./typed-arguments.js";
33
34
  import { thenReader } from "./checked-promise-all.js";
34
35
  import { dynCompoundValue } from "./lower-exprs.js";
@@ -108,7 +109,10 @@ export function lowerNodeApiCall(lowerer, call, member) {
108
109
  const caller = callerPath(call);
109
110
  const problem = lowerer.nodeIslandModules.add(caller, specifierNode.text);
110
111
  if (problem !== null) {
111
- lowerer.pushDiag(nodeIslandModuleDiag(`${surface}: ${problem}`, locOf(specifierNode)));
112
+ const diag = lowerer.nodeIslandModules.isDataFileProblem(problem)
113
+ ? nodeIslandDataFileDiag
114
+ : nodeIslandModuleDiag;
115
+ lowerer.pushDiag(diag(`${surface}: ${problem}`, locOf(specifierNode)));
112
116
  throw new PoisonError();
113
117
  }
114
118
  const specifier = lowerer.lowerExprExpecting(specifierNode, STRING);
@@ -221,19 +225,59 @@ export function isEsmFile(file) {
221
225
  dir = parent;
222
226
  }
223
227
  }
228
+ /** The file a relative (or absolute) specifier names from `fromFile`, as
229
+ * Node's CommonJS/ESM resolution would find it, or null. Extension fallback
230
+ * and directory indexes only: an island module is a file the program
231
+ * already loaded, and `exports` maps stay Node's job. */
232
+ function relativeIslandFile(fromFile, spec) {
233
+ const base = isAbsolute(spec) ? spec : resolve(dirname(fromFile), spec);
234
+ const candidates = [base];
235
+ if (!/\.[cm]?js$/.test(base)) {
236
+ for (const ext of [".js", ".cjs", ".mjs"])
237
+ candidates.push(base + ext);
238
+ }
239
+ for (const ext of [".js", ".cjs", ".mjs"])
240
+ candidates.push(join(base, `index${ext}`));
241
+ for (const candidate of candidates) {
242
+ try {
243
+ if (statSync(candidate).isFile())
244
+ return candidate;
245
+ }
246
+ catch {
247
+ /* the next candidate */
248
+ }
249
+ }
250
+ return null;
251
+ }
224
252
  /** The island module file `spec` names from `fromFile`, or null when the
225
- * specifier does not resolve into an island package. */
253
+ * specifier does not resolve into an island package or module. */
226
254
  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;
255
+ let file;
256
+ if (isRelativeSpecifier(spec) || isAbsolute(spec)) {
257
+ // A program module the pre-scan put in a Node island (DESIGN.md note 1
258
+ // §3.2): the file itself is the island, resolved as Node would.
259
+ if (islands.modules.size === 0)
260
+ return null;
261
+ const resolved = relativeIslandFile(fromFile, spec);
262
+ if (resolved === null)
263
+ return null;
264
+ if (islandOwnerOfFile(islands, resolved) === null)
265
+ return null;
266
+ file = resolved;
267
+ }
268
+ else {
269
+ const js = resolveBareModule(fromFile, spec, "js-only", kind);
270
+ if (js === null)
271
+ return null;
272
+ if (islandOwnerOfFile(islands, js.typesFile) === null)
273
+ return null;
274
+ file = js.typesFile;
275
+ }
232
276
  try {
233
- return realpathSync(js.typesFile);
277
+ return realpathSync(file);
234
278
  }
235
279
  catch {
236
- return js.typesFile;
280
+ return file;
237
281
  }
238
282
  }
239
283
  /** The module global of the island module at `path`, created on first use. */
@@ -269,7 +313,10 @@ function islandLoadPath(lowerer, path, loc) {
269
313
  }
270
314
  const problem = lowerer.nodeIslandModules.addLoaded(real);
271
315
  if (problem !== null) {
272
- lowerer.pushDiag(nodeIslandModuleDiag(problem, loc));
316
+ const diag = lowerer.nodeIslandModules.isDataFileProblem(problem)
317
+ ? nodeIslandDataFileDiag
318
+ : nodeIslandModuleDiag;
319
+ lowerer.pushDiag(diag(problem, loc));
273
320
  throw new PoisonError();
274
321
  }
275
322
  lowerer.nodeIslandLoads.push({ literal, path: real });
@@ -296,8 +343,16 @@ function loadIslandModule(lowerer, path, loc) {
296
343
  /** A static import's load: `nodeIsland.defer(path, snapshot)`, which the
297
344
  * build decides after lowering (node-islands/snapshot.ts, scope-B NI-7):
298
345
  * a module proved effect-free at load keeps it with its interface snapshot
299
- * and evaluates on first use; any other becomes nodeIsland.require. */
346
+ * and evaluates on first use; any other becomes nodeIsland.require.
347
+ *
348
+ * A program module that runs in an island loads eagerly
349
+ * (`nodeIsland.require`): deciding a deferral means evaluating the module
350
+ * in the build-time probe, and the build never runs the program's own
351
+ * source. */
300
352
  function deferIslandModule(lowerer, path, loc) {
353
+ const islands = lowerer.nodeIslands;
354
+ if (islands !== null && isIslandProgramModule(islands, path))
355
+ return loadIslandModule(lowerer, path, loc);
301
356
  return {
302
357
  kind: "libCall",
303
358
  fn: "nodeIsland.defer",
@@ -306,9 +361,36 @@ function deferIslandModule(lowerer, path, loc) {
306
361
  loc,
307
362
  };
308
363
  }
364
+ /** Whether `node` runs while its module evaluates: no enclosing function,
365
+ * method, accessor, constructor or class member initializer. */
366
+ function runsAtModuleEvaluation(node) {
367
+ for (let n = node.parent; n !== undefined; n = n.parent) {
368
+ if (ts.isSourceFile(n))
369
+ return true;
370
+ if (ts.isFunctionLike(n) || ts.isClassStaticBlockDeclaration(n) || ts.isPropertyDeclaration(n))
371
+ return false;
372
+ }
373
+ return false;
374
+ }
375
+ /** The %init statements that run in `stmt`'s place in its file's %init
376
+ * header (Lowerer.islandImportActions). */
377
+ function islandStatementActions(lowerer, sf, stmt) {
378
+ let byStatement = lowerer.islandImportActions.get(sf);
379
+ if (byStatement === undefined) {
380
+ byStatement = new Map();
381
+ lowerer.islandImportActions.set(sf, byStatement);
382
+ }
383
+ let actions = byStatement.get(stmt);
384
+ if (actions === undefined) {
385
+ actions = [];
386
+ byStatement.set(stmt, actions);
387
+ }
388
+ return actions;
389
+ }
309
390
  /** 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. */
391
+ * in the importer's %init header, in the statement's place among the
392
+ * dependencies' %init calls, as Node evaluates it in source order. Returns
393
+ * false when `spec` is not an island module. */
312
394
  export function collectIslandImport(lowerer, sf, stmt, spec) {
313
395
  const islands = lowerer.nodeIslands;
314
396
  if (islands === null)
@@ -317,14 +399,42 @@ export function collectIslandImport(lowerer, sf, stmt, spec) {
317
399
  if (path === null)
318
400
  return false;
319
401
  if (ts.isExportDeclaration(stmt)) {
320
- lowerer.pushDiag(nodeIslandBoundaryDiag(`re-exporting the Node island module '${spec}'`, locOf(stmt)));
402
+ // `export { Type } from "typebox"`: the re-exporting module loads the
403
+ // island module and every name it re-exports binds the island's own
404
+ // export, so importers of this module reach it through the alias chain
405
+ // (islandBindingOf). A namespace or star re-export has no name to bind.
406
+ const clause = stmt.exportClause;
407
+ if (stmt.isTypeOnly || clause === undefined || !ts.isNamedExports(clause)) {
408
+ lowerer.pushDiag(nodeIslandBoundaryDiag(`re-exporting the Node island module '${spec}'`, locOf(stmt)));
409
+ return true;
410
+ }
411
+ lowerer.usesNodeIsland = true;
412
+ const exportLoc = locOf(stmt);
413
+ const exported = islandModuleGlobal(lowerer, path);
414
+ const initActions = islandStatementActions(lowerer, sf, stmt);
415
+ initActions.push({
416
+ kind: "assign",
417
+ localId: exported.global.id,
418
+ value: deferIslandModule(lowerer, path, exportLoc),
419
+ loc: exportLoc,
420
+ });
421
+ for (const el of clause.elements.nodes) {
422
+ if (el.isTypeOnly)
423
+ continue;
424
+ const name = el.propertyName?.text ?? el.name.text;
425
+ // CommonJS named exports are the namespace's snapshot (below).
426
+ if (!exported.esm && name !== "default")
427
+ initActions.push(islandSnapshotAssign(lowerer, exported, name, exportLoc));
428
+ registerIslandReexport(lowerer, stmt, el, name === "default"
429
+ ? { kind: "default", module: exported }
430
+ : { kind: "named", module: exported, name });
431
+ }
321
432
  return true;
322
433
  }
323
434
  lowerer.usesNodeIsland = true;
324
435
  const loc = locOf(stmt);
325
436
  const binding = islandModuleGlobal(lowerer, path);
326
- const actions = lowerer.jsonInitActions.get(sf) ?? [];
327
- lowerer.jsonInitActions.set(sf, actions);
437
+ const actions = islandStatementActions(lowerer, sf, stmt);
328
438
  actions.push({
329
439
  kind: "assign",
330
440
  localId: binding.global.id,
@@ -358,31 +468,30 @@ export function collectIslandImport(lowerer, sf, stmt, spec) {
358
468
  return undefined;
359
469
  });
360
470
  }
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
- }
471
+ for (const name of snapshotNames) {
472
+ if (name === "default")
473
+ continue;
474
+ actions.push(islandSnapshotAssign(lowerer, binding, name, loc));
383
475
  }
384
476
  return true;
385
477
  }
478
+ /** A CommonJS island name's snapshot global and the %init action that
479
+ * assigns it once the module evaluated (Node's namespace snapshots named
480
+ * exports). */
481
+ function islandSnapshotAssign(lowerer, binding, name, loc) {
482
+ let g = binding.snapshots.get(name);
483
+ if (g === undefined) {
484
+ g = { id: `%g.island.${lowerer.globalsList.length}`, name, type: DYN, mutable: true };
485
+ lowerer.globalsList.push(g);
486
+ binding.snapshots.set(name, g);
487
+ }
488
+ return {
489
+ kind: "assign",
490
+ localId: g.id,
491
+ value: islandGet(varRef(binding.global.id, DYN, loc), name, loc),
492
+ loc,
493
+ };
494
+ }
386
495
  function islandGet(target, key, loc) {
387
496
  return {
388
497
  kind: "libCall",
@@ -392,6 +501,47 @@ function islandGet(target, key, loc) {
392
501
  loc,
393
502
  };
394
503
  }
504
+ /** Records that `specifier`'s exported name binds `binding`: importers of
505
+ * the re-exporting module reach the island's own export through the alias
506
+ * chain, whatever they spell it (`export { Num as NumberSchema }`). The
507
+ * island's export symbol is the key a chain ends on, so it is registered
508
+ * beside the specifier's own symbol. */
509
+ function registerIslandReexport(lowerer, stmt, specifier, binding) {
510
+ const named = lowerer.checker.getSymbolAtLocation(specifier.name);
511
+ if (named !== undefined)
512
+ lowerer.islandReexports.set(named, binding);
513
+ const moduleSpecifier = stmt.moduleSpecifier;
514
+ if (moduleSpecifier === undefined)
515
+ return;
516
+ const moduleSymbol = lowerer.checker.getSymbolAtLocation(moduleSpecifier);
517
+ if (moduleSymbol === undefined)
518
+ return;
519
+ const exported = lowerer.checker.getExportsOfModule(moduleSymbol);
520
+ const found = exported.find((s) => ts.symbolName(s) === (specifier.propertyName?.text ?? specifier.name.text));
521
+ if (found === undefined)
522
+ return;
523
+ lowerer.islandReexports.set(found, binding);
524
+ if ((found.flags & ts.SymbolFlags.Alias) !== 0)
525
+ lowerer.islandReexports.set(lowerer.checker.getAliasedSymbol(found), binding);
526
+ }
527
+ /** The island binding an alias chain reaches, or null: a name re-exported
528
+ * by a native module resolves to the island's export symbol itself. */
529
+ function islandReexportOf(lowerer, symbol) {
530
+ if (symbol === undefined || lowerer.islandReexports.size === 0)
531
+ return null;
532
+ const seen = new Set();
533
+ let s = symbol;
534
+ while (s !== undefined && !seen.has(s)) {
535
+ seen.add(s);
536
+ const bound = lowerer.islandReexports.get(s);
537
+ if (bound !== undefined)
538
+ return bound;
539
+ if ((s.flags & ts.SymbolFlags.Alias) === 0)
540
+ return null;
541
+ s = lowerer.checker.getAliasedSymbol(s);
542
+ }
543
+ return null;
544
+ }
395
545
  function moduleSpecifierOf(decl) {
396
546
  return ts.isImportDeclaration(decl) && ts.isStringLiteral(decl.moduleSpecifier)
397
547
  ? decl.moduleSpecifier.text
@@ -408,6 +558,11 @@ function islandBindingOf(lowerer, ident) {
408
558
  if (islands === null)
409
559
  return null;
410
560
  const symbol = lowerer.checker.getSymbolAtLocation(ident);
561
+ // A name a native module re-exports from an island package binds the
562
+ // island's own export: the import's alias chain reaches it.
563
+ const reexport = islandReexportOf(lowerer, symbol);
564
+ if (reexport !== null)
565
+ return reexport;
411
566
  const decl = symbol ? symbol.declarations[0] : undefined;
412
567
  if (decl === undefined)
413
568
  return null;
@@ -427,8 +582,24 @@ function islandBindingOf(lowerer, ident) {
427
582
  binding = name === "default" ? "default" : { name };
428
583
  }
429
584
  else {
585
+ // `const { name } = require("pkg")`: a member of module.exports, read
586
+ // at each use (shortcut: not copied once at the declaration).
587
+ const property = requiredPropertyOf(decl);
588
+ if (property !== null && loadsAtStatement(property.declaration)) {
589
+ const spec = requireInitSpecOf(lowerer, property.declaration);
590
+ if (spec === null)
591
+ return null;
592
+ const file = ts.getSourceFileOfNode(decl).fileName;
593
+ const path = islandModuleFile(islands, file, spec, "require");
594
+ const module = path === null ? undefined : lowerer.islandModules.get(path);
595
+ return module === undefined ? null : { kind: "named", module, name: property.name };
596
+ }
430
597
  // `const x = require("pkg")` (a CommonJS module of a native package
431
- // requiring an island package): x is module.exports.
598
+ // requiring an island package): x is module.exports. Only at the
599
+ // module's top level: a function's own binding is a local.
600
+ const statement = decl.parent?.parent;
601
+ if (statement === undefined || !ts.isSourceFile(statement.parent))
602
+ return null;
432
603
  const spec = requireSpecOf(lowerer, decl);
433
604
  if (spec === null)
434
605
  return null;
@@ -484,8 +655,16 @@ function fromIsland(lowerer, raw, node) {
484
655
  if ((tsType.flags & (ts.TypeFlags.Void | ts.TypeFlags.Undefined)) !== 0 && isDiscarded(node))
485
656
  return raw;
486
657
  const mapped = lowerer.mapTypeOf(tsType);
487
- if (mapped === null)
658
+ if (mapped === null) {
659
+ // An intersection of containers (`Choice[] & GenChoice[]`: the
660
+ // island's array extended by the caller's own type) has no native
661
+ // representation of its own. Where the program only uses it through
662
+ // island operations it stays a handle, like an array the island does
663
+ // not declare.
664
+ if (containerType(lowerer, tsType) && handleUseOk(lowerer, node))
665
+ return raw;
488
666
  boundaryFail(lowerer, `an island value of type '${lowerer.checker.typeToString(tsType)}'`, node);
667
+ }
489
668
  if (mapped.kind === "dyn")
490
669
  return raw;
491
670
  if (mapped.kind === "void")
@@ -528,7 +707,7 @@ function fromIsland(lowerer, raw, node) {
528
707
  if (!copiedType(lowerer, mapped) && containerType(lowerer, tsType) && handleUseOk(lowerer, node))
529
708
  return raw;
530
709
  // Otherwise an array of copied values is a copy (above).
531
- if (copiedArrayType(lowerer, mapped)) {
710
+ if (copyableArrayType(lowerer, mapped)) {
532
711
  const copy = {
533
712
  kind: "libCall",
534
713
  fn: "nodeIsland.copyArrays",
@@ -538,7 +717,7 @@ function fromIsland(lowerer, raw, node) {
538
717
  };
539
718
  return lowerer.coerceToExpected(copy, mapped);
540
719
  }
541
- if (!copiedType(lowerer, mapped) && exportedByReference(lowerer, tsType))
720
+ if (!copiedType(lowerer, mapped) && copiedRecordType(lowerer, tsType))
542
721
  return lowerer.coerceToExpected(raw, mapped);
543
722
  if (!copiedType(lowerer, mapped))
544
723
  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);
@@ -550,6 +729,33 @@ function copiedArrayType(lowerer, t) {
550
729
  return false;
551
730
  return copiedType(lowerer, t.elem) || copiedArrayType(lowerer, t.elem);
552
731
  }
732
+ /** An array of copied values, or a union of one with null and/or
733
+ * undefined (`string[] | undefined`): the copy converts whatever the
734
+ * island value holds (a non-array crosses as itself, so a nullish value
735
+ * stays nullish) and the checked conversion throws on an element of the
736
+ * wrong type. */
737
+ function copyableArrayType(lowerer, t) {
738
+ if (t.kind !== "union")
739
+ return copiedArrayType(lowerer, t);
740
+ const def = lowerer.unions.get(t.unionId);
741
+ if (def === undefined)
742
+ return false;
743
+ let arrays = 0;
744
+ for (const arm of def.arms) {
745
+ if (arm.kind === "nullT" || arm.kind === "undefinedT")
746
+ continue;
747
+ if (!copiedArrayType(lowerer, arm))
748
+ return false;
749
+ arrays++;
750
+ }
751
+ return arrays > 0;
752
+ }
753
+ /** The IR type an island value crosses as when it is a copyable array
754
+ * (`copyableArrayType`), or null when the declared type is not one. */
755
+ function copyableCrossing(lowerer, node) {
756
+ const mapped = lowerer.mapTypeOf(lowerer.typeOf(node));
757
+ return mapped !== null && copyableArrayType(lowerer, mapped) ? mapped : null;
758
+ }
553
759
  /** Whether a value of IR type `t` is copied at the boundary: primitives,
554
760
  * strings, null/undefined, and unions of those. */
555
761
  function copiedType(lowerer, t) {
@@ -626,20 +832,56 @@ function undeclaredHandleType(lowerer, type) {
626
832
  return false;
627
833
  return containerType(lowerer, type);
628
834
  }
835
+ /** Builtin classes whose native representation is not a JavaScript object
836
+ * (URLSearchParams, Headers, Request, …): an island instance of one has no
837
+ * native counterpart to convert into, so it stays a handle. */
838
+ const BUILTIN_HANDLE_CLASSES = new Set([
839
+ "URL",
840
+ "URLSearchParams",
841
+ "Headers",
842
+ "Request",
843
+ "Response",
844
+ "FormData",
845
+ "Blob",
846
+ "File",
847
+ "AbortController",
848
+ "AbortSignal",
849
+ "ReadableStream",
850
+ "WritableStream",
851
+ "TransformStream",
852
+ "TextEncoder",
853
+ "TextDecoder",
854
+ ]);
855
+ /** Whether `type` is one of BUILTIN_HANDLE_CLASSES as declared by the
856
+ * standard library or @types/node (not a program class of the same name). */
857
+ function builtinHandleClass(type) {
858
+ const symbol = type.getSymbol();
859
+ if (symbol === undefined || !BUILTIN_HANDLE_CLASSES.has(String(symbol.escapedName)))
860
+ return false;
861
+ return (symbol.declarations.length > 0 &&
862
+ symbol.declarations.every((d) => ts.getSourceFileOfNode(d).isDeclarationFile));
863
+ }
629
864
  /** Arrays, tuples, Maps and Sets (every arm of a union, nullish arms
630
- * aside): the object types an island hands back without declaring them. */
865
+ * aside), and the builtin classes of builtinHandleClass: the object types
866
+ * an island hands back without declaring them. An intersection of those
867
+ * (`Choice[] & GenChoice[]`) is a container too: it is a value of each. */
631
868
  function containerType(lowerer, type) {
632
869
  if (type.isUnionType())
633
870
  return ts
634
871
  .constituentTypes(type)
635
872
  .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
636
873
  containerType(lowerer, t));
874
+ if ((type.flags & ts.TypeFlags.Intersection) !== 0)
875
+ return ts
876
+ .constituentTypes(type)
877
+ .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
878
+ containerType(lowerer, t));
637
879
  if ((type.flags & ts.TypeFlags.Object) === 0)
638
880
  return false;
639
881
  if (lowerer.checker.isArrayType(type) || lowerer.checker.isTupleType(type))
640
882
  return true;
641
883
  const name = type.getSymbol()?.escapedName;
642
- return name === "Map" || name === "Set";
884
+ return name === "Map" || name === "Set" || builtinHandleClass(type);
643
885
  }
644
886
  /** A member read, call, index or `new` whose receiver or callee is an
645
887
  * island value. */
@@ -934,7 +1176,11 @@ export function classConstructHelper(lowerer, ident, loc) {
934
1176
  /** Native values NI-5 exports into the island by reference: functions,
935
1177
  * promises, and object types other than arrays, tuples, Maps and Sets
936
1178
  * (records, interfaces, class instances). A union qualifies when every
937
- * arm does or is copied. */
1179
+ * arm does or is copied, and an intersection of them qualifies: a merged
1180
+ * generic record (`Omit<Base, "k"> & Extras`, the `Type.Object(props)`
1181
+ * shape) is one native object, and the island reads the program's own
1182
+ * object, not a copy of it. An intersection with a primitive arm
1183
+ * (`string & {brand}`) is a primitive value, which the runtime copies. */
938
1184
  function exportedByReference(lowerer, type) {
939
1185
  const checker = lowerer.checker;
940
1186
  if (type.isUnionType())
@@ -942,6 +1188,11 @@ function exportedByReference(lowerer, type) {
942
1188
  .constituentTypes(type)
943
1189
  .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
944
1190
  exportedByReference(lowerer, t));
1191
+ if ((type.flags & ts.TypeFlags.Intersection) !== 0)
1192
+ return ts
1193
+ .constituentTypes(type)
1194
+ .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
1195
+ exportedByReference(lowerer, t));
945
1196
  if ((type.flags & ts.TypeFlags.Object) === 0)
946
1197
  return false;
947
1198
  // Arrays and tuples cross as Proxies over the native array (NI-5b).
@@ -951,6 +1202,21 @@ function exportedByReference(lowerer, type) {
951
1202
  return false;
952
1203
  return true;
953
1204
  }
1205
+ /** A record type an island object crosses OUT into as a deep checked
1206
+ * copy: the object types exportedByReference names, and intersections of
1207
+ * them — a mapped pair (`{[K in Fg]: V} & {[K in Bg]?: V}`) or a merged
1208
+ * generic record (`Omit<Base, "k"> & Extras`) is one record, so the
1209
+ * island's object converts into the native one the same way a plain
1210
+ * record's does. An intersection with a primitive arm (`string & {brand}`)
1211
+ * is a primitive value, which copies as its arm. */
1212
+ function copiedRecordType(lowerer, type) {
1213
+ if ((type.flags & ts.TypeFlags.Intersection) !== 0)
1214
+ return ts
1215
+ .constituentTypes(type)
1216
+ .every((t) => (t.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void)) !== 0 ||
1217
+ copiedRecordType(lowerer, t));
1218
+ return exportedByReference(lowerer, type);
1219
+ }
954
1220
  /** A fresh object or array literal crosses as a copy (a plain dyn object
955
1221
  * or array the runtime copies into V8): nothing native can alias it. Its
956
1222
  * members cross by the same rules (toIsland). */
@@ -1135,6 +1401,16 @@ function lowerIslandChain(lowerer, expr, chain, loc) {
1135
1401
  const result = fromIsland(lowerer, value, expr);
1136
1402
  return stmts.length > 0 ? { kind: "seqExpr", stmts, result, type: result.type, loc } : result;
1137
1403
  }
1404
+ /** The local an island handle binding reads here: its own binding, retyped
1405
+ * checked-dynamic, or, inside a closure, the capture of an enclosing
1406
+ * function's binding, which resolveLocal registers. */
1407
+ function islandHandleLocal(lowerer, ident) {
1408
+ const origin = lowerer.peekLocal(ident);
1409
+ if (origin === null)
1410
+ return null;
1411
+ origin.type = DYN;
1412
+ return lowerer.resolveLocal(ident);
1413
+ }
1138
1414
  /** Expressions on island values (the lowerExpr hook; null: not an island
1139
1415
  * expression, the ordinary lowering applies). */
1140
1416
  export function lowerIslandExpr(lowerer, expr) {
@@ -1151,14 +1427,24 @@ export function lowerIslandExpr(lowerer, expr) {
1151
1427
  if (b === null) {
1152
1428
  if (!islandHandleBinding(lowerer, expr))
1153
1429
  return null;
1154
- if (!handleUseOk(lowerer, expr))
1430
+ // The DECLARED type decides the crossing, not the use: an island
1431
+ // handle whose type is an array of copied values crosses as a copy of
1432
+ // its elements wherever native code needs a native value, and the
1433
+ // checked conversion throws on an element of the wrong type. Every
1434
+ // other native use stays refused (the value is a handle).
1435
+ const ok = handleUseOk(lowerer, expr);
1436
+ const copy = ok ? null : copyableCrossing(lowerer, expr);
1437
+ if (!ok && copy === null)
1155
1438
  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
1439
  lowerer.usesNodeIsland = true;
1157
- const g = lowerer.globalOf(expr);
1158
- if (g === null)
1440
+ const slot = lowerer.globalOf(expr) ?? islandHandleLocal(lowerer, expr);
1441
+ if (slot === null)
1159
1442
  return null; // the local is declared dyn
1160
- g.type = DYN;
1161
- return varRef(g.id, DYN, loc);
1443
+ slot.type = DYN;
1444
+ const ref = varRef(slot.id, DYN, loc);
1445
+ return copy === null
1446
+ ? ref
1447
+ : lowerer.coerceToExpected({ kind: "libCall", fn: "nodeIsland.copyArrays", args: [ref], type: DYN, loc }, copy);
1162
1448
  }
1163
1449
  lowerer.usesNodeIsland = true;
1164
1450
  return fromIsland(lowerer, islandBindingValue(lowerer, b, expr, loc), expr);
@@ -1489,6 +1775,19 @@ function islandReceiver(lowerer, receiver, member, loc, call = false) {
1489
1775
  }
1490
1776
  return { value: lowerer.coerceToExpected(lowerer.lowerExpr(receiver), FOREIGN) };
1491
1777
  }
1778
+ /** Whether `require(spec)` in `file` loads an island module. */
1779
+ export function isIslandRequireSpec(lowerer, file, spec) {
1780
+ const islands = lowerer.nodeIslands;
1781
+ return islands !== null && islandModuleFile(islands, file, spec, "require") !== null;
1782
+ }
1783
+ /** `require("<island pkg>")` in a CommonJS module, at a call no other
1784
+ * lowering claimed (inside a function, or as a subexpression): the island
1785
+ * module loads at the call. Null when the package is not an island. */
1786
+ export function lowerIslandRequireCall(lowerer, call) {
1787
+ if (lowerer.nodeIslands === null)
1788
+ return null;
1789
+ return lowerIslandLoadCall(lowerer, call, locOf(call)) ?? null;
1790
+ }
1492
1791
  /** `require("pkg")` (the global require, anywhere) and `import("pkg")` of
1493
1792
  * an island module: load it at the call. Undefined: not such a call. */
1494
1793
  function lowerIslandLoadCall(lowerer, expr, loc) {
@@ -1518,7 +1817,14 @@ function lowerIslandLoadCall(lowerer, expr, loc) {
1518
1817
  loc,
1519
1818
  };
1520
1819
  }
1521
- return fromIsland(lowerer, loadIslandModule(lowerer, path, loc), expr);
1820
+ // A require() the module's own evaluation runs (not inside a function or
1821
+ // class body) loads the island exactly when a static import would: it is
1822
+ // deferred the same way (scope-B NI-7d), so a native package's top-level
1823
+ // `const x = require("<island>")` does not start Node at boot.
1824
+ const load = runsAtModuleEvaluation(expr)
1825
+ ? deferIslandModule(lowerer, path, loc)
1826
+ : loadIslandModule(lowerer, path, loc);
1827
+ return fromIsland(lowerer, load, expr);
1522
1828
  }
1523
1829
  /* ── native classes extending island classes (scope-B NI-5b) ───────────
1524
1830
  * `class Sub extends IslandBase { ... }` at module top level: the class is
@@ -1808,14 +2114,89 @@ function plainLiteral(node) {
1808
2114
  /** The specifier of `x = require("spec")` (a variable declaration binding
1809
2115
  * an identifier to a literal require), or null. */
1810
2116
  function requireSpecOf(lowerer, decl) {
1811
- if (!ts.isVariableDeclaration(decl) ||
1812
- !ts.isIdentifier(decl.name) ||
1813
- decl.initializer === undefined)
2117
+ if (!ts.isVariableDeclaration(decl) || !ts.isIdentifier(decl.name))
1814
2118
  return null;
1815
2119
  // Only a const keeps the module: a let or var can be reassigned.
1816
2120
  const list = decl.parent;
1817
2121
  if (!ts.isVariableDeclarationList(list) || (list.flags & ts.NodeFlags.Const) === 0)
1818
2122
  return null;
2123
+ return requireInitSpecOf(lowerer, decl);
2124
+ }
2125
+ /** The property a destructured CommonJS require binds: `name` in
2126
+ * `const { name } = require("spec")` or `const { name: local } = …`, with
2127
+ * the declaration. Rest elements, defaults and nested patterns are null. */
2128
+ function requiredPropertyOf(decl) {
2129
+ if (!ts.isBindingElement(decl) || decl.dotDotDotToken || decl.initializer)
2130
+ return null;
2131
+ if (!ts.isIdentifier(decl.name))
2132
+ return null;
2133
+ const pattern = decl.parent;
2134
+ if (pattern === undefined || !ts.isObjectBindingPattern(pattern))
2135
+ return null;
2136
+ const declaration = pattern.parent;
2137
+ if (declaration === undefined || !ts.isVariableDeclaration(declaration))
2138
+ return null;
2139
+ const key = decl.propertyName;
2140
+ const name = key === undefined
2141
+ ? decl.name.text
2142
+ : ts.isIdentifier(key) || ts.isStringLiteral(key)
2143
+ ? key.text
2144
+ : null;
2145
+ return name === null ? null : { name, declaration };
2146
+ }
2147
+ /** Whether every element of `const { … } = require("<island>")` binds a
2148
+ * plain member (requiredPropertyOf): only then do the names read the
2149
+ * module global; other patterns keep the ordinary lowering. */
2150
+ function islandPatternBindable(pattern) {
2151
+ return pattern.elements.nodes.every((e) => requiredPropertyOf(e) !== null);
2152
+ }
2153
+ /** Whether the top-level declaration `decl` of a JavaScript module loads
2154
+ * its island module at the statement (lowerIslandRequireAtStatement)
2155
+ * rather than in the module's %init prelude: `const` declarations binding
2156
+ * an identifier or a plain object pattern. Reads before the statement are
2157
+ * TDZ errors in Node, so the binding is never observed unassigned. `let`
2158
+ * and `var` bindings can be reassigned: they keep the ordinary lowering. */
2159
+ function loadsAtStatement(decl) {
2160
+ const list = decl.parent;
2161
+ if (list === undefined || !ts.isVariableDeclarationList(list))
2162
+ return false;
2163
+ if ((list.flags & ts.NodeFlags.Const) === 0)
2164
+ return false;
2165
+ if (!isJsSourceFile(ts.getSourceFileOfNode(decl)))
2166
+ return false;
2167
+ if (ts.isIdentifier(decl.name))
2168
+ return true;
2169
+ return ts.isObjectBindingPattern(decl.name) && islandPatternBindable(decl.name);
2170
+ }
2171
+ /** The top-level statement `const x = require("<island>")` or `const { a,
2172
+ * b: c } = require("<island>")` of a JavaScript module: assigns the island
2173
+ * module (deferred like any top-level require) to its module global at the
2174
+ * statement's position, so writes before it (`process.env.NODE_ENV = …`)
2175
+ * are visible to the module's evaluation, as in Node; `x` is the module,
2176
+ * `a` and `c` read its members at each use (shortcut: not copied once at
2177
+ * the declaration). Null for any other declaration. */
2178
+ export function lowerIslandRequireAtStatement(lowerer, decl) {
2179
+ const islands = lowerer.nodeIslands;
2180
+ if (islands === null || !loadsAtStatement(decl))
2181
+ return null;
2182
+ const spec = requireInitSpecOf(lowerer, decl);
2183
+ if (spec === null)
2184
+ return null;
2185
+ const path = islandModuleFile(islands, ts.getSourceFileOfNode(decl).fileName, spec, "require");
2186
+ const module = path === null ? undefined : lowerer.islandModules.get(path);
2187
+ if (path === null || module === undefined)
2188
+ return null;
2189
+ const loc = locOf(decl);
2190
+ const load = runsAtModuleEvaluation(decl)
2191
+ ? deferIslandModule(lowerer, path, loc)
2192
+ : loadIslandModule(lowerer, path, loc);
2193
+ return { kind: "assign", localId: module.global.id, value: load, loc };
2194
+ }
2195
+ /** The specifier of a variable declaration initialized with a literal
2196
+ * `require("spec")`, whatever its binding name or pattern, or null. */
2197
+ function requireInitSpecOf(lowerer, decl) {
2198
+ if (decl.initializer === undefined)
2199
+ return null;
1819
2200
  let init = decl.initializer;
1820
2201
  while (ts.isParenthesizedExpression(init))
1821
2202
  init = init.expression;
@@ -1835,7 +2216,9 @@ function requireSpecOf(lowerer, decl) {
1835
2216
  /** Top-level `const x = require("pkg")` statements of island packages in a
1836
2217
  * compiled module (a native package requiring an island package): load the
1837
2218
  * island module in the module's %init prelude (shortcut: before the body,
1838
- * not at the statement). */
2219
+ * not at the statement; JavaScript `const` declarations load at the
2220
+ * statement instead, loadsAtStatement), deferred exactly like a static import (scope-B
2221
+ * NI-7d: the build decides from the probe, stubs stand in until first use). */
1839
2222
  export function collectIslandRequires(lowerer, sf) {
1840
2223
  const islands = lowerer.nodeIslands;
1841
2224
  if (islands === null)
@@ -1844,6 +2227,18 @@ export function collectIslandRequires(lowerer, sf) {
1844
2227
  if (!ts.isVariableStatement(stmt))
1845
2228
  continue;
1846
2229
  for (const decl of stmt.declarationList.declarations.nodes) {
2230
+ // JavaScript `const` requires: the module global exists from
2231
+ // here on; the statement itself loads the module at its position
2232
+ // (lowerIslandRequireAtStatement).
2233
+ if (loadsAtStatement(decl)) {
2234
+ const spec = requireInitSpecOf(lowerer, decl);
2235
+ const path = spec === null ? null : islandModuleFile(islands, sf.fileName, spec, "require");
2236
+ if (path !== null) {
2237
+ lowerer.usesNodeIsland = true;
2238
+ islandModuleGlobal(lowerer, path);
2239
+ }
2240
+ continue;
2241
+ }
1847
2242
  const spec = requireSpecOf(lowerer, decl);
1848
2243
  if (spec === null)
1849
2244
  continue;
@@ -1858,7 +2253,7 @@ export function collectIslandRequires(lowerer, sf) {
1858
2253
  actions.push({
1859
2254
  kind: "assign",
1860
2255
  localId: binding.global.id,
1861
- value: loadIslandModule(lowerer, path, loc),
2256
+ value: deferIslandModule(lowerer, path, loc),
1862
2257
  loc,
1863
2258
  });
1864
2259
  }