@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
@@ -16,11 +16,16 @@ import type {
16
16
  } from "@typescript/native/sync";
17
17
  import { isStringLiteralLikeNode } from "@typescript/native/ast";
18
18
  import type { StringLiteralLikeNode } from "@typescript/native/ast";
19
- import { baseUrlPaths } from "./base-url.ts";
20
- import type { Host } from "./host.ts";
21
- import { dirnamePath, resolvePath } from "./paths.ts";
22
- import type { Engine } from "./session.ts";
19
+ import type { Host } from "../host.ts";
20
+ import { JAVASCRIPT_FILE } from "../javascript-file.ts";
21
+ import { isRecord } from "../json-document.ts";
22
+ import { dirnamePath, resolvePath } from "../paths.ts";
23
+ import { batched, type Engine, type ProgramBuild } from "../session.ts";
23
24
  import type { WorkspaceResolver } from "./workspace-resolution.ts";
25
+ import { bytewise } from "../text/compare.ts";
26
+ import { PRODUCT } from "../product.ts";
27
+ import type { Parsed } from "./discover.ts";
28
+ import type { Build, CompilerOptions } from "./plan.ts";
24
29
 
25
30
  /** One member import no member source answers for. */
26
31
  interface UnresolvedImport {
@@ -43,32 +48,35 @@ export interface MemberReading {
43
48
  readonly componentsUnread: string | undefined;
44
49
  }
45
50
 
46
- /** How a snapshot reads one configuration that imports a member. */
47
- export type WorkspaceProgram =
48
- | { readonly kind: "program"; readonly params: CreateSnapshotProgramParams }
49
- /** A configuration only the snapshot holds, at a path no file has. */
50
- | { readonly kind: "configuration"; readonly file: string; readonly text: string };
51
+ /** One configuration as a written configuration or a described program. */
52
+ type Written = Exclude<Build, { readonly kind: "project" }>;
51
53
 
52
54
  /** The programs one run builds instead of opening projects, with what reading them did. */
53
55
  interface WorkspacePrograms {
54
56
  /** Per configuration that imports a member, how the snapshot reads it. */
55
- readonly programs: ReadonlyMap<string, WorkspaceProgram>;
57
+ readonly programs: ReadonlyMap<string, Written>;
56
58
  readonly readings: readonly MemberReading[];
57
59
  }
58
60
 
59
- type Parsed = ReturnType<Engine["parseConfigFile"]>;
60
-
61
- /** The most questions one round trip carries. */
62
- const BATCH = 2048;
61
+ /** One configuration the rounds read: its parse and the options the plan builds it with. */
62
+ export interface PlannedConfiguration {
63
+ readonly configFile: string;
64
+ readonly parsed: Parsed;
65
+ readonly options: CompilerOptions;
66
+ /** The configuration of a program the run forms, which only the snapshot holds, at `configFile`. */
67
+ readonly written?: Readonly<Record<string, unknown>> | undefined;
68
+ }
63
69
 
64
70
  /**
65
- * The options a configuration's program is built with: its own, less the ones that
66
- * lay out an emitted program's inputs and outputs, and with `paths` read against the
67
- * effective `baseUrl` as {@link baseUrlPaths} states. The analysis emits nothing, and a
68
- * member's source is outside the importer's root directory by construction, which
69
- * the compiler refuses under such a layout.
71
+ * The options a configuration's program is built with: the plan's, less the ones that lay
72
+ * out an emitted program's inputs and outputs. The analysis emits nothing, and a member's
73
+ * source is outside the importer's root directory by construction, which the compiler
74
+ * refuses under such a layout.
70
75
  */
71
- function analysisOptions(parsed: Parsed): CreateSnapshotProgramParams["compilerOptions"] {
76
+ function analysisOptions(
77
+ options: CompilerOptions,
78
+ readsJavaScript: boolean,
79
+ ): CreateSnapshotProgramParams["compilerOptions"] {
72
80
  const {
73
81
  composite,
74
82
  rootDir: _rootDir,
@@ -76,10 +84,24 @@ function analysisOptions(parsed: Parsed): CreateSnapshotProgramParams["compilerO
76
84
  declarationDir: _declarationDir,
77
85
  tsBuildInfoFile: _tsBuildInfoFile,
78
86
  ...kept
79
- } = parsed.options;
80
- const paths = baseUrlPaths(parsed.options);
81
- const options = paths === undefined ? kept : { ...kept, paths };
82
- return composite === true ? { ...options, declaration: true } : options;
87
+ } = options;
88
+ const read = readsJavaScript ? { ...kept, allowJs: true } : kept;
89
+ return composite === true ? { ...read, declaration: true } : read;
90
+ }
91
+
92
+ /**
93
+ * Whether one reading answers a member import with a JavaScript file, which its program reads
94
+ * as source only where it allows JavaScript, a program formed for a JavaScript member being the
95
+ * member's source.
96
+ */
97
+ function readsJavaScript(reading: Reading): boolean {
98
+ return (
99
+ reading.options.allowJs !== true &&
100
+ reading.entries.some((entry) => {
101
+ const file = entry.result.resolvedFileName;
102
+ return typeof file === "string" && JAVASCRIPT_FILE.test(file);
103
+ })
104
+ );
83
105
  }
84
106
 
85
107
  /** The conditions an `exports` lookup under one configuration and one resolution mode reads. */
@@ -101,9 +123,7 @@ function resolutionMode(kind: ModuleKind): ResolutionMode | undefined {
101
123
  }
102
124
 
103
125
  /** One configuration's state across the rounds. */
104
- interface Reading {
105
- readonly configFile: string;
106
- readonly parsed: Parsed;
126
+ interface Reading extends PlannedConfiguration {
107
127
  readonly entries: ModuleResolutionEntry[];
108
128
  readonly seen: Set<string>;
109
129
  /** Per member specifier, every file an import of it is read as. */
@@ -125,38 +145,60 @@ function unstatable(reading: Reading): string | undefined {
125
145
  return undefined;
126
146
  }
127
147
 
128
- /** The path beside `configFile` its written configuration takes, which no file has. */
129
- export function writtenPath(host: Host, configFile: string): string {
148
+ /** The path beside `configFile` its written configuration takes, which no file and none of `taken` has. */
149
+ export function writtenPath(
150
+ host: Host,
151
+ configFile: string,
152
+ taken: ReadonlySet<string> = new Set(),
153
+ ): string {
130
154
  const stem = configFile.replace(/\.json$/u, "");
131
155
  for (let counter = 0; ; counter += 1) {
132
- const path = `${stem}.deadset-ts${counter === 0 ? "" : `-${String(counter)}`}.json`;
133
- if (host.kindOf(path) === "absent") {
156
+ const path = `${stem}.${PRODUCT}${counter === 0 ? "" : `-${String(counter)}`}.json`;
157
+ if (host.kindOf(path) === "absent" && !taken.has(path)) {
134
158
  return path;
135
159
  }
136
160
  }
137
161
  }
138
162
 
139
163
  /**
140
- * The configuration that reads as one configuration's program: it extends it, lays out
141
- * no output for the reason {@link analysisOptions} gives, maps each answered specifier
142
- * to its file, and carries the references the program does. The compiler's default
143
- * `exclude` names the output directories this drops, so where the file list moves it is
144
- * restated; a list that still differs, or answers `paths` cannot state, are a reason.
164
+ * The path the snapshot holds one configuration's written form at: a formed configuration's
165
+ * own path, else a free one beside it that no configuration of `formed` holds, because a formed
166
+ * program in a directory with a `jsconfig.json` takes the name that file's written form would.
167
+ */
168
+ export function writtenFileOf(
169
+ host: Host,
170
+ configuration: Pick<PlannedConfiguration, "configFile" | "written">,
171
+ formed: ReadonlySet<string>,
172
+ ): string {
173
+ return configuration.written === undefined
174
+ ? writtenPath(host, configuration.configFile, formed)
175
+ : configuration.configFile;
176
+ }
177
+
178
+ /**
179
+ * The configuration that reads as one configuration's program: it extends it, lays out no output
180
+ * ({@link analysisOptions}), maps each answered specifier to its file and keeps its references.
181
+ * Where the file list moves, the default `exclude` the dropped output directories are named in is
182
+ * restated, and one that {@link readsJavaScript} lists its files outright, as `allowJs` widens its
183
+ * `include` to JavaScript; a list that still differs, or answers `paths` cannot state, are a
184
+ * reason. A formed configuration, which no file holds to extend, is its own value with `paths`.
145
185
  */
146
186
  function configurationOf(
147
187
  engine: Engine,
148
188
  host: Host,
149
189
  reading: Reading,
150
- ): WorkspaceProgram | { readonly kind: "unread"; readonly reason: string } {
190
+ formed: ReadonlySet<string>,
191
+ ): Written | { readonly kind: "unread"; readonly reason: string } {
151
192
  const reason = unstatable(reading);
152
193
  if (reason !== undefined) {
153
194
  return { kind: "unread", reason };
154
195
  }
155
- const { options, projectReferences: references = [] } = reading.parsed;
196
+ const { options } = reading;
197
+ const references = reading.parsed.projectReferences ?? [];
156
198
  const raw: unknown = (options as Record<string, unknown>)["pathsBasePath"];
157
199
  const base = typeof raw === "string" ? raw : dirnamePath(reading.configFile);
158
200
  const paths: Record<string, string[]> = {};
159
- for (const [key, targets] of Object.entries(baseUrlPaths(options) ?? options.paths ?? {})) {
201
+ for (const [key, targets] of Object.entries(options.paths ?? {})) {
160
202
  paths[key] = targets.map((target) => resolvePath(base, target));
161
203
  }
162
204
  for (const entry of reading.entries) {
@@ -165,6 +207,17 @@ function configurationOf(
165
207
  paths[entry.moduleName] = [file];
166
208
  }
167
209
  }
210
+ if (reading.written !== undefined) {
211
+ const held = reading.written["compilerOptions"];
212
+ return {
213
+ kind: "configuration",
214
+ value: {
215
+ ...reading.written,
216
+ compilerOptions: { ...(isRecord(held) ? held : {}), paths },
217
+ },
218
+ };
219
+ }
220
+ const javascript = readsJavaScript(reading);
168
221
  const json = (exclude: readonly string[] | undefined): Record<string, unknown> => ({
169
222
  extends: reading.configFile,
170
223
  compilerOptions: {
@@ -173,18 +226,20 @@ function configurationOf(
173
226
  declarationDir: null,
174
227
  tsBuildInfoFile: null,
175
228
  ...(options.composite === true ? { composite: false, declaration: true } : {}),
229
+ ...(javascript ? { allowJs: true } : {}),
176
230
  paths,
177
231
  },
178
232
  ...(references.length > 0
179
233
  ? { references: references.map((reference) => ({ path: reference.path })) }
180
234
  : {}),
235
+ ...(javascript ? { files: [...reading.parsed.fileNames], include: [] } : {}),
181
236
  ...(exclude === undefined ? {} : { exclude }),
182
237
  });
183
- const file = writtenPath(host, reading.configFile);
184
- const expected = [...reading.parsed.fileNames].sort().join("\u0000");
238
+ const file = writtenFileOf(host, reading, formed);
239
+ const expected = [...reading.parsed.fileNames].sort(bytewise).join("\u0000");
185
240
  const listed = (value: Record<string, unknown>): string | undefined => {
186
241
  try {
187
- return [...engine.parseConfigJson(value, file).fileNames].sort().join("\u0000");
242
+ return [...engine.parseConfigJson(value, file).fileNames].sort(bytewise).join("\u0000");
188
243
  } catch {
189
244
  return undefined;
190
245
  }
@@ -202,7 +257,7 @@ function configurationOf(
202
257
  };
203
258
  }
204
259
  }
205
- return { kind: "configuration", file, text: `${JSON.stringify(value, null, 2)}\n` };
260
+ return { kind: "configuration", value };
206
261
  }
207
262
 
208
263
  /** The program one configuration is built as, under the answers it holds so far. */
@@ -210,7 +265,7 @@ function programOf(
210
265
  engine: Engine,
211
266
  reading: Reading,
212
267
  ): { readonly params: CreateSnapshotProgramParams; readonly resolver: ModuleResolver } {
213
- const compilerOptions = analysisOptions(reading.parsed);
268
+ const compilerOptions = analysisOptions(reading.options, readsJavaScript(reading));
214
269
  const references = reading.parsed.projectReferences ?? [];
215
270
  const resolver = engine.createModuleResolver(compilerOptions, reading.entries);
216
271
  return {
@@ -227,23 +282,6 @@ function programOf(
227
282
  };
228
283
  }
229
284
 
230
- function chunks<T>(items: readonly T[]): readonly (readonly T[])[] {
231
- const found: T[][] = [];
232
- for (let at = 0; at < items.length; at += BATCH) {
233
- found.push(items.slice(at, at + BATCH));
234
- }
235
- return found;
236
- }
237
-
238
- /** Asks one question of every item, in round trips of at most {@link BATCH}. */
239
- function batched<T, A>(
240
- engine: Engine,
241
- items: readonly T[],
242
- question: (item: T) => Parameters<Engine["batch"]>[0][number],
243
- ): A[] {
244
- return chunks(items).flatMap((run) => engine.batch(run.map(question)) as A[]);
245
- }
246
-
247
285
  /** One round over one program: answers the member imports no earlier round asked about. */
248
286
  function scan(
249
287
  engine: Engine,
@@ -336,6 +374,18 @@ type Built =
336
374
  }
337
375
  | { readonly kind: "configuration"; readonly file: string; readonly text: string };
338
376
 
377
+ function configurationText(value: Readonly<Record<string, unknown>>): string {
378
+ return `${JSON.stringify(value, null, 2)}\n`;
379
+ }
380
+
381
+ /** One configuration value as the snapshot holds it, at `file`, which no file on disk holds. */
382
+ export function writtenConfiguration(
383
+ file: string,
384
+ value: Readonly<Record<string, unknown>>,
385
+ ): Extract<ProgramBuild, { readonly kind: "configuration" }> {
386
+ return { kind: "configuration", file, text: configurationText(value) };
387
+ }
388
+
339
389
  /**
340
390
  * Answers the member imports of every reading `build` describes, round by round, all
341
391
  * the readings still adding answers built in one snapshot per round. A reading `build`
@@ -391,45 +441,38 @@ function readRounds(
391
441
  export function workspacePrograms(
392
442
  engine: Engine,
393
443
  host: Host,
394
- configFiles: readonly string[],
444
+ configurations: readonly PlannedConfiguration[],
395
445
  resolver: WorkspaceResolver,
396
446
  ): WorkspacePrograms {
397
- const readings: Reading[] = configFiles.flatMap((configFile) => {
398
- let parsed: Parsed;
399
- try {
400
- parsed = engine.parseConfigFile(configFile);
401
- } catch {
402
- // A configuration that does not read is opened as a project, which states why.
403
- return [];
404
- }
405
- return [
406
- {
407
- configFile,
408
- parsed,
409
- entries: [],
410
- seen: new Set<string>(),
411
- bound: new Map<string, Set<string>>(),
412
- unresolved: [],
413
- },
414
- ];
415
- });
447
+ const readings: Reading[] = configurations.map((configuration) => ({
448
+ ...configuration,
449
+ entries: [],
450
+ seen: new Set<string>(),
451
+ bound: new Map<string, Set<string>>(),
452
+ unresolved: [],
453
+ }));
454
+ const formed = new Set(
455
+ configurations.filter((one) => one.written !== undefined).map((one) => one.configFile),
456
+ );
416
457
  readRounds(engine, readings, resolver, (reading) => ({
417
458
  kind: "program",
418
459
  ...programOf(engine, reading),
419
460
  }));
420
461
  if (engine.readsComponents) {
421
462
  readRounds(engine, readings, resolver, (reading) => {
422
- const one = configurationOf(engine, host, reading);
423
- return one.kind === "configuration" ? one : undefined;
463
+ const one = configurationOf(engine, host, reading, formed);
464
+ return one.kind === "configuration"
465
+ ? writtenConfiguration(writtenFileOf(host, reading, formed), one.value)
466
+ : undefined;
424
467
  });
425
468
  }
426
- const programs = new Map<string, WorkspaceProgram>();
469
+ const programs = new Map<string, Written>();
427
470
  const unread = new Map<string, string>();
428
471
  for (const reading of readings) {
429
472
  if (reading.entries.length === 0) {
430
473
  continue;
431
474
  }
432
- const one = engine.readsComponents ? configurationOf(engine, host, reading) : undefined;
475
+ const one = engine.readsComponents ? configurationOf(engine, host, reading, formed) : undefined;
433
476
  if (one !== undefined && one.kind !== "unread") {
434
477
  programs.set(reading.configFile, one);
435
478
  continue;
@@ -7,11 +7,27 @@
7
7
  */
8
8
 
9
9
  import { emittedFrom } from "./emit-map.ts";
10
- import { gitIgnored } from "./git-ignore.ts";
11
- import type { Host } from "./host.ts";
12
- import { dirnamePath, isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.ts";
13
- import { satisfies } from "./version-range.ts";
10
+ import { packageOfSpecifier } from "../dependencies.ts";
11
+ import { gitIgnored } from "../git-ignore.ts";
12
+ import type { Host } from "../host.ts";
13
+ import {
14
+ ancestors,
15
+ cannotStartPackageName,
16
+ dirnamePath,
17
+ joinPath,
18
+ relativePath,
19
+ resolvePath,
20
+ } from "../paths.ts";
21
+ import { satisfies } from "../version-range.ts";
14
22
  import type { Workspace, WorkspaceMember } from "./workspace.ts";
23
+ import { isRecord } from "../json-document.ts";
24
+ import { MANIFEST } from "../fs/manifest.ts";
25
+ import {
26
+ dependencySpecifiers,
27
+ installedPackage,
28
+ manifestsAbove,
29
+ type ManifestAt,
30
+ } from "./module-lookup.ts";
15
31
 
16
32
  /** What the compiler's own resolution answered for one import. */
17
33
  export interface DefaultResolution {
@@ -36,39 +52,9 @@ export type MemberResolution =
36
52
  /** The manifest members that name an entry point for the subpath `.` without `exports`. */
37
53
  const LEGACY_MEMBERS = ["types", "typings", "module", "main"] as const;
38
54
 
39
- /** The dependency members a manifest declares other packages under. */
40
- const DEPENDENCY_MEMBERS = [
41
- "dependencies",
42
- "devDependencies",
43
- "peerDependencies",
44
- "optionalDependencies",
45
- ] as const;
46
-
47
55
  const SOURCE = /(?<!\.d)\.(?:[mc]?ts|tsx)$/u;
48
56
  const OUTPUT = /(?:\.d\.[mc]?ts|\.[mc]?js|\.jsx)$/u;
49
57
 
50
- function isRecord(value: unknown): value is Record<string, unknown> {
51
- return typeof value === "object" && value !== null && !Array.isArray(value);
52
- }
53
-
54
- /** The package name a bare specifier names, or `undefined` for any other specifier. */
55
- export function packageNameOf(specifier: string): string | undefined {
56
- if (
57
- specifier === "" ||
58
- specifier.startsWith(".") ||
59
- specifier.startsWith("#") ||
60
- isAbsolutePath(specifier) ||
61
- specifier.includes(":")
62
- ) {
63
- return undefined;
64
- }
65
- const [first, second] = specifier.split("/");
66
- if (specifier.startsWith("@")) {
67
- return second === undefined || second === "" ? undefined : `${first ?? ""}/${second}`;
68
- }
69
- return first;
70
- }
71
-
72
58
  function inside(dir: string, path: string): boolean {
73
59
  return relativePath(dir, path) !== undefined;
74
60
  }
@@ -161,7 +147,7 @@ function dependsOn(specifier: string, member: WorkspaceMember, fromDir: string):
161
147
  member.version !== undefined && satisfies(member.version, range);
162
148
  if (specifier.startsWith("workspace:")) {
163
149
  const rest = specifier.slice("workspace:".length);
164
- if (rest.startsWith(".") || rest.startsWith("/")) {
150
+ if (cannotStartPackageName(rest)) {
165
151
  return atPath(rest);
166
152
  }
167
153
  const alias = /^((?:@[^/@]+\/)?[^/@]+)@(.*)$/u.exec(rest);
@@ -210,52 +196,32 @@ type Linked =
210
196
  /** The member imports of one workspace, read from the members' sources. */
211
197
  export function workspaceResolver(host: Host, workspace: Workspace): WorkspaceResolver {
212
198
  const links = new Map<string, string | undefined>();
213
- /** The directory `node_modules/<name>` names from one directory, links followed. */
199
+ /** The directory the package `name` installed for one directory is, links followed. */
214
200
  const linkedFrom = (name: string, dir: string): string | undefined => {
215
201
  const key = `${name}\u0000${dir}`;
216
- if (links.has(key)) {
217
- return links.get(key);
218
- }
219
- const candidate = joinPath(dir, "node_modules", name);
220
- let found: string | undefined;
221
- if (host.kindOf(candidate) === "absent") {
222
- const up = dirnamePath(dir);
223
- found = up === dir ? undefined : linkedFrom(name, up);
224
- } else {
202
+ if (!links.has(key)) {
203
+ const installed = installedPackage(host, dir, name);
204
+ let found: string | undefined;
225
205
  try {
226
- found = host.realPath(candidate);
206
+ found = installed === undefined ? undefined : host.realPath(installed);
227
207
  } catch {
228
208
  found = undefined;
229
209
  }
210
+ links.set(key, found);
230
211
  }
231
- links.set(key, found);
232
- return found;
212
+ return links.get(key);
233
213
  };
234
214
 
235
215
  const root = workspace.members[0]?.dir;
236
216
  const ignored = root === undefined ? () => false : gitIgnored(host, root);
237
- const manifests = new Map<
238
- string,
239
- { dir: string; manifest: Record<string, unknown> } | undefined
240
- >();
217
+ const manifests = new Map<string, ManifestAt | undefined>();
241
218
  /** The nearest manifest at or above one directory, up to the workspace's root. */
242
- const nearestManifest = (
243
- dir: string,
244
- ): { dir: string; manifest: Record<string, unknown> } | undefined => {
245
- if (manifests.has(dir)) {
246
- return manifests.get(dir);
219
+ const nearestManifest = (dir: string): ManifestAt | undefined => {
220
+ if (!manifests.has(dir)) {
221
+ const [nearest] = manifestsAbove(host, dir, root ?? dir);
222
+ manifests.set(dir, nearest);
247
223
  }
248
- let found: { dir: string; manifest: Record<string, unknown> } | undefined;
249
- try {
250
- const value: unknown = JSON.parse(host.readFile(joinPath(dir, "package.json")));
251
- found = isRecord(value) ? { dir, manifest: value } : undefined;
252
- } catch {
253
- const up = dirnamePath(dir);
254
- found =
255
- up === dir || root === undefined || !inside(root, up) ? undefined : nearestManifest(up);
256
- }
257
- manifests.set(dir, found);
258
- return found;
224
+ return manifests.get(dir);
259
225
  };
260
226
 
261
227
  const linkOf = (candidates: readonly WorkspaceMember[], fromDir: string): Linked => {
@@ -265,18 +231,16 @@ export function workspaceResolver(host: Host, workspace: Workspace): WorkspaceRe
265
231
  const member = candidates.find((one) => one.dir === linked);
266
232
  return member === undefined ? { kind: "none" } : { kind: "member", member };
267
233
  }
268
- const scope = workspace.memberOf(joinPath(fromDir, "package.json"));
234
+ const scope = workspace.memberOf(joinPath(fromDir, MANIFEST));
269
235
  if (scope?.name === name) {
270
236
  return { kind: "member", member: scope };
271
237
  }
272
238
  // A package below the root that no workspace lists depends on a member as a member does.
273
239
  const owner = scope ?? nearestManifest(fromDir);
274
240
  const manifest = owner?.manifest;
275
- const declared = DEPENDENCY_MEMBERS.flatMap((field) => {
276
- const held = manifest?.[field];
277
- const specifier = isRecord(held) ? held[name] : undefined;
278
- return typeof specifier === "string" ? [specifier] : [];
279
- });
241
+ const declared = (manifest === undefined ? [] : dependencySpecifiers(manifest, name)).filter(
242
+ (specifier) => typeof specifier === "string",
243
+ );
280
244
  const matched = candidates.filter((member) =>
281
245
  declared.some((specifier) => dependsOn(specifier, member, owner?.dir ?? fromDir)),
282
246
  );
@@ -300,7 +264,7 @@ export function workspaceResolver(host: Host, workspace: Workspace): WorkspaceRe
300
264
  * directory however its configuration writes it.
301
265
  */
302
266
  const mirrored = (member: WorkspaceMember, path: string): string | undefined => {
303
- for (let dir = dirnamePath(path); inside(member.dir, dir); dir = dirnamePath(dir)) {
267
+ for (const dir of ancestors(dirnamePath(path), member.dir).filter((at) => at !== member.dir)) {
304
268
  const found = emittedFrom(path, { outDir: dir, sourceDirs: [member.dir] }).find(
305
269
  (candidate) =>
306
270
  SOURCE.test(candidate) && !ignored(candidate) && host.kindOf(candidate) === "file",
@@ -379,11 +343,11 @@ export function workspaceResolver(host: Host, workspace: Workspace): WorkspaceRe
379
343
  workspace,
380
344
  sourceOf,
381
345
  names: (specifier) => {
382
- const name = packageNameOf(specifier);
346
+ const name = packageOfSpecifier(specifier);
383
347
  return name !== undefined && workspace.named.has(name);
384
348
  },
385
349
  resolve(specifier, fromDir, conditions, answered) {
386
- const name = packageNameOf(specifier);
350
+ const name = packageOfSpecifier(specifier);
387
351
  const candidates = name === undefined ? undefined : workspace.named.get(name);
388
352
  if (name === undefined || candidates === undefined) {
389
353
  return { kind: "default" };
@@ -5,24 +5,26 @@
5
5
  * the members' manifests name. A target in no workspace reads none of it.
6
6
  */
7
7
 
8
- import type { LocatedDiagnostic } from "./discover.ts";
9
- import type { Host } from "./host.ts";
10
- import type { Manifest, ManifestEntry } from "./manifest.ts";
11
- import { relativePath } from "./paths.ts";
12
- import type { Engine } from "./session.ts";
13
- import { findWorkspace, referenceOnlyIn, type ParsedLayout } from "./workspace.ts";
8
+ import type { Host } from "../host.ts";
9
+ import type { Manifest, ManifestEntry } from "../roots/manifest.ts";
10
+ import { relativePath } from "../paths.ts";
11
+ import type { Engine } from "../session.ts";
12
+ import type { LocatedDiagnostic } from "./diagnostics.ts";
13
+ import type { Build } from "./plan.ts";
14
+ import { referenceOnlyIn, type ParsedLayout, type Workspace } from "./workspace.ts";
14
15
  import { memberEntries, targetManifestIn } from "./workspace-manifests.ts";
15
16
  import {
16
17
  workspacePrograms,
17
18
  type MemberReading,
18
- type WorkspaceProgram,
19
+ type PlannedConfiguration,
19
20
  } from "./workspace-programs.ts";
20
21
  import { workspaceResolver } from "./workspace-resolution.ts";
21
22
 
22
23
  /** One run's workspace. */
23
- interface WorkspaceRun {
24
+ export interface WorkspaceRun {
25
+ readonly workspace: Workspace;
24
26
  /** Per configuration that imports a member, how the snapshot reads it. */
25
- readonly programs: ReadonlyMap<string, WorkspaceProgram>;
27
+ readonly programs: ReadonlyMap<string, Exclude<Build, { readonly kind: "project" }>>;
26
28
  /**
27
29
  * Per configuration whose component files the run cannot read, the reason, in the
28
30
  * order the configurations are named.
@@ -50,11 +52,10 @@ interface WorkspaceRun {
50
52
  readonly manifest: Manifest;
51
53
  /** The entry points the other members' manifests name. */
52
54
  readonly entries: readonly ManifestEntry[];
53
- /** The directory of every member, the target's included, in the workspace's order. */
54
- readonly memberDirs: readonly string[];
55
55
  }
56
56
 
57
- function layoutOf(engine: Engine, configFile: string): ParsedLayout | undefined {
57
+ /** What one member's configuration file says of its layout, or `undefined` where it does not parse. */
58
+ export function layoutOf(engine: Engine, configFile: string): ParsedLayout | undefined {
58
59
  try {
59
60
  const parsed = engine.parseConfigFile(configFile);
60
61
  return {
@@ -96,15 +97,16 @@ export function workspaceRun(
96
97
  engine: Engine,
97
98
  host: Host,
98
99
  targetRoot: string,
99
- configFiles: readonly string[],
100
+ configurations: readonly PlannedConfiguration[],
100
101
  manifest: Manifest,
102
+ workspace: Workspace | undefined,
101
103
  ): WorkspaceRun | undefined {
102
- const workspace = findWorkspace(host, targetRoot, (configFile) => layoutOf(engine, configFile));
103
104
  if (workspace === undefined) {
104
105
  return undefined;
105
106
  }
107
+
106
108
  const resolver = workspaceResolver(host, workspace);
107
- const read = workspacePrograms(engine, host, configFiles, resolver);
109
+ const read = workspacePrograms(engine, host, configurations, resolver);
108
110
  const readings = new Map(read.readings.map((reading) => [reading.configFile, reading]));
109
111
  const referenceOnly = (
110
112
  configFile: string,
@@ -115,6 +117,7 @@ export function workspaceRun(
115
117
  new Set([...(readings.get(configFile)?.fileNames ?? []), ...compiled]),
116
118
  );
117
119
  return {
120
+ workspace,
118
121
  programs: read.programs,
119
122
  componentsUnread: read.readings.flatMap(({ configFile, componentsUnread }) =>
120
123
  componentsUnread === undefined ? [] : [{ configFile, reason: componentsUnread }],
@@ -132,7 +135,6 @@ export function workspaceRun(
132
135
  : !fromExternalLibrary,
133
136
  manifest: targetManifestIn(resolver, targetRoot, manifest),
134
137
  entries: memberEntries(host, resolver, targetRoot),
135
- memberDirs: workspace.members.map((member) => member.dir),
136
138
  };
137
139
  }
138
140