mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-27 12:04:04 +01:00
Allow extensions to be able to make requests to the typescript extension's tsserver via commands (#138279)
* Allow extensions to be able to make requests to the typescript extension's tsserver via the command system * Adds allowlisting the commands Co-authored-by: Matt Bierner <matb@microsoft.com>
This commit is contained in:
@@ -8,7 +8,7 @@ import * as vscode from 'vscode';
|
||||
export interface Command {
|
||||
readonly id: string;
|
||||
|
||||
execute(...args: any[]): void;
|
||||
execute(...args: any[]): void | any;
|
||||
}
|
||||
|
||||
export class CommandManager {
|
||||
|
||||
@@ -15,6 +15,7 @@ import { OpenTsServerLogCommand } from './openTsServerLog';
|
||||
import { ReloadJavaScriptProjectsCommand, ReloadTypeScriptProjectsCommand } from './reloadProject';
|
||||
import { RestartTsServerCommand } from './restartTsServer';
|
||||
import { SelectTypeScriptVersionCommand } from './selectTypeScriptVersion';
|
||||
import { TSServerRequestCommand } from './tsserverRequests';
|
||||
|
||||
export function registerBaseCommands(
|
||||
commandManager: CommandManager,
|
||||
@@ -31,4 +32,5 @@ export function registerBaseCommands(
|
||||
commandManager.register(new JavaScriptGoToProjectConfigCommand(activeJsTsEditorTracker, lazyClientHost));
|
||||
commandManager.register(new ConfigurePluginCommand(pluginManager));
|
||||
commandManager.register(new LearnMoreAboutRefactoringsCommand());
|
||||
commandManager.register(new TSServerRequestCommand(lazyClientHost));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { TypeScriptRequests } from '../typescriptService';
|
||||
import TypeScriptServiceClientHost from '../typeScriptServiceClientHost';
|
||||
import { nulToken } from '../utils/cancellation';
|
||||
import { Lazy } from '../utils/lazy';
|
||||
import { Command } from './commandManager';
|
||||
|
||||
export class TSServerRequestCommand implements Command {
|
||||
public readonly id = 'typescript.tsserverRequest';
|
||||
|
||||
public constructor(
|
||||
private readonly lazyClientHost: Lazy<TypeScriptServiceClientHost>
|
||||
) { }
|
||||
|
||||
public execute(requestID: keyof TypeScriptRequests, args?: any, config?: any) {
|
||||
// A cancellation token cannot be passed through the command infrastructure
|
||||
const token = nulToken;
|
||||
|
||||
// The list can be found in the TypeScript compiler as `const enum CommandTypes`,
|
||||
// to avoid extensions making calls which could affect the internal tsserver state
|
||||
// these are only read-y sorts of commands
|
||||
const allowList = [
|
||||
// Seeing the JS/DTS output for a file
|
||||
'emit-output',
|
||||
// Grabbing a file's diagnostics
|
||||
'semanticDiagnosticsSync',
|
||||
'syntacticDiagnosticsSync',
|
||||
'suggestionDiagnosticsSync',
|
||||
// Introspecting code at a position
|
||||
'quickinfo',
|
||||
'quickinfo-full',
|
||||
'completionInfo'
|
||||
];
|
||||
|
||||
if (!allowList.includes(requestID)) { return; }
|
||||
return this.lazyClientHost.value.serviceClient.execute(requestID, args, token, config);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user