@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.21

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 (431) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +35 -9
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +274 -496
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/commands/held.js +499 -0
  12. package/dist/src/commands/read.js +161 -0
  13. package/dist/src/commands/shell.js +169 -0
  14. package/dist/src/commands/tools.js +1847 -0
  15. package/dist/src/component-files.js +3 -2
  16. package/dist/src/component-layer.js +4 -2
  17. package/dist/src/config.js +6 -82
  18. package/dist/src/conformance-record.js +2 -2
  19. package/dist/src/consumers.js +10 -38
  20. package/dist/src/contextual-uses.js +57 -26
  21. package/dist/src/contract/config.generated.js +561 -0
  22. package/dist/src/contract/contract.generated.js +1370 -0
  23. package/dist/src/contract/report.generated.js +866 -0
  24. package/dist/src/dependencies.js +165 -122
  25. package/dist/src/destructuring.js +1 -19
  26. package/dist/src/edges.js +38 -122
  27. package/dist/src/element-access.js +181 -168
  28. package/dist/src/entries/build-scripts.js +222 -0
  29. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  30. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  31. package/dist/src/entries/conventions.js +740 -0
  32. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  33. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  34. package/dist/src/entries/run-directories.js +77 -0
  35. package/dist/src/entries/sources.js +144 -0
  36. package/dist/src/entries/static-module.js +670 -0
  37. package/dist/src/entries/test-runners.js +650 -0
  38. package/dist/src/entries/workflow-steps.js +345 -0
  39. package/dist/src/exemptions/argument-places.js +131 -0
  40. package/dist/src/exemptions/calls.js +338 -0
  41. package/dist/src/exemptions/classes.js +13 -0
  42. package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
  43. package/dist/src/exemptions/detectors.js +48 -0
  44. package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
  45. package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
  46. package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
  47. package/dist/src/exemptions/generated-file.js +241 -0
  48. package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
  49. package/dist/src/exemptions/installed-globals.js +173 -0
  50. package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
  51. package/dist/src/exemptions/lifecycle.js +150 -0
  52. package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
  53. package/dist/src/exemptions/serialization-contract.js +1276 -0
  54. package/dist/src/exemptions/sites.js +182 -0
  55. package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
  56. package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
  57. package/dist/src/exposure.js +400 -0
  58. package/dist/src/extensions.js +37 -0
  59. package/dist/src/facts.js +38 -0
  60. package/dist/src/failure.js +36 -0
  61. package/dist/src/file-facts.js +3 -26
  62. package/dist/src/findings/completion.js +109 -56
  63. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  64. package/dist/src/findings/emitters.js +27 -41
  65. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  66. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  67. package/dist/src/findings/interfaces.js +4 -5
  68. package/dist/src/findings/intra-function.js +16 -13
  69. package/dist/src/findings/non-code-artifacts.js +17 -12
  70. package/dist/src/findings/reads-and-writes.js +86 -27
  71. package/dist/src/findings/self-check.js +44 -30
  72. package/dist/src/findings/unused-declarations.js +29 -45
  73. package/dist/src/findings/visibility-narrowing.js +23 -31
  74. package/dist/src/findings-pass.js +13 -21
  75. package/dist/src/fs/document.js +52 -0
  76. package/dist/src/fs/manifest.js +67 -0
  77. package/dist/src/fs/tree.js +88 -0
  78. package/dist/src/git-ignore.js +39 -26
  79. package/dist/src/import-bindings.js +73 -28
  80. package/dist/src/index/sites.js +557 -0
  81. package/dist/src/index/values.js +124 -0
  82. package/dist/src/index.js +2 -2
  83. package/dist/src/indexed-access.js +523 -478
  84. package/dist/src/intra-function-parts.js +63 -43
  85. package/dist/src/inventory/commonjs.js +507 -0
  86. package/dist/src/inventory/enumerate.js +167 -0
  87. package/dist/src/inventory/syntax.js +236 -0
  88. package/dist/src/inventory.js +323 -724
  89. package/dist/src/javascript-file.js +48 -0
  90. package/dist/src/json-document.js +198 -67
  91. package/dist/src/keyof-comparisons.js +126 -107
  92. package/dist/src/kinds.js +3 -366
  93. package/dist/src/{components.js → liveness/components.js} +2 -3
  94. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  95. package/dist/src/liveness/matrix.js +99 -0
  96. package/dist/src/liveness/sweep.js +558 -0
  97. package/dist/src/load/classify.js +289 -0
  98. package/dist/src/load/diagnostics.js +87 -0
  99. package/dist/src/load/discover.js +285 -0
  100. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  101. package/dist/src/load/expected-module.js +136 -0
  102. package/dist/src/load/load.js +27 -0
  103. package/dist/src/load/module-lookup.js +37 -0
  104. package/dist/src/load/package-scope.js +56 -0
  105. package/dist/src/load/plan.js +313 -0
  106. package/dist/src/load/specifiers.js +113 -0
  107. package/dist/src/load/synthesize.js +152 -0
  108. package/dist/src/load/test-globals.js +207 -0
  109. package/dist/src/load/test-joins.js +82 -0
  110. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  111. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  112. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  113. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  114. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  115. package/dist/src/module-declarations.js +70 -85
  116. package/dist/src/overrides.js +134 -112
  117. package/dist/src/partial.js +2 -1
  118. package/dist/src/paths.js +82 -16
  119. package/dist/src/platform-calls.js +78 -0
  120. package/dist/src/platform-symbols.js +134 -0
  121. package/dist/src/position.js +43 -1
  122. package/dist/src/print.js +11 -79
  123. package/dist/src/product.js +13 -0
  124. package/dist/src/query.js +95 -0
  125. package/dist/src/ref.js +12 -20
  126. package/dist/src/references/read-rule.js +1 -0
  127. package/dist/src/references/read-rules.js +48 -0
  128. package/dist/src/references/sink.js +237 -0
  129. package/dist/src/references/sources.js +450 -0
  130. package/dist/src/references.js +117 -1074
  131. package/dist/src/report-schema.js +51 -0
  132. package/dist/src/report.js +57 -41
  133. package/dist/src/reporters/annotations.js +15 -8
  134. package/dist/src/reporters/sarif.js +16 -10
  135. package/dist/src/reporters/template.js +4 -19
  136. package/dist/src/resolve.js +246 -730
  137. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  138. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  139. package/dist/src/roots/manifest.js +216 -0
  140. package/dist/src/roots/published-reach.js +412 -0
  141. package/dist/src/roots/root-set.js +487 -0
  142. package/dist/src/roots/unseen-loads.js +236 -0
  143. package/dist/src/run.js +66 -77
  144. package/dist/src/schema.js +320 -343
  145. package/dist/src/scope.js +38 -115
  146. package/dist/src/session.js +37 -29
  147. package/dist/src/source-files.js +6 -10
  148. package/dist/src/stores.js +4 -2
  149. package/dist/src/suppress-file.js +25 -28
  150. package/dist/src/suppress-inline.js +36 -83
  151. package/dist/src/suppress.js +50 -71
  152. package/dist/src/symbol-keys.js +92 -88
  153. package/dist/src/tests/file-class.js +76 -0
  154. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  155. package/dist/src/{test-support.js → tests/support.js} +5 -12
  156. package/dist/src/text/compare.js +26 -0
  157. package/dist/src/text/glob.js +194 -0
  158. package/dist/src/text/named-files.js +298 -0
  159. package/dist/src/text/yaml.js +684 -0
  160. package/dist/src/type-errors.js +11 -232
  161. package/dist/src/type-parameter-reads.js +178 -139
  162. package/dist/src/unimplemented-callees.js +262 -242
  163. package/dist/src/unwrap.js +23 -0
  164. package/dist/src/usage.js +10 -0
  165. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  166. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  167. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  168. package/dist/src/vendor/unbash/assignment.js +131 -0
  169. package/dist/src/vendor/unbash/chars.js +48 -0
  170. package/dist/src/vendor/unbash/command.js +41 -0
  171. package/dist/src/vendor/unbash/expansion.js +80 -0
  172. package/dist/src/vendor/unbash/glob.js +268 -0
  173. package/dist/src/vendor/unbash/heredoc.js +27 -0
  174. package/dist/src/vendor/unbash/internal-types.js +1 -0
  175. package/dist/src/vendor/unbash/lexer.js +4274 -0
  176. package/dist/src/vendor/unbash/limits.js +3 -0
  177. package/dist/src/vendor/unbash/parser.js +1366 -0
  178. package/dist/src/vendor/unbash/parts.js +57 -0
  179. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  180. package/dist/src/vendor/unbash/traversal.js +212 -0
  181. package/dist/src/vendor/unbash/types.js +1 -0
  182. package/dist/src/vendor/unbash/word-value.js +61 -0
  183. package/dist/src/vendor/unbash/word.js +40 -0
  184. package/dist/src/verbs/analyze.js +194 -127
  185. package/dist/src/verbs/describe.js +13 -18
  186. package/dist/src/verbs/explain.js +85 -139
  187. package/dist/src/verbs/print-config.js +2 -1
  188. package/dist/src/verbs/print-projects.js +6 -4
  189. package/dist/src/verbs/print-retained.js +30 -6
  190. package/dist/src/verbs/print-roots.js +4 -2
  191. package/dist/src/verbs/verb.js +1 -5
  192. package/dist/src/verbs/version.js +14 -3
  193. package/jsr.json +2 -1
  194. package/package.json +14 -8
  195. package/src/alias-chain.ts +40 -11
  196. package/src/amd.ts +130 -0
  197. package/src/analysis.ts +426 -733
  198. package/src/augmentations.ts +93 -4
  199. package/src/automatic-types.ts +12 -30
  200. package/src/bindings.ts +460 -0
  201. package/src/commands/held.ts +632 -0
  202. package/src/commands/read.ts +242 -0
  203. package/src/commands/shell.ts +228 -0
  204. package/src/commands/tools.ts +2382 -0
  205. package/src/component-files.ts +4 -2
  206. package/src/component-layer.ts +4 -2
  207. package/src/config.ts +31 -302
  208. package/src/conformance-record.ts +2 -2
  209. package/src/consumers.ts +16 -66
  210. package/src/contextual-uses.ts +66 -34
  211. package/src/contract/config.generated.ts +821 -0
  212. package/src/contract/contract.generated.ts +1453 -0
  213. package/src/contract/report.generated.ts +1241 -0
  214. package/src/dependencies.ts +223 -128
  215. package/src/destructuring.ts +1 -31
  216. package/src/edges.ts +41 -140
  217. package/src/element-access.ts +190 -187
  218. package/src/entries/build-scripts.ts +292 -0
  219. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  220. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  221. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  222. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  223. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  224. package/src/entries/run-directories.ts +108 -0
  225. package/src/entries/sources.ts +266 -0
  226. package/src/entries/static-module.ts +858 -0
  227. package/src/entries/test-runners.ts +835 -0
  228. package/src/entries/workflow-steps.ts +432 -0
  229. package/src/exemptions/argument-places.ts +198 -0
  230. package/src/exemptions/calls.ts +483 -0
  231. package/src/exemptions/classes.ts +49 -0
  232. package/src/exemptions/decorator.ts +56 -0
  233. package/src/exemptions/detectors.ts +75 -0
  234. package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
  235. package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
  236. package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
  237. package/src/exemptions/generated-file.ts +318 -0
  238. package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
  239. package/src/exemptions/installed-globals.ts +255 -0
  240. package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
  241. package/src/exemptions/lifecycle.ts +286 -0
  242. package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
  243. package/src/exemptions/serialization-contract.ts +1729 -0
  244. package/src/exemptions/sites.ts +293 -0
  245. package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
  246. package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
  247. package/src/exposure.ts +492 -0
  248. package/src/extensions.ts +45 -0
  249. package/src/facts.ts +46 -0
  250. package/src/failure.ts +63 -0
  251. package/src/file-facts.ts +15 -25
  252. package/src/finding.ts +10 -10
  253. package/src/findings/boundary.ts +11 -0
  254. package/src/findings/completion.ts +133 -64
  255. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  256. package/src/findings/emitter.ts +9 -10
  257. package/src/findings/emitters.ts +38 -52
  258. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  259. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  260. package/src/findings/interfaces.ts +7 -9
  261. package/src/findings/intra-function.ts +16 -14
  262. package/src/findings/non-code-artifacts.ts +24 -15
  263. package/src/findings/reads-and-writes.ts +118 -41
  264. package/src/findings/self-check.ts +51 -38
  265. package/src/findings/unused-declarations.ts +31 -49
  266. package/src/findings/visibility-narrowing.ts +36 -40
  267. package/src/findings-pass.ts +15 -31
  268. package/src/fs/document.ts +70 -0
  269. package/src/fs/manifest.ts +96 -0
  270. package/src/fs/tree.ts +110 -0
  271. package/src/git-ignore.ts +50 -26
  272. package/src/host.ts +12 -5
  273. package/src/import-bindings.ts +98 -29
  274. package/src/index/sites.ts +781 -0
  275. package/src/index/values.ts +170 -0
  276. package/src/index.ts +2 -2
  277. package/src/indexed-access.ts +570 -527
  278. package/src/intra-function-parts.ts +73 -44
  279. package/src/inventory/commonjs.ts +696 -0
  280. package/src/inventory/enumerate.ts +203 -0
  281. package/src/inventory/syntax.ts +311 -0
  282. package/src/inventory.ts +442 -895
  283. package/src/javascript-file.ts +54 -0
  284. package/src/json-document.ts +241 -76
  285. package/src/keyof-comparisons.ts +133 -122
  286. package/src/kinds.ts +5 -413
  287. package/src/{components.ts → liveness/components.ts} +4 -6
  288. package/src/{graph.ts → liveness/graph.ts} +100 -35
  289. package/src/liveness/matrix.ts +162 -0
  290. package/src/liveness/sweep.ts +855 -0
  291. package/src/load/classify.ts +433 -0
  292. package/src/load/diagnostics.ts +154 -0
  293. package/src/load/discover.ts +471 -0
  294. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  295. package/src/load/expected-module.ts +194 -0
  296. package/src/load/load.ts +73 -0
  297. package/src/load/module-lookup.ts +50 -0
  298. package/src/load/package-scope.ts +74 -0
  299. package/src/load/plan.ts +513 -0
  300. package/src/load/specifiers.ts +171 -0
  301. package/src/load/synthesize.ts +230 -0
  302. package/src/load/test-globals.ts +251 -0
  303. package/src/load/test-joins.ts +98 -0
  304. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  305. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  306. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  307. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  308. package/src/{workspace.ts → load/workspace.ts} +90 -134
  309. package/src/module-declarations.ts +74 -98
  310. package/src/overrides.ts +162 -134
  311. package/src/partial.ts +3 -2
  312. package/src/paths.ts +92 -16
  313. package/src/platform-calls.ts +119 -0
  314. package/src/platform-symbols.ts +189 -0
  315. package/src/position.ts +44 -1
  316. package/src/print.ts +12 -92
  317. package/src/product.ts +18 -0
  318. package/src/query.ts +201 -10
  319. package/src/ref.ts +12 -20
  320. package/src/references/read-rule.ts +60 -0
  321. package/src/references/read-rules.ts +55 -0
  322. package/src/references/sink.ts +314 -0
  323. package/src/references/sources.ts +632 -0
  324. package/src/references.ts +187 -1450
  325. package/src/report-schema.ts +68 -0
  326. package/src/report.ts +103 -226
  327. package/src/reporters/annotations.ts +22 -11
  328. package/src/reporters/json.ts +1 -1
  329. package/src/reporters/reporter.ts +2 -4
  330. package/src/reporters/reporters.ts +1 -1
  331. package/src/reporters/sarif.ts +29 -16
  332. package/src/reporters/template.ts +4 -20
  333. package/src/reporters/text.ts +3 -3
  334. package/src/resolve.ts +284 -1115
  335. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
  336. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  337. package/src/roots/manifest.ts +303 -0
  338. package/src/roots/published-reach.ts +486 -0
  339. package/src/{roots.ts → roots/root-set.ts} +286 -469
  340. package/src/roots/unseen-loads.ts +345 -0
  341. package/src/run.ts +75 -91
  342. package/src/schema.ts +391 -388
  343. package/src/scope.ts +46 -138
  344. package/src/session.ts +87 -55
  345. package/src/source-files.ts +6 -11
  346. package/src/stores.ts +15 -3
  347. package/src/suppress-file.ts +24 -33
  348. package/src/suppress-inline.ts +55 -91
  349. package/src/suppress.ts +78 -79
  350. package/src/symbol-keys.ts +104 -107
  351. package/src/tests/file-class.ts +135 -0
  352. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  353. package/src/{test-support.ts → tests/support.ts} +15 -21
  354. package/src/text/compare.ts +27 -0
  355. package/src/text/glob.ts +210 -0
  356. package/src/text/named-files.ts +388 -0
  357. package/src/text/yaml.ts +747 -0
  358. package/src/type-errors.ts +18 -288
  359. package/src/type-parameter-reads.ts +187 -158
  360. package/src/unimplemented-callees.ts +297 -280
  361. package/src/unwrap.ts +34 -0
  362. package/src/usage.ts +10 -0
  363. package/src/vendor/unbash/LICENSE +15 -0
  364. package/src/vendor/unbash/VENDORED.md +16 -0
  365. package/src/vendor/unbash/ansi-c.ts +132 -0
  366. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  367. package/src/vendor/unbash/arithmetic.ts +641 -0
  368. package/src/vendor/unbash/assignment.ts +163 -0
  369. package/src/vendor/unbash/chars.ts +48 -0
  370. package/src/vendor/unbash/command.ts +47 -0
  371. package/src/vendor/unbash/expansion.ts +144 -0
  372. package/src/vendor/unbash/glob.ts +284 -0
  373. package/src/vendor/unbash/heredoc.ts +34 -0
  374. package/src/vendor/unbash/internal-types.ts +94 -0
  375. package/src/vendor/unbash/lexer.ts +4352 -0
  376. package/src/vendor/unbash/limits.ts +3 -0
  377. package/src/vendor/unbash/parser.ts +1612 -0
  378. package/src/vendor/unbash/parts.ts +96 -0
  379. package/src/vendor/unbash/substitution-context.ts +20 -0
  380. package/src/vendor/unbash/traversal.ts +182 -0
  381. package/src/vendor/unbash/types.ts +660 -0
  382. package/src/vendor/unbash/word-value.ts +64 -0
  383. package/src/vendor/unbash/word.ts +50 -0
  384. package/src/verbs/analyze.ts +255 -164
  385. package/src/verbs/describe.ts +19 -17
  386. package/src/verbs/explain.ts +93 -169
  387. package/src/verbs/print-config.ts +2 -1
  388. package/src/verbs/print-projects.ts +6 -4
  389. package/src/verbs/print-retained.ts +36 -6
  390. package/src/verbs/print-roots.ts +4 -2
  391. package/src/verbs/verb.ts +2 -8
  392. package/src/verbs/version.ts +15 -3
  393. package/dist/src/base-url.js +0 -18
  394. package/dist/src/calls.js +0 -155
  395. package/dist/src/conventions.js +0 -937
  396. package/dist/src/discover.js +0 -468
  397. package/dist/src/entry-points.js +0 -529
  398. package/dist/src/exempt-classes.js +0 -75
  399. package/dist/src/exempt.js +0 -209
  400. package/dist/src/generated-file.js +0 -95
  401. package/dist/src/glob.js +0 -65
  402. package/dist/src/manifest.js +0 -165
  403. package/dist/src/matrix.js +0 -246
  404. package/dist/src/pnpm-workspace.js +0 -120
  405. package/dist/src/roots.js +0 -672
  406. package/dist/src/serialization-contract.js +0 -611
  407. package/dist/src/setup-failure.js +0 -23
  408. package/dist/src/sweep.js +0 -224
  409. package/dist/src/test-joins.js +0 -101
  410. package/dist/src/value-flow.js +0 -74
  411. package/dist/src/version.js +0 -7
  412. package/dist/src/workflow-steps.js +0 -185
  413. package/src/base-url.ts +0 -24
  414. package/src/calls.ts +0 -225
  415. package/src/decorator.ts +0 -78
  416. package/src/discover.ts +0 -653
  417. package/src/entry-points.ts +0 -687
  418. package/src/exempt-classes.ts +0 -123
  419. package/src/exempt.ts +0 -323
  420. package/src/generated-file.ts +0 -111
  421. package/src/glob.ts +0 -67
  422. package/src/manifest.ts +0 -234
  423. package/src/matrix.ts +0 -423
  424. package/src/pnpm-workspace.ts +0 -135
  425. package/src/serialization-contract.ts +0 -849
  426. package/src/setup-failure.ts +0 -39
  427. package/src/sweep.ts +0 -347
  428. package/src/test-joins.ts +0 -120
  429. package/src/value-flow.ts +0 -104
  430. package/src/version.ts +0 -7
  431. package/src/workflow-steps.ts +0 -216
