File changed on disk with a content-mapped or `.d.ts` extension never triggers workspace/diagnostic/refresh

Aberta
#64,943 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@mrlubos já está trabalhando nisso.

Desde 23/10/2026.

  • #64944 de @mrlubos — aberto

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
javascript, node.js, typescript

Direção de pesquisa

Start with the change in #64159 and trace Session.DidChangeWatchedFiles, path.Extension(), and the content mapper extension check described in the issue. Use the linked repro repository with npm install && npm run repro to compare changes to dep.ts, shape.data, and an open shape.data file. Done when disk changes to mapped files and .d.ts files trigger diagnostic refreshes.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

🔎 Search Terms

"content mapper", "contentMappers", "workspace/diagnostic/refresh", "didChangeWatchedFiles", "isRelevantExtension", "stale diagnostics", "restart TS server", ".d.ts"

🕗 Version & Regression Information
  • This changed in #64159, which switched Session.DidChangeWatchedFiles from taking everything after the last dot to path.Extension(). Seen on [email protected].
⏯ Playground Link

No response

💻 Code

Repro: https://github.com/mrlubos/ts-content-mapper-refresh (npm install && npm run repro)

// tsconfig.json
{ "compilerOptions": { "module": "nodenext", "strict": true, "noEmit": true },
  "contentMappers": [{ "package": "toy-mapper", "extensions": [".data"] }] }
// index.ts. toy-mapper turns each `name: type` line of shape.data into a member of `Data`.
import type { Dep } from './dep.js';
import type { Data } from './shape.data';
declare const dep: Dep;
declare const data: Data;
export const fromTs = dep.age;     // error until `age` is added to dep.ts
export const fromData = data.age;  // error until `age: number` is added to shape.data
🙁 Actual behavior

After shape.data changes on disk (written by another process, with the editor sending workspace/didChangeWatchedFiles), the server never sends workspace/diagnostic/refresh. In VS Code the error on data.age stays until "TypeScript: Restart TS Server". The server already has the right answer: a textDocument/diagnostic request made by hand returns no errors. npm run repro drives tsc --lsp as VS Code does and prints:

  1. dep.ts changed on disk, refresh requests: 1
  2. shape.data changed on disk, refresh requests: 0
    errors when pulled by hand: []
  3. shape.data edited while open, refresh requests: 1
🙂 Expected behavior

A change on disk to a file a registered content mapper handles should refresh diagnostics the way a change to a .ts file does, since it changes the program. This matters most when a tool regenerates the mapped file, for example a dev server writing an API description on each reload, because the editor never has that file open.

Additional information about the issue

path.Extension() returns only the extensions TypeScript reads itself. For shape.data it returns "", so the path is treated as a possible directory: DirectoryExists is false and the change is dropped. The check against the extensions a project's contentMappers register is in the else branch, which a mapped extension never reaches.

The same change breaks .d.ts files: path.Extension() returns .d.ts, which isRelevantExtension does not list, so a declaration file changed on disk does not refresh diagnostics either.

A workaround for mapped files is to keep the file open in an editor tab, so VS Code reloads it and sends didChange.

Linguagem predominante
Go
Estrelas
112k
Forks
15.4k
Merge médio
3d 6h
PRs com merge (30d)
136

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de microsoft/TypeScript

Todas as issues de microsoft/TypeScript

Issues semelhantes

Mais issues de Go

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.