diff --git a/src/node/devcontainer-feature.json b/src/node/devcontainer-feature.json index b8d699def..e963031c4 100644 --- a/src/node/devcontainer-feature.json +++ b/src/node/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "node", - "version": "1.6.2", + "version": "1.6.3", "name": "Node.js (via nvm), yarn and pnpm", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/node", "description": "Installs Node.js, nvm, yarn, pnpm, and needed dependencies.", @@ -13,7 +13,8 @@ "none", "18", "16", - "14" + "14", + "project-file" // This will read the Node version from .node-version or .nvmrc in the project ], "default": "lts", "description": "Select or enter a Node.js version to install" diff --git a/src/node/install.sh b/src/node/install.sh index 46d448440..572311d5a 100755 --- a/src/node/install.sh +++ b/src/node/install.sh @@ -13,7 +13,6 @@ export NVM_VERSION="${NVMVERSION:-"latest"}" export NVM_DIR="${NVMINSTALLPATH:-"/usr/local/share/nvm"}" INSTALL_TOOLS_FOR_NODE_GYP="${NODEGYPDEPENDENCIES:-true}" export INSTALL_YARN_USING_APT="${INSTALLYARNUSINGAPT:-true}" # only concerns Debian-based systems - # Comma-separated list of node versions to be installed (with nvm) # alongside NODE_VERSION, but not set as default. ADDITIONAL_VERSIONS="${ADDITIONALVERSIONS:-""}" @@ -287,6 +286,29 @@ if ! type git > /dev/null 2>&1; then check_packages git fi +# Determine the Node.js version using the .nvmrc or .node-version file if present. +if [[ "${NODE_VERSION}" == "project-file" ]]; then + echo "Finding Node version from .nvmrc or .node-version file..." + NODE_VERSION_FOUND="" + for version_file in ".node-version" ".nvmrc"; do + if [[ -f "$version_file" && -s "$version_file" ]]; then + file_version=$(tr -d '[:space:]' < "$version_file") + if [[ -n "$file_version" ]]; then + echo "Using Node version from $version_file: $file_version" + NODE_VERSION="$file_version" + NODE_VERSION_FOUND="yes" + break + else + echo "$version_file exists but contains only whitespace. Continuing search..." + fi + fi + done + if [[ -z "$NODE_VERSION_FOUND" ]]; then + NODE_VERSION="lts" + echo "No Node version found in .nvmrc or .node-version. Using default: lts" + fi +fi + # Adjust node version if required if [ "${NODE_VERSION}" = "none" ]; then export NODE_VERSION= diff --git a/test/node/install_additional_node.sh b/test/node/install_additional_node.sh index 57d615a0a..8cc2eca32 100644 --- a/test/node/install_additional_node.sh +++ b/test/node/install_additional_node.sh @@ -5,11 +5,20 @@ set -e # Optional: Import test library source dev-container-features-test-lib -# 'lts' is now some version of node 20... -check "version_on_path" node -v | grep 20 +# Install jq if not already installed +if ! type jq >/dev/null 2>&1; then + apt-get update && apt-get install -y jq +fi + +#Get the latest LTS version of Node.js +LATEST_LTS_VERSION=$(curl -s https://nodejs.org/dist/index.json | jq -r '[.[] | select(.lts != false)][0].version') + + +# 'lts' is fetched instead of hardcoded to a specific version +check "version_on_path" node -v | grep "$LATEST_LTS_VERSION" check "pnpm" bash -c "pnpm -v | grep 8.8.0" -check "v20_installed" ls -1 /usr/local/share/nvm/versions/node | grep 20 +check "lts_installed" ls -1 /usr/local/share/nvm/versions/node | grep "$LATEST_LTS_VERSION" check "v14_installed" ls -1 /usr/local/share/nvm/versions/node | grep 14.19.3 check "v17_installed" ls -1 /usr/local/share/nvm/versions/node | grep 17.9.1 diff --git a/test/node/install_additional_node_on_rhel_family.sh b/test/node/install_additional_node_on_rhel_family.sh index 3300f7f1a..339ce0267 100644 --- a/test/node/install_additional_node_on_rhel_family.sh +++ b/test/node/install_additional_node_on_rhel_family.sh @@ -5,11 +5,19 @@ set -e # Optional: Import test library source dev-container-features-test-lib -# 'lts' is now some version of node 20... -check "version_on_path" node -v | grep 20 +# Install jq if not already installed +if ! type jq >/dev/null 2>&1; then + yum install -y jq +fi + +#Get the latest LTS version of Node.js +LATEST_LTS_VERSION=$(curl -s https://nodejs.org/dist/index.json | jq -r '[.[] | select(.lts != false)][0].version') + +# 'lts' is fetched instead of hardcoded to a specific version +check "version_on_path" node -v | grep "$LATEST_LTS_VERSION" check "pnpm" bash -c "pnpm -v | grep 6.16.0" -check "v20_installed" ls -1 /usr/local/share/nvm/versions/node | grep 20 +check "lts_installed" ls -1 /usr/local/share/nvm/versions/node | grep "$LATEST_LTS_VERSION" check "v14_installed" ls -1 /usr/local/share/nvm/versions/node | grep 14.19.3 check "v17_installed" ls -1 /usr/local/share/nvm/versions/node | grep 17.9.1 diff --git a/test/node/scenarios.json b/test/node/scenarios.json index df03128d6..e11a0cf22 100644 --- a/test/node/scenarios.json +++ b/test/node/scenarios.json @@ -82,7 +82,7 @@ "features": { "node": { "version": "16", - "pnpmVersion":"8.8.0" + "pnpmVersion": "8.8.0" } } }, @@ -199,5 +199,35 @@ "installYarnUsingApt": false } } + }, + "test_node_project_nvmrc": { + "build": { + "dockerfile": "DockerFile" + }, + "features": { + "node": { + "version": "project-file" + } + } + }, + "test_node_project_nodev": { + "build": { + "dockerfile": "DockerFile" + }, + "features": { + "node": { + "version": "project-file" + } + } + }, + "test_node_project_nvm_nodev": { + "build": { + "dockerfile": "DockerFile" + }, + "features": { + "node": { + "version": "project-file" + } + } } } \ No newline at end of file diff --git a/test/node/test_node_project_nodev.sh b/test/node/test_node_project_nodev.sh new file mode 100644 index 000000000..cff7bdcd8 --- /dev/null +++ b/test/node/test_node_project_nodev.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +cd test_node_project_nodev + +# Check that .nvmrc exists +if [ ! -f .node-version ]; then + echo ".node-version file not found!" + exit 1 +fi + +# Read the version from .nvmrc and compare with current node version +N_VERSION=$(cat .node-version | tr -d 'v') +NODE_VERSION=$(node -v | tr -d 'v') + +if [ "$N_VERSION" != "$NODE_VERSION" ]; then + echo "Node version mismatch: .node-version specifies $N_VERSION, but current node is $NODE_VERSION" + exit 1 +fi + +echo ".node-version is used and matches the current Node.js version." +# Report result +reportResults \ No newline at end of file diff --git a/test/node/test_node_project_nodev/.node-version b/test/node/test_node_project_nodev/.node-version new file mode 100644 index 000000000..0d215b0fb --- /dev/null +++ b/test/node/test_node_project_nodev/.node-version @@ -0,0 +1 @@ +20.19.2 \ No newline at end of file diff --git a/test/node/test_node_project_nodev/DockerFile b/test/node/test_node_project_nodev/DockerFile new file mode 100644 index 000000000..59d170198 --- /dev/null +++ b/test/node/test_node_project_nodev/DockerFile @@ -0,0 +1,3 @@ +FROM debian:11 + +COPY .node-version /tmp/dev-container-features/node_0/.node-version diff --git a/test/node/test_node_project_nvm_nodev.sh b/test/node/test_node_project_nvm_nodev.sh new file mode 100644 index 000000000..386d90db0 --- /dev/null +++ b/test/node/test_node_project_nvm_nodev.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +cd test_node_project_nvm_nodev + +# Check that .node-version exists +if [ ! -f .node-version ]; then + echo ".node-version file not found!" + exit 1 +fi + +# Read the version from .node-version and compare with current node version +N_VERSION=$(cat .node-version | tr -d 'v') +NODE_VERSION=$(node -v | tr -d 'v') + +if [ "$N_VERSION" != "$NODE_VERSION" ]; then + echo "Node version mismatch: .nvmrc specifies $N_VERSION, but current node is $NODE_VERSION" + exit 1 +fi + +echo ".node-version is used and matches the current Node.js version." +# Report result +reportResults \ No newline at end of file diff --git a/test/node/test_node_project_nvm_nodev/.node-version b/test/node/test_node_project_nvm_nodev/.node-version new file mode 100644 index 000000000..0d215b0fb --- /dev/null +++ b/test/node/test_node_project_nvm_nodev/.node-version @@ -0,0 +1 @@ +20.19.2 \ No newline at end of file diff --git a/test/node/test_node_project_nvm_nodev/.nvmrc b/test/node/test_node_project_nvm_nodev/.nvmrc new file mode 100644 index 000000000..ee57e7f61 --- /dev/null +++ b/test/node/test_node_project_nvm_nodev/.nvmrc @@ -0,0 +1 @@ +22.9.0 \ No newline at end of file diff --git a/test/node/test_node_project_nvm_nodev/DockerFile b/test/node/test_node_project_nvm_nodev/DockerFile new file mode 100644 index 000000000..31e32808f --- /dev/null +++ b/test/node/test_node_project_nvm_nodev/DockerFile @@ -0,0 +1,4 @@ +FROM debian:11 + +COPY .nvmrc .node-version /tmp/dev-container-features/node_0/ + diff --git a/test/node/test_node_project_nvmrc.sh b/test/node/test_node_project_nvmrc.sh new file mode 100644 index 000000000..c4ad8a90b --- /dev/null +++ b/test/node/test_node_project_nvmrc.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +# Optional: Import test library +source dev-container-features-test-lib + +cd test_node_project_nvmrc + +# Check that .nvmrc exists +if [ ! -f .nvmrc ]; then + echo ".nvmrc file not found!" + exit 1 +fi + +# Read the version from .nvmrc and compare with current node version +NVMRC_VERSION=$(cat .nvmrc | tr -d 'v') +NODE_VERSION=$(node -v | tr -d 'v') + +if [ "$NVMRC_VERSION" != "$NODE_VERSION" ]; then + echo "Node version mismatch: .nvmrc specifies $NVMRC_VERSION, but current node is $NODE_VERSION" + exit 1 +fi + +echo ".nvmrc is used and matches the current Node.js version." +# Report result +reportResults \ No newline at end of file diff --git a/test/node/test_node_project_nvmrc/.nvmrc b/test/node/test_node_project_nvmrc/.nvmrc new file mode 100644 index 000000000..ee57e7f61 --- /dev/null +++ b/test/node/test_node_project_nvmrc/.nvmrc @@ -0,0 +1 @@ +22.9.0 \ No newline at end of file diff --git a/test/node/test_node_project_nvmrc/DockerFile b/test/node/test_node_project_nvmrc/DockerFile new file mode 100644 index 000000000..9a9a9ab87 --- /dev/null +++ b/test/node/test_node_project_nvmrc/DockerFile @@ -0,0 +1,3 @@ +FROM debian:11 + +COPY .nvmrc /tmp/dev-container-features/node_0/.nvmrc \ No newline at end of file