diff --git a/libraries/access-token-encryptor/.nvmrc b/libraries/access-token-encryptor/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/access-token-encryptor/.nvmrc
+++ b/libraries/access-token-encryptor/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/access-token-encryptor/buildscript.txt b/libraries/access-token-encryptor/buildscript.txt
index 36fd724a80..6edd9f367b 100644
--- a/libraries/access-token-encryptor/buildscript.txt
+++ b/libraries/access-token-encryptor/buildscript.txt
@@ -5,6 +5,6 @@ access-token-encryptor
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/fetch-utils/.nvmrc b/libraries/fetch-utils/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/fetch-utils/.nvmrc
+++ b/libraries/fetch-utils/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/fetch-utils/buildscript.txt b/libraries/fetch-utils/buildscript.txt
index a158079aee..8b214755c6 100644
--- a/libraries/fetch-utils/buildscript.txt
+++ b/libraries/fetch-utils/buildscript.txt
@@ -5,6 +5,6 @@ fetch-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/logger/.nvmrc b/libraries/logger/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/logger/.nvmrc
+++ b/libraries/logger/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/logger/buildscript.txt b/libraries/logger/buildscript.txt
index afe93c28dc..7f3bba47dd 100644
--- a/libraries/logger/buildscript.txt
+++ b/libraries/logger/buildscript.txt
@@ -5,6 +5,6 @@ logger
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/metrics/.nvmrc b/libraries/metrics/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/metrics/.nvmrc
+++ b/libraries/metrics/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/metrics/buildscript.txt b/libraries/metrics/buildscript.txt
index 74fcbdb6c6..7b952a3920 100644
--- a/libraries/metrics/buildscript.txt
+++ b/libraries/metrics/buildscript.txt
@@ -5,6 +5,6 @@ metrics
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/mongo-utils/.nvmrc b/libraries/mongo-utils/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/mongo-utils/.nvmrc
+++ b/libraries/mongo-utils/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/mongo-utils/buildscript.txt b/libraries/mongo-utils/buildscript.txt
index a4e4fe7802..81fe685256 100644
--- a/libraries/mongo-utils/buildscript.txt
+++ b/libraries/mongo-utils/buildscript.txt
@@ -5,6 +5,6 @@ mongo-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/o-error/.nvmrc b/libraries/o-error/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/o-error/.nvmrc
+++ b/libraries/o-error/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/o-error/buildscript.txt b/libraries/o-error/buildscript.txt
index 81d3eb3252..79b5d38c73 100644
--- a/libraries/o-error/buildscript.txt
+++ b/libraries/o-error/buildscript.txt
@@ -5,6 +5,6 @@ o-error
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/object-persistor/.nvmrc b/libraries/object-persistor/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/object-persistor/.nvmrc
+++ b/libraries/object-persistor/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/object-persistor/buildscript.txt b/libraries/object-persistor/buildscript.txt
index 9ca6929a03..2484951ddc 100644
--- a/libraries/object-persistor/buildscript.txt
+++ b/libraries/object-persistor/buildscript.txt
@@ -5,6 +5,6 @@ object-persistor
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/overleaf-editor-core/.nvmrc b/libraries/overleaf-editor-core/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/overleaf-editor-core/.nvmrc
+++ b/libraries/overleaf-editor-core/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/overleaf-editor-core/buildscript.txt b/libraries/overleaf-editor-core/buildscript.txt
index 03b7f06791..0011456758 100644
--- a/libraries/overleaf-editor-core/buildscript.txt
+++ b/libraries/overleaf-editor-core/buildscript.txt
@@ -5,6 +5,6 @@ overleaf-editor-core
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/promise-utils/.nvmrc b/libraries/promise-utils/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/promise-utils/.nvmrc
+++ b/libraries/promise-utils/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/promise-utils/buildscript.txt b/libraries/promise-utils/buildscript.txt
index 51a6dad532..a961c96d43 100644
--- a/libraries/promise-utils/buildscript.txt
+++ b/libraries/promise-utils/buildscript.txt
@@ -5,6 +5,6 @@ promise-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/ranges-tracker/.nvmrc b/libraries/ranges-tracker/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/ranges-tracker/.nvmrc
+++ b/libraries/ranges-tracker/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/ranges-tracker/buildscript.txt b/libraries/ranges-tracker/buildscript.txt
index d112f852a7..d1803898ae 100644
--- a/libraries/ranges-tracker/buildscript.txt
+++ b/libraries/ranges-tracker/buildscript.txt
@@ -5,6 +5,6 @@ ranges-tracker
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/redis-wrapper/.nvmrc b/libraries/redis-wrapper/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/redis-wrapper/.nvmrc
+++ b/libraries/redis-wrapper/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/redis-wrapper/buildscript.txt b/libraries/redis-wrapper/buildscript.txt
index 89de51417a..c5c4f6abd9 100644
--- a/libraries/redis-wrapper/buildscript.txt
+++ b/libraries/redis-wrapper/buildscript.txt
@@ -5,6 +5,6 @@ redis-wrapper
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/settings/.nvmrc b/libraries/settings/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/settings/.nvmrc
+++ b/libraries/settings/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/settings/buildscript.txt b/libraries/settings/buildscript.txt
index ed79480d31..844f3dd13c 100644
--- a/libraries/settings/buildscript.txt
+++ b/libraries/settings/buildscript.txt
@@ -5,6 +5,6 @@ settings
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/libraries/stream-utils/.nvmrc b/libraries/stream-utils/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/libraries/stream-utils/.nvmrc
+++ b/libraries/stream-utils/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/libraries/stream-utils/buildscript.txt b/libraries/stream-utils/buildscript.txt
index ad7265549c..709adeae9a 100644
--- a/libraries/stream-utils/buildscript.txt
+++ b/libraries/stream-utils/buildscript.txt
@@ -5,6 +5,6 @@ stream-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/server-ce/test/Dockerfile b/server-ce/test/Dockerfile
index 721b99c06b..c8c2626a5b 100644
--- a/server-ce/test/Dockerfile
+++ b/server-ce/test/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20.18.2
+FROM node:22.15.0
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \
&& echo \
"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
diff --git a/services/chat/.nvmrc b/services/chat/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/chat/.nvmrc
+++ b/services/chat/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/chat/Dockerfile b/services/chat/Dockerfile
index 14056c2d29..9f9efaa915 100644
--- a/services/chat/Dockerfile
+++ b/services/chat/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/chat
diff --git a/services/chat/Makefile b/services/chat/Makefile
index 94f0afb567..40cb2b6af3 100644
--- a/services/chat/Makefile
+++ b/services/chat/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/chat/buildscript.txt b/services/chat/buildscript.txt
index 1dc88e9fa6..a90eb1a5e9 100644
--- a/services/chat/buildscript.txt
+++ b/services/chat/buildscript.txt
@@ -4,6 +4,6 @@ chat
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/services/chat/docker-compose.yml b/services/chat/docker-compose.yml
index b830d25453..40a6e561f6 100644
--- a/services/chat/docker-compose.yml
+++ b/services/chat/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
diff --git a/services/clsi/.nvmrc b/services/clsi/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/clsi/.nvmrc
+++ b/services/clsi/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/clsi/Dockerfile b/services/clsi/Dockerfile
index c5f46c1c19..1f37b3dd01 100644
--- a/services/clsi/Dockerfile
+++ b/services/clsi/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/clsi
COPY services/clsi/install_deps.sh /overleaf/services/clsi/
diff --git a/services/clsi/Makefile b/services/clsi/Makefile
index 70415b80e9..1d93a411be 100644
--- a/services/clsi/Makefile
+++ b/services/clsi/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/clsi/buildscript.txt b/services/clsi/buildscript.txt
index 831ac3ecc9..82084539ee 100644
--- a/services/clsi/buildscript.txt
+++ b/services/clsi/buildscript.txt
@@ -5,7 +5,7 @@ clsi
--env-add=ENABLE_PDF_CACHING="true",PDF_CACHING_ENABLE_WORKER_POOL="true",ALLOWED_IMAGES=quay.io/sharelatex/texlive-full:2017.1,TEXLIVE_IMAGE=quay.io/sharelatex/texlive-full:2017.1,TEX_LIVE_IMAGE_NAME_OVERRIDE=us-east1-docker.pkg.dev/overleaf-ops/ol-docker,TEXLIVE_IMAGE_USER="tex",DOCKER_RUNNER="true",COMPILES_HOST_DIR=$PWD/compiles,OUTPUT_HOST_DIR=$PWD/output
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=True
--script-version=4.7.0
--use-large-ci-runner=True
diff --git a/services/contacts/.nvmrc b/services/contacts/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/contacts/.nvmrc
+++ b/services/contacts/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/contacts/Dockerfile b/services/contacts/Dockerfile
index 69d2d35b3c..19094d7d44 100644
--- a/services/contacts/Dockerfile
+++ b/services/contacts/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/contacts
diff --git a/services/contacts/Makefile b/services/contacts/Makefile
index 97a348d219..963a19c590 100644
--- a/services/contacts/Makefile
+++ b/services/contacts/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/contacts/buildscript.txt b/services/contacts/buildscript.txt
index 8563d1b71e..d498d72ecc 100644
--- a/services/contacts/buildscript.txt
+++ b/services/contacts/buildscript.txt
@@ -4,6 +4,6 @@ contacts
--env-add=
--env-pass-through=
--esmock-loader=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/services/contacts/docker-compose.yml b/services/contacts/docker-compose.yml
index 310220bd20..7646495f6f 100644
--- a/services/contacts/docker-compose.yml
+++ b/services/contacts/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/contacts
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/contacts
- ../../node_modules:/overleaf/node_modules
diff --git a/services/docstore/.nvmrc b/services/docstore/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/docstore/.nvmrc
+++ b/services/docstore/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/docstore/Dockerfile b/services/docstore/Dockerfile
index 60a024ea91..98ad4b88e5 100644
--- a/services/docstore/Dockerfile
+++ b/services/docstore/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/docstore
diff --git a/services/docstore/Makefile b/services/docstore/Makefile
index 6efd053025..e44b964044 100644
--- a/services/docstore/Makefile
+++ b/services/docstore/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/docstore/buildscript.txt b/services/docstore/buildscript.txt
index c329d7b571..acf043e4e2 100644
--- a/services/docstore/buildscript.txt
+++ b/services/docstore/buildscript.txt
@@ -4,6 +4,6 @@ docstore
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=True
--script-version=4.7.0
diff --git a/services/docstore/docker-compose.yml b/services/docstore/docker-compose.yml
index 93a029b00a..9d4a7bfc6b 100644
--- a/services/docstore/docker-compose.yml
+++ b/services/docstore/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/docstore
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/docstore
- ../../node_modules:/overleaf/node_modules
diff --git a/services/document-updater/.nvmrc b/services/document-updater/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/document-updater/.nvmrc
+++ b/services/document-updater/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/document-updater/Dockerfile b/services/document-updater/Dockerfile
index 436d722577..e23e5a9052 100644
--- a/services/document-updater/Dockerfile
+++ b/services/document-updater/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/document-updater
diff --git a/services/document-updater/Makefile b/services/document-updater/Makefile
index 55f483fc89..963a56a0d0 100644
--- a/services/document-updater/Makefile
+++ b/services/document-updater/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/document-updater/buildscript.txt b/services/document-updater/buildscript.txt
index ee013ebea9..83e9299109 100644
--- a/services/document-updater/buildscript.txt
+++ b/services/document-updater/buildscript.txt
@@ -4,6 +4,6 @@ document-updater
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=True
--script-version=4.7.0
diff --git a/services/document-updater/docker-compose.yml b/services/document-updater/docker-compose.yml
index e33174f9e2..d211fbe307 100644
--- a/services/document-updater/docker-compose.yml
+++ b/services/document-updater/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/document-updater
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/document-updater
- ../../node_modules:/overleaf/node_modules
diff --git a/services/filestore/.nvmrc b/services/filestore/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/filestore/.nvmrc
+++ b/services/filestore/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/filestore/Dockerfile b/services/filestore/Dockerfile
index 8e336d4630..1de1be5e22 100644
--- a/services/filestore/Dockerfile
+++ b/services/filestore/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/filestore
COPY services/filestore/install_deps.sh /overleaf/services/filestore/
diff --git a/services/filestore/Makefile b/services/filestore/Makefile
index cc1724589d..53827955fc 100644
--- a/services/filestore/Makefile
+++ b/services/filestore/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/filestore/buildscript.txt b/services/filestore/buildscript.txt
index 75a491c18a..fd80733689 100644
--- a/services/filestore/buildscript.txt
+++ b/services/filestore/buildscript.txt
@@ -5,7 +5,7 @@ filestore
--env-add=ENABLE_CONVERSIONS="true",USE_PROM_METRICS="true",AWS_S3_USER_FILES_STORAGE_CLASS=REDUCED_REDUNDANCY,AWS_S3_USER_FILES_BUCKET_NAME=fake-user-files,AWS_S3_USER_FILES_DEK_BUCKET_NAME=fake-user-files-dek,AWS_S3_TEMPLATE_FILES_BUCKET_NAME=fake-template-files,GCS_USER_FILES_BUCKET_NAME=fake-gcs-user-files,GCS_TEMPLATE_FILES_BUCKET_NAME=fake-gcs-template-files
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=True
--script-version=4.7.0
--test-acceptance-shards=SHARD_01_,SHARD_02_,SHARD_03_
diff --git a/services/filestore/docker-compose.ci.yml b/services/filestore/docker-compose.ci.yml
index febd6e4c13..e1454fa809 100644
--- a/services/filestore/docker-compose.ci.yml
+++ b/services/filestore/docker-compose.ci.yml
@@ -64,7 +64,7 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
certs:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- ./test/acceptance/certs:/certs
working_dir: /certs
diff --git a/services/filestore/docker-compose.yml b/services/filestore/docker-compose.yml
index cc58997445..e6e9c659db 100644
--- a/services/filestore/docker-compose.yml
+++ b/services/filestore/docker-compose.yml
@@ -72,7 +72,7 @@ services:
command: npm run --silent test:acceptance
certs:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- ./test/acceptance/certs:/certs
working_dir: /certs
diff --git a/services/history-v1/.nvmrc b/services/history-v1/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/history-v1/.nvmrc
+++ b/services/history-v1/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/history-v1/Dockerfile b/services/history-v1/Dockerfile
index 0aa6a2fc0f..4231373781 100644
--- a/services/history-v1/Dockerfile
+++ b/services/history-v1/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/history-v1
COPY services/history-v1/install_deps.sh /overleaf/services/history-v1/
diff --git a/services/history-v1/Makefile b/services/history-v1/Makefile
index 1f03a21f18..18f6bcffd5 100644
--- a/services/history-v1/Makefile
+++ b/services/history-v1/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/history-v1/buildscript.txt b/services/history-v1/buildscript.txt
index f3e029ba33..a1988ab2ca 100644
--- a/services/history-v1/buildscript.txt
+++ b/services/history-v1/buildscript.txt
@@ -4,7 +4,7 @@ history-v1
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
--tsconfig-extra-includes=backup-deletion-app.mjs,backup-verifier-app.mjs,backup-worker-app.mjs,api/**/*,migrations/**/*,storage/**/*
diff --git a/services/history-v1/docker-compose.ci.yml b/services/history-v1/docker-compose.ci.yml
index 06d5d55161..ebf15679eb 100644
--- a/services/history-v1/docker-compose.ci.yml
+++ b/services/history-v1/docker-compose.ci.yml
@@ -98,7 +98,7 @@ services:
retries: 20
certs:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- ./test/acceptance/certs:/certs
working_dir: /certs
diff --git a/services/history-v1/docker-compose.yml b/services/history-v1/docker-compose.yml
index f4c885d467..941c5a6d6d 100644
--- a/services/history-v1/docker-compose.yml
+++ b/services/history-v1/docker-compose.yml
@@ -107,7 +107,7 @@ services:
retries: 20
certs:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- ./test/acceptance/certs:/certs
working_dir: /certs
diff --git a/services/notifications/.nvmrc b/services/notifications/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/notifications/.nvmrc
+++ b/services/notifications/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/notifications/Dockerfile b/services/notifications/Dockerfile
index 16a5c44fbf..255a7ffeff 100644
--- a/services/notifications/Dockerfile
+++ b/services/notifications/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/notifications
diff --git a/services/notifications/Makefile b/services/notifications/Makefile
index 8ca3f983ff..1d5938cfcf 100644
--- a/services/notifications/Makefile
+++ b/services/notifications/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/notifications/buildscript.txt b/services/notifications/buildscript.txt
index c52e316ffe..1ff790603e 100644
--- a/services/notifications/buildscript.txt
+++ b/services/notifications/buildscript.txt
@@ -4,6 +4,6 @@ notifications
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=True
--script-version=4.7.0
diff --git a/services/notifications/docker-compose.yml b/services/notifications/docker-compose.yml
index c0902fee2d..b35375a399 100644
--- a/services/notifications/docker-compose.yml
+++ b/services/notifications/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/notifications
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/notifications
- ../../node_modules:/overleaf/node_modules
diff --git a/services/project-history/.nvmrc b/services/project-history/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/project-history/.nvmrc
+++ b/services/project-history/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/project-history/Dockerfile b/services/project-history/Dockerfile
index 1bf4e5680b..5a88d0382f 100644
--- a/services/project-history/Dockerfile
+++ b/services/project-history/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/project-history
diff --git a/services/project-history/Makefile b/services/project-history/Makefile
index 5cde05ea46..1d63b7a8f0 100644
--- a/services/project-history/Makefile
+++ b/services/project-history/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json --volume $(MONOREPO)/services/document-updater/app/js/types.ts:/overleaf/services/document-updater/app/js/types.ts ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/project-history/buildscript.txt b/services/project-history/buildscript.txt
index be5e751759..0e4591c5fc 100644
--- a/services/project-history/buildscript.txt
+++ b/services/project-history/buildscript.txt
@@ -4,6 +4,6 @@ project-history
--env-add=
--env-pass-through=
--esmock-loader=True
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/services/project-history/docker-compose.yml b/services/project-history/docker-compose.yml
index deed9c5033..a7db044a27 100644
--- a/services/project-history/docker-compose.yml
+++ b/services/project-history/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/project-history
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/project-history
- ../../node_modules:/overleaf/node_modules
diff --git a/services/real-time/.nvmrc b/services/real-time/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/real-time/.nvmrc
+++ b/services/real-time/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/real-time/Dockerfile b/services/real-time/Dockerfile
index d1f2046895..a14a51b224 100644
--- a/services/real-time/Dockerfile
+++ b/services/real-time/Dockerfile
@@ -2,7 +2,7 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/real-time
diff --git a/services/real-time/Makefile b/services/real-time/Makefile
index e9e6a7a067..746f5e8e74 100644
--- a/services/real-time/Makefile
+++ b/services/real-time/Makefile
@@ -32,12 +32,12 @@ HERE=$(shell pwd)
MONOREPO=$(shell cd ../../ && pwd)
# Run the linting commands in the scope of the monorepo.
# Eslint and prettier (plus some configs) are on the root.
-RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:20.18.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.15.0 npm run --silent
RUN_LINTING_CI = docker run --rm --volume $(MONOREPO)/.editorconfig:/overleaf/.editorconfig --volume $(MONOREPO)/.eslintignore:/overleaf/.eslintignore --volume $(MONOREPO)/.eslintrc:/overleaf/.eslintrc --volume $(MONOREPO)/.prettierignore:/overleaf/.prettierignore --volume $(MONOREPO)/.prettierrc:/overleaf/.prettierrc --volume $(MONOREPO)/tsconfig.backend.json:/overleaf/tsconfig.backend.json ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) npm run --silent
# Same but from the top of the monorepo
-RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:20.18.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.15.0 npm run --silent
SHELLCHECK_OPTS = \
--shell=bash \
diff --git a/services/real-time/buildscript.txt b/services/real-time/buildscript.txt
index 292fde8b4c..1b5cfce301 100644
--- a/services/real-time/buildscript.txt
+++ b/services/real-time/buildscript.txt
@@ -4,6 +4,6 @@ real-time
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=20.18.2
+--node-version=22.15.0
--public-repo=False
--script-version=4.7.0
diff --git a/services/real-time/docker-compose.yml b/services/real-time/docker-compose.yml
index d40fada758..b122dd0f39 100644
--- a/services/real-time/docker-compose.yml
+++ b/services/real-time/docker-compose.yml
@@ -6,7 +6,7 @@ version: "2.3"
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/real-time
- ../../node_modules:/overleaf/node_modules
@@ -21,7 +21,7 @@ services:
user: node
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/real-time
- ../../node_modules:/overleaf/node_modules
diff --git a/services/web/.nvmrc b/services/web/.nvmrc
index 0254b1e633..b8ffd70759 100644
--- a/services/web/.nvmrc
+++ b/services/web/.nvmrc
@@ -1 +1 @@
-20.18.2
+22.15.0
diff --git a/services/web/Dockerfile b/services/web/Dockerfile
index 4f5d2e5ff1..ba8a91fe6d 100644
--- a/services/web/Dockerfile
+++ b/services/web/Dockerfile
@@ -1,6 +1,6 @@
# the base image is suitable for running web with /overleaf/services/web bind
# mounted
-FROM node:20.18.2 AS base
+FROM node:22.15.0 AS base
WORKDIR /overleaf/services/web
diff --git a/services/web/Dockerfile.frontend b/services/web/Dockerfile.frontend
index 0bdfd8c1f9..ee66f12559 100644
--- a/services/web/Dockerfile.frontend
+++ b/services/web/Dockerfile.frontend
@@ -1,4 +1,4 @@
-FROM node:20.18.2
+FROM node:22.15.0
# Install Google Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
diff --git a/services/web/cloudbuild-storybook.yaml b/services/web/cloudbuild-storybook.yaml
index ac9cfeba7d..20a523ceaa 100644
--- a/services/web/cloudbuild-storybook.yaml
+++ b/services/web/cloudbuild-storybook.yaml
@@ -1,13 +1,13 @@
steps:
- id: npm_ci
- name: "node:20.18.2"
+ name: "node:22.15.0"
entrypoint: /bin/bash
args:
- '-c'
- 'bin/npm_install_subset . libraries/* services/web'
- id: build-storybook
- name: 'node:20.18.2'
+ name: 'node:22.15.0'
env:
- 'BRANCH_NAME=$BRANCH_NAME'
- 'BUILD_ID=$BUILD_ID'
@@ -49,7 +49,7 @@ steps:
- deploy-storybook
- id: create-storybook-index
- name: 'node:20.18.2'
+ name: 'node:22.15.0'
dir: services/web
env:
- 'BRANCH_NAME=$BRANCH_NAME'
diff --git a/services/web/docker-compose.common.env b/services/web/docker-compose.common.env
index 7f94f5714a..10ee8b4a89 100644
--- a/services/web/docker-compose.common.env
+++ b/services/web/docker-compose.common.env
@@ -41,6 +41,6 @@ OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN=true
OVERLEAF_SAML_CERT=MIIDXTCCAkWgAwIBAgIJAOvOeQ4xFTzsMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNVBAYTAkdCMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTYxMTE1MTQxMjU5WhcNMjYxMTE1MTQxMjU5WjBFMQswCQYDVQQGEwJHQjETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCT6MBe5G9VoLU8MfztOEbUhnwLp17ak8eFUqxqeXkkqtWB0b/cmIBU3xoQoO3dIF8PBzfqehqfYVhrNt/TFgcmDfmJnPJRL1RJWMW3VmiP5odJ3LwlkKbZpkeT3wZ8HEJIR1+zbpxiBNkbd2GbdR1iumcsHzMYX1A2CBj+ZMV5VijC+K4P0e9c05VsDEUtLmfeAasJAiumQoVVgAe/BpiXjICGGewa6EPFI7mKkifIRKOGxdRESwZZjxP30bI31oDN0cgKqIgSJtJ9nfCn9jgBMBkQHu42WMuaWD4jrGd7+vYdX+oIfArs9aKgAH5kUGhGdew2R9SpBefrhbNxG8QIDAQABo1AwTjAdBgNVHQ4EFgQU+aSojSyyLChP/IpZcafvSdhj7KkwHwYDVR0jBBgwFoAU+aSojSyyLChP/IpZcafvSdhj7KkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEABl3+OOVLBWMKs6PjA8lPuloWDNzSr3v76oUcHqAb+cfbucjXrOVsS9RJ0X9yxvCQyfM9FfY43DbspnN3izYhdvbJD8kKLNf0LA5st+ZxLfy0ACyL2iyAwICaqndqxAjQYplFAHmpUiu1DiHckyBPekokDJd+ze95urHMOsaGS5RWPoKJVE0bkaAeZCmEu0NNpXRSBiuxXSTeSAJfv6kyE/rkdhzUKyUl/cGQFrsVYfAFQVA+W6CKOh74ErSEzSHQQYndl7nD33snD/YqdU1ROxV6aJzLKCg+sdj+wRXSP2u/UHnM4jW9TGJfhO42jzL6WVuEvr9q4l7zWzUQKKKhtQ==
# DEVICE_HISTORY_SECRET has been generated using:
# NOTE: crypto.generateKeySync was added in v15, v16 is the next LTS release.
-# $ docker run --rm node:20.18.2 --print 'require("crypto").generateKeySync("aes", { length: 256 }).export().toString("hex")'
+# $ docker run --rm node:22.15.0 --print 'require("crypto").generateKeySync("aes", { length: 256 }).export().toString("hex")'
DEVICE_HISTORY_SECRET=1b46e6cdf72db02845da06c9517c9cfbbfa0d87357479f4e1df3ce160bd54807
QUEUE_PROCESSING_ENABLED=true
diff --git a/services/web/docker-compose.yml b/services/web/docker-compose.yml
index c6a5aa7482..a423c9687f 100644
--- a/services/web/docker-compose.yml
+++ b/services/web/docker-compose.yml
@@ -6,7 +6,7 @@ volumes:
services:
test_unit:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/web
- ../../node_modules:/overleaf/node_modules
@@ -26,7 +26,7 @@ services:
- mongo
test_acceptance:
- image: node:20.18.2
+ image: node:22.15.0
volumes:
- .:/overleaf/services/web
- ../../node_modules:/overleaf/node_modules
diff --git a/services/web/scripts/translations/Dockerfile b/services/web/scripts/translations/Dockerfile
index e033989372..f1b4d09492 100644
--- a/services/web/scripts/translations/Dockerfile
+++ b/services/web/scripts/translations/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:20.18.2
+FROM node:22.15.0
WORKDIR /app/scripts/translations
diff --git a/services/web/test/frontend/bootstrap.js b/services/web/test/frontend/bootstrap.js
index e98d2c35de..df4d3f1464 100644
--- a/services/web/test/frontend/bootstrap.js
+++ b/services/web/test/frontend/bootstrap.js
@@ -104,3 +104,8 @@ const fetchMock = require('fetch-mock').default
fetchMock.spyGlobal()
fetchMock.config.fetch = global.fetch
fetchMock.config.Response = fetch.Response
+
+Object.defineProperty(navigator, 'onLine', {
+ configurable: true,
+ get: () => true,
+})
diff --git a/services/web/test/frontend/features/project-list/components/project-list-root.test.tsx b/services/web/test/frontend/features/project-list/components/project-list-root.test.tsx
index 4cfc119f0b..dc5ecfe6cf 100644
--- a/services/web/test/frontend/features/project-list/components/project-list-root.test.tsx
+++ b/services/web/test/frontend/features/project-list/components/project-list-root.test.tsx
@@ -287,7 +287,6 @@ describe('', function () {
fireEvent.click(unarchiveButton)
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
await screen.findByText('No projects')
})
@@ -302,7 +301,6 @@ describe('', function () {
)
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
expect(screen.queryByText('No projects')).to.be.null
})
@@ -354,7 +352,6 @@ describe('', function () {
fireEvent.click(untrashButton)
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
await screen.findByText('No projects')
})
@@ -367,7 +364,6 @@ describe('', function () {
expect(allCheckboxesChecked.length).to.equal(trashedList.length - 1)
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
expect(screen.queryByText('No projects')).to.be.null
})
@@ -392,7 +388,6 @@ describe('', function () {
expect(confirmButton.disabled).to.be.true
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
const calls = fetchMock.callHistory.calls().map(({ url }) => url)
@@ -457,7 +452,6 @@ describe('', function () {
expect(confirmButton.disabled).to.be.true
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
const calls = fetchMock.callHistory.calls().map(({ url }) => url)
leavableList.forEach(project => {
@@ -520,7 +514,6 @@ describe('', function () {
expect(confirmButton.disabled).to.be.true
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
const calls = fetchMock.callHistory.calls().map(({ url }) => url)
deletableList.forEach(project => {
@@ -591,7 +584,6 @@ describe('', function () {
expect(confirmButton.disabled).to.be.true
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
const calls = fetchMock.callHistory.calls().map(({ url }) => url)
deletableAndLeavableList.forEach(project => {
@@ -1186,7 +1178,6 @@ describe('', function () {
fireEvent.click(copyConfirmButton)
await fetchMock.callHistory.flush(true)
- expect(fetchMock.callHistory.done()).to.be.true
expect(sendMBSpy).to.have.been.calledTwice
expect(sendMBSpy).to.have.been.calledWith('loads_v2_dash')