Skip to content

Commit eba6201

Browse files
authored
feat: make vscode extensions configurable when creating a new workspace, fixes #42 (#86)
1 parent ea65b4a commit eba6201

3 files changed

Lines changed: 139 additions & 33 deletions

File tree

drupal-core/template.tf

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,25 @@ data "coder_parameter" "install_profile" {
130130
}
131131
}
132132

133+
data "coder_parameter" "vscode_extensions" {
134+
name = "vscode_extensions"
135+
display_name = "VS Code Extensions"
136+
description = "Select extensions to enable in VS Code for Web"
137+
type = "list(string)"
138+
form_type = "multi-select"
139+
default = jsonencode([for e in var.vscode_extensions : e.id if e.default])
140+
mutable = true
141+
order = 100
142+
143+
dynamic "option" {
144+
for_each = var.vscode_extensions
145+
content {
146+
name = option.value.name
147+
value = option.value.id
148+
}
149+
}
150+
}
151+
133152

134153

135154
# Workspace data source
@@ -148,6 +167,7 @@ locals {
148167
# Determine workspace home path
149168
# Sysbox Strategy: Use standard /home/coder
150169
workspace_home = "/home/coder"
170+
selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value)
151171
issue_fork_clean = trimprefix(data.coder_parameter.issue_fork.value, "drupal-")
152172
issue_url = local.issue_fork_clean != "" ? "https://www.drupal.org/project/drupal/issues/${local.issue_fork_clean}" : ""
153173
}
@@ -165,6 +185,31 @@ locals {
165185
workspace_image_registry_base = replace(local.registry_without_version, ":latest", "")
166186
}
167187

