Skip to content

Commit 28e495a

Browse files
authored
feat: support all Node.js versions, fixes #14 (#15)
1 parent 90f86bb commit 28e495a

3 files changed

Lines changed: 84 additions & 35 deletions

File tree

commands/web/pnpm

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
## HostWorkingDir: true
99
## MutagenSync: true
1010

11-
if [ "$(pnpm config get store-dir --global)" == "undefined" ]; then
12-
pnpm config set store-dir "$PNPM_HOME" --global
13-
fi
14-
1511
# If a $PNPM_DIRECTORY is set, run our PNPM commands in that directory
1612
if [ -n "$PNPM_DIRECTORY" ]; then
1713
mkdir -p "$DDEV_APPROOT/$PNPM_DIRECTORY"

tests/test.bats

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,27 @@ health_checks() {
4444
run ddev pnpm --version
4545
assert_success
4646

47-
run ddev exec pnpm config get store-dir --global
47+
run ddev pnpm store path
4848
assert_success
4949
assert_output --partial "/mnt/ddev-global-cache/pnpm"
5050

51+
# Verify $PNPM_HOME is prepended to $PATH. The exact directory depends on the
52+
# pnpm major version (see web-build/Dockerfile.pnpm): pnpm v11+ uses
53+
# $PNPM_HOME/bin, older versions use $PNPM_HOME directly.
54+
run ddev pnpm -v
55+
assert_success
56+
57+
pnpm_version="${output#v}"
58+
if [[ "${pnpm_version%%.*}" -ge 11 ]]; then
59+
expected_path="/mnt/ddev-global-cache/pnpm/bin"
60+
else
61+
expected_path="/mnt/ddev-global-cache/pnpm"
62+
fi
63+
64+
run ddev exec 'echo ":$PATH:"'
65+
assert_success
66+
assert_output --partial ":${expected_path}:"
67+
5168
if [[ "${HAS_PNPM_DIRECTORY}" == "true" ]]; then
5269
run ddev pnpm test
5370
assert_success
@@ -97,9 +114,12 @@ teardown() {
97114

98115
@test "use ENV to set working directory" {
99116
set -eu -o pipefail
117+
100118
export HAS_PNPM_DIRECTORY=true
119+
101120
# Create a frontend project
102121
cp -r "${DIR}/tests/testdata/frontend" "${TESTDIR}/frontend"
122+
103123
# Set the PNPM_DIRECTORY to match our frontend project
104124
run ddev dotenv set .ddev/.env.web --pnpm-directory=frontend
105125
assert_success
@@ -113,38 +133,34 @@ teardown() {
113133
health_checks
114134
}
115135

116-
@test "global cache is populated after install" {
136+
@test "latest Node.js" {
117137
set -eu -o pipefail
118-
cp "${DIR}/tests/testdata/frontend/package.json" "${TESTDIR}/package.json"
138+
139+
ddev config --nodejs-version=latest
140+
assert_success
119141

120142
echo "# ddev add-on get ${DIR} with project ${PROJNAME} in $(pwd)" >&3
121143
run ddev add-on get "${DIR}"
122144
assert_success
123145
run ddev restart -y
124146
assert_success
147+
health_checks
148+
}
125149

126-
# Verify is-odd@3.0.1 is stored in the global cache after installing
127-
run ddev pnpm install
128-
assert_success
129-
run ddev exec bash -c "grep -R 'is-odd' /mnt/ddev-global-cache/pnpm 2>/dev/null | grep '3.0.1'"
130-
assert_success
150+
@test "v20 Node.js" {
151+
set -eu -o pipefail
131152

132-
# Install the same package version from a second directory and verify it is reused from cache
133-
mkdir "${TESTDIR}/second"
134-
cp "${TESTDIR}/package.json" "${TESTDIR}/second/package.json"
135-
run ddev exec bash -c "cd /var/www/html/second && pnpm install 2>&1 | grep 'Progress:.*done' | grep 'reused [1-9]'"
136-
assert_success
153+
if [[ "$(ddev --version)" == "ddev version v1.25.2" ]]; then
154+
skip "Node.js v20 requires ddev v1.25.3+"
155+
fi
137156

138-
# Install a different version of the same package and verify the correct version is installed
139-
mkdir "${TESTDIR}/third"
140-
printf '{"name":"third","version":"1.0.0","dependencies":{"is-odd":"2.0.0"}}' > "${TESTDIR}/third/package.json"
141-
run ddev exec bash -c "cd /var/www/html/third && pnpm install"
157+
ddev config --nodejs-version=20
142158
assert_success
143159

144-
run ddev exec bash -c "grep -R 'is-odd' /mnt/ddev-global-cache/pnpm 2>/dev/null | grep '2.0.0'"
160+
echo "# ddev add-on get ${DIR} with project ${PROJNAME} in $(pwd)" >&3
161+
run ddev add-on get "${DIR}"
145162
assert_success
146-
147-
run ddev exec bash -c "node -e \"console.log(require('/var/www/html/third/node_modules/is-odd/package.json').version)\""
163+
run ddev restart -y
148164
assert_success
149-
assert_output "2.0.0"
165+
health_checks
150166
}

web-build/Dockerfile.pnpm

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,49 @@
11
#ddev-generated
22

3-
RUN (command -v pnpm >/dev/null 2>&1 || npm install --global pnpm) && \
4-
PNPM_SCRIPT=$(printf '%s\n' \
5-
'export PNPM_HOME="/mnt/ddev-global-cache/pnpm"' \
6-
'case ":$PATH:" in' \
7-
' *":$PNPM_HOME/bin:"*) ;;' \
8-
' *) PATH="$PNPM_HOME/bin:$PATH" ;;' \
9-
'esac' \
10-
'export PATH') && \
11-
echo "$PNPM_SCRIPT" >> /etc/bash.bashrc && \
12-
echo "$PNPM_SCRIPT" >> /etc/bash.nointeractive.bashrc
3+
RUN <<EOF
4+
set -eu -o pipefail
5+
if ! command -v pnpm >/dev/null 2>&1; then
6+
NODE_VERSION=$(node -v)
7+
IFS=. read -r NODE_MAJOR NODE_MINOR _ <<< "${NODE_VERSION#v}"
8+
if [ "$NODE_MAJOR" -gt 22 ] || { [ "$NODE_MAJOR" -eq 22 ] && [ "$NODE_MINOR" -ge 13 ]; }; then
9+
PNPM_TAG="latest"
10+
elif [ "$NODE_MAJOR" -gt 18 ] || { [ "$NODE_MAJOR" -eq 18 ] && [ "$NODE_MINOR" -ge 12 ]; }; then
11+
PNPM_TAG="latest-10"
12+
elif [ "$NODE_MAJOR" -gt 16 ] || { [ "$NODE_MAJOR" -eq 16 ] && [ "$NODE_MINOR" -ge 14 ]; }; then
13+
PNPM_TAG="latest-8"
14+
elif [ "$NODE_MAJOR" -gt 14 ] || { [ "$NODE_MAJOR" -eq 14 ] && [ "$NODE_MINOR" -ge 6 ]; }; then
15+
PNPM_TAG="latest-7"
16+
elif [ "$NODE_MAJOR" -gt 12 ] || { [ "$NODE_MAJOR" -eq 12 ] && [ "$NODE_MINOR" -ge 17 ]; }; then
17+
PNPM_TAG="latest-6"
18+
elif [ "$NODE_MAJOR" -gt 10 ] || { [ "$NODE_MAJOR" -eq 10 ] && [ "$NODE_MINOR" -ge 13 ]; }; then
19+
PNPM_TAG="latest-5"
20+
elif [ "$NODE_MAJOR" -gt 7 ] || { [ "$NODE_MAJOR" -eq 7 ] && [ "$NODE_MINOR" -ge 6 ]; }; then
21+
PNPM_TAG="latest-3"
22+
elif [ "$NODE_MAJOR" -ge 6 ]; then
23+
PNPM_TAG="latest-2"
24+
elif [ "$NODE_MAJOR" -ge 4 ]; then
25+
PNPM_TAG="latest-1"
26+
else
27+
PNPM_TAG="latest"
28+
fi
29+
npm install -g pnpm@"$PNPM_TAG" -f
30+
fi
31+
PNPM_VERSION=$(pnpm -v)
32+
IFS=. read -r PNPM_MAJOR _ <<< "${PNPM_VERSION#v}"
33+
if [ "$PNPM_MAJOR" -ge 11 ]; then
34+
PNPM_BIN=/bin
35+
else
36+
PNPM_BIN=
37+
fi
38+
PNPM_SCRIPT=$(printf '%s\n' \
39+
'export PNPM_HOME="/mnt/ddev-global-cache/pnpm"' \
40+
'export pnpm_config_store_dir="$PNPM_HOME"' \
41+
'export npm_config_store_dir="$PNPM_HOME"' \
42+
'case ":$PATH:" in' \
43+
' *":$PNPM_HOME'"$PNPM_BIN"':"*) ;;' \
44+
' *) PATH="$PNPM_HOME'"$PNPM_BIN"':$PATH" ;;' \
45+
'esac' \
46+
'export PATH')
47+
echo "$PNPM_SCRIPT" >> /etc/bash.bashrc
48+
echo "$PNPM_SCRIPT" >> /etc/bash.nointeractive.bashrc
49+
EOF

0 commit comments

Comments
 (0)