From 9ac5afa6dd228b5b953bd79d7af8f660e1f4764c Mon Sep 17 00:00:00 2001 From: rahul Date: Sun, 25 Oct 2026 20:25:46 +0000 Subject: [PATCH 1/3] Bind pnpm to the selected Node.js runtime Assisted-by: Replit --- flake.nix | 6 +++++ pkgs/modules/nodejs/default.nix | 4 +++- pkgs/modules/nodejs/tests.nix | 39 +++++++++++++++++++++++++++++++++ scripts/ci_check.sh | 1 + 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 pkgs/modules/nodejs/tests.nix diff --git a/flake.nix b/flake.nix index cdb8c13e..8ab4ce35 100644 --- a/flake.nix +++ b/flake.nix @@ -185,6 +185,12 @@ checks.x86_64-linux.pip-user-site = pkgs.linkFarm "pip-user-site-check" (pkgs.lib.mapAttrsToList (name: path: { inherit name path; }) (import ./pkgs/pip/tests.nix { inherit pkgs; })); + checks.x86_64-linux.pnpm-nodejs = pkgs.linkFarm "pnpm-nodejs-check" + (pkgs.lib.mapAttrsToList (name: path: { inherit name path; }) + (import ./pkgs/modules/nodejs/tests.nix { + inherit pkgs; + runtimes = [ pkgs-master.nodejs_20 nodejs-22 nodejs-24 ]; + })); devShells.x86_64-linux.default = pkgs.mkShell { packages = with pkgs; [ python310 diff --git a/pkgs/modules/nodejs/default.nix b/pkgs/modules/nodejs/default.nix index 8b638247..d6a59c99 100644 --- a/pkgs/modules/nodejs/default.nix +++ b/pkgs/modules/nodejs/default.nix @@ -12,6 +12,8 @@ let inherit nodejs; }; + pnpm = pkgs.pnpm.override { inherit nodejs; }; + npx-wrapper = pkgs.writeShellApplication { name = "npx"; text = '' @@ -105,7 +107,7 @@ in packages = [ nodejs-wrapped bun - nodepkgs.pnpm + pnpm nodepkgs.yarn ]; diff --git a/pkgs/modules/nodejs/tests.nix b/pkgs/modules/nodejs/tests.nix new file mode 100644 index 00000000..016736ab --- /dev/null +++ b/pkgs/modules/nodejs/tests.nix @@ -0,0 +1,39 @@ +{ pkgs, runtimes }: +pkgs.lib.listToAttrs (map + (nodejs: + let + module = import ./. { inherit nodejs; } { inherit pkgs; inherit (pkgs) lib; }; + pnpm = pkgs.lib.findFirst (package: pkgs.lib.getName package == "pnpm") + (throw "Node.js module must include pnpm") + module.replit.packages; + major = pkgs.lib.versions.major nodejs.version; + name = "pnpm-nodejs-${major}"; + in + pkgs.lib.nameValuePair name (pkgs.runCommand name { } '' + export HOME="$TMPDIR/home" + export PATH="${nodejs}/bin:$PATH" + mkdir -p "$HOME" project + cd project + cat > package.json <<'EOF' + { + "name": "pnpm-runtime-check", + "version": "1.0.0", + "engines": { "node": ">=${nodejs.version} <${toString (pkgs.lib.toInt major + 1)}" } + } + EOF + echo 'engine-strict=true' > .npmrc + cat > "$TMPDIR/check-runtime.cjs" <<'EOF' + const assert = require('node:assert/strict'); + const fs = require('node:fs'); + assert.equal(process.version, 'v${nodejs.version}'); + assert.equal(fs.realpathSync(process.execPath), fs.realpathSync('${nodejs}/bin/node')); + fs.appendFileSync(process.env.RUNTIME_CHECK_LOG, process.version + '\n'); + EOF + export RUNTIME_CHECK_LOG="$TMPDIR/runtime.log" + export NODE_OPTIONS="--require=$TMPDIR/check-runtime.cjs" + test "$(${pnpm}/bin/pnpm --version)" = "${pnpm.version}" + ${pnpm}/bin/pnpm install --offline --ignore-scripts + test "$(wc -l < "$RUNTIME_CHECK_LOG")" -ge 2 + cp "$RUNTIME_CHECK_LOG" "$out" + '')) + runtimes) diff --git a/scripts/ci_check.sh b/scripts/ci_check.sh index 13dcab24..6d856030 100755 --- a/scripts/ci_check.sh +++ b/scripts/ci_check.sh @@ -18,6 +18,7 @@ nix eval "${NIX_FLAGS[@]}" .#modules --json nix eval "${NIX_FLAGS[@]}" .#deploymentModules --json nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.module-registry --no-link nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.pip-user-site --no-link +nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.pnpm-nodejs --no-link # The standalone lockfile OCI helper reconstructs old bundles, not current implementations. if git grep -n -E 'builtins[.]getFlake|(^|[^[:alnum:]_])getFlake[[:space:]]|github:replit/nixmodules/' -- '*.nix' ':!pkgs/mk-phony-ocis/default.nix'; then From 9db48ee8a6a2b6dabd5e736cec13ee2722fb58a2 Mon Sep 17 00:00:00 2001 From: rahul Date: Sun, 25 Oct 2026 20:28:06 +0000 Subject: [PATCH 2/3] Remove temporary pnpm regression checks Assisted-by: Replit --- flake.nix | 6 ------ pkgs/modules/nodejs/tests.nix | 39 ----------------------------------- scripts/ci_check.sh | 1 - 3 files changed, 46 deletions(-) delete mode 100644 pkgs/modules/nodejs/tests.nix diff --git a/flake.nix b/flake.nix index 8ab4ce35..cdb8c13e 100644 --- a/flake.nix +++ b/flake.nix @@ -185,12 +185,6 @@ checks.x86_64-linux.pip-user-site = pkgs.linkFarm "pip-user-site-check" (pkgs.lib.mapAttrsToList (name: path: { inherit name path; }) (import ./pkgs/pip/tests.nix { inherit pkgs; })); - checks.x86_64-linux.pnpm-nodejs = pkgs.linkFarm "pnpm-nodejs-check" - (pkgs.lib.mapAttrsToList (name: path: { inherit name path; }) - (import ./pkgs/modules/nodejs/tests.nix { - inherit pkgs; - runtimes = [ pkgs-master.nodejs_20 nodejs-22 nodejs-24 ]; - })); devShells.x86_64-linux.default = pkgs.mkShell { packages = with pkgs; [ python310 diff --git a/pkgs/modules/nodejs/tests.nix b/pkgs/modules/nodejs/tests.nix deleted file mode 100644 index 016736ab..00000000 --- a/pkgs/modules/nodejs/tests.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ pkgs, runtimes }: -pkgs.lib.listToAttrs (map - (nodejs: - let - module = import ./. { inherit nodejs; } { inherit pkgs; inherit (pkgs) lib; }; - pnpm = pkgs.lib.findFirst (package: pkgs.lib.getName package == "pnpm") - (throw "Node.js module must include pnpm") - module.replit.packages; - major = pkgs.lib.versions.major nodejs.version; - name = "pnpm-nodejs-${major}"; - in - pkgs.lib.nameValuePair name (pkgs.runCommand name { } '' - export HOME="$TMPDIR/home" - export PATH="${nodejs}/bin:$PATH" - mkdir -p "$HOME" project - cd project - cat > package.json <<'EOF' - { - "name": "pnpm-runtime-check", - "version": "1.0.0", - "engines": { "node": ">=${nodejs.version} <${toString (pkgs.lib.toInt major + 1)}" } - } - EOF - echo 'engine-strict=true' > .npmrc - cat > "$TMPDIR/check-runtime.cjs" <<'EOF' - const assert = require('node:assert/strict'); - const fs = require('node:fs'); - assert.equal(process.version, 'v${nodejs.version}'); - assert.equal(fs.realpathSync(process.execPath), fs.realpathSync('${nodejs}/bin/node')); - fs.appendFileSync(process.env.RUNTIME_CHECK_LOG, process.version + '\n'); - EOF - export RUNTIME_CHECK_LOG="$TMPDIR/runtime.log" - export NODE_OPTIONS="--require=$TMPDIR/check-runtime.cjs" - test "$(${pnpm}/bin/pnpm --version)" = "${pnpm.version}" - ${pnpm}/bin/pnpm install --offline --ignore-scripts - test "$(wc -l < "$RUNTIME_CHECK_LOG")" -ge 2 - cp "$RUNTIME_CHECK_LOG" "$out" - '')) - runtimes) diff --git a/scripts/ci_check.sh b/scripts/ci_check.sh index 6d856030..13dcab24 100755 --- a/scripts/ci_check.sh +++ b/scripts/ci_check.sh @@ -18,7 +18,6 @@ nix eval "${NIX_FLAGS[@]}" .#modules --json nix eval "${NIX_FLAGS[@]}" .#deploymentModules --json nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.module-registry --no-link nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.pip-user-site --no-link -nix build "${NIX_FLAGS[@]}" .#checks.x86_64-linux.pnpm-nodejs --no-link # The standalone lockfile OCI helper reconstructs old bundles, not current implementations. if git grep -n -E 'builtins[.]getFlake|(^|[^[:alnum:]_])getFlake[[:space:]]|github:replit/nixmodules/' -- '*.nix' ':!pkgs/mk-phony-ocis/default.nix'; then From 9c312f35308ace5a91e1646745b86bf90c54b089 Mon Sep 17 00:00:00 2001 From: rahul Date: Sun, 25 Oct 2026 20:43:01 +0000 Subject: [PATCH 3/3] Bind bundled tools to selected and patched runtimes Assisted-by: Replit --- README.md | 2 ++ flake.nix | 10 +++++++++- pkgs/angular-language-server/default.nix | 2 ++ pkgs/modules/angular/default.nix | 6 ++++-- pkgs/modules/default.nix | 4 +++- pkgs/modules/nodejs/default.nix | 8 +++----- pkgs/modules/nodejs/node-packages.nix | 15 +++++++++++++++ pkgs/modules/python-base/default.nix | 2 +- pkgs/modules/svelte-kit/default.nix | 17 +++++++++++------ pkgs/modules/vue/default.nix | 2 +- pkgs/upgrade-map/default.nix | 1 + 11 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 pkgs/modules/nodejs/node-packages.nix diff --git a/README.md b/README.md index 1732385f..635ab5a8 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ and Swift 5.6 to 5.8. The unversioned `swift` alias also resolves to 5.8. The old Python and Node.js Prybar IDs now use the standard Python 3.10 and Node.js 20 file runners, not Prybar. Projects using retired IDs get the newer runtime and tools with this bundle and may need code or dependency changes. +The old `svelte-kit-node-20` ID resolves to `svelte-kit-node-24`, preserving +the Node.js 24 major that the SvelteKit module already used. ## Building diff --git a/flake.nix b/flake.nix index cdb8c13e..e17ef623 100644 --- a/flake.nix +++ b/flake.nix @@ -122,7 +122,15 @@ ]; }; - pkgs = mkPkgs patched-unstable "x86_64-linux"; + pkgs = (mkPkgs patched-unstable "x86_64-linux").extend (final: _: { + nodejs-slim = nodejs-24-slim; + nodejs = nodejs-24 // { + # The base nixpkgs nodePackages alias requires the older pkgs passthru. + pkgs = final.callPackage "${nixpkgs}/pkgs/development/node-packages" { + nodejs = final.nodejs; + }; + }; + }); pkgs-aarch64-darwin = mkPkgs patched-unstable "aarch64-darwin"; in { diff --git a/pkgs/angular-language-server/default.nix b/pkgs/angular-language-server/default.nix index cd0f7e88..a69ad6e3 100644 --- a/pkgs/angular-language-server/default.nix +++ b/pkgs/angular-language-server/default.nix @@ -1,9 +1,11 @@ # TODO: upstream this file into nixpkgs { buildNpmPackage , fetchurl +, nodejs }: buildNpmPackage rec { + inherit nodejs; name = "@angular/language-server"; version = "17.0.3"; diff --git a/pkgs/modules/angular/default.nix b/pkgs/modules/angular/default.nix index 7fb87491..6816d25e 100644 --- a/pkgs/modules/angular/default.nix +++ b/pkgs/modules/angular/default.nix @@ -4,9 +4,11 @@ let nodeVersion = lib.versions.major nodejs.version; - nodepkgs = pkgs.nodePackages.override { inherit nodejs; }; + nodepkgs = import ../nodejs/node-packages.nix { inherit pkgs nodejs; }; - angular-language-server = pkgs.callPackage ../../angular-language-server { }; + angular-language-server = pkgs.callPackage ../../angular-language-server { + inherit nodejs; + }; language = "angular"; in diff --git a/pkgs/modules/default.nix b/pkgs/modules/default.nix index 78dd6137..e41837c4 100644 --- a/pkgs/modules/default.nix +++ b/pkgs/modules/default.nix @@ -160,7 +160,9 @@ let }) ) (import ./swift) - (import ./svelte-kit) + (import ./svelte-kit { + nodejs = nodejs-24; + }) (import ./vue { nodejs = pkgs.nodejs_20; }) diff --git a/pkgs/modules/nodejs/default.nix b/pkgs/modules/nodejs/default.nix index d6a59c99..1bcd4c2d 100644 --- a/pkgs/modules/nodejs/default.nix +++ b/pkgs/modules/nodejs/default.nix @@ -8,12 +8,10 @@ let bun = pkgs.bun; - nodepkgs = pkgs.nodePackages.override { - inherit nodejs; + nodepkgs = import ./node-packages.nix { + inherit pkgs nodejs; }; - pnpm = pkgs.pnpm.override { inherit nodejs; }; - npx-wrapper = pkgs.writeShellApplication { name = "npx"; text = '' @@ -107,7 +105,7 @@ in packages = [ nodejs-wrapped bun - pnpm + nodepkgs.pnpm nodepkgs.yarn ]; diff --git a/pkgs/modules/nodejs/node-packages.nix b/pkgs/modules/nodejs/node-packages.nix new file mode 100644 index 00000000..d2229184 --- /dev/null +++ b/pkgs/modules/nodejs/node-packages.nix @@ -0,0 +1,15 @@ +{ pkgs, nodejs }: +let + typescript = pkgs.typescript.override { + buildNpmPackage = pkgs.buildNpmPackage.override { inherit nodejs; }; + }; +in +(pkgs.nodePackages.override { inherit nodejs; }) // { + pnpm = pkgs.pnpm.override { inherit nodejs; }; + yarn = pkgs.yarn.override { inherit nodejs; }; + prettier = pkgs.prettier.override { inherit nodejs; }; + inherit typescript; + typescript-language-server = pkgs.typescript-language-server.override { + inherit nodejs typescript; + }; +} diff --git a/pkgs/modules/python-base/default.nix b/pkgs/modules/python-base/default.nix index a496824a..a5d394d6 100644 --- a/pkgs/modules/python-base/default.nix +++ b/pkgs/modules/python-base/default.nix @@ -34,7 +34,7 @@ in replit.packages = [ binary-wrapped-python (pypkgs.callPackage ../../pip { }) - pkgs.poetry + (pkgs.poetry.override { python3 = python; }) uv ]; diff --git a/pkgs/modules/svelte-kit/default.nix b/pkgs/modules/svelte-kit/default.nix index f16b364a..d209d759 100644 --- a/pkgs/modules/svelte-kit/default.nix +++ b/pkgs/modules/svelte-kit/default.nix @@ -1,15 +1,20 @@ -{ pkgs, ... }: +{ nodejs }: +{ pkgs, lib, ... }: +let + node-version = lib.versions.major nodejs.version; + svelte-language-server = pkgs.svelte-language-server.override { inherit nodejs; }; +in { - id = "svelte-kit-node-20"; + id = "svelte-kit-node-${node-version}"; name = "SvelteKit Tools with Node.js"; - displayVersion = "20"; + displayVersion = node-version; description = '' Svelte Kit development tools. Includes Node.js, Svelte language server. ''; replit = { - packages = with pkgs; [ + packages = [ nodejs ]; @@ -23,14 +28,14 @@ ".ts" ]; - start = "${pkgs.nodejs}/bin/npm run dev"; + start = "${nodejs}/bin/npm run dev"; }; dev.languageServers.svelte-language-server = { name = "Svelte Language Server"; language = "svelte"; extensions = [ ".svelte" ".js" ".ts" ]; - start = "${pkgs.nodePackages.svelte-language-server}/bin/svelteserver --stdio"; + start = "${svelte-language-server}/bin/svelteserver --stdio"; }; }; } diff --git a/pkgs/modules/vue/default.nix b/pkgs/modules/vue/default.nix index 16ca1a61..d528e59a 100644 --- a/pkgs/modules/vue/default.nix +++ b/pkgs/modules/vue/default.nix @@ -2,7 +2,7 @@ { pkgs, lib, ... }: let - nodepkgs = nodejs.pkgs; + nodepkgs = import ../nodejs/node-packages.nix { inherit pkgs nodejs; }; node-version = lib.versions.major nodejs.version; vue-language-server = pkgs.callPackage ../../vue-language-server { diff --git a/pkgs/upgrade-map/default.nix b/pkgs/upgrade-map/default.nix index b7a38248..9c2c8445 100644 --- a/pkgs/upgrade-map/default.nix +++ b/pkgs/upgrade-map/default.nix @@ -50,6 +50,7 @@ let "rust-1.70" = "rust-1.72"; "rust-1.72" = "rust-stable"; "ruby-3.1" = "ruby-3.2"; + "svelte-kit-node-20" = "svelte-kit-node-24"; "swift" = "swift-5.8"; "swift-5.6" = "swift-5.8"; "vue-node-18" = "vue-node-20";