@@ -0,0 +1,632 @@
1
+ /**
2
+ * The reference sources of the reference pass: each turns one form of site the walk found in a
3
+ * file into uses, through the file's one batch, into the pass's one sink. A source names the
4
+ * nodes it needs the batch to answer, and the pass asks them all in capped runs.
5
+ */
6
+
7
+ import {
8
+ isExportDeclaration,
9
+ isIdentifier,
10
+ isImportDeclaration,
11
+ isStringLiteralLikeNode,
12
+ type Node,
13
+ type SourceFile,
14
+ } from "@typescript/native/ast";
15
+ import type { Symbol as TSSymbol } from "@typescript/native/sync";
16
+ import type { AliasChains, ChainTarget } from "../alias-chain.ts";
17
+ import { amdPath, amdPlatform } from "../amd.ts";
18
+ import type { destructuring } from "../destructuring.ts";
19
+ import { specifierCandidates } from "../entries/configuration-files.ts";
20
+ import type { RunDirectories } from "../entries/run-directories.ts";
21
+ import { bindingsOf, importedNames } from "../import-bindings.ts";
22
+ import {
23
+ isLiteralText,
24
+ WORKER_CONSTRUCTORS,
25
+ type Evaluation,
26
+ type FileSites,
27
+ type Link,
28
+ type Site,
29
+ } from "../index/sites.ts";
30
+ import { nodeKey, type Inventory, type InventorySymbol } from "../inventory.ts";
31
+ import { JAVASCRIPT_FILE } from "../javascript-file.ts";
32
+ import {
33
+ dirnamePath,
34
+ isRelativeSpecifier,
35
+ queriedModulePath,
36
+ relativeURLPath,
37
+ resolvePath,
38
+ startsRelativePath,
39
+ } from "../paths.ts";
40
+ import { callsPlatform, isPlatformGlobal, startsThread } from "../platform-symbols.ts";
41
+ import { isComponentFile, type Position } from "../position.ts";
42
+ import { UNANSWERED, type Answer } from "../query.ts";
43
+ import type { Resolution } from "../references.ts";
44
+ import { computedLoadsOf, type ComputedLoad } from "../roots/unseen-loads.ts";
45
+ import type { ProjectView } from "../session.ts";
46
+ import type { SourceFiles } from "../source-files.ts";
47
+ import { computedKeyNames, keyedUses } from "../symbol-keys.ts";
48
+ import type { PropertyTables } from "../query.ts";
49
+ import { storedValue, type Sink, type Target } from "./sink.ts";
50
+
51
+ /** One walked file of the side, its sites, and what the pass read of it before the batch. */
52
+ interface WalkedFile extends FileSites {
53
+ readonly file: SourceFile;
54
+ readonly fileId: string;
55
+ /** The loads by a computed path the file makes. */
56
+ readonly loads: readonly ComputedLoad[];
57
+ /** Whether the file is a component file, whose markup may use any binding it declares. */
58
+ readonly markup: boolean;
59
+ /** The name nodes of the file's import bindings its markup may use. */
60
+ readonly bindings: readonly Node[];
61
+ }
62
+
63
+ /** What every source reads across the files of one pass. */
64
+ export interface Pass<Brand> {
65
+ readonly project: ProjectView<Brand>;
66
+ readonly held: Inventory;
67
+ readonly chains: AliasChains;
68
+ readonly tables: PropertyTables;
69
+ readonly cap: number;
70
+ readonly sink: Sink;
71
+ readonly consumer: boolean;
72
+ readonly directories: RunDirectories;
73
+ readonly fileIds: ReadonlySet<string>;
74
+ /** The target's walked files by file name, each with its identifier. */
75
+ readonly fileIdByName: ReadonlyMap<string, string>;
76
+ readonly loadableById: ReadonlyMap<string, SourceFile>;
77
+ readonly destructured: ReturnType<typeof destructuring>;
78
+ /** Each load by a computed path a production file of the target makes whose files the analysis cannot name. */
79
+ readonly unseenLoads: Position[];
80
+ /** Whether the program is one the run formed to resolve as Node does (program.36). */
81
+ readonly formedForNode: boolean;
82
+ /** What an import {@link possibleLoad} retries names: its file and what it binds there. */
83
+ readonly possiblyLoaded: Set<string>;
84
+ readonly declaredIn: (moduleId: string) => readonly InventorySymbol[];
85
+ readonly exportsRead: (module: Answer<TSSymbol>) => readonly ChainTarget[];
86
+ readonly named: (node: Node) => readonly ChainTarget[];
87
+ readonly targetsOf: (symbol: TSSymbol) => readonly ChainTarget[];
88
+ readonly throughAliases: (targets: readonly ChainTarget[]) => readonly ChainTarget[];
89
+ readonly ownFiles: () => SourceFiles;
90
+ }
91
+
92
+ /** One form of site, and the uses it makes once the file's batch has answered. */
93
+ interface ReferenceSource {
94
+ batched?<Brand>(walked: WalkedFile, pass: Pass<Brand>): Iterable<Node>;
95
+ emit<Brand>(
96
+ walked: WalkedFile,
97
+ answered: ReadonlyMap<Node, Answer<TSSymbol>>,
98
+ pass: Pass<Brand>,
99
+ ): void;
100
+ }
101
+
102
+ /** The file of the target a relative specifier written in `file` names, by its source or output name. */
103
+ function fileNamed(
104
+ file: SourceFile,
105
+ specifier: string,
106
+ fileIdByName: ReadonlyMap<string, string>,
107
+ ): string | undefined {
108
+ return specifierCandidates(dirnamePath(file.fileName), specifier)
109
+ .map((path) => fileIdByName.get(path))
110
+ .find((id) => id !== undefined);
111
+ }
112
+
113
+ /**
114
+ * The own file a module specifier with a query evaluates ({@link queriedModulePath}): the
115
+ * checker resolves the whole specifier to whatever module declaration matches it.
116
+ */
117
+ function queriedFile(
118
+ file: SourceFile,
119
+ specifier: Node,
120
+ fileIdByName: ReadonlyMap<string, string>,
121
+ ): string | undefined {
122
+ if (!isLiteralText(specifier)) {
123
+ return undefined;
124
+ }
125
+ const path = queriedModulePath(specifier.text);
126
+ return path === undefined
127
+ ? undefined
128
+ : fileIdByName.get(resolvePath(dirnamePath(file.fileName), path));
129
+ }
130
+
131
+ /**
132
+ * A decorator is written inside the declaration it is attached to and receives it, so the
133
+ * declaration is used where the decorator is written, whatever the decorator does with it.
134
+ */
135
+ const decorators: ReferenceSource = {
136
+ emit({ file, decorated }, _answered, { sink }) {
137
+ for (const { decorator, declaration } of decorated) {
138
+ sink.add(file, decorator, declaration, [declaration], "decorator", "syntax");
139
+ }
140
+ },
141
+ };
142
+
143
+ /** The constructor stores its argument in the member a parameter property declares. */
144
+ const parameterWrites: ReferenceSource = {
145
+ emit({ file, parameterWrites: writes }, _answered, { sink }) {
146
+ for (const { name, from, member } of writes) {
147
+ sink.add(file, name, from, [member], "write", "syntax");
148
+ }
149
+ },
150
+ };
151
+
152
+ /**
153
+ * A re-export references the first declaration its alias chain carries forward that the
154
+ * inventory declares, one link per re-export, or for a bare star the module it names.
155
+ */
156
+ const links: ReferenceSource = {
157
+ batched: ({ links: found }) => found.map((link) => link.node),
158
+ emit({ file, links: found }, answered, { sink, chains, named }) {
159
+ for (const link of found) {
160
+ const symbol = answered.get(link.node);
161
+ if (symbol === undefined) {
162
+ continue;
163
+ }
164
+ const carried: readonly Target[] =
165
+ symbol === UNANSWERED ? named(link.at) : carriedBy(chains, link, symbol);
166
+ sink.add(file, link.at, link.from, carried, "read", link.alias ? "alias" : "batch");
167
+ }
168
+ },
169
+ };
170
+
171
+ /**
172
+ * The declarations one re-export carries forward: for an alias, the first link along its chain
173
+ * that the inventory declares, stepping over the links it does not, such as an import the
174
+ * re-export is written against; for a bare star, the module it names.
175
+ */
176
+ function carriedBy(chains: AliasChains, link: Link, symbol: TSSymbol): readonly ChainTarget[] {
177
+ return link.alias
178
+ ? chains.nextDeclared(symbol).map((target) => ({ ...target, stepped: false }))
179
+ : chains.declarationsOf(symbol).map((id) => ({ id, stepped: false, guessed: false }));
180
+ }
181
+
182
+ /**
183
+ * Whether one evaluation loads its module: an import form, or a `require`, or an AMD `define`
184
+ * or `require`, that {@link callsPlatform} names.
185
+ */
186
+ function loading<Brand>(
187
+ evaluation: Evaluation,
188
+ answered: ReadonlyMap<Node, Answer<TSSymbol>>,
189
+ project: ProjectView<Brand>,
190
+ ): boolean {
191
+ const { require } = evaluation;
192
+ return (
193
+ require === undefined ||
194
+ callsPlatform(
195
+ project,
196
+ evaluation.amd === true ? amdPlatform(require) : "require",
197
+ require,
198
+ answered.get(require),
199
+ )
200
+ );
201
+ }
202
+
203
+ /**
204
+ * Every import of one of the target's modules evaluates that module's file. A required
205
+ * file the checker names no module for is read whole where the call's value is used: the
206
+ * value is the file's exports object, which this pass does not follow.
207
+ */
208
+ const evaluations: ReferenceSource = {
209
+ batched: ({ evaluations: found }) =>
210
+ found.flatMap((evaluation) =>
211
+ evaluation.require === undefined
212
+ ? [evaluation.node]
213
+ : [
214
+ evaluation.require,
215
+ ...(evaluation.require.text === "require" && evaluation.amd !== true
216
+ ? [evaluation.node]
217
+ : []),
218
+ ],
219
+ ),
220
+ emit({ file, evaluations: found }, answered, pass) {
221
+ const { project, sink, fileIds, fileIdByName, chains, loadableById, cap, exportsRead } = pass;
222
+ const loaded = found.filter((one) => loading(one, answered, project));
223
+ // A script declares no module, so the checker names nothing for a specifier of one;
224
+ // the compiler's module resolution still names its file.
225
+ const unnamed = loaded.flatMap(({ node, amd }) =>
226
+ amd !== true &&
227
+ answered.get(node) === undefined &&
228
+ isStringLiteralLikeNode(node) &&
229
+ queriedFile(file, node, fileIdByName) === undefined
230
+ ? [node]
231
+ : [],
232
+ );
233
+ const resolved = project.resolvedFileNames(unnamed);
234
+ const scripts = new Map<Node, string | undefined>(
235
+ unnamed.map((node, at) => {
236
+ const name = resolved[at];
237
+ return [node, name === undefined ? undefined : fileIdByName.get(name)];
238
+ }),
239
+ );
240
+ const wholeReads: { readonly evaluation: Evaluation; readonly loaded: SourceFile }[] = [];
241
+ for (const evaluation of loaded) {
242
+ const queried = queriedFile(file, evaluation.node, fileIdByName);
243
+ if (queried !== undefined) {
244
+ sink.add(file, evaluation.node, evaluation.from, [queried], "evaluation", "syntax");
245
+ }
246
+ const module = answered.get(evaluation.node);
247
+ const amd = evaluation.amd === true && isLiteralText(evaluation.node);
248
+ const amdFile = amd
249
+ ? fileIdByName.get(amdPath(dirnamePath(file.fileName), evaluation.node.text) ?? "")
250
+ : undefined;
251
+ // Node's require resolves a relative specifier the program records no resolution for,
252
+ // as in a TypeScript file, by its own extension search.
253
+ const script =
254
+ amdFile ??
255
+ scripts.get(evaluation.node) ??
256
+ (!amd &&
257
+ evaluation.require !== undefined &&
258
+ module === undefined &&
259
+ isLiteralText(evaluation.node) &&
260
+ startsRelativePath(evaluation.node.text)
261
+ ? fileNamed(file, evaluation.node.text, fileIdByName)
262
+ : undefined);
263
+ if (script === undefined && module === undefined) {
264
+ possibleLoad(file, evaluation, pass);
265
+ }
266
+ if (script !== undefined) {
267
+ const whole = loadableById.get(script);
268
+ if (evaluation.whole === true && module === undefined && whole !== undefined) {
269
+ wholeReads.push({ evaluation, loaded: whole });
270
+ }
271
+ sink.add(file, evaluation.node, evaluation.from, [script], "evaluation", "syntax");
272
+ }
273
+ if (module === undefined) {
274
+ continue;
275
+ }
276
+ // A module the checker could not resolve may be any file of the target.
277
+ const evaluated: readonly Target[] =
278
+ module === UNANSWERED
279
+ ? [...fileIds].map((id) => ({ id, guessed: true }))
280
+ : chains
281
+ .declarationsOf(module)
282
+ .flatMap((id) => (fileIds.has(id) ? [id] : []))
283
+ .map((id) => ({ id }));
284
+ sink.add(file, evaluation.node, evaluation.from, evaluated, "evaluation", "batch");
285
+ }
286
+ const modules = project.symbolsAt(
287
+ wholeReads.map((one) => project.handle(one.loaded)),
288
+ cap,
289
+ );
290
+ wholeReads.forEach(({ evaluation }, at) => {
291
+ const module = modules[at];
292
+ const targets = module === undefined ? [] : exportsRead(module);
293
+ sink.add(file, evaluation.node, evaluation.from, targets, "read", "batch");
294
+ });
295
+ },
296
+ };
297
+
298
+ /**
299
+ * An import of a JavaScript file that a program formed for Node leaves unresolved, asked again
300
+ * as a bundler resolves it (program.38): the file it names, and each export there the import
301
+ * binds, a namespace import binding every one, are only possibly loaded.
302
+ */
303
+ function possibleLoad<Brand>(file: SourceFile, evaluation: Evaluation, pass: Pass<Brand>): void {
304
+ const { node } = evaluation;
305
+ const declaration = node.parent;
306
+ if (
307
+ !pass.formedForNode ||
308
+ evaluation.require !== undefined ||
309
+ !JAVASCRIPT_FILE.test(file.fileName) ||
310
+ !isLiteralText(node) ||
311
+ !isRelativeSpecifier(node.text) ||
312
+ !(isImportDeclaration(declaration) || isExportDeclaration(declaration))
313
+ ) {
314
+ return;
315
+ }
316
+ const loaded = fileNamed(file, node.text, pass.fileIdByName);
317
+ if (loaded === undefined) {
318
+ return;
319
+ }
320
+ pass.possiblyLoaded.add(loaded);
321
+ const exported = pass.declaredIn(loaded).filter((one) => one.exported);
322
+ for (const name of importedNames(declaration)) {
323
+ for (const one of exported) {
324
+ if (name === undefined || one.name === name) {
325
+ pass.possiblyLoaded.add(one.id);
326
+ }
327
+ }
328
+ }
329
+ }
330
+
331
+ /** A module URL the platform's `URL` builds names the file a runtime starts as a module. */
332
+ const urls: ReferenceSource = {
333
+ batched: ({ urls: found }) => found.flatMap((url) => url.constructor ?? []),
334
+ emit({ file, urls: found }, answered, { project, sink, fileIdByName }) {
335
+ for (const url of found) {
336
+ if (
337
+ url.constructor !== undefined &&
338
+ !callsPlatform(project, "URL", url.constructor, answered.get(url.constructor))
339
+ ) {
340
+ continue;
341
+ }
342
+ const path = relativeURLPath(dirnamePath(file.fileName), url.specifier);
343
+ const loaded = path === undefined ? undefined : fileNamed(file, path, fileIdByName);
344
+ if (loaded !== undefined) {
345
+ sink.add(file, url.at, url.from, [loaded], "evaluation", "syntax");
346
+ }
347
+ }
348
+ },
349
+ };
350
+
351
+ /**
352
+ * A worker address names the file a runtime starts (references-ts.2): Node's `Worker` reads
353
+ * a relative path against the working directory and a path of the module's own directory
354
+ * against that directory, a browser's an address against the module's URL.
355
+ */
356
+ const workers: ReferenceSource = {
357
+ batched: ({ workers: found }) =>
358
+ found.flatMap((worker) =>
359
+ worker.holder === undefined ? [worker.constructor] : [worker.constructor, worker.holder],
360
+ ),
361
+ emit({ file, workers: found }, answered, pass) {
362
+ const { project, sink, fileIds, directories, held } = pass;
363
+ for (const worker of found) {
364
+ const symbol = answered.get(worker.constructor);
365
+ const text = worker.address;
366
+ let path: string | undefined;
367
+ if (startsThread(project, symbol, worker.holder && answered.get(worker.holder))) {
368
+ path = worker.evaluated
369
+ ? undefined
370
+ : worker.ownDirectory
371
+ ? resolvePath(dirnamePath(file.fileName), text)
372
+ : startsRelativePath(text)
373
+ ? resolvePath(directories.workingDirectoryOf(file.fileName), text)
374
+ : undefined;
375
+ } else if (
376
+ !worker.ownDirectory &&
377
+ (WORKER_CONSTRUCTORS.has(worker.constructor.text) ||
378
+ worker.constructor.text === "navigator") &&
379
+ isPlatformGlobal(project, symbol)
380
+ ) {
381
+ path = relativeURLPath(dirnamePath(file.fileName), text);
382
+ }
383
+ const started = (path === undefined ? [] : pass.ownFiles().named(path)).flatMap((one) => {
384
+ const id = held.declarations.get(nodeKey(one, one));
385
+ return id !== undefined && fileIds.has(id) ? [id] : [];
386
+ });
387
+ sink.add(file, worker.at, worker.from, started, "evaluation", "syntax");
388
+ }
389
+ },
390
+ };
391
+
392
+ /**
393
+ * A computed load imports each file it loads where the call is written, reading what the file
394
+ * exports unless it reads the file as text or a URL; callsPlatform owns which call is a `require`.
395
+ */
396
+ const loads: ReferenceSource = {
397
+ batched: ({ loads: found }) =>
398
+ found.flatMap((load) => [
399
+ ...(load.require === undefined ? [] : [load.require]),
400
+ ...(load.asset ? [] : load.files.map((loaded) => loaded.file)),
401
+ ]),
402
+ emit({ file, fileId, loads: found }, answered, pass) {
403
+ const { project, sink, consumer, exportsRead, unseenLoads } = pass;
404
+ for (const load of found) {
405
+ if (
406
+ load.require !== undefined &&
407
+ !callsPlatform(
408
+ project,
409
+ load.amd ? amdPlatform(load.require) : "require",
410
+ load.require,
411
+ answered.get(load.require),
412
+ )
413
+ ) {
414
+ continue;
415
+ }
416
+ const position = sink.position(file, load.call);
417
+ if (!load.resolved && !consumer && !file.isDeclarationFile && !sink.isTest(file)) {
418
+ unseenLoads.push(position);
419
+ }
420
+ for (const loaded of load.files) {
421
+ sink.add(
422
+ file,
423
+ position,
424
+ load.eager ? fileId : load.from,
425
+ [loaded.fileId],
426
+ "evaluation",
427
+ "syntax",
428
+ );
429
+ const module = load.asset ? undefined : answered.get(loaded.file);
430
+ sink.add(
431
+ file,
432
+ position,
433
+ load.from,
434
+ module === undefined ? [] : exportsRead(module),
435
+ "read",
436
+ "batch",
437
+ );
438
+ }
439
+ }
440
+ },
441
+ };
442
+
443
+ /** A use of a module namespace object that may read every export of the module reads them all. */
444
+ const wholes: ReferenceSource = {
445
+ batched: ({ wholes: found }) => found.map((whole) => whole.specifier),
446
+ emit({ file, wholes: found }, answered, { sink, exportsRead }) {
447
+ for (const whole of found) {
448
+ const module = answered.get(whole.specifier);
449
+ if (module !== undefined) {
450
+ sink.add(file, whole.at, whole.from, exportsRead(module), "read", "batch");
451
+ }
452
+ }
453
+ },
454
+ };
455
+
456
+ /**
457
+ * A component file's markup may use any binding its blocks declare at the top level, and any
458
+ * export of a module a binding's chain reaches, whether a namespace import binds it or a named
459
+ * or default import of a namespace re-export.
460
+ */
461
+ const markup: ReferenceSource = {
462
+ batched: ({ bindings }) => bindings,
463
+ emit({ file, fileId, markup: written, bindings }, answered, pass) {
464
+ if (!written) {
465
+ return;
466
+ }
467
+ const { sink, chains, named, declaredIn } = pass;
468
+ for (const symbol of declaredIn(fileId)) {
469
+ sink.add(file, symbol.position, fileId, [symbol.id], "read", "syntax");
470
+ }
471
+ for (const binding of bindings) {
472
+ const symbol = answered.get(binding);
473
+ if (symbol === undefined) {
474
+ continue;
475
+ }
476
+ const chained: readonly Target[] =
477
+ symbol === UNANSWERED ? named(binding) : chains.chainOf(symbol);
478
+ const targets = chained.flatMap((target) => [
479
+ target,
480
+ ...declaredIn(target.id)
481
+ .filter((one) => one.exported)
482
+ .map((one) => ({ ...target, id: one.id })),
483
+ ]);
484
+ sink.add(file, binding, fileId, targets, "read", "batch");
485
+ }
486
+ },
487
+ };
488
+
489
+ /**
490
+ * A pattern names a property of the value it destructures, which no name node of the pattern
491
+ * resolves to: a shorthand's name is the local it binds.
492
+ */
493
+ const patterns: ReferenceSource = {
494
+ emit({ file, reads }, _answered, { sink, held, destructured, targetsOf }) {
495
+ destructured.resolve(reads).forEach((symbol, index) => {
496
+ const read = reads[index];
497
+ if (symbol === undefined || read === undefined) {
498
+ return;
499
+ }
500
+ const targets: readonly Target[] =
501
+ symbol === UNANSWERED
502
+ ? (held.byName.get(read.name) ?? []).map((id) => ({ id, guessed: true }))
503
+ : targetsOf(symbol).map((target) => ({ ...target, stepped: false }));
504
+ sink.add(file, read.key, read.from, targets, "read", "destructured");
505
+ });
506
+ },
507
+ };
508
+
509
+ /** A key a unique symbol types selects the member declared under that symbol. */
510
+ const keyed: ReferenceSource = {
511
+ emit({ file, keyed: found }, answered, { project, sink, chains, tables, cap, held }) {
512
+ const keyNames = computedKeyNames(held.symbols);
513
+ const resolvedKeys = found.flatMap((access) => {
514
+ const symbol =
515
+ isIdentifier(access.key) && keyNames.has(access.key.text)
516
+ ? answered.get(access.key)
517
+ : undefined;
518
+ return typeof symbol === "object" ? [{ access, symbol }] : [];
519
+ });
520
+ for (const { access, ids } of keyedUses(project, chains, resolvedKeys, tables, cap)) {
521
+ for (const use of access.use === "both" ? (["read", "write"] as const) : [access.use]) {
522
+ sink.add(file, access.access.argumentExpression, access.from, ids, use, "keyed");
523
+ }
524
+ }
525
+ },
526
+ };
527
+
528
+ /**
529
+ * A name a use writes resolves to what it names; a re-export something imports is used and so
530
+ * is the declaration behind it, so the use names every link of the chain its name stands at the
531
+ * head of. A shorthand is left out of the batch: its name resolves to the property the literal
532
+ * declares, which this project's inventory never holds, so its value is asked on its own.
533
+ */
534
+ const names: ReferenceSource = {
535
+ batched: ({ uses }) =>
536
+ uses.filter((site) => site.shorthand === undefined).map((site) => site.node),
537
+ emit({ file, uses }, answered, pass) {
538
+ const { project, sink, named, targetsOf, throughAliases } = pass;
539
+ for (const site of uses) {
540
+ const symbol = symbolFor(project, site, answered);
541
+ if (symbol === undefined) {
542
+ continue;
543
+ }
544
+ const direct: Resolution =
545
+ site.shorthand !== undefined
546
+ ? "shorthand"
547
+ : typeof answered.get(site.node) === "object"
548
+ ? "batch"
549
+ : "resolved-symbol";
550
+ const targets = throughAliases(symbol === UNANSWERED ? named(site.node) : targetsOf(symbol));
551
+ const value = site.use === "write" ? storedValue(site.node) : undefined;
552
+ sink.add(file, site.node, site.from, targets, site.use, direct, value);
553
+ }
554
+ },
555
+ };
556
+
557
+ /** The symbol one site resolves to, asking only the accessor the site's form names. */
558
+ function symbolFor<Brand>(
559
+ project: ProjectView<Brand>,
560
+ site: Site,
561
+ answered: ReadonlyMap<Node, Answer<TSSymbol>>,
562
+ ): Answer<TSSymbol | undefined> {
563
+ if (site.shorthand !== undefined) {
564
+ return project.shorthandValueAt(project.handle(site.shorthand));
565
+ }
566
+ const batched = answered.get(site.node);
567
+ if (batched === UNANSWERED || typeof batched === "object") {
568
+ return batched;
569
+ }
570
+ return project.resolvedSymbolAt(project.handle(site.node));
571
+ }
572
+
573
+ /** Every per-file source, in the order the pass asks their nodes. */
574
+ const REFERENCE_SOURCES: readonly ReferenceSource[] = [
575
+ names,
576
+ links,
577
+ evaluations,
578
+ wholes,
579
+ urls,
580
+ workers,
581
+ markup,
582
+ loads,
583
+ decorators,
584
+ parameterWrites,
585
+ patterns,
586
+ keyed,
587
+ ];
588
+
589
+ /** What the pass reads of one walked file before its batch: its computed loads and its markup bindings. */
590
+ export function prepared<Brand>(
591
+ sites: FileSites & { readonly file: SourceFile; readonly fileId: string },
592
+ pass: Pick<Pass<Brand>, "directories">,
593
+ loadable: readonly { readonly file: SourceFile; readonly fileId: string }[],
594
+ ): WalkedFile {
595
+ const markupFile = isComponentFile(sites.file);
596
+ return {
597
+ ...sites,
598
+ loads: computedLoadsOf(sites.file, sites.loadCalls, loadable, (fileName) =>
599
+ pass.directories.bundlerRootOf(fileName),
600
+ ),
601
+ markup: markupFile,
602
+ bindings: markupFile ? bindingsOf(sites.file).map((binding) => binding.name) : [],
603
+ };
604
+ }
605
+
606
+ /**
607
+ * Runs every source over one walked file: one batch per capped run of the nodes the sources
608
+ * name, each node once, then each source's uses.
609
+ */
610
+ export function emitFile<Brand>(walked: WalkedFile, pass: Pass<Brand>): void {
611
+ const { project, cap } = pass;
612
+ const batching = [
613
+ ...new Set(REFERENCE_SOURCES.flatMap((source) => [...(source.batched?.(walked, pass) ?? [])])),
614
+ ];
615
+ const answered = new Map<Node, Answer<TSSymbol>>();
616
+ for (let from = 0; from < batching.length; from += cap) {
617
+ const run = batching.slice(from, from + cap);
618
+ const answers = project.symbolsAt(
619
+ run.map((node) => project.handle(node)),
620
+ cap,
621
+ );
622
+ run.forEach((node, index) => {
623
+ const symbol = answers[index];
624
+ if (symbol !== undefined) {
625
+ answered.set(node, symbol);
626
+ }
627
+ });
628
+ }
629
+ for (const source of REFERENCE_SOURCES) {
630
+ source.emit(walked, answered, pass);
631
+ }
632
+ }