diff --git a/src/npm-packages/devcontainer-feature.json b/src/npm-packages/devcontainer-feature.json index 7c38a762f..2981e9c8f 100644 --- a/src/npm-packages/devcontainer-feature.json +++ b/src/npm-packages/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "npm-packages", - "version": "1.0.0", + "version": "1.0.1", "name": "npm-packages", "documentationURL": "http://github.com/devcontainers-extra/features/tree/main/src/npm-packages", "description": "", diff --git a/src/npm-packages/install.sh b/src/npm-packages/install.sh index 6600bad1d..e444d2e70 100755 --- a/src/npm-packages/install.sh +++ b/src/npm-packages/install.sh @@ -16,13 +16,16 @@ IFS=',' read -ra PACKAGE_ARRAY <<<"$PACKAGES" # Iterate through each package for package in "${PACKAGE_ARRAY[@]}"; do - # Check if package contains version - if [[ $package == *@* ]]; then - # Split package into name and version - name=${package%@*} - version=${package#*@} + # Use regex to match valid npm package identifier + # unscoped, unscoped@version, @scoped, @scoped@version + if [[ $package =~ ^(@?[^@]+?)(@(.+?))?$ ]]; then + name="${BASH_REMATCH[1]}" + version="${BASH_REMATCH[3]}" + # Bash doesn't have non-capturing groups so @version portion can + # only be made optional inside a group, then a nested group captures + # the version number itself. else - # Package without version + # Fallback for any invalid package identifiers name=$package version="" fi diff --git a/test/npm-packages/scenarios.json b/test/npm-packages/scenarios.json index d5363099d..d9581aec6 100644 --- a/test/npm-packages/scenarios.json +++ b/test/npm-packages/scenarios.json @@ -3,7 +3,7 @@ "image": "mcr.microsoft.com/devcontainers/base:debian", "features": { "npm-packages": { - "packages": "eslint@9.20.1,nodemon,prettier@3.5.2" + "packages": "eslint@9.20.1,nodemon,prettier@3.5.2,@angular/cli@19.2.1,@biomejs/biome" } } } diff --git a/test/npm-packages/test_debian_versions.sh b/test/npm-packages/test_debian_versions.sh index 4463caa7e..cb688c17d 100755 --- a/test/npm-packages/test_debian_versions.sh +++ b/test/npm-packages/test_debian_versions.sh @@ -7,5 +7,7 @@ source dev-container-features-test-lib check "eslint version is equal to 9.20.1" bash -c "eslint --version | grep 'v9.20.1'" check "nodemon is installed" nodemon --version check "prettier version is equal to 3.5.2" bash -c "prettier --version | grep '3.5.2'" +check "@angular/cli version is equal to 19.2.1" bash -c "ng --version | grep '19.2.1'" +check "@biomejs/biome is installed" biome --version reportResults