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

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 (402) 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 +2 -7
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +269 -432
  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/calls.js +279 -43
  12. package/dist/src/commands/held.js +499 -0
  13. package/dist/src/commands/read.js +161 -0
  14. package/dist/src/commands/shell.js +169 -0
  15. package/dist/src/commands/tools.js +1847 -0
  16. package/dist/src/component-files.js +3 -2
  17. package/dist/src/component-layer.js +4 -2
  18. package/dist/src/config.js +6 -82
  19. package/dist/src/conformance-record.js +1 -1
  20. package/dist/src/consumers.js +10 -38
  21. package/dist/src/contextual-uses.js +57 -26
  22. package/dist/src/contract/config.generated.js +561 -0
  23. package/dist/src/contract/contract.generated.js +1369 -0
  24. package/dist/src/contract/report.generated.js +866 -0
  25. package/dist/src/dependencies.js +164 -121
  26. package/dist/src/destructuring.js +1 -19
  27. package/dist/src/edges.js +38 -122
  28. package/dist/src/element-access.js +181 -168
  29. package/dist/src/entries/build-scripts.js +222 -0
  30. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  31. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  32. package/dist/src/entries/conventions.js +740 -0
  33. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  34. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  35. package/dist/src/entries/run-directories.js +77 -0
  36. package/dist/src/entries/sources.js +144 -0
  37. package/dist/src/entries/static-module.js +670 -0
  38. package/dist/src/entries/test-runners.js +650 -0
  39. package/dist/src/entries/workflow-steps.js +345 -0
  40. package/dist/src/enum-group.js +3 -10
  41. package/dist/src/erased-stores.js +4 -6
  42. package/dist/src/exempt-classes.js +1 -63
  43. package/dist/src/exempt.js +21 -66
  44. package/dist/src/exposure.js +400 -0
  45. package/dist/src/extensions.js +37 -0
  46. package/dist/src/facts.js +38 -0
  47. package/dist/src/failure.js +36 -0
  48. package/dist/src/file-facts.js +3 -26
  49. package/dist/src/findings/completion.js +109 -56
  50. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  51. package/dist/src/findings/emitters.js +27 -41
  52. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  53. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  54. package/dist/src/findings/interfaces.js +4 -5
  55. package/dist/src/findings/intra-function.js +16 -13
  56. package/dist/src/findings/non-code-artifacts.js +17 -12
  57. package/dist/src/findings/reads-and-writes.js +86 -27
  58. package/dist/src/findings/self-check.js +44 -30
  59. package/dist/src/findings/unused-declarations.js +29 -45
  60. package/dist/src/findings/visibility-narrowing.js +23 -31
  61. package/dist/src/findings-pass.js +13 -21
  62. package/dist/src/framework-lifecycle.js +46 -19
  63. package/dist/src/fs/document.js +52 -0
  64. package/dist/src/fs/manifest.js +67 -0
  65. package/dist/src/fs/tree.js +88 -0
  66. package/dist/src/generated-file.js +174 -28
  67. package/dist/src/git-ignore.js +39 -26
  68. package/dist/src/import-bindings.js +73 -28
  69. package/dist/src/index/sites.js +557 -0
  70. package/dist/src/index.js +2 -2
  71. package/dist/src/indexed-access.js +523 -478
  72. package/dist/src/injection-container.js +2 -2
  73. package/dist/src/interface-satisfaction.js +1 -1
  74. package/dist/src/intra-function-parts.js +63 -43
  75. package/dist/src/inventory/commonjs.js +507 -0
  76. package/dist/src/inventory/enumerate.js +167 -0
  77. package/dist/src/inventory/syntax.js +236 -0
  78. package/dist/src/inventory.js +323 -724
  79. package/dist/src/javascript-file.js +48 -0
  80. package/dist/src/json-document.js +198 -67
  81. package/dist/src/keyof-comparisons.js +126 -107
  82. package/dist/src/kinds.js +3 -366
  83. package/dist/src/{components.js → liveness/components.js} +2 -3
  84. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  85. package/dist/src/liveness/matrix.js +99 -0
  86. package/dist/src/liveness/sweep.js +558 -0
  87. package/dist/src/load/classify.js +289 -0
  88. package/dist/src/load/diagnostics.js +87 -0
  89. package/dist/src/load/discover.js +285 -0
  90. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  91. package/dist/src/load/expected-module.js +136 -0
  92. package/dist/src/load/load.js +27 -0
  93. package/dist/src/load/module-lookup.js +37 -0
  94. package/dist/src/load/package-scope.js +56 -0
  95. package/dist/src/load/plan.js +313 -0
  96. package/dist/src/load/specifiers.js +113 -0
  97. package/dist/src/load/synthesize.js +152 -0
  98. package/dist/src/load/test-globals.js +207 -0
  99. package/dist/src/load/test-joins.js +82 -0
  100. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  101. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  102. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  103. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  104. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  105. package/dist/src/module-declarations.js +70 -85
  106. package/dist/src/overrides.js +134 -112
  107. package/dist/src/partial.js +2 -1
  108. package/dist/src/paths.js +82 -16
  109. package/dist/src/platform-calls.js +78 -0
  110. package/dist/src/platform-symbols.js +134 -0
  111. package/dist/src/position.js +43 -1
  112. package/dist/src/print.js +11 -79
  113. package/dist/src/product.js +13 -0
  114. package/dist/src/query.js +47 -0
  115. package/dist/src/ref.js +12 -20
  116. package/dist/src/references/read-rule.js +1 -0
  117. package/dist/src/references/read-rules.js +48 -0
  118. package/dist/src/references/sink.js +237 -0
  119. package/dist/src/references/sources.js +450 -0
  120. package/dist/src/references.js +117 -1074
  121. package/dist/src/report-schema.js +51 -0
  122. package/dist/src/report.js +57 -41
  123. package/dist/src/reporters/annotations.js +15 -8
  124. package/dist/src/reporters/sarif.js +16 -10
  125. package/dist/src/reporters/template.js +4 -19
  126. package/dist/src/resolve.js +246 -730
  127. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  128. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  129. package/dist/src/roots/manifest.js +216 -0
  130. package/dist/src/roots/published-reach.js +412 -0
  131. package/dist/src/roots/root-set.js +487 -0
  132. package/dist/src/roots/unseen-loads.js +236 -0
  133. package/dist/src/run.js +66 -77
  134. package/dist/src/schema.js +320 -343
  135. package/dist/src/scope.js +38 -115
  136. package/dist/src/serialization-contract.js +601 -22
  137. package/dist/src/session.js +37 -29
  138. package/dist/src/source-files.js +6 -10
  139. package/dist/src/stores.js +4 -2
  140. package/dist/src/suppress-file.js +25 -28
  141. package/dist/src/suppress-inline.js +36 -83
  142. package/dist/src/suppress.js +50 -71
  143. package/dist/src/symbol-keys.js +92 -88
  144. package/dist/src/template-field.js +9 -19
  145. package/dist/src/tests/file-class.js +76 -0
  146. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  147. package/dist/src/{test-support.js → tests/support.js} +5 -12
  148. package/dist/src/text/compare.js +26 -0
  149. package/dist/src/text/glob.js +194 -0
  150. package/dist/src/text/named-files.js +298 -0
  151. package/dist/src/text/yaml.js +684 -0
  152. package/dist/src/type-errors.js +11 -232
  153. package/dist/src/type-parameter-reads.js +178 -139
  154. package/dist/src/unimplemented-callees.js +262 -242
  155. package/dist/src/unwrap.js +23 -0
  156. package/dist/src/usage.js +10 -0
  157. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  158. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  159. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  160. package/dist/src/vendor/unbash/assignment.js +131 -0
  161. package/dist/src/vendor/unbash/chars.js +48 -0
  162. package/dist/src/vendor/unbash/command.js +41 -0
  163. package/dist/src/vendor/unbash/expansion.js +80 -0
  164. package/dist/src/vendor/unbash/glob.js +268 -0
  165. package/dist/src/vendor/unbash/heredoc.js +27 -0
  166. package/dist/src/vendor/unbash/internal-types.js +1 -0
  167. package/dist/src/vendor/unbash/lexer.js +4274 -0
  168. package/dist/src/vendor/unbash/limits.js +3 -0
  169. package/dist/src/vendor/unbash/parser.js +1366 -0
  170. package/dist/src/vendor/unbash/parts.js +57 -0
  171. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  172. package/dist/src/vendor/unbash/traversal.js +212 -0
  173. package/dist/src/vendor/unbash/types.js +1 -0
  174. package/dist/src/vendor/unbash/word-value.js +61 -0
  175. package/dist/src/vendor/unbash/word.js +40 -0
  176. package/dist/src/verbs/analyze.js +194 -127
  177. package/dist/src/verbs/describe.js +13 -18
  178. package/dist/src/verbs/explain.js +85 -139
  179. package/dist/src/verbs/print-config.js +2 -1
  180. package/dist/src/verbs/print-projects.js +6 -4
  181. package/dist/src/verbs/print-retained.js +7 -5
  182. package/dist/src/verbs/print-roots.js +4 -2
  183. package/dist/src/verbs/verb.js +1 -5
  184. package/dist/src/verbs/version.js +14 -3
  185. package/jsr.json +2 -1
  186. package/package.json +14 -8
  187. package/src/alias-chain.ts +2 -9
  188. package/src/amd.ts +130 -0
  189. package/src/analysis.ts +424 -650
  190. package/src/augmentations.ts +93 -4
  191. package/src/automatic-types.ts +12 -30
  192. package/src/bindings.ts +460 -0
  193. package/src/calls.ts +338 -46
  194. package/src/commands/held.ts +632 -0
  195. package/src/commands/read.ts +242 -0
  196. package/src/commands/shell.ts +228 -0
  197. package/src/commands/tools.ts +2382 -0
  198. package/src/component-files.ts +4 -2
  199. package/src/component-layer.ts +4 -2
  200. package/src/config.ts +31 -302
  201. package/src/conformance-record.ts +1 -1
  202. package/src/consumers.ts +16 -66
  203. package/src/contextual-uses.ts +66 -34
  204. package/src/contract/config.generated.ts +821 -0
  205. package/src/contract/contract.generated.ts +1452 -0
  206. package/src/contract/report.generated.ts +1241 -0
  207. package/src/dependencies.ts +222 -127
  208. package/src/destructuring.ts +1 -31
  209. package/src/edges.ts +41 -140
  210. package/src/element-access.ts +190 -187
  211. package/src/entries/build-scripts.ts +292 -0
  212. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  213. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  214. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  215. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  216. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  217. package/src/entries/run-directories.ts +108 -0
  218. package/src/entries/sources.ts +266 -0
  219. package/src/entries/static-module.ts +858 -0
  220. package/src/entries/test-runners.ts +835 -0
  221. package/src/entries/workflow-steps.ts +432 -0
  222. package/src/enum-group.ts +2 -11
  223. package/src/erased-stores.ts +3 -7
  224. package/src/exempt-classes.ts +1 -75
  225. package/src/exempt.ts +70 -98
  226. package/src/exposure.ts +492 -0
  227. package/src/extensions.ts +45 -0
  228. package/src/facts.ts +46 -0
  229. package/src/failure.ts +63 -0
  230. package/src/file-facts.ts +15 -25
  231. package/src/finding.ts +10 -10
  232. package/src/findings/boundary.ts +11 -0
  233. package/src/findings/completion.ts +133 -64
  234. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  235. package/src/findings/emitter.ts +9 -10
  236. package/src/findings/emitters.ts +38 -52
  237. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  238. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  239. package/src/findings/interfaces.ts +7 -9
  240. package/src/findings/intra-function.ts +16 -14
  241. package/src/findings/non-code-artifacts.ts +24 -15
  242. package/src/findings/reads-and-writes.ts +118 -41
  243. package/src/findings/self-check.ts +51 -38
  244. package/src/findings/unused-declarations.ts +31 -49
  245. package/src/findings/visibility-narrowing.ts +36 -40
  246. package/src/findings-pass.ts +15 -31
  247. package/src/framework-lifecycle.ts +47 -19
  248. package/src/fs/document.ts +70 -0
  249. package/src/fs/manifest.ts +96 -0
  250. package/src/fs/tree.ts +110 -0
  251. package/src/generated-file.ts +242 -35
  252. package/src/git-ignore.ts +50 -26
  253. package/src/host.ts +12 -5
  254. package/src/import-bindings.ts +98 -29
  255. package/src/index/sites.ts +781 -0
  256. package/src/index.ts +2 -2
  257. package/src/indexed-access.ts +570 -527
  258. package/src/injection-container.ts +2 -2
  259. package/src/interface-satisfaction.ts +2 -2
  260. package/src/intra-function-parts.ts +73 -44
  261. package/src/inventory/commonjs.ts +696 -0
  262. package/src/inventory/enumerate.ts +203 -0
  263. package/src/inventory/syntax.ts +311 -0
  264. package/src/inventory.ts +442 -895
  265. package/src/javascript-file.ts +54 -0
  266. package/src/json-document.ts +241 -76
  267. package/src/keyof-comparisons.ts +133 -122
  268. package/src/kinds.ts +5 -413
  269. package/src/{components.ts → liveness/components.ts} +4 -6
  270. package/src/{graph.ts → liveness/graph.ts} +100 -35
  271. package/src/liveness/matrix.ts +162 -0
  272. package/src/liveness/sweep.ts +855 -0
  273. package/src/load/classify.ts +433 -0
  274. package/src/load/diagnostics.ts +154 -0
  275. package/src/load/discover.ts +471 -0
  276. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  277. package/src/load/expected-module.ts +194 -0
  278. package/src/load/load.ts +73 -0
  279. package/src/load/module-lookup.ts +50 -0
  280. package/src/load/package-scope.ts +74 -0
  281. package/src/load/plan.ts +513 -0
  282. package/src/load/specifiers.ts +171 -0
  283. package/src/load/synthesize.ts +230 -0
  284. package/src/load/test-globals.ts +251 -0
  285. package/src/load/test-joins.ts +98 -0
  286. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  287. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  288. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  289. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  290. package/src/{workspace.ts → load/workspace.ts} +90 -134
  291. package/src/module-declarations.ts +74 -98
  292. package/src/overrides.ts +162 -134
  293. package/src/partial.ts +3 -2
  294. package/src/paths.ts +92 -16
  295. package/src/platform-calls.ts +119 -0
  296. package/src/platform-symbols.ts +189 -0
  297. package/src/position.ts +44 -1
  298. package/src/print.ts +12 -92
  299. package/src/product.ts +18 -0
  300. package/src/query.ts +92 -0
  301. package/src/ref.ts +12 -20
  302. package/src/references/read-rule.ts +60 -0
  303. package/src/references/read-rules.ts +55 -0
  304. package/src/references/sink.ts +314 -0
  305. package/src/references/sources.ts +632 -0
  306. package/src/references.ts +187 -1450
  307. package/src/report-schema.ts +68 -0
  308. package/src/report.ts +103 -226
  309. package/src/reporters/annotations.ts +22 -11
  310. package/src/reporters/json.ts +1 -1
  311. package/src/reporters/reporter.ts +2 -4
  312. package/src/reporters/reporters.ts +1 -1
  313. package/src/reporters/sarif.ts +29 -16
  314. package/src/reporters/template.ts +4 -20
  315. package/src/reporters/text.ts +3 -3
  316. package/src/resolve.ts +284 -1115
  317. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
  318. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  319. package/src/roots/manifest.ts +303 -0
  320. package/src/roots/published-reach.ts +486 -0
  321. package/src/{roots.ts → roots/root-set.ts} +286 -469
  322. package/src/roots/unseen-loads.ts +345 -0
  323. package/src/run.ts +75 -91
  324. package/src/schema.ts +391 -388
  325. package/src/scope.ts +46 -138
  326. package/src/serialization-contract.ts +769 -23
  327. package/src/session.ts +87 -55
  328. package/src/source-files.ts +6 -11
  329. package/src/stores.ts +15 -3
  330. package/src/suppress-file.ts +24 -33
  331. package/src/suppress-inline.ts +55 -91
  332. package/src/suppress.ts +78 -79
  333. package/src/symbol-keys.ts +104 -107
  334. package/src/template-field.ts +15 -25
  335. package/src/tests/file-class.ts +135 -0
  336. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  337. package/src/{test-support.ts → tests/support.ts} +15 -21
  338. package/src/text/compare.ts +27 -0
  339. package/src/text/glob.ts +210 -0
  340. package/src/text/named-files.ts +388 -0
  341. package/src/text/yaml.ts +747 -0
  342. package/src/type-errors.ts +18 -288
  343. package/src/type-parameter-reads.ts +187 -158
  344. package/src/unimplemented-callees.ts +297 -280
  345. package/src/unwrap.ts +34 -0
  346. package/src/usage.ts +10 -0
  347. package/src/vendor/unbash/LICENSE +15 -0
  348. package/src/vendor/unbash/VENDORED.md +16 -0
  349. package/src/vendor/unbash/ansi-c.ts +132 -0
  350. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  351. package/src/vendor/unbash/arithmetic.ts +641 -0
  352. package/src/vendor/unbash/assignment.ts +163 -0
  353. package/src/vendor/unbash/chars.ts +48 -0
  354. package/src/vendor/unbash/command.ts +47 -0
  355. package/src/vendor/unbash/expansion.ts +144 -0
  356. package/src/vendor/unbash/glob.ts +284 -0
  357. package/src/vendor/unbash/heredoc.ts +34 -0
  358. package/src/vendor/unbash/internal-types.ts +94 -0
  359. package/src/vendor/unbash/lexer.ts +4352 -0
  360. package/src/vendor/unbash/limits.ts +3 -0
  361. package/src/vendor/unbash/parser.ts +1612 -0
  362. package/src/vendor/unbash/parts.ts +96 -0
  363. package/src/vendor/unbash/substitution-context.ts +20 -0
  364. package/src/vendor/unbash/traversal.ts +182 -0
  365. package/src/vendor/unbash/types.ts +660 -0
  366. package/src/vendor/unbash/word-value.ts +64 -0
  367. package/src/vendor/unbash/word.ts +50 -0
  368. package/src/verbs/analyze.ts +255 -164
  369. package/src/verbs/describe.ts +19 -17
  370. package/src/verbs/explain.ts +93 -169
  371. package/src/verbs/print-config.ts +2 -1
  372. package/src/verbs/print-projects.ts +6 -4
  373. package/src/verbs/print-retained.ts +7 -5
  374. package/src/verbs/print-roots.ts +4 -2
  375. package/src/verbs/verb.ts +2 -8
  376. package/src/verbs/version.ts +15 -3
  377. package/dist/src/base-url.js +0 -18
  378. package/dist/src/conventions.js +0 -937
  379. package/dist/src/discover.js +0 -468
  380. package/dist/src/entry-points.js +0 -529
  381. package/dist/src/glob.js +0 -65
  382. package/dist/src/manifest.js +0 -165
  383. package/dist/src/matrix.js +0 -246
  384. package/dist/src/pnpm-workspace.js +0 -120
  385. package/dist/src/roots.js +0 -672
  386. package/dist/src/setup-failure.js +0 -23
  387. package/dist/src/sweep.js +0 -224
  388. package/dist/src/test-joins.js +0 -101
  389. package/dist/src/version.js +0 -7
  390. package/dist/src/workflow-steps.js +0 -185
  391. package/src/base-url.ts +0 -24
  392. package/src/discover.ts +0 -653
  393. package/src/entry-points.ts +0 -687
  394. package/src/glob.ts +0 -67
  395. package/src/manifest.ts +0 -234
  396. package/src/matrix.ts +0 -423
  397. package/src/pnpm-workspace.ts +0 -135
  398. package/src/setup-failure.ts +0 -39
  399. package/src/sweep.ts +0 -347
  400. package/src/test-joins.ts +0 -120
  401. package/src/version.ts +0 -7
  402. package/src/workflow-steps.ts +0 -216
