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:
Orta Therox
2021-12-07 22:42:47 +00:00
committed by GitHub
parent 21e0035bdb
commit fc4f41d9fc
4 changed files with 48 additions and 2 deletions

View File

@@ -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 {

View File

@@ -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));
}

View File

@@ -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);
}
}