From 1f01f32853d00a05d97810aba51f58141cc38095 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Sun, 21 Jun 2026 21:55:20 +0200 Subject: [PATCH] refactor(tools): centralize Node.js corepack and npm handling in setup_nodejs Move corepack install/enable into setup_nodejs and update CT scripts to use NODE_MODULE instead of manual corepack calls. Co-authored-by: Cursor --- ct/bookorbit.sh | 3 +- ct/dashy.sh | 2 +- ct/databasus.sh | 2 +- ct/docmost.sh | 2 +- ct/elementsynapse.sh | 2 +- ct/excalidraw.sh | 2 +- ct/feishin.sh | 2 +- ct/flowiseai.sh | 2 +- ct/fumadocs.sh | 2 +- ct/ghost.sh | 2 +- ct/gramps-web.sh | 4 +- ct/homepage.sh | 2 +- ct/immich.sh | 3 +- ct/invoiceshelf.sh | 2 +- ct/jellyseerr.sh | 2 +- ct/joplin-server.sh | 2 +- ct/jotty.sh | 2 +- ct/karakeep.sh | 4 +- ct/koillection.sh | 2 +- ct/linkwarden.sh | 4 +- ct/manyfold.sh | 4 +- ct/mealie.sh | 2 +- ct/metube.sh | 4 +- ct/monica.sh | 2 +- ct/musicseerr.sh | 2 +- ct/nginxproxymanager.sh | 2 +- ct/outline.sh | 4 +- ct/papra.sh | 2 +- ct/peanut.sh | 2 +- ct/plane.sh | 2 +- ct/reactive-resume.sh | 4 +- ct/rwmarkable.sh | 2 +- ct/seerr.sh | 2 +- ct/sparkyfitness.sh | 2 +- ct/storyteller.sh | 2 +- ct/streamlink-webui.sh | 2 +- ct/tandoor.sh | 2 +- ct/tianji.sh | 2 +- ct/twenty.sh | 2 +- ct/web-check.sh | 2 +- ct/wikijs.sh | 2 +- ct/wishlist.sh | 2 +- ct/zigbee2mqtt.sh | 2 +- ct/zipline.sh | 2 +- misc/tools.func | 81 +++++++++++++++++++++++++++-------------- 45 files changed, 103 insertions(+), 82 deletions(-) diff --git a/ct/bookorbit.sh b/ct/bookorbit.sh index 25b19cddf..df71c450d 100644 --- a/ct/bookorbit.sh +++ b/ct/bookorbit.sh @@ -42,7 +42,7 @@ function update_script() { msg_info "Rebuilding Application" cd /opt/bookorbit PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/bookorbit/package.json) - $STD corepack enable + $STD corepack prepare "pnpm@${PNPM_VERSION}" --activate $STD pnpm install --frozen-lockfile $STD pnpm --filter client run build-only @@ -59,7 +59,6 @@ function update_script() { $STD uv pip install --python /opt/bookorbit-python/bin/python -r /opt/bookorbit/server/requirements/kobo-cloudscraper.txt msg_ok "Updated Kobo Python Runtime" - msg_info "Starting Service" systemctl start bookorbit msg_ok "Started Service" diff --git a/ct/dashy.sh b/ct/dashy.sh index 4a5488256..686e335e3 100644 --- a/ct/dashy.sh +++ b/ct/dashy.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs if check_for_gh_release "dashy" "Lissy93/dashy"; then msg_info "Stopping Service" diff --git a/ct/databasus.sh b/ct/databasus.sh index e07104331..c74259b99 100644 --- a/ct/databasus.sh +++ b/ct/databasus.sh @@ -70,7 +70,7 @@ function update_script() { msg_info "Updating Databasus" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 cd /opt/databasus/frontend - $STD corepack enable + $STD corepack prepare pnpm@latest --activate $STD pnpm install --frozen-lockfile $STD pnpm run build diff --git a/ct/docmost.sh b/ct/docmost.sh index c3392c585..32aba58f8 100644 --- a/ct/docmost.sh +++ b/ct/docmost.sh @@ -28,7 +28,7 @@ function update_script() { exit fi if ! command -v node >/dev/null || [[ "$(/usr/bin/env node -v | grep -oP '^v\K[0-9]+')" != "22" ]]; then - NODE_VERSION="22" NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/docmost/docmost/main/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,pnpm@$(curl -s https://raw.githubusercontent.com/docmost/docmost/main/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs fi export NODE_OPTIONS="--max_old_space_size=4096" diff --git a/ct/elementsynapse.sh b/ct/elementsynapse.sh index 1d2c43165..159ebb291 100644 --- a/ct/elementsynapse.sh +++ b/ct/elementsynapse.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs msg_info "Updating LXC" $STD apt update diff --git a/ct/excalidraw.sh b/ct/excalidraw.sh index 14db7843d..773dd56d8 100644 --- a/ct/excalidraw.sh +++ b/ct/excalidraw.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs if check_for_gh_release "excalidraw" "excalidraw/excalidraw"; then msg_info "Stopping Service" diff --git a/ct/feishin.sh b/ct/feishin.sh index b13b280e5..0653255fa 100644 --- a/ct/feishin.sh +++ b/ct/feishin.sh @@ -38,7 +38,7 @@ function update_script() { msg_info "Rebuilding Feishin Web" cd /opt/feishin #PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json) - $STD corepack enable + $STD corepack prepare "pnpm@10" --activate $STD pnpm install $STD pnpm run build:web diff --git a/ct/flowiseai.sh b/ct/flowiseai.sh index 7d4c6468e..9d31f69bd 100644 --- a/ct/flowiseai.sh +++ b/ct/flowiseai.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,pnpm" setup_nodejs msg_info "Updating FlowiseAI (this may take some time)" systemctl stop flowise diff --git a/ct/fumadocs.sh b/ct/fumadocs.sh index dc673872b..b43e7babe 100644 --- a/ct/fumadocs.sh +++ b/ct/fumadocs.sh @@ -35,7 +35,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="pnpm@latest" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm@latest" setup_nodejs PROJECT_NAME=$(/dev/null 2>&1; then - $STD corepack enable + $STD corepack yarn install $STD corepack yarn build else diff --git a/ct/jellyseerr.sh b/ct/jellyseerr.sh index 86128bb11..a2430db02 100644 --- a/ct/jellyseerr.sh +++ b/ct/jellyseerr.sh @@ -62,7 +62,7 @@ EOF systemctl stop jellyseerr output=$(git pull --no-rebase) pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json) - NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,pnpm@$pnpm_desired" setup_nodejs if echo "$output" | grep -q "Already up to date."; then msg_ok "$APP is already up to date." exit diff --git a/ct/joplin-server.sh b/ct/joplin-server.sh index 3f229a517..5fe3a65c6 100644 --- a/ct/joplin-server.sh +++ b/ct/joplin-server.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="yarn,npm,pm2" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,yarn,npm,pm2" setup_nodejs if check_for_gh_release "joplin-server" "laurent22/joplin"; then msg_info "Stopping Services" diff --git a/ct/jotty.sh b/ct/jotty.sh index af0e610d0..abfb59cf3 100644 --- a/ct/jotty.sh +++ b/ct/jotty.sh @@ -41,7 +41,7 @@ function update_script() { [[ -d /opt/jotty/config ]] && mv /opt/jotty/config /opt/config msg_ok "Backed up configuration & data" - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jotty" "fccview/jotty" "prebuild" "latest" "/opt/jotty" "jotty_*_prebuild.tar.gz" msg_info "Restoring configuration & data" diff --git a/ct/karakeep.sh b/ct/karakeep.sh index 2cc623d65..c52db636c 100644 --- a/ct/karakeep.sh +++ b/ct/karakeep.sh @@ -89,11 +89,11 @@ EOF fi sed -i "s/^SERVER_VERSION=.*$/SERVER_VERSION=${CHECK_UPDATE_RELEASE#v}/" /etc/karakeep/karakeep.env MODULE_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/karakeep/package.json)" - NODE_VERSION="24" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm@${MODULE_VERSION}" setup_nodejs setup_meilisearch msg_info "Updating Karakeep" - corepack enable + export PUPPETEER_SKIP_DOWNLOAD="true" export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD="true" export NEXT_TELEMETRY_DISABLED=1 diff --git a/ct/koillection.sh b/ct/koillection.sh index e68ccee63..72afdc45f 100644 --- a/ct/koillection.sh +++ b/ct/koillection.sh @@ -52,7 +52,7 @@ function update_script() { [[ -s /opt/koillection/.env.local && -n "$(tail -c 1 /opt/koillection/.env.local)" ]] && echo "" >>/opt/koillection/.env.local echo 'APP_RUNTIME="Symfony\Component\Runtime\SymfonyRuntime"' >>/opt/koillection/.env.local fi - NODE_VERSION="26" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="26" NODE_MODULE="corepack,yarn" setup_nodejs cd /opt/koillection export COMPOSER_ALLOW_SUPERUSER=1 export APP_RUNTIME='Symfony\Component\Runtime\SymfonyRuntime' diff --git a/ct/linkwarden.sh b/ct/linkwarden.sh index 59eb32c04..6fb08596b 100644 --- a/ct/linkwarden.sh +++ b/ct/linkwarden.sh @@ -28,7 +28,7 @@ function update_script() { exit fi if check_for_gh_release "linkwarden" "linkwarden/linkwarden"; then - NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn@latest" setup_nodejs msg_info "Stopping Service" systemctl stop linkwarden msg_ok "Stopped Service" @@ -54,7 +54,7 @@ function update_script() { fi fi if command -v corepack >/dev/null 2>&1; then - $STD corepack enable + $STD corepack prepare "yarn@${yarn_ver}" --activate || true fi $STD yarn diff --git a/ct/manyfold.sh b/ct/manyfold.sh index 2537736fd..52c9b76c3 100644 --- a/ct/manyfold.sh +++ b/ct/manyfold.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs ensure_dependencies f3d if check_for_gh_release "manyfold" "manyfold3d/manyfold"; then @@ -65,8 +65,6 @@ function update_script() { msg_ok "Restored Data" msg_info "Installing Manyfold" - $STD npm install --global corepack - $STD corepack enable yarn sudo -u manyfold bash -c ' source /opt/manyfold/.env diff --git a/ct/mealie.sh b/ct/mealie.sh index 1f3631ccc..fa1d2b1d9 100644 --- a/ct/mealie.sh +++ b/ct/mealie.sh @@ -31,7 +31,7 @@ function update_script() { fi if check_for_gh_release "mealie" "mealie-recipes/mealie"; then PYTHON_VERSION="3.12" setup_uv - NODE_MODULE="yarn" NODE_VERSION="24" setup_nodejs + NODE_MODULE="corepack,yarn" NODE_VERSION="24" setup_nodejs msg_info "Stopping Service" systemctl stop mealie diff --git a/ct/metube.sh b/ct/metube.sh index fbaeee46c..b00f4e833 100644 --- a/ct/metube.sh +++ b/ct/metube.sh @@ -41,7 +41,7 @@ function update_script() { fi fi - NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs if check_for_gh_release "metube" "alexta69/metube"; then msg_info "Stopping Service" @@ -60,7 +60,7 @@ function update_script() { msg_info "Building Frontend" cd /opt/metube/ui if command -v corepack >/dev/null 2>&1; then - $STD corepack enable + $STD corepack prepare pnpm --activate || true fi echo 'onlyBuiltDependencies=*' >> .npmrc diff --git a/ct/monica.sh b/ct/monica.sh index 9d4172ac9..17e05bbf6 100644 --- a/ct/monica.sh +++ b/ct/monica.sh @@ -30,7 +30,7 @@ function update_script() { fi setup_mariadb - NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn@latest" setup_nodejs # Fix for previous versions not having cronjob if ! grep -Fq 'php /opt/monica/artisan schedule:run' /etc/crontab; then diff --git a/ct/musicseerr.sh b/ct/musicseerr.sh index f7aa74e6d..4040f7d02 100644 --- a/ct/musicseerr.sh +++ b/ct/musicseerr.sh @@ -42,7 +42,7 @@ function update_script() { PYTHON_VERSION="3.13" setup_uv CLEAN_INSTALL=1 fetch_and_deploy_gh_release "musicseerr" "HabiRabbu/Musicseerr" "tarball" - NODE_VERSION="25" NODE_MODULE="pnpm@10.33.0" setup_nodejs + NODE_VERSION="25" NODE_MODULE="corepack,pnpm@10.33.0" setup_nodejs msg_info "Building Frontend" cd /opt/musicseerr/frontend diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh index 71b4939f6..69e4320fc 100644 --- a/ct/nginxproxymanager.sh +++ b/ct/nginxproxymanager.sh @@ -42,7 +42,7 @@ function update_script() { fi fi - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs if dpkg -s openresty &>/dev/null 2>&1; then msg_info "Migrating from packaged OpenResty to source" diff --git a/ct/outline.sh b/ct/outline.sh index cf38d4bd2..a67b7ff2e 100644 --- a/ct/outline.sh +++ b/ct/outline.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs if check_for_gh_release "outline" "outline/outline"; then msg_info "Stopping Services" @@ -48,7 +48,7 @@ function update_script() { export NODE_ENV=development export NODE_OPTIONS="--max-old-space-size=3584" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - $STD corepack enable + $STD yarn install --immutable export NODE_ENV=production $STD yarn build diff --git a/ct/papra.sh b/ct/papra.sh index 9e4fed221..df2c93008 100644 --- a/ct/papra.sh +++ b/ct/papra.sh @@ -44,7 +44,7 @@ function update_script() { CLEAN_INSTALL=1 fetch_and_deploy_gh_release "papra" "papra-hq/papra" "tarball" pnpm_version=$(grep -oP '"packageManager":\s*"pnpm@\K[^"]+' /opt/papra/package.json) - NODE_VERSION="26" NODE_MODULE="pnpm@$pnpm_version" setup_nodejs + NODE_VERSION="26" NODE_MODULE="corepack,pnpm@$pnpm_version" setup_nodejs msg_info "Building Application" cd /opt/papra diff --git a/ct/peanut.sh b/ct/peanut.sh index d9ac51475..99da4e803 100644 --- a/ct/peanut.sh +++ b/ct/peanut.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs if check_for_gh_release "PeaNUT" "Brandawg93/PeaNUT"; then msg_info "Stopping Service" diff --git a/ct/plane.sh b/ct/plane.sh index 33148a6a9..4a7e949bb 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -49,7 +49,7 @@ function update_script() { cd /opt/plane export NODE_OPTIONS="--max-old-space-size=4096" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - $STD corepack enable pnpm + $STD pnpm install --frozen-lockfile $STD pnpm turbo run build --filter=web --filter=admin --filter=space --filter=live msg_ok "Rebuilt Frontend" diff --git a/ct/reactive-resume.sh b/ct/reactive-resume.sh index 33dada404..e1da974db 100644 --- a/ct/reactive-resume.sh +++ b/ct/reactive-resume.sh @@ -37,13 +37,13 @@ function update_script() { ensure_dependencies git cp /opt/reactive-resume/.env /opt/reactive-resume.env.bak - NODE_VERSION="24" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs CLEAN_INSTALL=1 fetch_and_deploy_gh_release "reactive-resume" "amruthpillai/reactive-resume" "tarball" "latest" "/opt/reactive-resume" msg_info "Updating Reactive Resume (Patience)" cd /opt/reactive-resume export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - corepack enable + corepack prepare --activate export CI="true" export NODE_ENV="production" diff --git a/ct/rwmarkable.sh b/ct/rwmarkable.sh index 1a037d309..aa58c8249 100644 --- a/ct/rwmarkable.sh +++ b/ct/rwmarkable.sh @@ -34,7 +34,7 @@ function update_script() { systemctl -q disable --now rwmarkable msg_ok "Stopped Service" - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jotty" "fccview/jotty" "tarball" "latest" "/opt/jotty" msg_info "Updating app" diff --git a/ct/seerr.sh b/ct/seerr.sh index 4ea49c8f8..d8ab6d5cf 100644 --- a/ct/seerr.sh +++ b/ct/seerr.sh @@ -133,7 +133,7 @@ EOF msg_info "Updating PNPM Version" pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/seerr/package.json) - NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,pnpm@$pnpm_desired" setup_nodejs msg_ok "Updated PNPM Version" msg_info "Updating Seerr" diff --git a/ct/sparkyfitness.sh b/ct/sparkyfitness.sh index 5954b0bee..2adc9a519 100644 --- a/ct/sparkyfitness.sh +++ b/ct/sparkyfitness.sh @@ -48,7 +48,7 @@ function update_script() { CLEAN_INSTALL=1 fetch_and_deploy_gh_release "sparkyfitness" "CodeWithCJ/SparkyFitness" "tarball" PNPM_VERSION="$(jq -r '.packageManager | split("@")[1]' /opt/sparkyfitness/package.json)" - NODE_VERSION="25" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs + NODE_VERSION="25" NODE_MODULE="corepack,pnpm@${PNPM_VERSION}" setup_nodejs msg_info "Updating Sparky Fitness Backend" cd /opt/sparkyfitness/SparkyFitnessServer diff --git a/ct/storyteller.sh b/ct/storyteller.sh index a461a6d02..a4f31c5f3 100644 --- a/ct/storyteller.sh +++ b/ct/storyteller.sh @@ -48,7 +48,7 @@ function update_script() { msg_info "Rebuilding Storyteller" cd /opt/storyteller export NODE_OPTIONS="--max-old-space-size=4096" - $STD corepack enable + $STD corepack yarn install --network-timeout 600000 $STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so export CI=1 diff --git a/ct/streamlink-webui.sh b/ct/streamlink-webui.sh index 07c815e31..6b506fca9 100644 --- a/ct/streamlink-webui.sh +++ b/ct/streamlink-webui.sh @@ -35,7 +35,7 @@ function update_script() { systemctl stop streamlink-webui msg_info "Stopped Service" - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs setup_uv CLEAN_INSTALL=1 fetch_and_deploy_gh_release "streamlink-webui" "CrazyWolf13/streamlink-webui" "tarball" diff --git a/ct/tandoor.sh b/ct/tandoor.sh index 575233035..9a0fc4179 100644 --- a/ct/tandoor.sh +++ b/ct/tandoor.sh @@ -47,7 +47,7 @@ function update_script() { mv /opt/tandoor /opt/tandoor.bak msg_ok "Backup Created" - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs PYTHON_VERSION="3.13" setup_uv fetch_and_deploy_gh_release "tandoor" "TandoorRecipes/recipes" "tarball" "latest" "/opt/tandoor" diff --git a/ct/tianji.sh b/ct/tianji.sh index 3bc530ff8..f65d0c4d5 100644 --- a/ct/tianji.sh +++ b/ct/tianji.sh @@ -30,7 +30,7 @@ function update_script() { setup_uv if check_for_gh_release "tianji" "msgbyte/tianji"; then - NODE_VERSION="22" NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/msgbyte/tianji/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,pnpm@$(curl -s https://raw.githubusercontent.com/msgbyte/tianji/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs msg_info "Stopping Service" systemctl stop tianji diff --git a/ct/twenty.sh b/ct/twenty.sh index 19871062f..13dfd46c5 100644 --- a/ct/twenty.sh +++ b/ct/twenty.sh @@ -47,7 +47,7 @@ function update_script() { msg_info "Building Application" cd /opt/twenty export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 - $STD corepack enable + $STD corepack prepare yarn@4.9.2 --activate export NODE_OPTIONS="--max-old-space-size=3072" $STD yarn install --immutable || $STD yarn install diff --git a/ct/web-check.sh b/ct/web-check.sh index 327878810..7722901f7 100644 --- a/ct/web-check.sh +++ b/ct/web-check.sh @@ -38,7 +38,7 @@ function update_script() { mv /opt/web-check/.env /opt msg_ok "Created backup" - NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs + NODE_VERSION="22" NODE_MODULE="corepack,yarn" setup_nodejs CLEAN_INSTALL=1 fetch_and_deploy_gh_release "web-check" "Lissy93/web-check" "tarball" msg_info "Restoring backup" diff --git a/ct/wikijs.sh b/ct/wikijs.sh index 391ce5aae..b2efcd71d 100644 --- a/ct/wikijs.sh +++ b/ct/wikijs.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="yarn,node-gyp" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,yarn,node-gyp" setup_nodejs if check_for_gh_release "wikijs" "requarks/wiki"; then msg_info "Verifying whether ${APP}' new release is v3.x+ and current install uses SQLite." diff --git a/ct/wishlist.sh b/ct/wishlist.sh index 7542941eb..28b0c4609 100644 --- a/ct/wishlist.sh +++ b/ct/wishlist.sh @@ -29,7 +29,7 @@ function update_script() { fi if check_for_gh_release "wishlist" "cmintey/wishlist"; then - NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs msg_info "Stopping Service" systemctl stop wishlist diff --git a/ct/zigbee2mqtt.sh b/ct/zigbee2mqtt.sh index 2520d7d7b..94726a687 100644 --- a/ct/zigbee2mqtt.sh +++ b/ct/zigbee2mqtt.sh @@ -30,7 +30,7 @@ function update_script() { fi if check_for_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt"; then - NODE_VERSION="24" NODE_MODULE="pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs msg_info "Stopping Service" systemctl stop zigbee2mqtt msg_ok "Stopped Service" diff --git a/ct/zipline.sh b/ct/zipline.sh index f8ed33d52..8cb039cac 100644 --- a/ct/zipline.sh +++ b/ct/zipline.sh @@ -28,7 +28,7 @@ function update_script() { exit fi - NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + NODE_VERSION="24" NODE_MODULE="corepack,pnpm" setup_nodejs if check_for_gh_release "zipline" "diced/zipline"; then msg_info "Stopping Service" diff --git a/misc/tools.func b/misc/tools.func index 278a015e9..2dd8a7184 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -7283,13 +7283,18 @@ EOF # - Optionally installs or updates global npm modules # # Variables: -# NODE_VERSION - Node.js version to install (default: 24 LTS) -# NODE_MODULE - Comma-separated list of global modules (e.g. "yarn,@vue/cli@5.0.0") +# NODE_VERSION - Node.js version to install (default: 24 LTS) +# NODE_MODULE - Comma-separated global modules (e.g. "yarn,corepack,pnpm@10") +# NODE_COREPACK_ENABLE - Run corepack enable after install (default: 1 when corepack is used) # ------------------------------------------------------------------------------ setup_nodejs() { local NODE_VERSION="${NODE_VERSION:-24}" local NODE_MODULE="${NODE_MODULE:-}" + local NODE_COREPACK_ENABLE="${NODE_COREPACK_ENABLE:-1}" + local node_major="${NODE_VERSION%%.*}" + local wants_corepack=0 + local node_setup_ok_msg="" # ALWAYS clean up legacy installations first (nvm, etc.) to prevent conflicts cleanup_legacy_install "nodejs" @@ -7316,18 +7321,17 @@ setup_nodejs() { # Upgrade to the latest minor/patch release from NodeSource $STD apt-get install -y --only-upgrade nodejs 2>/dev/null || true - # Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425) - $STD npm install -g npm@11.11.0 2>/dev/null || true - cache_installed_version "nodejs" "$NODE_VERSION" msg_ok "Update Node.js $NODE_VERSION" else # Scenario 2: Different version installed - clean upgrade if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" != "$NODE_VERSION" ]]; then msg_info "Upgrade Node.js from $CURRENT_NODE_VERSION to $NODE_VERSION" + node_setup_ok_msg="Upgrade Node.js to $NODE_VERSION" remove_old_tool_version "nodejs" else msg_info "Setup Node.js $NODE_VERSION" + node_setup_ok_msg="Setup Node.js $NODE_VERSION" fi # Remove ALL Debian nodejs packages BEFORE adding NodeSource repo @@ -7336,6 +7340,7 @@ setup_nodejs() { $STD apt purge -y nodejs nodejs-doc libnode* node-* 2>/dev/null || true $STD apt autoremove -y 2>/dev/null || true $STD apt clean 2>/dev/null || true + msg_ok "Removed Debian-packaged Node.js" fi # Remove any APT pinning (not needed) @@ -7381,17 +7386,19 @@ setup_nodejs() { return 127 fi - # Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425) - local NPM_VERSION - NPM_VERSION=$(npm -v 2>/dev/null || echo "0") - if [[ "$NPM_VERSION" != "0" ]]; then - $STD npm install -g npm@11.11.0 2>/dev/null || { - msg_warn "Failed to update npm to 11.11.0 (continuing with bundled npm $NPM_VERSION)" - } - fi - cache_installed_version "nodejs" "$NODE_VERSION" - msg_ok "Setup Node.js $NODE_VERSION" + msg_ok "$node_setup_ok_msg" + fi + + # Node 22.22.2 bundles npm 10.9.7 which cannot self-upgrade (nodejs/node#62425) + if [[ "$NODE_VERSION" == "22" && "$(npm -v 2>/dev/null)" == "10.9.7" ]]; then + msg_info "Updating npm (Node 22 regression fix)" + $STD npm install -g npm@10.9.8 2>/dev/null || true + if $STD npm install -g npm@latest 2>/dev/null; then + msg_ok "Updated npm ($(npm -v))" + else + msg_warn "npm update failed on Node 22.22.2" + fi fi # Set a safe default heap limit for Node.js builds if not explicitly provided. @@ -7436,12 +7443,20 @@ setup_nodejs() { } # Install global Node modules - if [[ -n "$NODE_MODULE" ]]; then + if [[ -n "$NODE_MODULE" ]] || (( node_major >= 25 )); then + if (( node_major >= 25 )) && [[ ",${NODE_MODULE}," != *",corepack,"* ]] && [[ "$NODE_MODULE" != corepack* ]]; then + NODE_MODULE="${NODE_MODULE:+$NODE_MODULE,}corepack" + fi + IFS=',' read -ra MODULES <<<"$NODE_MODULE" - # Pin pnpm to v10 to avoid breaking changes from newer major versions for i in "${!MODULES[@]}"; do - if [[ "${MODULES[$i]}" =~ ^pnpm(@.*)?$ ]]; then + if [[ "${MODULES[$i]}" == "corepack" || "${MODULES[$i]}" == corepack@* ]]; then + wants_corepack=1 + elif [[ "${MODULES[$i]}" == yarn || "${MODULES[$i]}" == yarn@* || "${MODULES[$i]}" == pnpm || "${MODULES[$i]}" == pnpm@* ]]; then + wants_corepack=1 + fi + if [[ "${MODULES[$i]}" == "pnpm" ]]; then MODULES[$i]="pnpm@^10" fi done @@ -7467,33 +7482,43 @@ setup_nodejs() { if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')" if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then - msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION" - if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then + msg_info "Updating $MODULE_NAME to v$MODULE_REQ_VERSION" + if $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then + msg_ok "Updated $MODULE_NAME" + else msg_warn "Failed to update $MODULE_NAME to version $MODULE_REQ_VERSION" ((failed_modules++)) || true - continue fi elif [[ "$MODULE_REQ_VERSION" == "latest" ]]; then msg_info "Updating $MODULE_NAME to latest version" - if ! $STD npm install -g "${MODULE_NAME}@latest" 2>/dev/null; then + if $STD npm install -g "${MODULE_NAME}@latest" 2>/dev/null; then + msg_ok "Updated $MODULE_NAME" + else msg_warn "Failed to update $MODULE_NAME to latest version" ((failed_modules++)) || true - continue fi fi else msg_info "Installing $MODULE_NAME@$MODULE_REQ_VERSION" - if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then + if $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then + msg_ok "Installed $MODULE_NAME" + else msg_warn "Failed to install $MODULE_NAME@$MODULE_REQ_VERSION" ((failed_modules++)) || true - continue fi fi done - if [[ $failed_modules -eq 0 ]]; then - msg_ok "Installed Node.js modules: $NODE_MODULE" + if (( failed_modules > 0 )); then + msg_warn "$failed_modules Node.js module(s) failed: $NODE_MODULE" + fi + fi + + if [[ "$NODE_COREPACK_ENABLE" == "1" ]] && (( wants_corepack )) && command -v corepack >/dev/null 2>&1; then + msg_info "Enabling corepack" + if $STD corepack enable 2>/dev/null; then + msg_ok "Enabled corepack" else - msg_warn "Installed Node.js modules with $failed_modules failure(s): $NODE_MODULE" + msg_warn "corepack enable failed" fi fi }