188+
variable "vscode_extensions" {
189+
description = "List of VS Code extensions to offer in the workspace creation UI"
190+
type = list(object({
191+
id = string
192+
name = string
193+
default = bool
194+
}))
195+
default = [
196+
{ id = "xdebug.php-debug", name = "PHP Debug", default = true },
197+
{ id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true },
198+
{ id = "dbaeumer.vscode-eslint", name = "ESLint", default = true },
199+
{ id = "esbenp.prettier-vscode", name = "Prettier", default = true },
200+
{ id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true },
201+
{ id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true },
202+
{ id = "stylelint.vscode-stylelint", name = "Stylelint", default = true },
203+
{ id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true },
204+
{ id = "biati.ddev-manager", name = "DDEV Manager", default = true },
205+
{ id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false },
206+
{ id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false },
207+
{ id = "redhat.vscode-yaml", name = "YAML", default = false },
208+
{ id = "sleistner.vscode-fileutils", name = "File Utils", default = false },
209+
{ id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false },
210+
]
211+
}
212+
168213
variable "workspace_image_registry" {
169214
description = "Docker registry URL for the workspace base image (without tag, version is added automatically)"
170215
type = string
@@ -1445,17 +1490,7 @@ module "vscode-web" {
14451490
folder = "/home/coder/drupal-core"
14461491
accept_license = true
14471492
order = 2
1448-
extensions = [
1449-
"xdebug.php-debug",
1450-
"bmewburn.vscode-intelephense-client",
1451-
"dbaeumer.vscode-eslint",
1452-
"esbenp.prettier-vscode",
1453-
"sanderronde.phpstan-vscode",
1454-
"streetsidesoftware.code-spell-checker",
1455-
"stylelint.vscode-stylelint",
1456-
"valeryanm.vscode-phpsab",
1457-
"biati.ddev-manager",
1458-
]
1493+
extensions = local.selected_extensions
14591494
}
14601495

14611496
# DDEV Web Server (HTTP) - appears when DDEV project is running

freeform/template.tf

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,60 @@ variable "docker_gid" {
5959
data "coder_workspace" "me" {}
6060
data "coder_workspace_owner" "me" {}
6161

62+
# Per-workspace user parameters (shown in workspace creation UI)
63+
data "coder_parameter" "vscode_extensions" {
64+
name = "vscode_extensions"
65+
display_name = "VS Code Extensions"
66+
description = "Select extensions to enable in VS Code for Web"
67+
type = "list(string)"
68+
form_type = "multi-select"
69+
default = jsonencode([for e in var.vscode_extensions : e.id if e.default])
70+
mutable = true
71+
order = 100
72+
73+
dynamic "option" {
74+
for_each = var.vscode_extensions
75+
content {
76+
name = option.value.name
77+
value = option.value.id
78+
}
79+
}
80+
}
81+
6282
locals {
6383
workspace_home = "/home/coder"
84+
selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value)
6485
image_version = try(trimspace(file("${path.module}/VERSION")), var.image_version)
6586

6687
registry_without_version = replace(var.workspace_image_registry, ":${local.image_version}", "")
6788
workspace_image_registry_base = replace(local.registry_without_version, ":latest", "")
6889
}
6990

91+
variable "vscode_extensions" {
92+
description = "List of VS Code extensions to offer in the workspace creation UI"
93+
type = list(object({
94+
id = string
95+
name = string
96+
default = bool
97+
}))
98+
default = [
99+
{ id = "xdebug.php-debug", name = "PHP Debug", default = true },
100+
{ id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true },
101+
{ id = "dbaeumer.vscode-eslint", name = "ESLint", default = true },
102+
{ id = "esbenp.prettier-vscode", name = "Prettier", default = true },
103+
{ id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true },
104+
{ id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true },
105+
{ id = "stylelint.vscode-stylelint", name = "Stylelint", default = true },
106+
{ id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true },
107+
{ id = "biati.ddev-manager", name = "DDEV Manager", default = true },
108+
{ id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false },
109+
{ id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false },
110+
{ id = "redhat.vscode-yaml", name = "YAML", default = false },
111+
{ id = "sleistner.vscode-fileutils", name = "File Utils", default = false },
112+
{ id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false },
113+
]
114+
}
115+
70116
variable "workspace_image_registry" {
71117
description = "Docker registry URL for the workspace base image (without tag)"
72118
type = string
@@ -347,17 +393,7 @@ module "vscode-web" {
347393
folder = "/home/coder/${data.coder_workspace.me.name}"
348394
accept_license = true
349395
order = 2
350-
extensions = [
351-
"xdebug.php-debug",
352-
"bmewburn.vscode-intelephense-client",
353-
"dbaeumer.vscode-eslint",
354-
"esbenp.prettier-vscode",
355-
"sanderronde.phpstan-vscode",
356-
"streetsidesoftware.code-spell-checker",
357-
"stylelint.vscode-stylelint",
358-
"valeryanm.vscode-phpsab",
359-
"biati.ddev-manager",
360-
]
396+
extensions = local.selected_extensions
361397
}
362398

363399
# Slug matches the workspace name, which is also the DDEV project name.

user-defined-web/template.tf

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,25 @@ data "coder_workspace" "me" {}
6868

6969
# Workspace owner data source (Coder v2+)
7070
data "coder_workspace_owner" "me" {}
71+
# Per-workspace user parameters (shown in workspace creation UI)
72+
data "coder_parameter" "vscode_extensions" {
73+
name = "vscode_extensions"
74+
display_name = "VS Code Extensions"
75+
description = "Select extensions to enable in VS Code for Web"
76+
type = "list(string)"
77+
form_type = "multi-select"
78+
default = jsonencode([for e in var.vscode_extensions : e.id if e.default])
79+
mutable = true
80+
order = 100
81+
82+
dynamic "option" {
83+
for_each = var.vscode_extensions
84+
content {
85+
name = option.value.name
86+
value = option.value.id
87+
}
88+
}
89+
}
7190

7291

7392

@@ -79,6 +98,7 @@ locals {
7998
# Determine workspace home path
8099
# Sysbox Strategy: Use standard /home/coder
81100
workspace_home = "/home/coder"
101+
selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value)
82102
}
83103

84104
locals {
@@ -94,6 +114,31 @@ locals {
94114
workspace_image_registry_base = replace(local.registry_without_version, ":latest", "")
95115
}
96116

117+
variable "vscode_extensions" {
118+
description = "List of VS Code extensions to offer in the workspace creation UI"
119+
type = list(object({
120+
id = string
121+
name = string
122+
default = bool
123+
}))
124+
default = [
125+
{ id = "xdebug.php-debug", name = "PHP Debug", default = true },
126+
{ id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true },
127+
{ id = "dbaeumer.vscode-eslint", name = "ESLint", default = true },
128+
{ id = "esbenp.prettier-vscode", name = "Prettier", default = true },
129+
{ id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true },
130+
{ id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true },
131+
{ id = "stylelint.vscode-stylelint", name = "Stylelint", default = true },
132+
{ id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true },
133+
{ id = "biati.ddev-manager", name = "DDEV Manager", default = true },
134+
{ id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false },
135+
{ id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false },
136+
{ id = "redhat.vscode-yaml", name = "YAML", default = false },
137+
{ id = "sleistner.vscode-fileutils", name = "File Utils", default = false },
138+
{ id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false },
139+
]
140+
}
141+
97142
variable "workspace_image_registry" {
98143
description = "Docker registry URL for the workspace base image (without tag, version is added automatically)"
99144
type = string
@@ -525,17 +570,7 @@ module "vscode-web" {
525570
folder = "/home/coder"
526571
accept_license = true
527572
order = 2
528-
extensions = [
529-
"xdebug.php-debug",
530-
"bmewburn.vscode-intelephense-client",
531-
"dbaeumer.vscode-eslint",
532-
"esbenp.prettier-vscode",
533-
"sanderronde.phpstan-vscode",
534-
"streetsidesoftware.code-spell-checker",
535-
"stylelint.vscode-stylelint",
536-
"valeryanm.vscode-phpsab",
537-
"biati.ddev-manager",
538-
]
573+
extensions = local.selected_extensions
539574
}
540575

541576
# DDEV Web Server (HTTP) - appears when DDEV project is running

0 commit comments

Comments
 (0)