From fc0ea4dc56b856bc4816923cada4c8bcf8614c13 Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Tue, 4 Nov 2025 18:30:41 -0500 Subject: [PATCH 1/5] Use a single .nvm file for all node version refs --- .github/actions/frontend-build/action.yml | 3 +- .github/actions/load-versions/action.yml | 18 ++++++++ .github/config/versions.yaml | 3 ++ .github/workflows/docs.yaml | 18 +++++--- .github/workflows/frontend-macos-13.yaml | 4 ++ .github/workflows/frontend-macos-14.yaml | 4 ++ .github/workflows/frontend-macos-15.yaml | 4 ++ .github/workflows/frontend-macos-latest.yaml | 4 ++ .github/workflows/frontend-ubuntu-22-04.yaml | 4 ++ .../workflows/frontend-ubuntu-24-04-arm.yaml | 4 ++ .github/workflows/frontend.yaml | 4 ++ .../workflows/test-docs-scripts-frontend.yaml | 43 ++++--------------- .nvmrc | 1 + Makefile | 2 + frontend/Dockerfile | 27 ++++++++---- frontend/package.json | 3 ++ website/package.json | 2 +- 17 files changed, 97 insertions(+), 51 deletions(-) create mode 100644 .nvmrc diff --git a/.github/actions/frontend-build/action.yml b/.github/actions/frontend-build/action.yml index a6819f1ea..8ad7d0f82 100644 --- a/.github/actions/frontend-build/action.yml +++ b/.github/actions/frontend-build/action.yml @@ -15,8 +15,7 @@ inputs: default: 'false' node-version: description: 'Node.js version to use' - required: false - default: '23' + required: true runs: using: 'composite' diff --git a/.github/actions/load-versions/action.yml b/.github/actions/load-versions/action.yml index 08421ba56..a1c00d410 100644 --- a/.github/actions/load-versions/action.yml +++ b/.github/actions/load-versions/action.yml @@ -11,6 +11,9 @@ outputs: ocaml-version: description: "OCaml version" value: ${{ steps.load.outputs.ocaml-version }} + node-version: + description: "Node.js version" + value: ${{ steps.load.outputs.node-version }} runs: using: composite @@ -25,18 +28,33 @@ runs: RUST_STABLE=$(yq eval '.rust.stable' "$VERSIONS_FILE") RUST_NIGHTLY=$(yq eval '.rust.nightly' "$VERSIONS_FILE") OCAML_VERSION=$(yq eval '.ocaml.version' "$VERSIONS_FILE") + NODE_VERSION_YAML=$(yq eval '.node.version' "$VERSIONS_FILE") + + # Read node version from .nvmrc + NODE_VERSION_NVMRC=$(cat .nvmrc) + + # Verify that the versions match + if [ "$NODE_VERSION_YAML" != "$NODE_VERSION_NVMRC" ]; then + echo "Error: Node.js version mismatch!" + echo " .github/config/versions.yaml: $NODE_VERSION_YAML" + echo " .nvmrc: $NODE_VERSION_NVMRC" + exit 1 + fi # Set outputs echo "rust-stable=$RUST_STABLE" >> $GITHUB_OUTPUT echo "rust-nightly=$RUST_NIGHTLY" >> $GITHUB_OUTPUT echo "ocaml-version=$OCAML_VERSION" >> $GITHUB_OUTPUT + echo "node-version=$NODE_VERSION_YAML" >> $GITHUB_OUTPUT # Also set as environment variables for convenience echo "RUST_STABLE_VERSION=$RUST_STABLE" >> $GITHUB_ENV echo "RUST_NIGHTLY_VERSION=$RUST_NIGHTLY" >> $GITHUB_ENV echo "OCAML_VERSION=$OCAML_VERSION" >> $GITHUB_ENV + echo "NODE_VERSION=$NODE_VERSION_YAML" >> $GITHUB_ENV echo "Loaded versions:" echo " Rust stable: $RUST_STABLE" echo " Rust nightly: $RUST_NIGHTLY" echo " OCaml: $OCAML_VERSION" + echo " Node.js: $NODE_VERSION_YAML" diff --git a/.github/config/versions.yaml b/.github/config/versions.yaml index 5ed3f4371..e8d304513 100644 --- a/.github/config/versions.yaml +++ b/.github/config/versions.yaml @@ -15,3 +15,6 @@ rust: ocaml: version: "4.14.2" + +node: + version: "24.11.0" diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index ea077b74a..6290527e6 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -9,9 +9,6 @@ on: pull_request: workflow_dispatch: -env: - NODE_VERSION: '20' - concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true @@ -25,10 +22,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: ${{ env.NODE_VERSION }} + node-version: ${{ steps.versions.outputs.node-version }} cache: 'npm' cache-dependency-path: website/package-lock.json @@ -109,10 +109,13 @@ jobs: - name: Setup Pages uses: actions/configure-pages@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: ${{ env.NODE_VERSION }} + node-version: ${{ steps.versions.outputs.node-version }} cache: 'npm' cache-dependency-path: website/package-lock.json @@ -158,10 +161,13 @@ jobs: with: fetch-depth: 0 + - id: versions + uses: ./.github/actions/load-versions + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: ${{ env.NODE_VERSION }} + node-version: ${{ steps.versions.outputs.node-version }} cache: 'npm' cache-dependency-path: website/package-lock.json diff --git a/.github/workflows/frontend-macos-13.yaml b/.github/workflows/frontend-macos-13.yaml index d1aa6784b..282d46e4e 100644 --- a/.github/workflows/frontend-macos-13.yaml +++ b/.github/workflows/frontend-macos-13.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend-macos-14.yaml b/.github/workflows/frontend-macos-14.yaml index ce4f180cb..b782a0a9f 100644 --- a/.github/workflows/frontend-macos-14.yaml +++ b/.github/workflows/frontend-macos-14.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend-macos-15.yaml b/.github/workflows/frontend-macos-15.yaml index 64b6b5a63..bb174fc30 100644 --- a/.github/workflows/frontend-macos-15.yaml +++ b/.github/workflows/frontend-macos-15.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend-macos-latest.yaml b/.github/workflows/frontend-macos-latest.yaml index 69deada6c..f6c81898a 100644 --- a/.github/workflows/frontend-macos-latest.yaml +++ b/.github/workflows/frontend-macos-latest.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend-ubuntu-22-04.yaml b/.github/workflows/frontend-ubuntu-22-04.yaml index e0b0f9c51..37fd3e9d6 100644 --- a/.github/workflows/frontend-ubuntu-22-04.yaml +++ b/.github/workflows/frontend-ubuntu-22-04.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend-ubuntu-24-04-arm.yaml b/.github/workflows/frontend-ubuntu-24-04-arm.yaml index d406fd224..c16f791cd 100644 --- a/.github/workflows/frontend-ubuntu-24-04-arm.yaml +++ b/.github/workflows/frontend-ubuntu-24-04-arm.yaml @@ -16,7 +16,11 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} test-build-commands: 'true' \ No newline at end of file diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml index 1dac8ec7f..787172027 100644 --- a/.github/workflows/frontend.yaml +++ b/.github/workflows/frontend.yaml @@ -16,9 +16,13 @@ jobs: - name: Git checkout uses: actions/checkout@v5 + - id: versions + uses: ./.github/actions/load-versions + - name: Frontend build and test uses: ./.github/actions/frontend-build with: + node-version: ${{ steps.versions.outputs.node-version }} run-prettier-check: 'true' run-tests: 'true' test-build-commands: 'false' diff --git a/.github/workflows/test-docs-scripts-frontend.yaml b/.github/workflows/test-docs-scripts-frontend.yaml index 196f0fafe..25abd296c 100644 --- a/.github/workflows/test-docs-scripts-frontend.yaml +++ b/.github/workflows/test-docs-scripts-frontend.yaml @@ -34,24 +34,19 @@ jobs: run: | chmod +x website/docs/developers/scripts/frontend/*.sh - - name: Install Node.js on Linux - if: runner.os == 'Linux' - run: | - bash website/docs/developers/scripts/frontend/install-nodejs-linux.sh - # Set up nvm environment for future steps - echo "NVM_DIR=$HOME/.nvm" >> $GITHUB_ENV + - name: Load versions + id: versions + uses: ./.github/actions/load-versions - - name: Install Node.js on macOS - if: runner.os == 'macOS' - run: | - bash website/docs/developers/scripts/frontend/install-nodejs-macos.sh + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: ${{ steps.versions.outputs.node-version }} + cache: 'npm' + cache-dependency-path: website/package-lock.json - name: Install Angular CLI using documentation script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/install-angular-cli.sh - name: Install gtimeout on macOS @@ -63,42 +58,22 @@ jobs: - name: Test install dependencies script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/install-dependencies.sh - name: Test build production script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/build-production.sh - name: Test format code script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/format-code.sh - name: Test build leaderboard script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/build-leaderboard.sh - name: Test build webnode script run: | - # Source nvm if available (Linux) - if [ -n "$NVM_DIR" ] && [ -s "$NVM_DIR/nvm.sh" ]; then - \. "$NVM_DIR/nvm.sh" - fi bash website/docs/developers/scripts/frontend/build-webnode.sh - name: Prepare for Cypress tests (Ubuntu 22.04) diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..0a492611a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24.11.0 diff --git a/Makefile b/Makefile index 34c1d0cc7..fb86b1ba9 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ # - ./github/workflows/fmt.yaml # - ./github/workflows/lint.yaml NIGHTLY_RUST_VERSION = "nightly" +NODE_VERSION := $(shell cat .nvmrc) # WebAssembly WASM_BINDGEN_CLI_VERSION = "0.2.99" @@ -394,6 +395,7 @@ docker-build-frontend: ## Build frontend Docker image esac; \ echo "Building for platform: $$PLATFORM"; \ docker buildx build \ + --build-arg NODE_VERSION=$(NODE_VERSION) \ --platform $$PLATFORM \ --tag $(DOCKER_ORG)/mina-rust-frontend:$(GIT_COMMIT) \ --file ./frontend/Dockerfile \ diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 8ef415130..364120e89 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -96,18 +96,29 @@ RUN apt-get update && \ ca-certificates \ gnupg \ make \ + xz-utils \ && rm -rf /var/lib/apt/lists/* WORKDIR /app -# Copy documentation scripts for Node.js setup -COPY ./website/docs/developers/scripts/frontend/install-nodejs-linux.sh ./scripts/install-nodejs-linux.sh +# Install Node.js from build argument +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +ARG NODE_VERSION +ARG TARGETARCH +RUN case ${TARGETARCH} in \ + "amd64") \ + ARCH='x64' \ + ;; \ + "arm64") \ + ARCH='arm64' \ + ;; \ + esac && \ + curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${ARCH}.tar.xz" | tar -xJ -C /usr/local --strip-components=1 + +# Install Angular CLI COPY ./website/docs/developers/scripts/frontend/install-angular-cli.sh ./scripts/install-angular-cli.sh - -# Install Node.js and Angular CLI using documentation scripts -RUN chmod +x ./scripts/*.sh && \ - bash ./scripts/install-nodejs-linux.sh && \ - bash -c 'source "$HOME/.nvm/nvm.sh" && bash ./scripts/install-angular-cli.sh' +RUN chmod +x ./scripts/install-angular-cli.sh && \ + ./scripts/install-angular-cli.sh # Copy entire frontend source code and Makefile COPY frontend/ ./frontend/ @@ -130,7 +141,7 @@ RUN chmod +x /usr/local/bin/startup.sh && \ # Install frontend dependencies using Makefile WORKDIR /app/frontend -RUN bash -c 'source "$HOME/.nvm/nvm.sh" && make install-deps' +RUN make install-deps WORKDIR /app diff --git a/frontend/package.json b/frontend/package.json index 3ae721301..82abb4882 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -28,6 +28,9 @@ "tests:headless": "make test-headless" }, "private": true, + "engines": { + "node": "^24.0.0" + }, "dependencies": { "@angular/animations": "^19.2.14", "@angular/cdk": "^19.2.19", diff --git a/website/package.json b/website/package.json index 4a2b5b1d1..e3f3f3703 100644 --- a/website/package.json +++ b/website/package.json @@ -44,6 +44,6 @@ ] }, "engines": { - "node": ">=18.0" + "node": "^24.0.0" } } From 16fd02bf2a0626cac3c5d1ec78edc39bcc1dd522 Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Tue, 4 Nov 2025 18:39:18 -0500 Subject: [PATCH 2/5] Remove nodejs install scripts from docs. --- website/docs/developers/frontend/index.mdx | 20 +++++-------------- website/docs/developers/getting-started.mdx | 16 +++++---------- .../scripts/frontend/install-nodejs-linux.sh | 17 ---------------- .../scripts/frontend/install-nodejs-macos.sh | 11 ---------- .../scripts/setup/install-nodejs-macos.sh | 5 ----- .../scripts/setup/install-nodejs.sh | 3 --- 6 files changed, 10 insertions(+), 62 deletions(-) delete mode 100755 website/docs/developers/scripts/frontend/install-nodejs-linux.sh delete mode 100755 website/docs/developers/scripts/frontend/install-nodejs-macos.sh delete mode 100755 website/docs/developers/scripts/setup/install-nodejs-macos.sh delete mode 100755 website/docs/developers/scripts/setup/install-nodejs.sh diff --git a/website/docs/developers/frontend/index.mdx b/website/docs/developers/frontend/index.mdx index 1e0a8fc94..6fd00240c 100644 --- a/website/docs/developers/frontend/index.mdx +++ b/website/docs/developers/frontend/index.mdx @@ -58,22 +58,12 @@ These instructions are tested and compatible with: ### Install Node.js - - +We recommend using the latest Node.js version specified in the `.nvmrc` file at +the root of the repository. You can use a Node.js version manager like `nvm` to +easily switch to the correct version. - - {InstallNodejsLinux} - - - - - - - {InstallNodejsMacos} - - - - +For more information on how to install Node.js, please refer to the +[official Node.js documentation](https://nodejs.org/en/download/package-manager/). ### Install Angular CLI diff --git a/website/docs/developers/getting-started.mdx b/website/docs/developers/getting-started.mdx index 7fd3b572d..1709cb763 100644 --- a/website/docs/developers/getting-started.mdx +++ b/website/docs/developers/getting-started.mdx @@ -81,18 +81,12 @@ This installs: **Node.js (for documentation and frontend):** - - - -{InstallNodejsSh} +We recommend using the latest Node.js version specified in the `.nvmrc` file at +the root of the repository. You can use a Node.js version manager like `nvm` to +easily switch to the correct version. - - - -{InstallNodejsMacOSSh} - - - +For more information on how to install Node.js, please refer to the +[official Node.js documentation](https://nodejs.org/en/download/package-manager/). **Docker (optional, for containerized builds):** diff --git a/website/docs/developers/scripts/frontend/install-nodejs-linux.sh b/website/docs/developers/scripts/frontend/install-nodejs-linux.sh deleted file mode 100755 index e422fcbbf..000000000 --- a/website/docs/developers/scripts/frontend/install-nodejs-linux.sh +++ /dev/null @@ -1,17 +0,0 @@ -# Install nvm (if not already installed) -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash - -# Source nvm -export NVM_DIR="$HOME/.nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" - -# Install Node.js -nvm install 23.1.0 -nvm use 23.1.0 -nvm alias default 23.1.0 - -# Verify installation -echo "Node.js version: $(node --version)" -echo "npm version: $(npm --version)" - -echo "Node.js installation complete!" diff --git a/website/docs/developers/scripts/frontend/install-nodejs-macos.sh b/website/docs/developers/scripts/frontend/install-nodejs-macos.sh deleted file mode 100755 index bc146ef0e..000000000 --- a/website/docs/developers/scripts/frontend/install-nodejs-macos.sh +++ /dev/null @@ -1,11 +0,0 @@ -# Install Node.js -brew install node@23 - -# Link the installed version -brew link --overwrite node@23 - -# Verify installation -echo "Node.js version: $(node --version)" -echo "npm version: $(npm --version)" - -echo "Node.js installation complete!" diff --git a/website/docs/developers/scripts/setup/install-nodejs-macos.sh b/website/docs/developers/scripts/setup/install-nodejs-macos.sh deleted file mode 100755 index fa9099708..000000000 --- a/website/docs/developers/scripts/setup/install-nodejs-macos.sh +++ /dev/null @@ -1,5 +0,0 @@ -# Install Node.js (version 18+ recommended) via Homebrew -brew install node@18 - -# Link Node.js if needed -brew link node@18 \ No newline at end of file diff --git a/website/docs/developers/scripts/setup/install-nodejs.sh b/website/docs/developers/scripts/setup/install-nodejs.sh deleted file mode 100755 index 2c277e7b3..000000000 --- a/website/docs/developers/scripts/setup/install-nodejs.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Install Node.js (version 18+ recommended) -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - -sudo apt-get install -y nodejs From 0059c2ef82232fe2336f4012949b4f88c8ba440d Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Wed, 5 Nov 2025 17:30:38 -0500 Subject: [PATCH 3/5] Formating --- website/docs/developers/frontend/index.mdx | 3 +- website/docs/developers/getting-started.mdx | 3 +- website/package-lock.json | 47 ++++++++++++++++++++- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/website/docs/developers/frontend/index.mdx b/website/docs/developers/frontend/index.mdx index 6fd00240c..6b4fc5a70 100644 --- a/website/docs/developers/frontend/index.mdx +++ b/website/docs/developers/frontend/index.mdx @@ -7,8 +7,7 @@ sidebar_position: 1 import CodeBlock from "@theme/CodeBlock"; import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; -import InstallNodejsLinux from "!!raw-loader!../scripts/frontend/install-nodejs-linux.sh"; -import InstallNodejsMacos from "!!raw-loader!../scripts/frontend/install-nodejs-macos.sh"; + import InstallAngularCli from "!!raw-loader!../scripts/frontend/install-angular-cli.sh"; import InstallCypressUbuntu2204 from "!!raw-loader!../scripts/frontend/install-cypress-deps-ubuntu-22-04.sh"; import InstallCypressUbuntu2404 from "!!raw-loader!../scripts/frontend/install-cypress-deps-ubuntu-24-04.sh"; diff --git a/website/docs/developers/getting-started.mdx b/website/docs/developers/getting-started.mdx index 1709cb763..e18d8a620 100644 --- a/website/docs/developers/getting-started.mdx +++ b/website/docs/developers/getting-started.mdx @@ -10,8 +10,7 @@ import TabItem from "@theme/TabItem"; import InstallRustSh from "!!raw-loader!./scripts/setup/install-rust.sh"; import InstallSystemDepsSh from "!!raw-loader!./scripts/setup/install-system-deps.sh"; import InstallSystemDepsMacOSSh from "!!raw-loader!./scripts/setup/install-system-deps-macos.sh"; -import InstallNodejsSh from "!!raw-loader!./scripts/setup/install-nodejs.sh"; -import InstallNodejsMacOSSh from "!!raw-loader!./scripts/setup/install-nodejs-macos.sh"; + import InstallDockerSh from "!!raw-loader!./scripts/setup/install-docker.sh"; import InstallDockerMacOSSh from "!!raw-loader!./scripts/setup/install-docker-macos.sh"; import InstallWasmToolsSh from "!!raw-loader!./scripts/setup/install-wasm-tools.sh"; diff --git a/website/package-lock.json b/website/package-lock.json index b9016e854..4f49e2ade 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -25,7 +25,7 @@ "typescript": "~5.6.2" }, "engines": { - "node": ">=18.0" + "node": "^24.0.0" } }, "node_modules/@ai-sdk/gateway": { @@ -234,6 +234,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.42.0.tgz", "integrity": "sha512-NZR7yyHj2WzK6D5X8gn+/KOxPdzYEXOqVdSaK/biU8QfYUpUuEA0sCWg/XlO05tPVEcJelF/oLrrNY3UjRbOww==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.42.0", "@algolia/requester-browser-xhr": "5.42.0", @@ -359,6 +360,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2148,6 +2150,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2170,6 +2173,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2279,6 +2283,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2700,6 +2705,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3563,6 +3569,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -4264,6 +4271,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4582,6 +4590,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -4953,6 +4962,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -5303,6 +5313,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5388,6 +5399,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5433,6 +5445,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.42.0.tgz", "integrity": "sha512-X5+PtWc9EJIPafT/cj8ZG+6IU3cjRRnlHGtqMHK/9gsiupQbAyYlH5y7qt/FtsAhfX5AICHffZy69ZAsVrxWkQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.8.0", "@algolia/client-abtesting": "5.42.0", @@ -5896,6 +5909,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -6852,6 +6866,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8234,6 +8249,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8446,6 +8462,20 @@ "node": ">=14.14" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -12677,6 +12707,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13192,6 +13223,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -14095,6 +14127,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14881,6 +14914,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14963,6 +14997,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14972,6 +15007,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -15027,6 +15063,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -15055,6 +15092,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -16820,7 +16858,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/type-fest": { "version": "2.19.0", @@ -16883,6 +16922,7 @@ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17224,6 +17264,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17431,6 +17472,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -18017,6 +18059,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 7a498a74e618aa6700d71b621c4352b41542a1cd Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Wed, 5 Nov 2025 18:22:23 -0500 Subject: [PATCH 4/5] Use Debian to install the correct version of Node --- frontend/Dockerfile | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 364120e89..5630cd5a7 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -88,6 +88,10 @@ COPY --from=build_wasm /workspace/pkg ./ # Final stage - Apache with source code and build capability FROM httpd:2.4 AS final +# Set environment variables for Node.js version +ARG NODE_VERSION +ENV NODE_VERSION=${NODE_VERSION} + # Install system dependencies required for Node.js and build tools # hadolint ignore=DL3008 RUN apt-get update && \ @@ -101,19 +105,15 @@ RUN apt-get update && \ WORKDIR /app -# Install Node.js from build argument -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -ARG NODE_VERSION -ARG TARGETARCH -RUN case ${TARGETARCH} in \ - "amd64") \ - ARCH='x64' \ - ;; \ - "arm64") \ - ARCH='arm64' \ - ;; \ - esac && \ - curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${ARCH}.tar.xz" | tar -xJ -C /usr/local --strip-components=1 +# Add NodeSource GPG key and repository and install Node.js +RUN bash -c " \ + export NODE_MAJOR=$(echo ${NODE_VERSION} | cut -d. -f1); \ + mkdir -p /etc/apt/keyrings; \ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg; \ + echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$${NODE_MAJOR}.x nodistro main\" | tee /etc/apt/sources.list.d/nodesource.list; \ + apt-get update; \ + apt-get install -y nodejs; \ + " # Install Angular CLI COPY ./website/docs/developers/scripts/frontend/install-angular-cli.sh ./scripts/install-angular-cli.sh From 50838fa1f600e500823a6be73d9b15672065bd2c Mon Sep 17 00:00:00 2001 From: Richard Pringle Date: Wed, 5 Nov 2025 18:33:33 -0500 Subject: [PATCH 5/5] fixup! Use Debian to install the correct version of Node --- frontend/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 5630cd5a7..151415135 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -115,6 +115,9 @@ RUN bash -c " \ apt-get install -y nodejs; \ " +# Add Node.js to PATH +ENV PATH="/usr/local/bin:${PATH}" + # Install Angular CLI COPY ./website/docs/developers/scripts/frontend/install-angular-cli.sh ./scripts/install-angular-cli.sh RUN chmod +x ./scripts/install-angular-cli.sh && \