diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b69d7a420f..589b93ca7b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -23,7 +23,13 @@ updates: - package-ecosystem: npm directories: - "/web" - - "/web/sfe" + - "/web/packages/sfe" + - "/web/packages/core" + - "/web/packages/esbuild-plugin-live-reload" + - "/packages/prettier-config" + - "/packages/tsconfig" + - "/packages/docusaurus-config" + - "/packages/eslint-config" schedule: interval: daily time: "04:00" diff --git a/Dockerfile b/Dockerfile index 85456add26..c1d49ae29e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 # Stage 1: Build website -FROM --platform=${BUILDPLATFORM} docker.io/library/node:22 AS website-builder +FROM --platform=${BUILDPLATFORM} docker.io/library/node:24 AS website-builder ENV NODE_ENV=production @@ -20,7 +20,7 @@ COPY ./SECURITY.md /work/ RUN npm run build-bundled # Stage 2: Build webui -FROM --platform=${BUILDPLATFORM} docker.io/library/node:22 AS web-builder +FROM --platform=${BUILDPLATFORM} docker.io/library/node:24 AS web-builder ARG GIT_BUILD_HASH ENV GIT_BUILD_HASH=$GIT_BUILD_HASH diff --git a/package-lock.json b/package-lock.json index f9ac40756c..888bcec064 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@goauthentik/authentik", - "version": "2025.4.0", + "version": "2025.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@goauthentik/authentik", - "version": "2025.4.0", + "version": "2025.4.1", "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^5.2.2", "prettier": "^3.3.3", diff --git a/proxy.Dockerfile b/proxy.Dockerfile index cb58a55ad4..6b1e025be4 100644 --- a/proxy.Dockerfile +++ b/proxy.Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1 # Stage 1: Build web -FROM --platform=${BUILDPLATFORM} docker.io/library/node:22 AS web-builder +FROM --platform=${BUILDPLATFORM} docker.io/library/node:24 AS web-builder ENV NODE_ENV=production WORKDIR /static diff --git a/pyproject.toml b/pyproject.toml index f639ecbca0..55cf4f4e67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "drf-spectacular==0.28.0", "dumb-init==1.2.5.post1", "duo-client==5.5.0", - "fido2==1.2.0", + "fido2==2.0.0", "flower==2.0.1", "geoip2==5.1.0", "geopy==2.4.1", @@ -115,7 +115,7 @@ no-binary-package = [ [tool.uv.sources] django-tenants = { git = "https://github.com/rissson/django-tenants.git", branch = "authentik-fixes" } -opencontainers = { git = "https://github.com/BeryJu/oci-python", rev = "c791b19056769cd67957322806809ab70f5bead8" } +opencontainers = { git = "https://github.com/vsoch/oci-python", rev = "ceb4fcc090851717a3069d78e85ceb1e86c2740c" } djangorestframework = { git = "https://github.com/authentik-community/django-rest-framework", rev = "896722bab969fabc74a08b827da59409cf9f1a4e" } [project.scripts] diff --git a/uv.lock b/uv.lock index 287fbb7997..202892901d 100644 --- a/uv.lock +++ b/uv.lock @@ -291,7 +291,7 @@ requires-dist = [ { name = "drf-spectacular", specifier = "==0.28.0" }, { name = "dumb-init", specifier = "==1.2.5.post1" }, { name = "duo-client", specifier = "==5.5.0" }, - { name = "fido2", specifier = "==1.2.0" }, + { name = "fido2", specifier = "==2.0.0" }, { name = "flower", specifier = "==2.0.1" }, { name = "geoip2", specifier = "==5.1.0" }, { name = "geopy", specifier = "==2.4.1" }, @@ -304,7 +304,7 @@ requires-dist = [ { name = "ldap3", specifier = "==2.9.1" }, { name = "lxml", specifier = "==5.4.0" }, { name = "msgraph-sdk", specifier = "==1.30.0" }, - { name = "opencontainers", git = "https://github.com/BeryJu/oci-python?rev=c791b19056769cd67957322806809ab70f5bead8" }, + { name = "opencontainers", git = "https://github.com/vsoch/oci-python?rev=ceb4fcc090851717a3069d78e85ceb1e86c2740c" }, { name = "packaging", specifier = "==25.0" }, { name = "paramiko", specifier = "==3.5.1" }, { name = "psycopg", extras = ["c", "pool"], specifier = "==3.2.9" }, @@ -1262,14 +1262,14 @@ wheels = [ [[package]] name = "fido2" -version = "1.2.0" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/cc/4529123364d41f342145f2fd775307eaed817cd22810895dea10e15a4d06/fido2-1.2.0.tar.gz", hash = "sha256:e39f95920122d64283fda5e5581d95a206e704fa42846bfa4662f86aa0d3333b", size = 266369, upload-time = "2024-11-27T09:08:21.071Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/b9/6ec8d8ec5715efc6ae39e8694bd48d57c189906f0628558f56688d0447b2/fido2-2.0.0.tar.gz", hash = "sha256:3061cd05e73b3a0ef6afc3b803d57c826aa2d6a9732d16abd7277361f58e7964", size = 274942, upload-time = "2025-05-20T09:45:00.974Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/48/e9b99d66f27d3416a619324568739fd6603e093b2f79138d6f47ccf727b6/fido2-1.2.0-py3-none-any.whl", hash = "sha256:f7c8ee62e359aa980a45773f9493965bb29ede1b237a9218169dbfe60c80e130", size = 219418, upload-time = "2024-11-27T09:08:18.932Z" }, + { url = "https://files.pythonhosted.org/packages/4c/7d/a1dba174d7ec4b6b8d6360eed0ac3a4a4e2aa45f234e903592d3184c6c3f/fido2-2.0.0-py3-none-any.whl", hash = "sha256:685f54a50a57e019c6156e2dd699802a603e3abf70bab334f26affdd4fb8d4f7", size = 224761, upload-time = "2025-05-20T09:44:59.029Z" }, ] [[package]] @@ -2153,7 +2153,7 @@ wheels = [ [[package]] name = "opencontainers" version = "0.0.14" -source = { git = "https://github.com/BeryJu/oci-python?rev=c791b19056769cd67957322806809ab70f5bead8#c791b19056769cd67957322806809ab70f5bead8" } +source = { git = "https://github.com/vsoch/oci-python?rev=ceb4fcc090851717a3069d78e85ceb1e86c2740c#ceb4fcc090851717a3069d78e85ceb1e86c2740c" } [[package]] name = "opentelemetry-api" diff --git a/web/package-lock.json b/web/package-lock.json index 6b04513dac..1ab2a412ec 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -132,8 +132,8 @@ }, "optionalDependencies": { "@esbuild/darwin-arm64": "^0.24.0", - "@esbuild/linux-amd64": "^0.18.11", "@esbuild/linux-arm64": "^0.24.0", + "@esbuild/linux-x64": "^0.24.0", "@rollup/rollup-darwin-arm64": "4.23.0", "@rollup/rollup-linux-arm64-gnu": "4.23.0", "@rollup/rollup-linux-x64-gnu": "4.23.0" @@ -1232,13 +1232,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -7783,47 +7782,6 @@ "node": ">=10.0.0" } }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", - "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", - "dev": true, - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/@zip.js/zip.js": { "version": "2.7.52", "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.52.tgz", @@ -9714,32 +9672,6 @@ "layout-base": "^1.0.0" } }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/country-flag-icons": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/country-flag-icons/-/country-flag-icons-1.5.13.tgz", @@ -11053,15 +10985,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11888,6 +11811,23 @@ "node": ">=18" } }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -15332,12 +15272,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -15682,12 +15616,6 @@ "immediate": "~3.0.5" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, "node_modules/lit": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz", @@ -15836,39 +15764,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lockfile-lint": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/lockfile-lint/-/lockfile-lint-4.14.0.tgz", - "integrity": "sha512-uyXZ8X4J6EsicG87p0y4SHorJBwABLcaXOpI/j3h8SO/OX4fKTJ6Cqqi+U3zjgU0fo+u/4KbB7fl8ZzTewd0Ow==", - "dev": true, - "dependencies": { - "cosmiconfig": "^9.0.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "lockfile-lint-api": "^5.9.1", - "yargs": "^17.7.2" - }, - "bin": { - "lockfile-lint": "bin/lockfile-lint.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/lockfile-lint-api": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/lockfile-lint-api/-/lockfile-lint-api-5.9.1.tgz", - "integrity": "sha512-us5IT1bGA6KXbq1WrhrSzk9mtPgHKz5nhvv3S4hwcYnhcVOKW2uK0W8+PN9oIgv4pI49WsD5wBdTQFTpNChF/Q==", - "dev": true, - "dependencies": { - "@yarnpkg/parsers": "^3.0.0-rc.48.1", - "debug": "^4.3.4", - "object-hash": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -18460,15 +18355,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -18777,24 +18663,6 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-ms": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", @@ -24989,7 +24857,6 @@ "@swc/core": "^1.7.28", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/jquery": "^3.5.31", - "lockfile-lint": "^4.14.0", "prettier": "^3.3.2", "rollup": "^4.23.0", "rollup-plugin-copy": "^3.5.0", diff --git a/web/package.json b/web/package.json index a320315a39..27858252bb 100644 --- a/web/package.json +++ b/web/package.json @@ -200,8 +200,8 @@ }, "optionalDependencies": { "@esbuild/darwin-arm64": "^0.24.0", - "@esbuild/linux-amd64": "^0.18.11", "@esbuild/linux-arm64": "^0.24.0", + "@esbuild/linux-x64": "^0.24.0", "@rollup/rollup-darwin-arm64": "4.23.0", "@rollup/rollup-linux-arm64-gnu": "4.23.0", "@rollup/rollup-linux-x64-gnu": "4.23.0" diff --git a/web/packages/sfe/package.json b/web/packages/sfe/package.json index d490030c7b..895761bf48 100644 --- a/web/packages/sfe/package.json +++ b/web/packages/sfe/package.json @@ -17,7 +17,6 @@ "@swc/core": "^1.7.28", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/jquery": "^3.5.31", - "lockfile-lint": "^4.14.0", "prettier": "^3.3.2", "rollup": "^4.23.0", "rollup-plugin-copy": "^3.5.0", @@ -40,7 +39,6 @@ "private": true, "scripts": { "build": "wireit", - "lint:lockfile": "wireit", "prettier": "prettier --write ./src ./tsconfig.json ./rollup.config.js ./package.json", "watch": "rollup -w -c rollup.config.js --bundleConfigAsCjs" }, @@ -60,9 +58,6 @@ "dependencies": [ "build:sfe" ] - }, - "lint:lockfile": { - "command": "lockfile-lint --path package.json --type npm --allowed-hosts npm --validate-https" } } } diff --git a/website/docs/developer-docs/docs/writing-documentation.md b/website/docs/developer-docs/docs/writing-documentation.md index ff3b96336f..4107b0ac8f 100644 --- a/website/docs/developer-docs/docs/writing-documentation.md +++ b/website/docs/developer-docs/docs/writing-documentation.md @@ -22,7 +22,7 @@ Adhering to the following guidelines will help us get your PRs merged much easie Requirements: -- Node.js 20 (or greater, we use Node.js 22) +- Node.js 20 (or greater, we use Node.js 24) The docs and the code are in the same Github repo, at https://github.com/goauthentik/authentik, so if you have cloned the repo, you already have the docs. diff --git a/website/docs/developer-docs/setup/frontend-dev-environment.md b/website/docs/developer-docs/setup/frontend-dev-environment.md index 05628e21dd..f2b44a46d6 100644 --- a/website/docs/developer-docs/setup/frontend-dev-environment.md +++ b/website/docs/developer-docs/setup/frontend-dev-environment.md @@ -12,14 +12,14 @@ If you're focusing solely on frontend development, you can create a minimal deve ### Prerequisites -- [Node.js](https://nodejs.org/en) (22 or later) +- [Node.js](https://nodejs.org/en) (24 or later) - [Docker](https://www.docker.com/) (Latest Community Edition or Docker Desktop) - [Docker Compose](https://docs.docker.com/compose/) (Compose v2) - [Make](https://www.gnu.org/software/make/) (3 or later) :::info -Depending on platform, some native dependencies might be required. On macOS, run `brew install node@22`, and for Docker `brew install --cask docker` +Depending on platform, some native dependencies might be required. On macOS, run `brew install node@24`, and for Docker `brew install --cask docker` ::: diff --git a/website/docs/developer-docs/setup/full-dev-environment.mdx b/website/docs/developer-docs/setup/full-dev-environment.mdx index 438b76d218..6c88e75e66 100644 --- a/website/docs/developer-docs/setup/full-dev-environment.mdx +++ b/website/docs/developer-docs/setup/full-dev-environment.mdx @@ -18,7 +18,7 @@ import Tabs from "@theme/Tabs"; - [Python](https://www.python.org/) (3.13 or later) - [uv](https://docs.astral.sh/uv/getting-started/installation/), (Latest stable release) - [Go](https://go.dev/) (1.24 or later) -- [Node.js](https://nodejs.org/en) (22 or later) +- [Node.js](https://nodejs.org/en) (24 or later) - [PostgreSQL](https://www.postgresql.org/) (16 or later) - [Redis](https://redis.io/) (7 or later) - [Docker](https://www.docker.com/) (Latest Community Edition or Docker Desktop) @@ -55,7 +55,7 @@ values={[ ```sh $ brew install libxmlsec1 libpq krb5 pkg-config # Required development libraries, - $ brew install uv postgresql redis node@22 golangci-lint # Required CLI tools + $ brew install uv postgresql redis node@24 golangci-lint # Required CLI tools ``` diff --git a/website/docs/developer-docs/setup/website-dev-environment.md b/website/docs/developer-docs/setup/website-dev-environment.md index 98b56c0ad7..73ca1c4887 100644 --- a/website/docs/developer-docs/setup/website-dev-environment.md +++ b/website/docs/developer-docs/setup/website-dev-environment.md @@ -12,11 +12,11 @@ If you want to only make changes to the website, you only need node. ### Prerequisites -- Node.js (any recent version should work; we use 22.x to build) +- Node.js (any recent version should work; we use 24.x to build) - Make (again, any recent version should work) :::info -Depending on platform, some native dependencies might be required. On macOS, run `brew install node@22` +Depending on platform, some native dependencies might be required. On macOS, run `brew install node@24` ::: ### Instructions