@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
@@ -1,18 +1,28 @@
1
1
  /**
2
2
  * The workspace a target sits in: the packages `pnpm-workspace.yaml` or a manifest's
3
- * `workspaces` declares in the nearest directory at or above the target root, up to
4
- * its repository root, where its patterns name the package the target is in, each
5
- * with the compiler configurations in its directory. A
6
- * member is the workspace root or a directory the patterns name that holds a named
7
- * manifest, never one below `node_modules`.
3
+ * `workspaces` declares in the nearest directory at or above the target root, up to its
4
+ * repository root, where its patterns name the package the target is in, each with the
5
+ * compiler configurations in its directory.
8
6
  */
9
7
 
10
- import { DiscoveryError } from "./discover.ts";
8
+ import { configFilesIn } from "./discover.ts";
9
+ import { failureExit } from "../failure.ts";
11
10
  import type { EmitLayout } from "./emit-map.ts";
12
11
  import { commonDirectory } from "./emit-map.ts";
13
- import type { Host } from "./host.ts";
14
- import { dirnamePath, joinPath, relativePath } from "./paths.ts";
15
- import { pnpmPackages } from "./pnpm-workspace.ts";
12
+ import type { Host } from "../host.ts";
13
+ import { ancestors, dirnamePath, joinPath, relativePath } from "../paths.ts";
14
+ import { bytewise } from "../text/compare.ts";
15
+ import { isRecord } from "../json-document.ts";
16
+ import { directoriesIn, repositoryOf } from "../fs/tree.ts";
17
+ import {
18
+ holdsManifest,
19
+ inInstalledPackages,
20
+ INSTALLED_PACKAGES,
21
+ MANIFEST,
22
+ manifestAt,
23
+ } from "../fs/manifest.ts";
24
+ import { braceExpanded, pathMatches, segmentMatches } from "../text/glob.ts";
25
+ import { yamlKey } from "../text/yaml.ts";
16
26
 
17
27
  /** What one compiler configuration of a member says about where it reads and writes. */
