You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
TypeScript 7 VS Code extension: let extensions that serve their language through content mappers opt out of the tsserver-plugin warning #64356
The TypeScript 7 VS Code extension built from packages/vscode-typescript at f29aeb9 (main, 2026-09-16), VS Code 1.138.0, macOS 26.6 x64
The warning and its exemption list are unchanged since the published TypeScriptTeam.native-preview 0.20260708.2
⏯ Playground Link
n/a (VS Code extension behaviour)
💻 Code
warnAboutTsServerPlugins in packages/vscode-typescript/src/extension.ts warns once per session, when js/ts.experimental.useTsgo is set at user level, for every installed extension whose manifest contributes typescriptServerPlugins:
TypeScript server plugins from the "TSRX.tsrx-vscode-plugin" extension will not be loaded because TypeScript 7 is enabled globally.
The only exemption is the hardcoded suppressedPluginExtensionIds set (github.copilot, github.copilot-chat).
An extension for a content-mapped language needs both mechanisms: a typescriptServerPlugins contribution so that VS Code's built-in TypeScript extension (TypeScript 5.9/6, tsserver) can serve its files, and a content mapper (declared in the project's tsconfig.json under contentMappers) so that TypeScript 7 can. When TypeScript 7 is enabled, the plugin is intentionally not needed: the mapper takes over. The warning is then accurate but misleading, since the extension's language works fine.
🙁 Actual behavior
Every user of such an extension who enables TypeScript 7 globally sees a warning suggesting the extension is broken under TypeScript 7, with "Disable Native Preview in Workspace" offered as a remedy, although nothing is lost.
🙂 Expected behavior
A way for an extension to declare that its language is served through content mappers on TypeScript 7, for example a per-plugin flag on the contribution ("typescriptServerPlugins": [{ "name": "...", "contentMappers": true }] or similar), which the warning would then skip, as it skips the hardcoded ids today.
Additional information about the issue
Found while wiring the TSRX VS Code extension (tsrx-org/tsrx#135); its README currently tells users to dismiss the warning with "Don't Show Again".
A simpler solution may already exist. An extension that serves its language through content mappers calls registerContentMappers on the TypeScript 7 extension's API (the "LSP Activation" section of microsoft/typescript-go#4712), with its own extension ID. TSRX does this:
warnAboutTsServerPlugins could skip every extension ID that registered content mappers, as it skips suppressedPluginExtensionIds today. Then extensions need no manifest flag.
One timing detail: the warning check runs after the server starts and on vscode.extensions.onDidChange. An extension usually registers right after it activates the TypeScript 7 extension. So the check would need to run again after a registration, or wait for registrations briefly.
Activity
leonidaz commentedon Oct 1, 2026
A simpler solution may already exist. An extension that serves its language through content mappers calls
registerContentMapperson the TypeScript 7 extension's API (the "LSP Activation" section of microsoft/typescript-go#4712), with its own extension ID. TSRX does this:warnAboutTsServerPluginscould skip every extension ID that registered content mappers, as it skipssuppressedPluginExtensionIdstoday. Then extensions need no manifest flag.One timing detail: the warning check runs after the server starts and on
vscode.extensions.onDidChange. An extension usually registers right after it activates the TypeScript 7 extension. So the check would need to run again after a registration, or wait for registrations briefly.docs(vscode-plugin): plainer TypeScript 7 sections and a legacy setti…