package/src/discover.ts DELETED
@@ -1,653 +0,0 @@
1
- import { DiagnosticCategory } from "@typescript/native/sync";
2
- import type { Diagnostic } from "@typescript/native/sync";
3
- import { baseUrlPaths } from "./base-url.ts";
4
- import type { BuildConfiguration, ProjectConfiguration } from "./config.ts";
5
- import type { Host } from "./host.ts";
6
- import { dirnamePath, isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.ts";
7
- import type { Scope } from "./scope.ts";
8
- import { SetupError } from "./setup-failure.ts";
9
- import type { Engine, ProjectDiagnostics } from "./session.ts";
10
- import { writtenPath, type WorkspaceProgram } from "./workspace-programs.ts";
11
-
12
- /** Directory names discovery does not descend into. */
13
- export const IGNORED_DIRECTORIES: ReadonlySet<string> = new Set(["node_modules", ".git"]);
14
-
15
- /** A compiler configuration file discovery recognises under a root. */
16
- const CONFIG_FILE = /^tsconfig.*\.json$/u;
17
-
18
- /**
19
- * A run that cannot read what it was asked to analyze. It ends the run with the
20
- * failure code and no finding list: a configuration file the compiler cannot read,
21
- * or a project carrying an error, leaves the analysis without the type information
22
- * every answer rests on, and a partial answer is never printed as a complete one.
23
- */
24
- export class DiscoveryError extends Error {
25
- /** The diagnostics the compiler reported, in the order it reported them. */
26
- readonly diagnostics: readonly LocatedDiagnostic[];
27
-
28
- constructor(message: string, diagnostics: readonly LocatedDiagnostic[]) {
29
- super(message);
30
- this.name = "DiscoveryError";
31
- this.diagnostics = diagnostics;
32
- }
33
- }
34
-
35
- /** The category an error diagnostic carries, which the protocol sends as a number. */
36
- const ERROR_CATEGORY: number = DiagnosticCategory.Error;
37
-
38
- /** Whether one diagnostic is an error, which is what fails a run closed. */
39
- function isError(diagnostic: Diagnostic): boolean {
40
- return diagnostic.category === ERROR_CATEGORY;
41
- }
42
-
43
- /** One diagnostic, with the line and column its offset falls on where it names a file. */
44
- export interface LocatedDiagnostic {
45
- readonly diagnostic: Diagnostic;
46
- /** Where the diagnostic starts, counted from one; absent where it names no position. */
47
- readonly at?: { readonly line: number; readonly column: number } | undefined;
48
- }
49
-
50
- /**
51
- * One diagnostic as a line naming its file, its line and column, its code and its
52
- * message: `path:line:column: TScode: message`, the position left out where the
53
- * diagnostic names none and the file where it names none. `display` spells the
54
- * file's path; it answers the path itself where it is not given.
55
- */
56
- export function renderDiagnostic(
57
- located: LocatedDiagnostic,
58
- display: (path: string) => string = (path) => path,
59
- ): string {
60
- const { diagnostic, at } = located;
61
- const message = `TS${String(diagnostic.code)}: ${diagnostic.text}`;
62
- if (diagnostic.fileName === undefined) {
63
- return message;
64
- }
65
- const where = display(diagnostic.fileName);
66
- return at === undefined
67
- ? `${where}: ${message}`
68
- : `${where}:${String(at.line)}:${String(at.column)}: ${message}`;
69
- }
70
-
71
- /** Each diagnostic with the line and column its offset falls on. */
72
- function locatedIn(
73
- diagnostics: readonly Diagnostic[],
74
- locate: (fileName: string, offset: number) => { line: number; column: number } | undefined,
75
- ): readonly LocatedDiagnostic[] {
76
- return diagnostics.map((diagnostic) => ({
77
- diagnostic,
78
- at: diagnostic.fileName === undefined ? undefined : locate(diagnostic.fileName, diagnostic.pos),
79
- }));
80
- }
81
-
82
- /**
83
- * Every error a project's three diagnostic sets carry, in the order the compiler
84
- * reported them: a configuration whose options do not parse, a file whose syntax
85
- * does not, and a program that does not type-check. A resolved configuration
86
- * carries no diagnostics of its own, so a configuration written with an unreadable
87
- * option resolves and is refused here, once its project is open.
88
- */
89
- export function diagnosticErrors(sets: {
90
- readonly syntactic: readonly Diagnostic[];
91
- readonly semantic: readonly Diagnostic[];
92
- readonly configParsing: readonly Diagnostic[];
93
- }): readonly Diagnostic[] {
94
- return [...sets.configParsing, ...sets.syntactic, ...sets.semantic].filter(isError);
95
- }
96
-
97
- /** Why one open project cannot be analyzed, split by whether it loaded at all. */
98
- interface ProjectErrors {
99
- /**
100
- * The errors in the configuration itself, and the errors the compiler places in no file
101
- * that leave its checker without a type it needs: no input matched, an option that
102
- * does not parse, a missing global type. A project carrying one did not load, whatever
103
- * its files say.
104
- */
105
- readonly load: readonly LocatedDiagnostic[];
106
- /** The errors in the files of a project that loaded: their syntax and their types. */
107
- readonly check: readonly LocatedDiagnostic[];
108
- /**
109
- * The libraries the configuration names that the compiler cannot find, which leave it
110
- * loaded: a use of a name only such a library declares is an error in its file.
111
- */
112
- readonly unfound: readonly LocatedDiagnostic[];
113
- }
114
-
115
- /**
116
- * The codes of a type library and a lib the configuration names that the compiler
117
- * cannot find, which it reports while it gathers the program's files,
118
- * https://github.com/microsoft/typescript-go/blob/89d5d5b2849a0db0957065889ca58536fa6d2e4a/internal/compiler/processingDiagnostic.go,
119
- * and {@link MISSING_GLOBAL_TYPE}, which the checker reports.
120
- */
121
- const UNFOUND_LIBRARY: ReadonlySet<number> = new Set([2318, 2688, 2726, 2727]);
122
-
123
- /**
124
- * The code of a global type the checker finds in no library the program holds. The checker
125
- * types every use of one against nothing and places no error in the file, so the analysis
126
- * skips each file of such a project whole.
127
- */
128
- export const MISSING_GLOBAL_TYPE = 2318;
129
-
130
- /** The errors one open project carries, each located in the file it names. */
131
- export function projectErrors(sets: ProjectDiagnostics): ProjectErrors {
132
- // The compiler numbers its semantic messages from 2000 and its option messages from
133
- // 5000. A file-less option error, a removed option or an output layout, leaves the
134
- // program whole, and the compiler checks it all the same:
135
- // https://github.com/microsoft/TypeScript/wiki/Coding-guidelines#diagnostic-message-codes
136
- const semantic = sets.unplaced.filter(
137
- (diagnostic) => isError(diagnostic) && diagnostic.code >= 2000 && diagnostic.code < 3000,
138
- );
139
- const unfound = semantic.filter(({ code }) => UNFOUND_LIBRARY.has(code));
140
- const load = [
141
- ...sets.configParsing.filter(isError),
142
- ...semantic.filter(({ code }) => !UNFOUND_LIBRARY.has(code)),
143
- ];
144
- return {
145
- load: locatedIn(load, sets.locate),
146
- check: load.length > 0 ? [] : locatedIn(diagnosticErrors(sets), sets.locate),
147
- unfound: load.length > 0 ? [] : locatedIn(unfound, sets.locate),
148
- };
149
- }
150
-
151
- /** One project a run analyzes. */
152
- interface DiscoveredProject {
153
- /**
154
- * The name a run gives the project: the identifier the build matrix declares for
155
- * it, or, for a project discovery derived, its configuration file's path below the
156
- * target root. A derived project whose file is not below the target root is named
157
- * by the file's absolute path, the one spelling it has.
158
- */
159
- readonly id: string;
160
- /** The compiler configuration file the project is opened from, absolute. */
161
- readonly configFile: string;
162
- }
163
-
164
- /**
165
- * One project discovery derived and the run could not build, with the first line of
166
- * the error that dropped it.
167
- */
168
- export interface NotBuilt {
169
- /** The name the project would have carried, as {@link DiscoveredProject.id} spells it. */
170
- readonly id: string;
171
- /** The compiler configuration file, absolute. */
172
- readonly configFile: string;
173
- /**
174
- * The error's first line, every path below the target root spelled relative to it, so
175
- * a report naming it carries no path of the machine it ran on.
176
- */
177
- readonly error: string;
178
- }
179
-
180
- /**
181
- * The first line of one error about the target, every mention of the target root
182
- * spelled relative to it: a path below the root loses the root and its separator, and
183
- * the root itself is `.`.
184
- */
185
- export function targetRelative(text: string, targetRoot: string): string {
186
- const root = targetRoot.endsWith("/") ? targetRoot.slice(0, -1) : targetRoot;
187
- const [first = ""] = text.split(/\r?\n/u);
188
- const spelled = first.split(`${root}/`).join("").split(root).join(".").trim();
189
- return spelled === "" ? "the configuration could not be built" : spelled;
190
- }
191
-
192
- /**
193
- * Whether one configuration is the analyzer's own guess: discovery derived it and the
194
- * scope did not name it. A guess that does not load is dropped; any other ends the run.
195
- */
196
- export function isGuess(discovery: Discovery, configFile: string): boolean {
197
- return discovery.derived && !discovery.fromScope.includes(configFile);
198
- }
199
-
200
- /** Every project discovery found, and where each came from. */
201
- interface Discovery {
202
- /** The projects, in discovery order, each once. */
203
- readonly projects: readonly DiscoveredProject[];
204
- /**
205
- * Whether discovery derived the projects rather than reading them from a declared
206
- * matrix. A derived project that fails to load is dropped and named in
207
- * {@link Discovery.notBuilt}; a declared one ends the run.
208
- */
209
- readonly derived: boolean;
210
- /** The derived configurations the compiler could not read, in discovery order. */
211
- readonly notBuilt: readonly NotBuilt[];
212
- /** The configuration file of each project, in the same order. */
213
- readonly configFiles: readonly string[];
214
- /**
215
- * The files the scope named, which are the ones a derivation reads first. A
216
- * declared matrix reads none of them.
217
- */
218
- readonly fromScope: readonly string[];
219
- }
220
-
221
- /**
222
- * The configuration files below `root`, in ascending path order, skipping an
223
- * ignored directory. A directory that cannot be read is skipped: a tree the
224
- * analysis may not enter names no project.
225
- */
226
- function configFilesUnder(host: Host, root: string): string[] {
227
- const found: string[] = [];
228
- const pending = [root];
229
- while (pending.length > 0) {
230
- const dir = pending.pop();
231
- if (dir === undefined) {
232
- break;
233
- }
234
- let entries: readonly { readonly name: string; readonly directory: boolean }[];
235
- try {
236
- entries = host.readDirectory(dir);
237
- } catch {
238
- continue;
239
- }
240
- for (const entry of [...entries].sort((a, b) => (a.name < b.name ? -1 : 1))) {
241
- const path = joinPath(dir, entry.name);
242
- if (entry.directory) {
243
- if (!IGNORED_DIRECTORIES.has(entry.name)) {
244
- pending.push(path);
245
- }
246
- continue;
247
- }
248
- if (CONFIG_FILE.test(entry.name)) {
249
- found.push(path);
250
- }
251
- }
252
- }
253
- return found.sort();
254
- }
255
-
256
- /**
257
- * The configuration file the scope names for the target directly, where its path
258
- * names one rather than a directory. A target naming a directory is reached by the
259
- * walk over that directory instead. A consumer's projects are a consumer's, never the
260
- * target's, so no consumer path is read here.
261
- */
262
- function scopeConfigFiles(host: Host, scope: Scope): string[] {
263
- return [scope.target.path]
264
- .filter((path) => path.endsWith(".json"))
265
- .map((path) => resolvePath(host.workingDirectory(), path));
266
- }
267
-
268
- /**
269
- * Every configuration file reached from `pending`, in the order discovery reads them:
270
- * each once, each followed by the configurations it references that `follows` admits,
271
- * transitively. A configuration the compiler cannot read ends the run naming it, unless
272
- * `unreadable` is given, which is then told the configuration and why, and the walk
273
- * goes on without it.
274
- */
275
- function derivedFrom(
276
- engine: Engine,
277
- host: Host,
278
- pending: string[],
279
- follows: (reference: string) => boolean,
280
- unreadable?: (configFile: string, reason: string) => void,
281
- ): string[] {
282
- const seen = new Set<string>();
283
- const found: string[] = [];
284
- while (pending.length > 0) {
285
- const configFile = pending.shift();
286
- if (configFile === undefined) {
287
- break;
288
- }
289
- const path = resolvePath(host.workingDirectory(), configFile);
290
- if (seen.has(path)) {
291
- continue;
292
- }
293
- seen.add(path);
294
- const read = readConfiguration(engine, path);
295
- if ("reason" in read) {
296
- if (unreadable === undefined) {
297
- throw new DiscoveryError(
298
- `${path} cannot be read as a compiler configuration: ${read.reason}`,
299
- [],
300
- );
301
- }
302
- unreadable(path, read.reason);
303
- continue;
304
- }
305
- found.push(path);
306
- pending.push(...read.references.filter(follows));
307
- }
308
- return found;
309
- }
310
-
311
- /**
312
- * The compiler configurations one consumer is loaded through: every one under its
313
- * root that is not inside an ignored directory, and the configurations each of those
314
- * references, transitively, in that order. A root that is absent, that is no
315
- * directory, or that holds no configuration ends the run naming it, because a
316
- * finding computed without a declared consumer would claim a reference set the run
317
- * never read.
318
- */
319
- export function consumerProjects(engine: Engine, host: Host, root: string): readonly string[] {
320
- const kind = host.kindOf(root);
321
- if (kind === "absent") {
322
- throw new SetupError([
323
- {
324
- setupClass: "missing-consumer",
325
- detail: `the scope declares the consumer ${root}, and nothing is at that path: check the consumer out at ${root} and install its dependencies`,
326
- },
327
- ]);
328
- }
329
- if (kind !== "directory") {
330
- throw new DiscoveryError(`the consumer ${root} is not a directory`, []);
331
- }
332
- const found = derivedFrom(engine, host, configFilesUnder(host, root), () => true);
333
- if (found.length === 0) {
334
- throw new DiscoveryError(
335
- `the consumer ${root} holds no compiler configuration, so none of its references can be read`,
336
- [],
337
- );
338
- }
339
- return found;
340
- }
341
-
342
- /**
343
- * The name a derived project carries: its configuration file's path below the target
344
- * root, or the absolute path of a file outside it.
345
- */
346
- function derivedId(targetRoot: string, configFile: string): string {
347
- return relativePath(targetRoot, configFile) ?? configFile;
348
- }
349
-
350
- /**
351
- * The code of a configuration whose `extends` chain returns to a configuration it already
352
- * passed. The parse reports it and returns, and a snapshot opened from it never answers:
353
- * https://github.com/microsoft/TypeScript/issues/64754
354
- */
355
- const CIRCULAR_EXTENDS = 18000;
356
-
357
- type Parsed = ReturnType<Engine["parseConfigFile"]>;
358
-
359
- /** The configuration files one parsed configuration's own `extends` names by path. */
360
- function extendedPaths(parsed: Parsed, configFile: string): readonly string[] {
361
- const { raw } = parsed as { readonly raw?: unknown };
362
- const named: unknown = typeof raw === "object" && raw !== null ? Reflect.get(raw, "extends") : [];
363
- return (Array.isArray(named) ? named : [named])
364
- .filter((one): one is string => typeof one === "string")
365
- .filter((one) => one.startsWith("./") || one.startsWith("../") || isAbsolutePath(one))
366
- .map((one) => resolvePath(dirnamePath(configFile), one));
367
- }
368
-
369
- /**
370
- * The `extends` chain from `configFile` to the first configuration it reaches twice, each
371
- * link by path, or undefined where no chain written by path returns.
372
- */
373
- function extendsCycle(
374
- engine: Engine,
375
- configFile: string,
376
- parsed: Parsed,
377
- ): readonly string[] | undefined {
378
- const walk = (chain: readonly string[], at: Parsed): readonly string[] | undefined => {
379
- for (const next of extendedPaths(at, chain.at(-1) ?? configFile)) {
380
- if (chain.includes(next)) {
381
- return [...chain, next];
382
- }
383
- let read: Parsed;
384
- try {
385
- read = engine.parseConfigFile(next);
386
- } catch {
387
- continue;
388
- }
389
- const cycle = walk([...chain, next], read);
390
- if (cycle !== undefined) {
391
- return cycle;
392
- }
393
- }
394
- return undefined;
395
- };
396
- return walk([configFile], parsed);
397
- }
398
-
399
- /** The configuration files one parsed configuration's `references` name. */
400
- function referencesOf(parsed: Parsed): readonly string[] {
401
- // The parse answers a directory reference as the directory; the compiler reads a
402
- // path not ending `.json` as its `tsconfig.json`:
403
- // https://github.com/microsoft/typescript-go/blob/89d5d5b2849a0db0957065889ca58536fa6d2e4a/internal/core/projectreference.go#L18
404
- return (parsed.projectReferences ?? []).map(({ path }) =>
405
- path.endsWith(".json") ? path : joinPath(path, "tsconfig.json"),
406
- );
407
- }
408
-
409
- /** Why one parsed configuration's own `extends` chain cannot be opened, where it is circular. */
410
- function circularity(engine: Engine, configFile: string, parsed: Parsed): string | undefined {
411
- const chain = extendsCycle(engine, configFile, parsed);
412
- if (chain === undefined && !parsed.errors.some(({ code }) => code === CIRCULAR_EXTENDS)) {
413
- return undefined;
414
- }
415
- return `TS${String(CIRCULAR_EXTENDS)}: Circularity detected while resolving configuration: ${(chain ?? [configFile]).join(" -> ")}`;
416
- }
417
-
418
- /**
419
- * Why a configuration the `references` reach, transitively, cannot be opened, where one's
420
- * `extends` chain is circular: the compiler opens every referenced project with the one
421
- * that references it.
422
- */
423
- function referencedCircularity(
424
- engine: Engine,
425
- references: readonly string[],
426
- visited: Set<string>,
427
- ): string | undefined {
428
- for (const reference of references) {
429
- if (visited.has(reference)) {
430
- continue;
431
- }
432
- visited.add(reference);
433
- let parsed: Parsed;
434
- try {
435
- parsed = engine.parseConfigFile(reference);
436
- } catch {
437
- continue;
438
- }
439
- const reason =
440
- circularity(engine, reference, parsed) ??
441
- referencedCircularity(engine, referencesOf(parsed), visited);
442
- if (reason !== undefined) {
443
- return reason;
444
- }
445
- }
446
- return undefined;
447
- }
448
-
449
- /**
450
- * The configuration files one configuration's `references` name, or why the compiler
451
- * cannot read the configuration: it throws, or its `extends` chain or that of a
452
- * configuration it references is circular, which the analysis refuses before any
453
- * snapshot is asked to open it.
454
- */
455
- function readConfiguration(
456
- engine: Engine,
457
- configFile: string,
458
- ): { readonly references: readonly string[] } | { readonly reason: string } {
459
- try {
460
- const parsed = engine.parseConfigFile(configFile);
461
- const references = referencesOf(parsed);
462
- const reason =
463
- circularity(engine, configFile, parsed) ??
464
- referencedCircularity(engine, references, new Set([configFile]));
465
- return reason === undefined ? { references } : { reason };
466
- } catch (error: unknown) {
467
- return { reason: error instanceof Error ? error.message : String(error) };
468
- }
469
- }
470
-
471
- /**
472
- * The references of one compiler configuration file, or ends the run naming it: a
473
- * project opened from a configuration the compiler cannot read would be analyzed with
474
- * no type information.
475
- */
476
- function parseOrRefuse(engine: Engine, configFile: string, named: string): readonly string[] {
477
- const read = readConfiguration(engine, configFile);
478
- if ("reason" in read) {
479
- throw new DiscoveryError(
480
- `${named} cannot be read as a compiler configuration: ${read.reason}`,
481
- [],
482
- );
483
- }
484
- return read.references;
485
- }
486
-
487
- /**
488
- * The projects a build matrix declares, in its order, each entry a file below the target
489
- * root: an entry naming an absent file, a directory or a file the compiler cannot read
490
- * ends the run naming it, and one naming an earlier entry's file adds nothing. A
491
- * reference below the root the matrix does not name ends the run naming both, because the
492
- * compiler builds a referenced project's sources into the referencing program without
493
- * reporting their diagnostics. A reference outside the root is an outside project.
494
- */
495
- function declaredProjects(
496
- engine: Engine,
497
- host: Host,
498
- targetRoot: string,
499
- entries: readonly ProjectConfiguration[],
500
- ): Discovery {
501
- const seen = new Set<string>();
502
- const projects: DiscoveredProject[] = [];
503
- const references = new Map<string, readonly string[]>();
504
- for (const entry of entries) {
505
- const configFile = joinPath(targetRoot, entry.project);
506
- const named = `the project ${JSON.stringify(entry.id)} (${configFile})`;
507
- const kind = host.kindOf(configFile);
508
- if (kind !== "file") {
509
- throw new DiscoveryError(
510
- kind === "absent"
511
- ? `${named} does not exist`
512
- : `${named} is a directory, and a project names its compiler configuration file`,
513
- [],
514
- );
515
- }
516
- if (seen.has(configFile)) {
517
- continue;
518
- }
519
- seen.add(configFile);
520
- references.set(configFile, parseOrRefuse(engine, configFile, named));
521
- projects.push({ id: entry.id, configFile });
522
- }
523
- for (const project of projects) {
524
- const unnamed = references
525
- .get(project.configFile)
526
- ?.find((path) => !seen.has(path) && relativePath(targetRoot, path) !== undefined);
527
- if (unnamed !== undefined) {
528
- throw new DiscoveryError(
529
- `the project ${JSON.stringify(project.id)} (${project.configFile}) references ` +
530
- `${unnamed}, which the build matrix does not name. A referenced project is built ` +
531
- "into the program that references it, so the matrix names it too",
532
- [],
533
- );
534
- }
535
- }
536
- return {
537
- projects,
538
- derived: false,
539
- notBuilt: [],
540
- configFiles: projects.map((project) => project.configFile),
541
- fromScope: [],
542
- };
543
- }
544
-
545
- /**
546
- * The projects a run derives where the matrix declares none, in discovery order: the
547
- * paths the scope names, every compiler configuration under the target root outside an
548
- * ignored directory, then each configuration below the root those reference,
549
- * transitively, each once. A reference outside the root is an outside project, whose
550
- * sources the compiler builds into the referencing program. A configuration the scope
551
- * names ends the run where it cannot be read; one the walk found is dropped and named.
552
- */
553
- function derivedProjects(engine: Engine, host: Host, scope: Scope): Discovery {
554
- const targetRoot = scope.target.path;
555
- const fromScope = scopeConfigFiles(host, scope);
556
- const notBuilt: NotBuilt[] = [];
557
- const rootDir = resolvePath(
558
- host.workingDirectory(),
559
- fromScope.length > 0 ? dirnamePath(targetRoot) : targetRoot,
560
- );
561
- const configFiles = derivedFrom(
562
- engine,
563
- host,
564
- [...fromScope, ...configFilesUnder(host, targetRoot)],
565
- (reference) => relativePath(rootDir, reference) !== undefined,
566
- (configFile, reason) => {
567
- if (fromScope.includes(configFile)) {
568
- throw new DiscoveryError(
569
- `${configFile} cannot be read as a compiler configuration: ${reason}`,
570
- [],
571
- );
572
- }
573
- notBuilt.push({
574
- id: derivedId(targetRoot, configFile),
575
- configFile,
576
- error: targetRelative(reason, resolvePath(host.workingDirectory(), targetRoot)),
577
- });
578
- },
579
- );
580
- const projects = configFiles.map((configFile) => ({
581
- id: derivedId(targetRoot, configFile),
582
- configFile,
583
- }));
584
- return { projects, derived: true, notBuilt, configFiles, fromScope };
585
- }
586
-
587
- /**
588
- * Every project one run analyzes.
589
- *
590
- * The project entries of the build matrix, where it holds any, are the projects:
591
- * exactly those, in the order the matrix lists them, each named by its declared
592
- * identifier, as {@link declaredProjects} reads them. A matrix holding no project
593
- * entry, the empty one included, leaves discovery to derive the projects from the
594
- * scope and the target tree. A platform entry names a configuration of another
595
- * language and plays no part here.
596
- *
597
- * A configuration file the compiler cannot read is never analyzed. One the matrix or
598
- * the scope names ends the run with the failure code; a guess is dropped and named in
599
- * {@link Discovery.notBuilt}. What a configuration's own contents say is read once its
600
- * project is open, by {@link diagnosticErrors}, because a resolution carries none.
601
- *
602
- * Nothing reads a build output: a project is the files its configuration names, so a
603
- * package whose sources ship as TypeScript is analyzed as it stands.
604
- */
605
- export function discoverProjects(
606
- engine: Engine,
607
- host: Host,
608
- scope: Scope,
609
- configurations: readonly BuildConfiguration[] = [],
610
- ): Discovery {
611
- const declared = configurations.filter(
612
- (entry): entry is ProjectConfiguration => entry.shape === "project",
613
- );
614
- if (declared.length > 0) {
615
- return declaredProjects(engine, host, scope.target.path, declared);
616
- }
617
- return derivedProjects(engine, host, scope);
618
- }
619
-
620
- /**
621
- * How the snapshot reads each configuration of `configFiles` that sets `baseUrl` and
622
- * `programs` does not already describe: a configuration only the snapshot holds, which
623
- * extends it and states the `paths` {@link baseUrlPaths} gives, so its imports resolve as
624
- * the compilers before version 7 resolve them. A configuration the compiler cannot read is
625
- * left for its project to refuse.
626
- */
627
- export function withBaseUrlPaths(
628
- engine: Engine,
629
- host: Host,
630
- configFiles: readonly string[],
631
- programs: ReadonlyMap<string, WorkspaceProgram>,
632
- ): ReadonlyMap<string, WorkspaceProgram> {
633
- const found = new Map(programs);
634
- for (const configFile of configFiles) {
635
- if (found.has(configFile)) {
636
- continue;
637
- }
638
- let paths: Record<string, string[]> | undefined;
639
- try {
640
- paths = baseUrlPaths(engine.parseConfigFile(configFile).options);
641
- } catch {
642
- continue;
643
- }
644
- if (paths !== undefined) {
645
- found.set(configFile, {
646
- kind: "configuration",
647
- file: writtenPath(host, configFile),
648
- text: `${JSON.stringify({ extends: configFile, compilerOptions: { paths } }, null, 2)}\n`,
649
- });
650
- }
651
- }
652
- return found;
653
- }