microsoft / microsoft/TypeScript
Feature request: machine-readable (JSONL) diagnostics output
还没有人认领这个 Issue。
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 132
描述
Background
Type-checking integrations that run alongside a dev server - e.g., vite-plugin-checker, or a NestJS-style backend that auto-restarts once a change type-checks cleanly - need to know, after every file change, whether the project currently has type errors. There are a few ways to get that from tsc today, but they have downsides:
- Re-run
tsc --noEmiton each change. Simple to consume (process exit code), but every run is a cold check - no incremental reuse - so it's slow on a real codebase and adds latency to every save, especially on a large codebase or many changes back to back. - Run
tsc --watch --noEmitonce and parse its stdout. This is the fast path: the watcher reuses program state and only rechecks what changed. But the output is built for humans, not machines. This causes code like this. While this is faster, it's not ideal, as any changes to the response structure or copy will cause the script to break.
As a side QOL improvement, it will allow for easier logging of the errors in CI/CD - instead of trying to figure out multiline errors, it can now be easily streamed into monitoring systems.
Proposal
A single flag that switches the entire console output stream to JSONL. This is deliberately all-or-nothing: when enabled, nothing is written as free text, so a consumer can readline → JSON.parse every line without a parser mode-switch. This also composes with --watch and --noEmit, which reuse the same reporters.
Examples of proposed output:
{"type":"diagnostic","category":"error","code":2304,"file":"src/a.ts","start":{"line":3,"character":9},"end":{"line":3,"character":12},"message":"Cannot find name 'foo'.","relatedInformation":[]}
{"type":"summary","errors":1,"warnings":0}
{"type":"status","code":6032,"message":"File change detected. Starting incremental compilation..."}
{"type":"diagnostic","category":"error","code":2304,"file":"src/a.ts","start":{"line":3,"character":9},"end":{"line":3,"character":12},"message":"Cannot find name 'foo'.","relatedInformation":[]}
{"type":"summary","errors":0,"warnings":0}
Flag
Off the top of my head, there are a couple of ways to name the flag:
--json- while this repeats the same approach as--pretty, it can be confused with other configurations likeresolveJsonModule.--pretty json- convert--prettyfrom a simple boolean to an advanced combo of boolean and enum. The side problem is that currently, the tsconfig.json fieldprettyis a boolean, and at first glance, there are no union types in the JSON parser and validator.--diagnosticsFormat json- the most distinct option, but can confuse when the user tries to use--prettyand json.
To my personal taste, it looks like microsoft/typescript-go#2 is the best option. I'm not a maintainer of this codebase, so I will leave it to core contributors to decide.
stdout vs stderr
It might make sense to split into 2 streams for easier logging.
Implementation
With my limited knowledge of the codebase, I can see that it is possible to implement it by creating a new flag + adding an additional formatter in diagnostics.go.
I can work on a PR for this, but I need to know the decision about the flag before I try to implement it.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
先阅读 diagnostics.go 以及现有的 --pretty 和 --noEmit 处理逻辑。在实现额外的 formatter 之前,先与 maintainer 确定 flag 命名以及 stdout/stderr 的行为。完成的标准是:所选模式能够一致地输出机器可读的 JSONL,其中包括 diagnostics、summaries 和 watch 状态消息。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- go, typescript
- 领域
- cli, tooling
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100