From ae279c717de6f0fd63e5989bf243a36b251afe7b Mon Sep 17 00:00:00 2001 From: Asher Date: Wed, 15 May 2024 14:10:07 -0800 Subject: [PATCH] Add open recent option to VS Code desktop --- vscode-desktop/main.test.ts | 44 ++++++++++++++++++++++++++++++++++++- vscode-desktop/main.tf | 21 +++++++++--------- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/vscode-desktop/main.test.ts b/vscode-desktop/main.test.ts index 53fba967..fa937f87 100644 --- a/vscode-desktop/main.test.ts +++ b/vscode-desktop/main.test.ts @@ -18,13 +18,55 @@ describe("vscode-desktop", async () => { agent_id: "foo", }); expect(state.outputs.vscode_url.value).toBe( - "vscode://coder.coder-remote/open?owner=default&workspace=default&token=$SESSION_TOKEN", + "vscode://coder.coder-remote/open?owner=default&workspace=default&url=https://mydeployment.coder.com&token=$SESSION_TOKEN", ); const resources: any = state.resources; expect(resources[1].instances[0].attributes.order).toBeNull(); }); + it("adds folder", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + folder: "/foo/bar", + }); + expect(state.outputs.vscode_url.value).toBe( + "vscode://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN", + ); + }); + + it("adds folder and open_recent", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + folder: "/foo/bar", + open_recent: true, + }); + expect(state.outputs.vscode_url.value).toBe( + "vscode://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN", + ); + }); + + it("adds folder but not open_recent", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + folder: "/foo/bar", + openRecent: false, + }); + expect(state.outputs.vscode_url.value).toBe( + "vscode://coder.coder-remote/open?owner=default&workspace=default&folder=/foo/bar&url=https://mydeployment.coder.com&token=$SESSION_TOKEN", + ); + }); + + it("adds open_recent", async () => { + const state = await runTerraformApply(import.meta.dir, { + agent_id: "foo", + open_recent: true, + }); + expect(state.outputs.vscode_url.value).toBe( + "vscode://coder.coder-remote/open?owner=default&workspace=default&openRecent&url=https://mydeployment.coder.com&token=$SESSION_TOKEN", + ); + }); + it("expect order to be set", async () => { const state = await runTerraformApply(import.meta.dir, { agent_id: "foo", diff --git a/vscode-desktop/main.tf b/vscode-desktop/main.tf index 7a0a0528..15af533e 100644 --- a/vscode-desktop/main.tf +++ b/vscode-desktop/main.tf @@ -20,6 +20,12 @@ variable "folder" { default = "" } +variable "open_recent" { + type = bool + description = "Open the most recent workspace or folder. Falls back to the folder if there is no recent workspace or folder to open." + default = false +} + variable "order" { type = number description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)." @@ -35,22 +41,17 @@ resource "coder_app" "vscode" { slug = "vscode" display_name = "VS Code Desktop" order = var.order - url = var.folder != "" ? join("", [ - "vscode://coder.coder-remote/open?owner=", + url = join("", [ + "vscode://coder.coder-remote/open", + "?owner=", data.coder_workspace.me.owner, "&workspace=", data.coder_workspace.me.name, - "&folder=", - var.folder, + var.folder != "" ? join("", ["&folder=", var.folder]) : "", + var.open_recent ? "&openRecent" : "", "&url=", data.coder_workspace.me.access_url, "&token=$SESSION_TOKEN", - ]) : join("", [ - "vscode://coder.coder-remote/open?owner=", - data.coder_workspace.me.owner, - "&workspace=", - data.coder_workspace.me.name, - "&token=$SESSION_TOKEN", ]) }