[7.1 API] Equivalent of `BuilderProgram.getAllDependencies` / batched module resolution
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
- Lĩnh vực
- api
Hướng nghiên cứu
Start by reading the Program API changes in #64247 and the builder/watch/solution-builder scope discussion in #64709, then compare the batched methods in #63904. The issue proposes either a server-side dependency graph method or batched module resolution, without choosing between them. Done means an API direction is agreed on and it addresses the per-import IPC cost and project-reference redirects described here.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
🔍 Search Terms
getAllDependencies, dependency graph, getResolvedModule, batched, 7.1 API, typescript/sync, typescript/async
✅ Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ Suggestion
In TypeScript ≤ 6, BuilderProgram.getAllDependencies(sourceFile) returned the transitive set of files a given source file depends on (module imports, /// <reference path>, type reference directives, and project-reference redirects).
With the 7.1 beta, builder/watch/solution-builder APIs are explicitly out of scope for stable (#64709), so there is no equivalent. The building blocks are mostly present (program.getSourceFileNames(), program.getSourceFile(), and the new program.getResolvedModule() / getResolvedTypeReferenceDirective() from #64247), but reconstructing the dependency graph requires one IPC round-trip per import per file, which gets expensive quickly on larger projects.
I'd like to request one (or both) of the following:
- A dependency-graph method on
Program— e.g.program.getAllDependencies(sourceFile)orprogram.getDependencies(sourceFile)returning the direct/transitive dependency file names, computed server-side. - A batched resolution method — e.g.
program.getResolvedModules(sourceFile)returning all resolutions for a file in a single call, similar in spirit to the batched methods added in #63904. This would let consumers build the graph themselves with one call per file instead of one call per import.
Option 1 is the ergonomic fit for the old API; option 2 is a smaller primitive and can be used independently.
📃 Motivating Example
I use getAllDependencies in StrykerJS to identify inrelated files and use that to implement mutant grouping (a roughly 50% performance improvement over single mutant validation). Migrating to 7.1 currently means re-implementing the traversal client-side.
Current client-side reconstruction (7.1 beta) (using AI)
import { API } from "typescript/sync";
function getAllDependencies(program: Program, rootFileName: string) {
const seen = new Set<string>();
const queue = [rootFileName];
while (queue.length) {
const fileName = queue.pop()!;
if (seen.has(fileName)) continue;
seen.add(fileName);
const sf = program.getSourceFile(fileName);
if (!sf) continue;
// One round-trip per import
for (const imp of sf.imports) {
const r = program.getResolvedModule(sf, imp.text /*, mode */);
if (r?.resolvedModule) queue.push(r.resolvedModule.resolvedFileName);
}
// One round-trip per type reference directive
for (const ref of sf.typeReferenceDirectives) {
const r = program.getResolvedTypeReferenceDirective(sf, ref.fileName);
if (r?.resolvedTypeReferenceDirective?.resolvedFileName) {
queue.push(r.resolvedTypeReferenceDirective.resolvedFileName);
}
}
for (const ref of sf.referencedFiles) {
queue.push(resolve(dirname(fileName), ref.fileName));
}
}
seen.delete(rootFileName);
return [...seen];
}
Issues with this approach:
- Round-trip count scales with total import count, not file count.
- Project-reference output redirects (handled by the old builder method) have to be reimplemented manually.
- Resolution mode (
ESNextvsCommonJS) must be derived client-side per import.
💻 Use Cases
- What do you want to use this for?
Generate a list of unrelated files so we can validate multiple mutants in a single type-check run.
- What shortcomings exist with current approaches?
Per-import IPC calls make the client-side traversal slow on large graphs, and project-reference redirects are easy to get subtly wrong.
- What workarounds are you using in the meantime?
The reconstruction above.
- Ngôn ngữ chính
- Go
- Star
- 112k
- Fork
- 15.4k
- Merge trung bình
- 2 ngày 21 giờ
- Pull request đã merge (30 ngày)
- 126
Chuẩn bị môi trường
Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của microsoft/TypeScript
-
Won't Fix
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
microsoft/TypeScript#65107 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Native API: formatDiagnosticsWithColorAndContext drops related information without a file locationCó thể đã có người làm @timurzvural đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
microsoft/TypeScript#65087 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
TS7 LSP: documentHighlight returns nothing when the file path contains '@'Có thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởBug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
microsoft/TypeScript#64758 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Language server (tsc --lsp) exits with code 1 after `shutdown` and `exit`Có thể đã có người làm @rajnish-verma-22172 đã nhận 12 ngày trước. Đang mởBug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
microsoft/TypeScript#64742 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Class names `eval` and `arguments` are not reported as invalid strict mode bindingsCó thể đã có người làm @dmety đã nhận 26 ngày trước. Đang mởBug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
microsoft/TypeScript#64661 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của microsoft/TypeScript
Issue tương tự
-
bug good first issue help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
-
[mesheryctl] design delete fails when passing file or URL as positional argumentCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởcomponent/mesheryctl kind/bug language/go
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
meshery/meshery#22772 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
backend security size:S
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
limitlessprojects/Go-Hybrid#3342 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
status/ready type/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
buildpacks/pack#2733 ·
Maintainer thường phản hồi trong vòng 1 ngày