18
28
  export interface ParsedLayout {
@@ -39,12 +49,17 @@ export interface WorkspaceMember {
39
49
  /** Whether the manifest forbids publishing it, so nothing outside the workspace imports it. */
40
50
  readonly private: boolean;
41
51
  readonly manifest: Readonly<Record<string, unknown>>;
42
- /** Every `tsconfig*.json` directly in its directory that parses, by file name. */
52
+ /**
53
+ * The programs the run forms in its directory, then every configuration file directly in
54
+ * it a derived matrix opens that parses, by file name.
55
+ */
43
56
  readonly configurations: readonly MemberConfiguration[];
44
57
  }
45
58
 
46
59
  /** The workspace one target sits in. */
47
60
  export interface Workspace {
61
+ /** The directory that declares the workspace, absolute. */
62
+ readonly root: string;
48
63
  /** Every member, the root first, then by directory. */
49
64
  readonly members: readonly WorkspaceMember[];
50
65
  /** The members one package name names; two members may share a name. */
@@ -56,29 +71,7 @@ export interface Workspace {
56
71
  memberOf(path: string): WorkspaceMember | undefined;
57
72
  }
58
73
 
59
- const MANIFEST = "package.json";
60
74
  const PNPM_WORKSPACE = "pnpm-workspace.yaml";
61
- const CONFIG_FILE = /^tsconfig.*\.json$/u;
62
-
63
- function isRecord(value: unknown): value is Record<string, unknown> {
64
- return typeof value === "object" && value !== null && !Array.isArray(value);
65
- }
66
-
67
- /** One manifest, decoded, or `undefined` where there is none to read. */
68
- function manifestAt(host: Host, dir: string): Record<string, unknown> | undefined {
69
- let text: string;
70
- try {
71
- text = host.readFile(joinPath(dir, MANIFEST));
72
- } catch {
73
- return undefined;
74
- }
75
- try {
76
- const value: unknown = JSON.parse(text);
77
- return isRecord(value) ? value : undefined;
78
- } catch {
79
- return undefined;
80
- }
81
- }
82
75
 
83
76
  /** The patterns one directory declares a workspace with, or `undefined` where it declares none. */
84
77
  function declarationAt(
@@ -87,14 +80,20 @@ function declarationAt(
87
80
  ): { readonly file: string; readonly patterns: readonly string[] } | undefined {
88
81
  const pnpm = joinPath(dir, PNPM_WORKSPACE);
89
82
  if (host.kindOf(pnpm) === "file") {
90
- const read = pnpmPackages(host.readFile(pnpm));
91
- if (read.kind === "refused") {
92
- throw new DiscoveryError(
93
- `${pnpm}: ${read.reason}; the workspace's packages are read from a sequence of strings`,
94
- [],
83
+ const read = yamlKey(host.readFile(pnpm), "packages");
84
+ if (read.kind === "absent") {
85
+ return { file: pnpm, patterns: [] };
86
+ }
87
+ const listed = read.kind === "value" ? read.value : undefined;
88
+ if (!Array.isArray(listed) || !listed.every((entry) => typeof entry === "string")) {
89
+ const reason =
90
+ read.kind === "refused" ? read.reason : "packages is not a sequence of strings";
91
+ throw failureExit(
92
+ "no-program",
93
+ `${pnpm}: ${reason}; the workspace's packages are read from a sequence of strings: correct the declaration`,
95
94
  );
96
95
  }
97
- return { file: pnpm, patterns: read.kind === "listed" ? read.patterns : [] };
96
+ return { file: pnpm, patterns: listed };
98
97
  }
99
98
  const manifest = manifestAt(host, dir);
100
99
  if (manifest === undefined || !Object.hasOwn(manifest, "workspaces")) {
@@ -103,9 +102,9 @@ function declarationAt(
103
102
  const declared = manifest["workspaces"];
104
103
  const list = isRecord(declared) ? declared["packages"] : declared;
105
104
  if (!Array.isArray(list) || !list.every((entry) => typeof entry === "string")) {
106
- throw new DiscoveryError(
107
- `${joinPath(dir, MANIFEST)}: workspaces is neither an array of strings nor an object whose packages is one`,
108
- [],
105
+ throw failureExit(
106
+ "no-program",
107
+ `${joinPath(dir, MANIFEST)}: workspaces is neither an array of strings nor an object whose packages is one: correct the declaration`,
109
108
  );
110
109
  }
111
110
  return { file: joinPath(dir, MANIFEST), patterns: list };
@@ -120,21 +119,6 @@ function declaresWorkspace(host: Host, dir: string): boolean {
120
119
  return manifest !== undefined && Object.hasOwn(manifest, "workspaces");
121
120
  }
122
121
 
123
- /** A pattern with every brace list expanded into its alternatives. */
124
- function braceExpanded(pattern: string): readonly string[] {
125
- const open = pattern.indexOf("{");
126
- const close = open < 0 ? -1 : pattern.indexOf("}", open);
127
- if (close < 0) {
128
- return [pattern];
129
- }
130
- const before = pattern.slice(0, open);
131
- const after = pattern.slice(close + 1);
132
- return pattern
133
- .slice(open + 1, close)
134
- .split(",")
135
- .flatMap((member) => braceExpanded(before + member + after));
136
- }
137
-
138
122
  /**
139
123
  * The segments of one pattern below the workspace root, `.` and empty segments
140
124
  * dropped and `..` taken back, or `undefined` where it leaves the root.
@@ -156,56 +140,6 @@ function segmentsOf(pattern: string): readonly string[] | undefined {
156
140
  return segments;
157
141
  }
158
142
 
159
- /**
160
- * Whether one directory name matches one pattern segment: `*` stands for any run of
161
- * characters and `?` for one, and neither matches a leading dot.
162
- */
163
- function segmentMatches(segment: string, name: string): boolean {
164
- if (name.startsWith(".") && !segment.startsWith(".")) {
165
- return false;
166
- }
167
- const source = Array.from(segment)
168
- .map((character) => {
169
- if (character === "*") {
170
- return ".*";
171
- }
172
- if (character === "?") {
173
- return ".";
174
- }
175
- return character.replaceAll(/[.+^${}()|[\]\\/]/gu, (c) => `\\${c}`);
176
- })
177
- .join("");
178
- return new RegExp(`^${source}$`, "u").test(name);
179
- }
180
-
181
- /** Whether one path's segments match one pattern's, `**` standing for any run of segments. */
182
- function pathMatches(pattern: readonly string[], path: readonly string[]): boolean {
183
- const [head, ...rest] = pattern;
184
- if (head === undefined) {
185
- return path.length === 0;
186
- }
187
- if (head === "**") {
188
- return (
189
- pathMatches(rest, path) ||
190
- (path.length > 0 && !(path[0] ?? "").startsWith(".") && pathMatches(pattern, path.slice(1)))
191
- );
192
- }
193
- const [name, ...below] = path;
194
- return name !== undefined && segmentMatches(head, name) && pathMatches(rest, below);
195
- }
196
-
197
- function subdirectories(host: Host, dir: string): readonly string[] {
198
- try {
199
- return host
200
- .readDirectory(dir)
201
- .filter((entry) => entry.directory && entry.name !== "node_modules" && entry.name !== ".git")
202
- .map((entry) => entry.name)
203
- .sort();
204
- } catch {
205
- return [];
206
- }
207
- }
208
-
209
143
  /**
210
144
  * Every directory below `dir` one pattern names. `**` does not descend into a
211
145
  * directory that declares a workspace of its own, whose packages are that
@@ -219,7 +153,7 @@ function expand(host: Host, dir: string, pattern: readonly string[], into: Set<s
219
153
  }
220
154
  if (head === "**") {
221
155
  expand(host, dir, rest, into);
222
- for (const name of subdirectories(host, dir)) {
156
+ for (const name of directoriesIn(host, dir)) {
223
157
  if (name.startsWith(".")) {
224
158
  continue;
225
159
  }
@@ -230,12 +164,12 @@ function expand(host: Host, dir: string, pattern: readonly string[], into: Set<s
230
164
  }
231
165
  if (!head.includes("*") && !head.includes("?")) {
232
166
  const child = joinPath(dir, head);
233
- if (head !== "node_modules" && host.kindOf(child) === "directory") {
167
+ if (head !== INSTALLED_PACKAGES && host.kindOf(child) === "directory") {
234
168
  expand(host, child, rest, into);
235
169
  }
236
170
  return;
237
171
  }
238
- for (const name of subdirectories(host, dir)) {
172
+ for (const name of directoriesIn(host, dir)) {
239
173
  if (segmentMatches(head, name)) {
240
174
  expand(host, joinPath(dir, name), rest, into);
241
175
  }
@@ -277,10 +211,10 @@ function namesDirectory(root: string, patterns: readonly string[], dir: string):
277
211
  if (below === undefined) {
278
212
  return false;
279
213
  }
280
- const path = below.split("/");
281
- if (path.includes("node_modules")) {
214
+ if (inInstalledPackages(below)) {
282
215
  return false;
283
216
  }
217
+ const path = below.split("/");
284
218
  let named = false;
285
219
  for (const written of patterns) {
286
220
  const negated = written.startsWith("!");
@@ -314,17 +248,7 @@ function configurationsOf(
314
248
  dir: string,
315
249
  parse: (configFile: string) => ParsedLayout | undefined,
316
250
  ): readonly MemberConfiguration[] {
317
- let names: readonly string[];
318
- try {
319
- names = host
320
- .readDirectory(dir)
321
- .filter((entry) => !entry.directory && CONFIG_FILE.test(entry.name))
322
- .map((entry) => entry.name)
323
- .sort();
324
- } catch {
325
- return [];
326
- }
327
- return names.flatMap((name) => {
251
+ return configFilesIn(host, dir).flatMap((name) => {
328
252
  const configFile = joinPath(dir, name);
329
253
  const parsed = parse(configFile);
330
254
  return parsed === undefined
@@ -353,22 +277,17 @@ function nearestDeclaration(
353
277
  readonly highestPackage: string | undefined;
354
278
  }
355
279
  | undefined {
356
- let dir = targetRoot;
357
280
  let highestPackage: string | undefined;
358
- for (;;) {
281
+ for (const dir of ancestors(targetRoot, repositoryOf(host, targetRoot)?.root)) {
359
282
  const declared = declarationAt(host, dir);
360
283
  if (declared !== undefined) {
361
284
  return { root: dir, ...declared, highestPackage };
362
285
  }
363
- if (host.kindOf(joinPath(dir, MANIFEST)) === "file") {
286
+ if (holdsManifest(host, dir)) {
364
287
  highestPackage = dir;
365
288
  }
366
- const up = dirnamePath(dir);
367
- if (up === dir || host.kindOf(joinPath(dir, ".git")) !== "absent") {
368
- return undefined;
369
- }
370
- dir = up;
371
289
  }
290
+ return undefined;
372
291
  }
373
292
 
374
293
  /**
@@ -376,12 +295,14 @@ function nearestDeclaration(
376
295
  * from the target root up to its repository root declares one with a member beside
377
296
  * its root, or the nearest one does not name the highest package below it, at or
378
297
  * above the target root, among its members. `parse` reads one compiler configuration,
379
- * or answers `undefined` where it does not read.
298
+ * or answers `undefined` where it does not read. `known`, a workspace already read, is the
299
+ * answer where the nearest declaration is its own, so its members are not listed again.
380
300
  */
381
301
  export function findWorkspace(
382
302
  host: Host,
383
303
  targetRoot: string,
384
304
  parse: (configFile: string) => ParsedLayout | undefined,
305
+ known?: Workspace,
385
306
  ): Workspace | undefined {
386
307
  const declared = nearestDeclaration(host, targetRoot);
387
308
  if (declared === undefined) {
@@ -393,6 +314,9 @@ export function findWorkspace(
393
314
  ) {
394
315
  return undefined;
395
316
  }
317
+ if (known?.root === declared.root) {
318
+ return known;
319
+ }
396
320
  const members: WorkspaceMember[] = [];
397
321
  for (const dir of memberDirectories(host, declared.root, declared.patterns)) {
398
322
  const manifest = manifestAt(host, dir);
@@ -414,8 +338,12 @@ export function findWorkspace(
414
338
  return undefined;
415
339
  }
416
340
  members.sort((a, b) =>
417
- a.dir === declared.root ? -1 : b.dir === declared.root ? 1 : a.dir < b.dir ? -1 : 1,
341
+ a.dir === declared.root ? -1 : b.dir === declared.root ? 1 : bytewise(a.dir, b.dir),
418
342
  );
343
+ return assembled(host, declared.root, members);
344
+ }
345
+
346
+ function assembled(host: Host, root: string, members: readonly WorkspaceMember[]): Workspace {
419
347
  const named = new Map<string, WorkspaceMember[]>();
420
348
  for (const member of members) {
421
349
  named.set(member.name, [...(named.get(member.name) ?? []), member]);
@@ -427,12 +355,12 @@ export function findWorkspace(
427
355
  return scopes.get(dir);
428
356
  }
429
357
  const up = dirnamePath(dir);
430
- const found =
431
- host.kindOf(joinPath(dir, MANIFEST)) === "file" ? dir : up === dir ? undefined : scopeOf(up);
358
+ const found = holdsManifest(host, dir) ? dir : up === dir ? undefined : scopeOf(up);
432
359
  scopes.set(dir, found);
433
360
  return found;
434
361
  };
435
362
  return {
363
+ root,
436
364
  members,
437
365
  named,
438
366
  memberOf: (path) => {
@@ -442,6 +370,34 @@ export function findWorkspace(
442
370
  };
443
371
  }
444
372
 
373
+ /**
374
+ * The workspace with the programs the run forms put first among each member's configurations,
375
+ * by the member's directory: a formed program has no file on disk to list, so its file list
376
+ * is what makes a member's JavaScript its source.
377
+ */
378
+ export function withFormed(
379
+ host: Host,
380
+ workspace: Workspace,
381
+ formed: ReadonlyMap<string, readonly ParsedLayout[]>,
382
+ ): Workspace {
383
+ return assembled(
384
+ host,
385
+ workspace.root,
386
+ workspace.members.map((member) => {
387
+ const own = formed.get(member.dir) ?? [];
388
+ return own.length === 0
389
+ ? member
390
+ : {
391
+ ...member,
392
+ configurations: [
393
+ ...own.map((layout) => ({ fileNames: new Set(layout.fileNames) })),
394
+ ...member.configurations,
395
+ ],
396
+ };
397
+ }),
398
+ );
399
+ }
400
+
445
401
  /**
446
402
  * Whether one configuration holds one file only for the references it makes: the file
447
403
  * belongs to a workspace package, the root included, and the configuration does not
@@ -15,20 +15,18 @@ import {
15
15
  isImportTypeNode,
16
16
  isLiteralTypeNode,
17
17
  isModuleDeclaration,
18
- isNamespaceExport,
19
- isNamespaceImport,
20
18
  isNoSubstitutionTemplateLiteral,
21
19
  isStringLiteral,
22
20
  SyntaxKind,
23
21
  type Node,
24
22
  type SourceFile,
25
23
  } from "@typescript/native/ast";
24
+ import { namesImported } from "./import-bindings.ts";
26
25
  import { nodeKey, type Inventory, type InventorySymbol } from "./inventory.ts";
27
- import { renderPosition } from "./position.ts";
28
26
  import { UNANSWERED } from "./query.ts";
29
27
  import { aliasFragment, nameComponent } from "./ref.ts";
30
- import type { Reference } from "./references.ts";
31
- import type { ProjectView } from "./session.ts";
28
+ import type { Read, ReadRule } from "./references/read-rule.ts";
29
+ import { isPathSpecifier } from "./paths.ts";
32
30
 
33
31
  /** Whether a node is a specifier's text: a string literal or a template with no substitution. */
34
32
  function literalText(node: Node | undefined): node is Node & { readonly text: string } {
@@ -58,33 +56,12 @@ function specifierOf(node: Node): (Node & { readonly text: string }) | undefined
58
56
  return undefined;
59
57
  }
60
58
 
61
- /**
62
- * The export names an import or a re-export reads from the module it names: none for a
63
- * namespace, a star or a bare form.
64
- */
65
- export function namesImported(node: Node): readonly string[] {
66
- if (isImportDeclaration(node)) {
67
- const clause = node.importClause;
68
- const bindings = clause?.namedBindings;
69
- return [
70
- ...(clause?.name === undefined ? [] : ["default"]),
71
- ...(bindings === undefined || isNamespaceImport(bindings)
72
- ? []
73
- : bindings.elements.map((one) => (one.propertyName ?? one.name).text)),
74
- ];
75
- }
76
- const clause = isExportDeclaration(node) ? node.exportClause : undefined;
77
- return clause === undefined || isNamespaceExport(clause)
78
- ? []
79
- : clause.elements.map((one) => (one.propertyName ?? one.name).text);
80
- }
81
-
82
59
  /**
83
60
  * Whether a specifier matches a declaration's name, the name's one `*` standing for any run.
84
61
  * A relative name is resolved against its own file, so no specifier names it by its text.
85
62
  */
86
63
  function namesModule(specifier: string, name: string): boolean {
87
- if (/^(?:\.{1,2}(?:\/|$)|\/)/u.test(name)) {
64
+ if (isPathSpecifier(name)) {
88
65
  return false;
89
66
  }
90
67
  const star = name.indexOf("*");
@@ -161,76 +138,75 @@ interface Declared {
161
138
  }
162
139
 
163
140
  /**
164
- * The references the imports of one project's own files make to the module declarations
165
- * they name, each at the import's specifier.
141
+ * The reads the imports of a side's files make of the module declarations of the target they
142
+ * name, each at the import's specifier. A specifier the checker leaves unanswered still names
143
+ * a declaration by its name or pattern.
166
144
  */
167
- export function moduleDeclarationReferences<Brand>(
168
- project: ProjectView<Brand>,
169
- held: Inventory,
170
- root: string,
171
- testFiles: ReadonlySet<string>,
172
- ): readonly Reference[] {
173
- const imports: Import[] = [];
174
- const declared: Declared[] = [];
175
- for (const file of project.ownSourceFiles()) {
176
- const fileId = held.declarations.get(nodeKey(file, file));
177
- if (fileId === undefined) {
178
- continue;
179
- }
180
- const visit = (node: Node, from: string): void => {
181
- const own = held.declarations.get(nodeKey(file, node));
182
- if (isModuleDeclaration(node) && literalText(node.name) && own !== undefined) {
183
- declared.push({ id: own, name: node.name });
184
- }
185
- const specifier = specifierOf(node);
186
- if (specifier !== undefined) {
187
- imports.push({ file, from, specifier, names: namesImported(node) });
188
- }
189
- node.forEachChild((child) => {
190
- visit(child, own ?? from);
191
- });
192
- };
193
- file.forEachChild((child) => {
194
- visit(child, fileId);
195
- });
196
- }
197
- if (declared.length === 0 || imports.length === 0) {
198
- return [];
199
- }
200
-
201
- const asked = [...declared.map((one) => one.name), ...imports.map((one) => one.specifier)];
202
- const answers = project.symbolsAt(asked.map((node) => project.handle(node)));
203
- const moduleOf = (at: number): number | undefined => {
204
- const symbol = answers[at];
205
- return symbol === undefined || symbol === UNANSWERED ? undefined : symbol.id;
206
- };
207
-
208
- const named = namedBy(held);
209
- const found: Reference[] = [];
210
- imports.forEach((one, index) => {
211
- const resolved = moduleOf(declared.length + index);
212
- const position = renderPosition(one.file, root, one.specifier.getStart());
213
- const read = (to: string, resolution: Reference["resolution"], test: boolean): void => {
214
- found.push({ from: one.from, to, position, use: "read", resolution, test });
215
- };
216
- const test = testFiles.has(position.path);
217
- const same = new Set(
218
- declared
219
- .filter((_, at) => resolved !== undefined && resolved === moduleOf(at))
220
- .map((declaration) => declaration.id),
221
- );
222
- for (const id of same) {
223
- read(id, "batch", test);
224
- }
225
- for (const declaration of named(one.specifier.text, one.names)) {
226
- // A wildcard declaration is how the compiler types the file a matching specifier
227
- // names, so the import uses it whoever writes it, a test included.
228
- if (declaration.wildcard || !same.has(declaration.id)) {
229
- for (const to of [declaration.id, ...declaration.members]) {
230
- read(to, "syntax", test && !declaration.wildcard);
145
+ export const moduleDeclarations: ReadRule = {
146
+ start() {
147
+ const imports: Import[] = [];
148
+ return {
149
+ visit(node, { file, from }) {
150
+ const specifier = specifierOf(node);
151
+ if (specifier !== undefined) {
152
+ imports.push({ file, from, specifier, names: namesImported(node) });
231
153
  }
232
- }
233
- }
234
- });
235
- return found;
236
- }
154
+ },
155
+ reads({ project, held }) {
156
+ const found: Read[] = [];
157
+ // A module declaration whose name is a string is written at a file's top level.
158
+ const declared: Declared[] = project.ownSourceFiles().flatMap((file) =>
159
+ file.statements.flatMap((statement) => {
160
+ const id = held.declarations.get(nodeKey(file, statement));
161
+ return isModuleDeclaration(statement) && literalText(statement.name) && id !== undefined
162
+ ? [{ id, name: statement.name }]
163
+ : [];
164
+ }),
165
+ );
166
+ if (declared.length === 0 || imports.length === 0) {
167
+ return found;
168
+ }
169
+ const asked = [...declared.map((one) => one.name), ...imports.map((one) => one.specifier)];
170
+ const answers = project.symbolsAt(asked.map((node) => project.handle(node)));
171
+ const moduleOf = (at: number): number | undefined => {
172
+ const symbol = answers[at];
173
+ return symbol === undefined || symbol === UNANSWERED ? undefined : symbol.id;
174
+ };
175
+ const named = namedBy(held);
176
+ imports.forEach((one, index) => {
177
+ const resolved = moduleOf(declared.length + index);
178
+ const read = (to: string, via: "batch" | "syntax", production: boolean): void => {
179
+ found.push({
180
+ kind: "named",
181
+ from: one.from,
182
+ to,
183
+ file: one.file,
184
+ at: one.specifier,
185
+ use: "read",
186
+ via,
187
+ ...(production ? { production: true as const } : {}),
188
+ });
189
+ };
190
+ const same = new Set(
191
+ declared
192
+ .filter((_, at) => resolved !== undefined && resolved === moduleOf(at))
193
+ .map((declaration) => declaration.id),
194
+ );
195
+ for (const id of same) {
196
+ read(id, "batch", false);
197
+ }
198
+ for (const declaration of named(one.specifier.text, one.names)) {
199
+ // A wildcard declaration is how the compiler types the file a matching specifier
200
+ // names, so the import uses it whoever writes it, a test included.
201
+ if (declaration.wildcard || !same.has(declaration.id)) {
202
+ for (const to of [declaration.id, ...declaration.members]) {
203
+ read(to, "syntax", declaration.wildcard);
204
+ }
205
+ }
206
+ }
207
+ });
208
+ return found;
209
+ },
210
+ };
211
+ },
212
+ };