diff --git a/src/harness/unittests/session.ts b/src/harness/unittests/session.ts index 9912294d1d2..75660f75f32 100644 --- a/src/harness/unittests/session.ts +++ b/src/harness/unittests/session.ts @@ -169,6 +169,19 @@ namespace ts.server { allowNonTsExtensions: true // injected by tsserver }); }); + + it("Status request gives ts.version", () => { + const req: protocol.StatusRequest = { + command: CommandNames.Status, + seq: 0, + type: "request" + }; + + const expected: protocol.StatusResponseBody = { + version: ts.version + }; + assert.deepEqual(session.executeCommand(req).response, expected); + }); }); describe("onMessage", () => { @@ -220,6 +233,7 @@ namespace ts.server { CommandNames.Saveto, CommandNames.SignatureHelp, CommandNames.SignatureHelpFull, + CommandNames.Status, CommandNames.TypeDefinition, CommandNames.ProjectInfo, CommandNames.ReloadProjects, diff --git a/src/server/protocol.ts b/src/server/protocol.ts index 6ba968dd114..2ade527e7c3 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -71,6 +71,7 @@ namespace ts.server.protocol { SignatureHelp = "signatureHelp", /* @internal */ SignatureHelpFull = "signatureHelp-full", + Status = "status", TypeDefinition = "typeDefinition", ProjectInfo = "projectInfo", ReloadProjects = "reloadProjects", @@ -216,6 +217,24 @@ namespace ts.server.protocol { projectFileName?: string; } + export interface StatusRequest extends Request { + command: CommandTypes.Status; + } + + export interface StatusResponseBody { + /** + * The TypeScript version (`ts.version`). + */ + version: string; + } + + /** + * Response to StatusRequest + */ + export interface StatusResponse extends Response { + body: StatusResponseBody; + } + /** * Requests a JS Doc comment template for a given position */ diff --git a/src/server/session.ts b/src/server/session.ts index 0eab6c9732a..744563cf321 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -1703,6 +1703,10 @@ namespace ts.server { } private handlers = createMapFromTemplate<(request: protocol.Request) => HandlerResponse>({ + [CommandNames.Status]: () => { + const response: protocol.StatusResponseBody = { version }; + return this.requiredResponse(response); + }, [CommandNames.OpenExternalProject]: (request: protocol.OpenExternalProjectRequest) => { this.projectService.openExternalProject(request.arguments, /*suppressRefreshOfInferredProjects*/ false); // TODO: GH#20447 report errors diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 2a4e97799a4..1f6dadb8b2a 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4905,6 +4905,7 @@ declare namespace ts.server.protocol { Rename = "rename", Saveto = "saveto", SignatureHelp = "signatureHelp", + Status = "status", TypeDefinition = "typeDefinition", ProjectInfo = "projectInfo", ReloadProjects = "reloadProjects", @@ -5006,6 +5007,21 @@ declare namespace ts.server.protocol { file: string; projectFileName?: string; } + interface StatusRequest extends Request { + command: CommandTypes.Status; + } + interface StatusResponseBody { + /** + * The TypeScript version (`ts.version`). + */ + version: string; + } + /** + * Response to StatusRequest + */ + interface StatusResponse extends Response { + body: StatusResponseBody; + } /** * Requests a JS Doc comment template for a given position */