@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
@@ -96,6 +96,21 @@ function builtinModuleName(spec) {
96
96
  return bare;
97
97
  return null;
98
98
  }
99
+ /** Parentheses and the TypeScript wrappers Node erases (`as`,
100
+ * `satisfies`, `!` and the angle-bracket assertion). */
101
+ function stripWrappers(node) {
102
+ let value = node;
103
+ for (;;) {
104
+ if (ts.isParenthesizedExpression(value) ||
105
+ ts.isAsExpression(value) ||
106
+ ts.isTypeAssertion(value) ||
107
+ ts.isNonNullExpression(value) ||
108
+ ts.isSatisfiesExpression(value))
109
+ value = value.expression;
110
+ else
111
+ return value;
112
+ }
113
+ }
99
114
  function literalText(node) {
100
115
  if (node === undefined)
101
116
  return null;
@@ -103,6 +118,15 @@ function literalText(node) {
103
118
  return node.text;
104
119
  return null;
105
120
  }
121
+ /** A property name the scan can spell: an identifier, a string or number
122
+ * literal, or a computed literal key. */
123
+ function staticKey(node) {
124
+ if (ts.isIdentifier(node) || ts.isNumericLiteral(node))
125
+ return node.text;
126
+ if (ts.isComputedPropertyName(node))
127
+ return literalText(stripWrappers(node.expression));
128
+ return literalText(node);
129
+ }
106
130
  /** A specifier that folds at build time: a literal, or a concatenation of
107
131
  * literals. */
108
132
  function isFoldableSpecifier(node) {
@@ -117,6 +141,15 @@ function isFoldableSpecifier(node) {
117
141
  function isAssignmentOperator(kind) {
118
142
  return kind >= ts.SyntaxKind.FirstAssignment && kind <= ts.SyntaxKind.LastAssignment;
119
143
  }
144
+ /** The key of an object-literal property (`name`, `"name"` or a
145
+ * template without substitutions). */
146
+ function literalKeyName(name) {
147
+ if (name === undefined)
148
+ return null;
149
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNoSubstitutionTemplateLiteral(name))
150
+ return name.text;
151
+ return null;
152
+ }
120
153
  function propertyName(node) {
121
154
  if (ts.isPropertyAccessExpression(node)) {
122
155
  const name = node.name;
@@ -129,15 +162,14 @@ function propertyName(node) {
129
162
  /** `a.b.c` as "a.b.c" (element accesses with literal keys included), or
130
163
  * null when the chain has a computed key or does not start at a name. */
131
164
  function chainText(node) {
132
- if (ts.isIdentifier(node))
133
- return node.text;
134
- if (node.kind === ts.SyntaxKind.ThisKeyword)
165
+ const value = stripWrappers(node);
166
+ if (ts.isIdentifier(value))
167
+ return value.text;
168
+ if (value.kind === ts.SyntaxKind.ThisKeyword)
135
169
  return "this";
136
- if (ts.isParenthesizedExpression(node))
137
- return chainText(node.expression);
138
- if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) {
139
- const base = chainText(node.expression);
140
- const name = propertyName(node);
170
+ if (ts.isPropertyAccessExpression(value) || ts.isElementAccessExpression(value)) {
171
+ const base = chainText(value.expression);
172
+ const name = propertyName(value);
141
173
  if (base === null || name === null)
142
174
  return null;
143
175
  return `${base}.${name}`;
@@ -146,32 +178,29 @@ function chainText(node) {
146
178
  }
147
179
  /** Like chainText, with computed keys spelled `[…]`: `process.env[…]`. */
148
180
  function memberText(node) {
149
- const text = chainText(node);
181
+ const value = stripWrappers(node);
182
+ const text = chainText(value);
150
183
  if (text !== null)
151
184
  return text;
152
- if (ts.isElementAccessExpression(node)) {
153
- const base = memberText(node.expression);
185
+ if (ts.isElementAccessExpression(value)) {
186
+ const base = memberText(value.expression);
154
187
  return base === null ? null : `${base}[…]`;
155
188
  }
156
- if (ts.isPropertyAccessExpression(node)) {
157
- const base = memberText(node.expression);
158
- const name = propertyName(node);
189
+ if (ts.isPropertyAccessExpression(value)) {
190
+ const base = memberText(value.expression);
191
+ const name = propertyName(value);
159
192
  return base === null || name === null ? null : `${base}.${name}`;
160
193
  }
161
194
  return null;
162
195
  }
163
196
  /** The identifier a member chain starts at (`a` of `a.b[c].d`). */
164
197
  function chainRoot(node) {
165
- let cur = node;
198
+ let cur = stripWrappers(node);
166
199
  for (;;) {
167
200
  if (ts.isIdentifier(cur))
168
201
  return cur;
169
202
  if (ts.isPropertyAccessExpression(cur) || ts.isElementAccessExpression(cur)) {
170
- cur = cur.expression;
171
- continue;
172
- }
173
- if (ts.isParenthesizedExpression(cur)) {
174
- cur = cur.expression;
203
+ cur = stripWrappers(cur.expression);
175
204
  continue;
176
205
  }
177
206
  return null;
@@ -212,6 +241,30 @@ function isFunctionBoundary(node) {
212
241
  ts.isGetAccessorDeclaration(node) ||
213
242
  ts.isSetAccessorDeclaration(node));
214
243
  }
244
+ /** The name a plain function value is bound to in the same file
245
+ * (`function f`, `var f = function`), for the constructor refinement. */
246
+ function boundFunctionName(fn) {
247
+ if (ts.isFunctionDeclaration(fn))
248
+ return fn.name?.text ?? null;
249
+ const parent = fn.parent;
250
+ if (parent === undefined)
251
+ return null;
252
+ if (ts.isVariableDeclaration(parent) && ts.isIdentifier(parent.name))
253
+ return parent.name.text;
254
+ if (ts.isPropertyAssignment(parent))
255
+ return propertyName(parent.name);
256
+ return null;
257
+ }
258
+ /** `X.prototype.name = function () {}`: a method assignment, whose every
259
+ * call through the same spelling has a receiver. */
260
+ function isPrototypeFunctionAssignment(left, right) {
261
+ let value = right;
262
+ while (ts.isParenthesizedExpression(value))
263
+ value = value.expression;
264
+ return (ts.isFunctionExpression(value) &&
265
+ ts.isPropertyAccessExpression(left.expression) &&
266
+ propertyName(left.expression) === "prototype");
267
+ }
215
268
  /** One module's pre-scan. */
216
269
  class ModuleScanner {
217
270
  sf;
@@ -227,6 +280,21 @@ class ModuleScanner {
227
280
  builtinBindings = new Map();
228
281
  /** Local names bound to a createRequire(...) result. */
229
282
  createdRequires = new Set();
283
+ /** Local names bound to a builtin module's CommonJS object: require(),
284
+ * a createRequire'd require's result, a default import, or an alias of
285
+ * one. Writes through these names are patches of the module object. */
286
+ cjsBuiltinObjects = new Set();
287
+ /** Members read through a CommonJS builtin object (H3.4). */
288
+ cjsReads = [];
289
+ /** Names the file constructs with `new`: a constructor's `this` is never
290
+ * the global object, so its `this` uses need no island (decision S5). */
291
+ constructed = new Set();
292
+ /** Names the file calls as a bare identifier, `f(...)`: a name used both
293
+ * ways is a constructor and a plain function, so it still marks. */
294
+ bareCalled = new Set();
295
+ /** Function expressions the file assigns to `X.prototype.name`: every
296
+ * same-file call of them is a receiver call (decision S5). */
297
+ prototypeFunctions = new Set();
230
298
  strictness = new Map();
231
299
  moduleStrict;
232
300
  constructor(sf) {
@@ -248,7 +316,7 @@ class ModuleScanner {
248
316
  });
249
317
  return this.markers;
250
318
  }
251
- add(rule, reason, construct, node) {
319
+ add(rule, reason, construct, node, member) {
252
320
  if (this.markers.length >= MARKER_CAP)
253
321
  return;
254
322
  this.markers.push({
@@ -256,6 +324,7 @@ class ModuleScanner {
256
324
  reason,
257
325
  construct,
258
326
  loc: { file: this.sf.fileName, start: ts.tokenStartOfNode(node), end: node.end },
327
+ ...(member === undefined ? {} : { member }),
259
328
  });
260
329
  }
261
330
  bindName(name, init) {
@@ -265,21 +334,23 @@ class ModuleScanner {
265
334
  this.declared.add(name.text);
266
335
  if (init === undefined)
267
336
  return;
268
- let value = init;
269
- while (ts.isParenthesizedExpression(value))
270
- value = value.expression;
337
+ const value = stripWrappers(init);
271
338
  if (ts.isFunctionExpression(value) || ts.isArrowFunction(value))
272
339
  this.functions.add(name.text);
273
340
  else if (ts.isClassExpression(value))
274
341
  this.classes.add(name.text);
275
342
  const bound = this.builtinOf(value);
276
- if (bound !== null)
343
+ if (bound !== null) {
277
344
  this.builtinBindings.set(name.text, bound);
345
+ if (!bound.includes(".") && this.isCjsObjectValue(value))
346
+ this.cjsBuiltinObjects.add(name.text);
347
+ }
278
348
  if (ts.isCallExpression(value) && this.isCreateRequireCallee(value.expression))
279
349
  this.createdRequires.add(name.text);
280
350
  return;
281
351
  }
282
352
  if (ts.isObjectBindingPattern(name)) {
353
+ this.recordCjsPatternReads(name, init);
283
354
  const base = init === undefined ? null : this.builtinOf(init);
284
355
  for (const element of name.elements.nodes) {
285
356
  if (!ts.isBindingElement(element))
@@ -301,12 +372,22 @@ class ModuleScanner {
301
372
  }
302
373
  }
303
374
  }
375
+ /** A value that is a builtin module's CommonJS object: a require() or a
376
+ * createRequire'd require's result of a builtin, or an alias of one. */
377
+ isCjsObjectValue(value) {
378
+ if (ts.isIdentifier(value))
379
+ return this.cjsBuiltinObjects.has(value.text);
380
+ if (!ts.isCallExpression(value))
381
+ return false;
382
+ return (this.isRequireCallee(value.expression) ||
383
+ (ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)));
384
+ }
304
385
  /** `require("fs")`, `require("node:util").inherits` → "fs", "util.inherits". */
305
386
  builtinOf(node) {
306
- let value = node;
307
- while (ts.isParenthesizedExpression(value))
308
- value = value.expression;
309
- if (ts.isCallExpression(value) && this.isRequireCallee(value.expression)) {
387
+ const value = stripWrappers(node);
388
+ if (ts.isCallExpression(value) &&
389
+ (this.isRequireCallee(value.expression) ||
390
+ (ts.isIdentifier(value.expression) && this.createdRequires.has(value.expression.text)))) {
310
391
  const spec = literalText(value.arguments.nodes[0]);
311
392
  return spec === null ? null : builtinModuleName(spec);
312
393
  }
@@ -345,6 +426,18 @@ class ModuleScanner {
345
426
  else if (ts.isParameter(node)) {
346
427
  this.bindName(node.name, undefined);
347
428
  }
429
+ else if (ts.isNewExpression(node) && ts.isIdentifier(node.expression)) {
430
+ this.constructed.add(node.expression.text);
431
+ }
432
+ else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
433
+ this.bareCalled.add(node.expression.text);
434
+ }
435
+ else if (ts.isBinaryExpression(node) &&
436
+ node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
437
+ ts.isPropertyAccessExpression(node.left) &&
438
+ isPrototypeFunctionAssignment(node.left, node.right)) {
439
+ this.prototypeFunctions.add(node.right);
440
+ }
348
441
  else if (ts.isImportDeclaration(node)) {
349
442
  const spec = literalText(node.moduleSpecifier);
350
443
  const module = spec === null ? null : builtinModuleName(spec);
@@ -352,8 +445,12 @@ class ModuleScanner {
352
445
  if (clause !== undefined) {
353
446
  if (clause.name !== undefined) {
354
447
  this.declared.add(clause.name.text);
355
- if (module !== null)
448
+ if (module !== null) {
356
449
  this.builtinBindings.set(clause.name.text, module);
450
+ // A default import is the CommonJS object (unlike a namespace
451
+ // or named import, through which Node refuses writes).
452
+ this.cjsBuiltinObjects.add(clause.name.text);
453
+ }
357
454
  }
358
455
  const bindings = clause.namedBindings;
359
456
  if (bindings !== undefined && ts.isNamespaceImport(bindings)) {
@@ -411,13 +508,79 @@ class ModuleScanner {
411
508
  isGlobal(name) {
412
509
  return BUILTIN_GLOBALS.has(name) && !this.declared.has(name);
413
510
  }
511
+ /** A function declaration whose parent is a block that is not a function
512
+ * body: Annex B.3.2's block-level declaration, which in sloppy code also
513
+ * creates a `var`-like binding in the enclosing function (DESIGN.md note 1
514
+ * §3.1, construct 5). A declaration directly in a function body or at the
515
+ * top level of a script is ordinary. */
516
+ isAnnexBBlockFunction(fn) {
517
+ const parent = fn.parent;
518
+ if (parent === undefined || !ts.isBlock(parent))
519
+ return false;
520
+ const owner = parent.parent;
521
+ if (owner === undefined)
522
+ return false;
523
+ // A function-like body, a class static block or a class member
524
+ // initializer block is not a bare block statement.
525
+ return owner.body !== parent;
526
+ }
527
+ /** Whether the file shows the function is only ever called with a
528
+ * receiver, so native's missing sloppy `this` cannot be observed: it is
529
+ * constructed with `new`, or it is a `X.prototype.name` method (decision
530
+ * S5 — the marker islands what native gets wrong, and native passes the
531
+ * receiver for both shapes). */
532
+ receiverSafe(fn) {
533
+ if (this.prototypeFunctions.has(fn))
534
+ return true;
535
+ const name = boundFunctionName(fn);
536
+ return name !== null && this.constructed.has(name) && !this.bareCalled.has(name);
537
+ }
538
+ /** `this` in a plain function call: a sloppy function that is not a
539
+ * method, constructor, accessor or class member, and is not an arrow
540
+ * function (whose `this` is its enclosing function's). Conservative
541
+ * (decision S2): a file-level scan cannot see cross-file call sites, so
542
+ * any `this` in such a function marks the module, except the shapes the
543
+ * file itself proves are receiver calls (decision S5). Top-level `this`
544
+ * is not this marker: it is the module's exports object, and the test262
545
+ * profile's script-environment exclusion covers the script form. */
546
+ visitThis(node) {
547
+ if (this.isStrict(node))
548
+ return;
549
+ for (let cur = node.parent; cur !== undefined; cur = cur.parent) {
550
+ // An arrow function has no `this` of its own: keep looking outward.
551
+ if (ts.isArrowFunction(cur))
552
+ continue;
553
+ if (ts.isFunctionDeclaration(cur) || ts.isFunctionExpression(cur)) {
554
+ if (this.receiverSafe(cur))
555
+ return;
556
+ this.add("R2.4", "sloppy-this", "'this' in a plain call in sloppy mode", node);
557
+ return;
558
+ }
559
+ // A method, constructor or accessor has a receiver; a class member
560
+ // initializer and a class static block have their own `this`; a
561
+ // property assignment's function is commonly a method too.
562
+ if (isFunctionBoundary(cur) ||
563
+ ts.isClassDeclaration(cur) ||
564
+ ts.isClassExpression(cur) ||
565
+ ts.isClassStaticBlockDeclaration(cur) ||
566
+ ts.isPropertyDeclaration(cur) ||
567
+ ts.isPropertyAssignment(cur))
568
+ return;
569
+ // Top-level `this` is the module's exports object, not a call site.
570
+ if (ts.isSourceFile(cur))
571
+ return;
572
+ }
573
+ }
414
574
  visit(node) {
415
575
  if (ts.isCallExpression(node))
416
576
  this.visitCall(node);
417
577
  else if (ts.isNewExpression(node))
418
578
  this.visitNew(node);
419
- else if (ts.isBinaryExpression(node) && isAssignmentOperator(node.operatorToken.kind))
579
+ else if (ts.isBinaryExpression(node) && isAssignmentOperator(node.operatorToken.kind)) {
420
580
  this.visitWrite(node.left, node, "write");
581
+ if (node.operatorToken.kind === ts.SyntaxKind.EqualsToken)
582
+ this.recordCjsPatternReads(node.left, node.right);
583
+ }
421
584
  else if (ts.isDeleteExpression(node))
422
585
  this.visitDelete(node);
423
586
  else if (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) {
@@ -426,7 +589,10 @@ class ModuleScanner {
426
589
  this.visitWrite(node.operand, node, "write");
427
590
  }
428
591
  else if (ts.isWithStatement(node)) {
429
- this.add("R2.4", "with", "a 'with' statement", node);
592
+ // A `with` in strict code is an early error (Node refuses the file
593
+ // too), so only sloppy code carries the sloppy-semantics marker.
594
+ if (!this.isStrict(node))
595
+ this.add("R2.4", "with", "a 'with' statement", node);
430
596
  }
431
597
  else if (ts.isImportDeclaration(node)) {
432
598
  const spec = literalText(node.moduleSpecifier);
@@ -445,6 +611,13 @@ class ModuleScanner {
445
611
  const text = chainText(node);
446
612
  if ((text === "arguments.callee" || text === "arguments.caller") && !this.isStrict(node))
447
613
  this.add("R2.4", "sloppy-arguments", `'${text}'`, node);
614
+ this.recordCjsRead(node);
615
+ }
616
+ else if (ts.isElementAccessExpression(node)) {
617
+ this.recordCjsRead(node);
618
+ }
619
+ else if (node.kind === ts.SyntaxKind.ThisKeyword) {
620
+ this.visitThis(node);
448
621
  }
449
622
  else if (ts.isObjectLiteralExpression(node)) {
450
623
  for (const prop of node.properties.nodes) {
@@ -460,6 +633,100 @@ class ModuleScanner {
460
633
  this.visitFunction(node);
461
634
  }
462
635
  }
636
+ /** Records a read of a member of a builtin module's CommonJS object, so
637
+ * a patch installed by an island module can be checked against it
638
+ * (H3.4). The left of an assignment (and a delete or ++/-- target) is a
639
+ * write, not a read. A computed key reads a member the scan cannot name,
640
+ * so it is recorded as the whole module ("fs.*"). */
641
+ recordCjsRead(node) {
642
+ const root = chainRoot(node);
643
+ if (root === null || !this.cjsBuiltinObjects.has(root.text))
644
+ return;
645
+ const module = this.builtinBindings.get(root.text);
646
+ if (module === undefined)
647
+ return;
648
+ const text = chainText(node);
649
+ const parent = node.parent;
650
+ if (parent !== undefined) {
651
+ if (ts.isBinaryExpression(parent) &&
652
+ isAssignmentOperator(parent.operatorToken.kind) &&
653
+ parent.left === node)
654
+ return;
655
+ if (ts.isDeleteExpression(parent) ||
656
+ ts.isPrefixUnaryExpression(parent) ||
657
+ ts.isPostfixUnaryExpression(parent))
658
+ return;
659
+ }
660
+ this.pushCjsRead(text === null ? `${module}.*` : module + text.slice(root.text.length), node);
661
+ }
662
+ pushCjsRead(member, node) {
663
+ this.cjsReads.push({
664
+ member,
665
+ loc: { file: this.sf.fileName, start: ts.tokenStartOfNode(node), end: node.end },
666
+ });
667
+ }
668
+ /** The reads of a destructuring whose source is a builtin module's
669
+ * CommonJS object (`const { readFileSync } = require("fs")`,
670
+ * `({ readFileSync } = fs)`): each property it takes is read when the
671
+ * destructuring runs, so it sees a patch installed before. A rest element
672
+ * or a computed key reads members the scan cannot name ("fs.*"). */
673
+ recordCjsPatternReads(pattern, source) {
674
+ if (source === undefined)
675
+ return;
676
+ const value = stripWrappers(source);
677
+ if (!this.isCjsObjectValue(value))
678
+ return;
679
+ const module = this.builtinOf(value);
680
+ if (module === null || module.includes("."))
681
+ return;
682
+ this.recordPatternReads(pattern, module);
683
+ }
684
+ recordPatternReads(pattern, base) {
685
+ const target = stripWrappers(pattern);
686
+ const elements = [];
687
+ if (ts.isObjectBindingPattern(target)) {
688
+ for (const element of target.elements.nodes) {
689
+ if (!ts.isBindingElement(element))
690
+ continue;
691
+ elements.push({
692
+ key: element.propertyName ?? element.name,
693
+ value: element.name,
694
+ rest: element.dotDotDotToken !== undefined,
695
+ node: element,
696
+ });
697
+ }
698
+ }
699
+ else if (ts.isObjectLiteralExpression(target)) {
700
+ for (const prop of target.properties.nodes) {
701
+ if (ts.isPropertyAssignment(prop))
702
+ elements.push({ key: prop.name, value: prop.initializer, rest: false, node: prop });
703
+ else if (ts.isShorthandPropertyAssignment(prop))
704
+ elements.push({ key: prop.name, value: undefined, rest: false, node: prop });
705
+ else if (ts.isSpreadAssignment(prop))
706
+ elements.push({ key: undefined, value: undefined, rest: true, node: prop });
707
+ }
708
+ }
709
+ else
710
+ return;
711
+ for (const element of elements) {
712
+ const key = element.rest || element.key === undefined ? null : staticKey(element.key);
713
+ if (key === null) {
714
+ this.pushCjsRead(`${base.split(".")[0]}.*`, element.node);
715
+ continue;
716
+ }
717
+ const member = `${base}.${key}`;
718
+ this.pushCjsRead(member, element.node);
719
+ // A nested pattern reads the member's own properties too.
720
+ if (element.value !== undefined) {
721
+ let inner = stripWrappers(element.value);
722
+ // `{ readFileSync = fallback }` (a default) and `{ a: { b } = {} }`.
723
+ if (ts.isBinaryExpression(inner) && inner.operatorToken.kind === ts.SyntaxKind.EqualsToken)
724
+ inner = stripWrappers(inner.left);
725
+ if (ts.isObjectBindingPattern(inner) || ts.isObjectLiteralExpression(inner))
726
+ this.recordPatternReads(inner, member);
727
+ }
728
+ }
729
+ }
463
730
  visitSpecifier(spec, node) {
464
731
  const builtin = builtinModuleName(spec);
465
732
  if (builtin === "vm")
@@ -500,15 +767,24 @@ class ModuleScanner {
500
767
  let target = callee;
501
768
  while (ts.isParenthesizedExpression(target))
502
769
  target = target.expression;
770
+ // A bare `eval(...)` is the intrinsic's DIRECT call: it reads and
771
+ // creates bindings in the caller's scope, and in sloppy mode creates
772
+ // globals (DESIGN.md note 1 §3.1). `globalThis.eval(...)`, the
773
+ // comma-operator idiom `(0, eval)(...)` and the other spellings are
774
+ // indirect: they observe no caller scope, so only R1.1.
775
+ const direct = ts.isIdentifier(target) && target.text === "eval" && !this.declared.has("eval");
503
776
  if (ts.isBinaryExpression(target) && target.operatorToken.kind === ts.SyntaxKind.CommaToken)
504
777
  target = target.right;
505
778
  const text = chainText(target);
506
779
  if (text === null)
507
780
  return;
508
- if ((text === "eval" && !this.declared.has("eval")) ||
509
- text === "globalThis.eval" ||
510
- text === "global.eval" ||
511
- text === "window.eval") {
781
+ if (text === "eval" && !this.declared.has("eval")) {
782
+ this.add("R1.1", "code-from-string", "eval()", call);
783
+ if (direct && !this.isStrict(call))
784
+ this.add("R2.4", "direct-eval", "a direct call of eval() in sloppy mode", call);
785
+ return;
786
+ }
787
+ if (text === "globalThis.eval" || text === "global.eval" || text === "window.eval") {
512
788
  this.add("R1.1", "code-from-string", "eval()", call);
513
789
  return;
514
790
  }
@@ -560,10 +836,45 @@ class ModuleScanner {
560
836
  if (((text === "Object.defineProperty" || text === "Object.defineProperties") &&
561
837
  this.isGlobal("Object")) ||
562
838
  (text === "Reflect.defineProperty" && this.isGlobal("Reflect"))) {
839
+ // A definition on a builtin module's CommonJS object is a patch the
840
+ // code loading that object must see (R2.5, H3.1.4).
841
+ const target = first === undefined ? undefined : stripWrappers(first);
842
+ const builtin = target !== undefined && ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)
843
+ ? (this.builtinBindings.get(target.text) ?? null)
844
+ : null;
845
+ if (builtin !== null) {
846
+ const key = literalText(args[1] === undefined ? undefined : stripWrappers(args[1]));
847
+ this.add("R2.5", "builtin-patch", `'${text}()' on the builtin module '${builtin}'`, call, key === null ? `${builtin}.*` : `${builtin}.${key}`);
848
+ return;
849
+ }
563
850
  if (first !== undefined && !this.isModuleObject(first) && !this.inInteropHelper(call))
564
851
  this.add("R2.3", "define-property", `'${text}()'`, call);
565
852
  return;
566
853
  }
854
+ // Object.assign(fs, …) on a builtin module's CommonJS object: every
855
+ // literal key is a patch (R2.5, H3.1.4).
856
+ if (text === "Object.assign" && this.isGlobal("Object") && first !== undefined) {
857
+ const target = stripWrappers(first);
858
+ if (ts.isIdentifier(target) && this.cjsBuiltinObjects.has(target.text)) {
859
+ const builtin = this.builtinBindings.get(target.text) ?? null;
860
+ if (builtin !== null) {
861
+ const source = args.length === 2 ? stripWrappers(args[1]) : undefined;
862
+ const keys = source !== undefined && ts.isObjectLiteralExpression(source)
863
+ ? source.properties.nodes
864
+ .map((property) => ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property)
865
+ ? literalKeyName(property.name)
866
+ : null)
867
+ .filter((key) => key !== null)
868
+ : [];
869
+ if (keys.length === 0)
870
+ this.add("R2.5", "builtin-patch", `'Object.assign()' on the builtin module '${builtin}'`, call, `${builtin}.*`);
871
+ else
872
+ for (const key of keys)
873
+ this.add("R2.5", "builtin-patch", `'Object.assign()' on the builtin module '${builtin}'`, call, `${builtin}.${key}`);
874
+ return;
875
+ }
876
+ }
877
+ }
567
878
  if (text.endsWith(".__defineGetter__") || text.endsWith(".__defineSetter__")) {
568
879
  this.add("R2.3", "define-property", `'${text.slice(text.lastIndexOf(".") + 1)}()'`, call);
569
880
  return;
@@ -706,7 +1017,10 @@ class ModuleScanner {
706
1017
  if (binding !== undefined) {
707
1018
  const member = binding + spelled.slice(root.text.length);
708
1019
  if (!this.allowedWrite(member)) {
709
- this.add("R2.5", "builtin-write", `a ${what} of the builtin module member '${member}'`, node);
1020
+ // A write through a builtin module's CommonJS object patches that
1021
+ // object; only code sharing Node's builtin can see it (H3.1).
1022
+ const patch = this.cjsBuiltinObjects.has(root.text);
1023
+ this.add("R2.5", patch ? "builtin-patch" : "builtin-write", `a ${what} of the builtin module member '${member}'`, node, patch ? member : undefined);
710
1024
  }
711
1025
  return;
712
1026
  }
@@ -757,6 +1071,8 @@ class ModuleScanner {
757
1071
  /** Observable `arguments` aliasing in a sloppy function: writes to
758
1072
  * arguments[i], or to a parameter while `arguments` is read. */
759
1073
  visitFunction(fn) {
1074
+ if (ts.isFunctionDeclaration(fn) && this.isAnnexBBlockFunction(fn) && !this.isStrict(fn))
1075
+ this.add("R2.4", "annexb-block-function", "a function declaration in a block in sloppy mode", fn);
760
1076
  const body = fn.body;
761
1077
  if (body === undefined || !ts.isBlock(body))
762
1078
  return;
@@ -797,9 +1113,18 @@ class ModuleScanner {
797
1113
  this.add("R2.4", "sloppy-arguments", "a parameter write while 'arguments' is read in sloppy mode", seen.paramWrite);
798
1114
  }
799
1115
  }
800
- /** The R1/R2 markers of one JavaScript module, in source order. */
1116
+ /** The R1/R2 markers and CommonJS-object reads of one module, in source
1117
+ * order. */
1118
+ export function scanModuleFacts(sf) {
1119
+ const scanner = new ModuleScanner(sf);
1120
+ const markers = scanner.scan();
1121
+ return {
1122
+ markers: markers.sort((a, b) => a.loc.start - b.loc.start),
1123
+ cjsReads: scanner.cjsReads.sort((a, b) => a.loc.start - b.loc.start),
1124
+ };
1125
+ }
1126
+ /** The R1/R2 markers of one module, in source order. */
801
1127
  export function scanModule(sf) {
802
- const markers = new ModuleScanner(sf).scan();
803
- return markers.sort((a, b) => a.loc.start - b.loc.start);
1128
+ return scanModuleFacts(sf).markers;
804
1129
  }
805
1130
  //# sourceMappingURL=detect.js.map