From ffed0c4816eb28aa205cec4551c09e6198ba961b Mon Sep 17 00:00:00 2001 From: Pierre-Paul Lefebvre Date: Fri, 24 Apr 2026 10:44:55 -0400 Subject: [PATCH] feat: make vscode extensions configurable when creating a new workspace. Fix #42 --- drupal-core/template.tf | 57 ++++++++++++++++++++++++++++------- freeform/template.tf | 58 +++++++++++++++++++++++++++++------- user-defined-web/template.tf | 57 ++++++++++++++++++++++++++++------- 3 files changed, 139 insertions(+), 33 deletions(-) diff --git a/drupal-core/template.tf b/drupal-core/template.tf index 15e8722..d437338 100644 --- a/drupal-core/template.tf +++ b/drupal-core/template.tf @@ -130,6 +130,25 @@ data "coder_parameter" "install_profile" { } } +data "coder_parameter" "vscode_extensions" { + name = "vscode_extensions" + display_name = "VS Code Extensions" + description = "Select extensions to enable in VS Code for Web" + type = "list(string)" + form_type = "multi-select" + default = jsonencode([for e in var.vscode_extensions : e.id if e.default]) + mutable = true + order = 100 + + dynamic "option" { + for_each = var.vscode_extensions + content { + name = option.value.name + value = option.value.id + } + } +} + # Workspace data source @@ -148,6 +167,7 @@ locals { # Determine workspace home path # Sysbox Strategy: Use standard /home/coder workspace_home = "/home/coder" + selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value) issue_fork_clean = trimprefix(data.coder_parameter.issue_fork.value, "drupal-") issue_url = local.issue_fork_clean != "" ? "https://www.drupal.org/project/drupal/issues/${local.issue_fork_clean}" : "" } @@ -165,6 +185,31 @@ locals { workspace_image_registry_base = replace(local.registry_without_version, ":latest", "") } +variable "vscode_extensions" { + description = "List of VS Code extensions to offer in the workspace creation UI" + type = list(object({ + id = string + name = string + default = bool + })) + default = [ + { id = "xdebug.php-debug", name = "PHP Debug", default = true }, + { id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true }, + { id = "dbaeumer.vscode-eslint", name = "ESLint", default = true }, + { id = "esbenp.prettier-vscode", name = "Prettier", default = true }, + { id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true }, + { id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true }, + { id = "stylelint.vscode-stylelint", name = "Stylelint", default = true }, + { id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true }, + { id = "biati.ddev-manager", name = "DDEV Manager", default = true }, + { id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false }, + { id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false }, + { id = "redhat.vscode-yaml", name = "YAML", default = false }, + { id = "sleistner.vscode-fileutils", name = "File Utils", default = false }, + { id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false }, + ] +} + variable "workspace_image_registry" { description = "Docker registry URL for the workspace base image (without tag, version is added automatically)" type = string @@ -1445,17 +1490,7 @@ module "vscode-web" { folder = "/home/coder/drupal-core" accept_license = true order = 2 - extensions = [ - "xdebug.php-debug", - "bmewburn.vscode-intelephense-client", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "sanderronde.phpstan-vscode", - "streetsidesoftware.code-spell-checker", - "stylelint.vscode-stylelint", - "valeryanm.vscode-phpsab", - "biati.ddev-manager", - ] + extensions = local.selected_extensions } # DDEV Web Server (HTTP) - appears when DDEV project is running diff --git a/freeform/template.tf b/freeform/template.tf index 0119fd2..792da28 100644 --- a/freeform/template.tf +++ b/freeform/template.tf @@ -59,14 +59,60 @@ variable "docker_gid" { data "coder_workspace" "me" {} data "coder_workspace_owner" "me" {} +# Per-workspace user parameters (shown in workspace creation UI) +data "coder_parameter" "vscode_extensions" { + name = "vscode_extensions" + display_name = "VS Code Extensions" + description = "Select extensions to enable in VS Code for Web" + type = "list(string)" + form_type = "multi-select" + default = jsonencode([for e in var.vscode_extensions : e.id if e.default]) + mutable = true + order = 100 + + dynamic "option" { + for_each = var.vscode_extensions + content { + name = option.value.name + value = option.value.id + } + } +} + locals { workspace_home = "/home/coder" + selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value) image_version = try(trimspace(file("${path.module}/VERSION")), var.image_version) registry_without_version = replace(var.workspace_image_registry, ":${local.image_version}", "") workspace_image_registry_base = replace(local.registry_without_version, ":latest", "") } +variable "vscode_extensions" { + description = "List of VS Code extensions to offer in the workspace creation UI" + type = list(object({ + id = string + name = string + default = bool + })) + default = [ + { id = "xdebug.php-debug", name = "PHP Debug", default = true }, + { id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true }, + { id = "dbaeumer.vscode-eslint", name = "ESLint", default = true }, + { id = "esbenp.prettier-vscode", name = "Prettier", default = true }, + { id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true }, + { id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true }, + { id = "stylelint.vscode-stylelint", name = "Stylelint", default = true }, + { id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true }, + { id = "biati.ddev-manager", name = "DDEV Manager", default = true }, + { id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false }, + { id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false }, + { id = "redhat.vscode-yaml", name = "YAML", default = false }, + { id = "sleistner.vscode-fileutils", name = "File Utils", default = false }, + { id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false }, + ] +} + variable "workspace_image_registry" { description = "Docker registry URL for the workspace base image (without tag)" type = string @@ -347,17 +393,7 @@ module "vscode-web" { folder = "/home/coder/${data.coder_workspace.me.name}" accept_license = true order = 2 - extensions = [ - "xdebug.php-debug", - "bmewburn.vscode-intelephense-client", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "sanderronde.phpstan-vscode", - "streetsidesoftware.code-spell-checker", - "stylelint.vscode-stylelint", - "valeryanm.vscode-phpsab", - "biati.ddev-manager", - ] + extensions = local.selected_extensions } # Slug matches the workspace name, which is also the DDEV project name. diff --git a/user-defined-web/template.tf b/user-defined-web/template.tf index 2a99e8b..94d3ea5 100644 --- a/user-defined-web/template.tf +++ b/user-defined-web/template.tf @@ -68,6 +68,25 @@ data "coder_workspace" "me" {} # Workspace owner data source (Coder v2+) data "coder_workspace_owner" "me" {} +# Per-workspace user parameters (shown in workspace creation UI) +data "coder_parameter" "vscode_extensions" { + name = "vscode_extensions" + display_name = "VS Code Extensions" + description = "Select extensions to enable in VS Code for Web" + type = "list(string)" + form_type = "multi-select" + default = jsonencode([for e in var.vscode_extensions : e.id if e.default]) + mutable = true + order = 100 + + dynamic "option" { + for_each = var.vscode_extensions + content { + name = option.value.name + value = option.value.id + } + } +} @@ -79,6 +98,7 @@ locals { # Determine workspace home path # Sysbox Strategy: Use standard /home/coder workspace_home = "/home/coder" + selected_extensions = jsondecode(data.coder_parameter.vscode_extensions.value) } locals { @@ -94,6 +114,31 @@ locals { workspace_image_registry_base = replace(local.registry_without_version, ":latest", "") } +variable "vscode_extensions" { + description = "List of VS Code extensions to offer in the workspace creation UI" + type = list(object({ + id = string + name = string + default = bool + })) + default = [ + { id = "xdebug.php-debug", name = "PHP Debug", default = true }, + { id = "bmewburn.vscode-intelephense-client", name = "Intelephense", default = true }, + { id = "dbaeumer.vscode-eslint", name = "ESLint", default = true }, + { id = "esbenp.prettier-vscode", name = "Prettier", default = true }, + { id = "sanderronde.phpstan-vscode", name = "PHPStan", default = true }, + { id = "streetsidesoftware.code-spell-checker", name = "Code Spell Checker", default = true }, + { id = "stylelint.vscode-stylelint", name = "Stylelint", default = true }, + { id = "valeryanm.vscode-phpsab", name = "PHPSAB", default = true }, + { id = "biati.ddev-manager", name = "DDEV Manager", default = true }, + { id = "deque-systems.vscode-axe-linter", name = "Axe Linter", default = false }, + { id = "andrewdavidblum.drupal-smart-snippets", name = "Drupal Smart Snippets", default = false }, + { id = "redhat.vscode-yaml", name = "YAML", default = false }, + { id = "sleistner.vscode-fileutils", name = "File Utils", default = false }, + { id = "GitHub.vscode-pull-request-github", name = "GitHub Pull Requests", default = false }, + ] +} + variable "workspace_image_registry" { description = "Docker registry URL for the workspace base image (without tag, version is added automatically)" type = string @@ -525,17 +570,7 @@ module "vscode-web" { folder = "/home/coder" accept_license = true order = 2 - extensions = [ - "xdebug.php-debug", - "bmewburn.vscode-intelephense-client", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "sanderronde.phpstan-vscode", - "streetsidesoftware.code-spell-checker", - "stylelint.vscode-stylelint", - "valeryanm.vscode-phpsab", - "biati.ddev-manager", - ] + extensions = local.selected_extensions } # DDEV Web Server (HTTP) - appears when DDEV project is running