diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/bug_report.md
similarity index 83%
rename from .github/ISSUE_TEMPLATE.md
rename to .github/ISSUE_TEMPLATE/bug_report.md
index 3a375bcbe9..9c0577106e 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,10 +1,19 @@
+---
+name: Bug report
+about: Report a bug
+title: ''
+labels: type:bug
+assignees: ''
+
+---
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 444a7520cb..5217640350 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,6 +14,8 @@ When submitting an issue please describe the issue as clearly as possible, inclu
reproduce the bug, which situations it appears in, what you expected to happen, and what actually happens.
If you can include a screenshot for front end issues that is very helpful.
+**Note**: If you are using [www.overleaf.com](www.overleaf.com) and have a problem, or if you would like to request a new feature, please contact the Support team at support@overleaf.com. Raise an issue here only to report bugs in the Community Edition release of Overleaf.
+
Pull Requests
-------------
@@ -34,7 +36,7 @@ Please see [our security policy](https://github.com/overleaf/overleaf/security/p
Contributor License Agreement
-----------------------------
-Before we can accept any contributions of code, we need you to agree to our
+Before we can accept any contributions of code, we need you to agree to our
[Contributor License Agreement](https://docs.google.com/forms/d/e/1FAIpQLSef79XH3mb7yIiMzZw-yALEegS-wyFetvjTiNBfZvf_IHD2KA/viewform?usp=sf_link).
This is to ensure that you own the copyright of your contribution, and that you
agree to give us a license to use it in both the open source version, and the version
diff --git a/README.md b/README.md
index 05462d8723..33e7a8956b 100644
--- a/README.md
+++ b/README.md
@@ -14,39 +14,52 @@
License
-
+
- Figure 1: A screenshot of a project being edited in Overleaf Community Edition.
+ Figure 1: A screenshot of a project being edited in Overleaf Extended Community Edition.
## Community Edition
-[Overleaf](https://www.overleaf.com) is an open-source online real-time collaborative LaTeX editor. We run a hosted version at [www.overleaf.com](https://www.overleaf.com), but you can also run your own local version, and contribute to the development of Overleaf.
+[Overleaf](https://www.overleaf.com) is an open-source online real-time collaborative LaTeX editor. Overleaf runs a hosted version at [www.overleaf.com](https://www.overleaf.com), but you can also run your own local version, and contribute to the development of Overleaf.
+
+## Extended Community Edition
+
+The present "extended" version of Overleaf CE includes:
+
+- Template Gallery
+- Sandboxed Compiles with TeX Live image selection
+- LDAP authentication
+- SAML authentication
+- OpenID Connect authentication
+- Real-time track changes and comments
+- Autocomplete of reference keys
+- Symbol Palette
+- "From External URL" feature
+
+> [!CAUTION]
+> Overleaf Community Edition is intended for use in environments where **all** users are trusted. Community Edition is **not** appropriate for scenarios where isolation of users is required due to Sandbox Compiles not being available. When not using Sandboxed Compiles, users have full read and write access to the `sharelatex` container resources (filesystem, network, environment variables) when running LaTeX compiles.
+Therefore, in any environment where not all users can be fully trusted, it is strongly recommended to enable the Sandboxed Compiles feature available in the Extended Community Edition.
+
+For more information on Sandbox Compiles check out Overleaf [documentation](https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/server-pro-only-configuration/sandboxed-compiles).
## Enterprise
-If you want help installing and maintaining Overleaf in your lab or workplace, we offer an officially supported version called [Overleaf Server Pro](https://www.overleaf.com/for/enterprises). It also includes more features for security (SSO with LDAP or SAML), administration and collaboration (e.g. tracked changes). [Find out more!](https://www.overleaf.com/for/enterprises)
-
-## Keeping up to date
-
-Sign up to the [mailing list](https://mailchi.mp/overleaf.com/community-edition-and-server-pro) to get updates on Overleaf releases and development.
+If you want help installing and maintaining Overleaf in your lab or workplace, Overleaf offers an officially supported version called [Overleaf Server Pro](https://www.overleaf.com/for/enterprises).
## Installation
-We have detailed installation instructions in the [Overleaf Toolkit](https://github.com/overleaf/toolkit/).
-
-## Upgrading
-
-If you are upgrading from a previous version of Overleaf, please see the [Release Notes section on the Wiki](https://github.com/overleaf/overleaf/wiki#release-notes) for all of the versions between your current version and the version you are upgrading to.
+Detailed installation instructions can be found in the [Overleaf Toolkit](https://github.com/overleaf/toolkit/).
+Configuration details and release history for the Extended Community Edition can be found on the [Extended CE Wiki Page](https://github.com/yu-i-i/overleaf-cep/wiki).
## Overleaf Docker Image
This repo contains two dockerfiles, [`Dockerfile-base`](server-ce/Dockerfile-base), which builds the
-`sharelatex/sharelatex-base` image, and [`Dockerfile`](server-ce/Dockerfile) which builds the
-`sharelatex/sharelatex` (or "community") image.
+`sharelatex/sharelatex-base:ext-ce` image, and [`Dockerfile`](server-ce/Dockerfile) which builds the
+`sharelatex/sharelatex:ext-ce` image.
-The Base image generally contains the basic dependencies like `wget` and
-`aspell`, plus `texlive`. We split this out because it's a pretty heavy set of
+The Base image generally contains the basic dependencies like `wget`, plus `texlive`.
+This is split out because it's a pretty heavy set of
dependencies, and it's nice to not have to rebuild all of that every time.
The `sharelatex/sharelatex` image extends the base image and adds the actual Overleaf code
@@ -54,23 +67,19 @@ and services.
Use `make build-base` and `make build-community` from `server-ce/` to build these images.
-We use the [Phusion base-image](https://github.com/phusion/baseimage-docker)
-(which is extended by our `base` image) to provide us with a VM-like container
+The [Phusion base-image](https://github.com/phusion/baseimage-docker)
+(which is extended by the `base` image) provides a VM-like container
in which to run the Overleaf services. Baseimage uses the `runit` service
-manager to manage services, and we add our init-scripts from the `server-ce/runit`
-folder.
-
-
-## Contributing
-
-Please see the [CONTRIBUTING](CONTRIBUTING.md) file for information on contributing to the development of Overleaf.
+manager to manage services, and init scripts from the `server-ce/runit`
+folder are added.
## Authors
-[The Overleaf Team](https://www.overleaf.com/about)
+[The Overleaf Team](https://www.overleaf.com/about)
+[yu-i-i](https://github.com/yu-i-i/overleaf-cep) — Extensions for CE unless otherwise noted
## License
The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the [`LICENSE`](LICENSE) file.
-Copyright (c) Overleaf, 2014-2024.
+Copyright (c) Overleaf, 2014-2025.
diff --git a/bin/shared/mongodb-init-replica-set.js b/bin/shared/mongodb-init-replica-set.js
new file mode 100644
index 0000000000..30af6601ca
--- /dev/null
+++ b/bin/shared/mongodb-init-replica-set.js
@@ -0,0 +1,3 @@
+/* eslint-disable no-undef */
+
+rs.initiate({ _id: 'overleaf', members: [{ _id: 0, host: 'mongo:27017' }] })
diff --git a/develop/README.md b/develop/README.md
index 49f7d63350..8e3f89862c 100644
--- a/develop/README.md
+++ b/develop/README.md
@@ -11,12 +11,6 @@ bin/build
> [!NOTE]
> If Docker is running out of RAM while building the services in parallel, create a `.env` file in this directory containing `COMPOSE_PARALLEL_LIMIT=1`.
-Next, initialize the database:
-
-```shell
-bin/init
-```
-
Then start the services:
```shell
@@ -48,7 +42,7 @@ To do this, use the included `bin/dev` script:
bin/dev
```
-This will start all services using `nodemon`, which will automatically monitor the code and restart the services as necessary.
+This will start all services using `node --watch`, which will automatically monitor the code and restart the services as necessary.
To improve performance, you can start only a subset of the services in development mode by providing a space-separated list to the `bin/dev` script:
@@ -83,6 +77,7 @@ each service:
| `filestore` | 9235 |
| `notifications` | 9236 |
| `real-time` | 9237 |
+| `references` | 9238 |
| `history-v1` | 9239 |
| `project-history` | 9240 |
diff --git a/develop/bin/init b/develop/bin/init
deleted file mode 100755
index 4cb2a4eae1..0000000000
--- a/develop/bin/init
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-docker compose up --detach mongo
-curl --max-time 10 --retry 5 --retry-delay 5 --retry-all-errors --silent --output /dev/null localhost:27017
-docker compose exec mongo mongosh --eval "rs.initiate({ _id: 'overleaf', members: [{ _id: 0, host: 'mongo:27017' }] })"
-docker compose down mongo
diff --git a/develop/dev.env b/develop/dev.env
index f817987f8e..b003e4e0eb 100644
--- a/develop/dev.env
+++ b/develop/dev.env
@@ -6,14 +6,18 @@ DOCUMENT_UPDATER_HOST=document-updater
FILESTORE_HOST=filestore
GRACEFUL_SHUTDOWN_DELAY_SECONDS=0
HISTORY_V1_HOST=history-v1
+HISTORY_REDIS_HOST=redis
LISTEN_ADDRESS=0.0.0.0
MONGO_HOST=mongo
MONGO_URL=mongodb://mongo/sharelatex?directConnection=true
NOTIFICATIONS_HOST=notifications
PROJECT_HISTORY_HOST=project-history
+QUEUES_REDIS_HOST=redis
REALTIME_HOST=real-time
REDIS_HOST=redis
-SPELLING_HOST=spelling
+REFERENCES_HOST=references
+SESSION_SECRET=foo
+V1_HISTORY_HOST=history-v1
WEBPACK_HOST=webpack
WEB_API_PASSWORD=overleaf
WEB_API_USER=overleaf
diff --git a/develop/docker-compose.dev.yml b/develop/docker-compose.dev.yml
index 4432a24162..65e15ef07b 100644
--- a/develop/docker-compose.dev.yml
+++ b/develop/docker-compose.dev.yml
@@ -112,8 +112,19 @@ services:
- ../services/real-time/app.js:/overleaf/services/real-time/app.js
- ../services/real-time/config:/overleaf/services/real-time/config
+ references:
+ command: ["node", "--watch", "app.js"]
+ environment:
+ - NODE_OPTIONS=--inspect=0.0.0.0:9229
+ ports:
+ - "127.0.0.1:9238:9229"
+ volumes:
+ - ../services/references/app:/overleaf/services/references/app
+ - ../services/references/config:/overleaf/services/references/config
+ - ../services/references/app.js:/overleaf/services/references/app.js
+
web:
- command: ["node", "--watch", "app.js", "--watch-locales"]
+ command: ["node", "--watch", "app.mjs", "--watch-locales"]
environment:
- NODE_OPTIONS=--inspect=0.0.0.0:9229
ports:
diff --git a/develop/docker-compose.yml b/develop/docker-compose.yml
index f9053c21ce..e5b84c38b3 100644
--- a/develop/docker-compose.yml
+++ b/develop/docker-compose.yml
@@ -1,6 +1,5 @@
volumes:
clsi-cache:
- clsi-output:
filestore-public-files:
filestore-template-files:
filestore-uploads:
@@ -8,7 +7,6 @@ volumes:
mongo-data:
redis-data:
sharelatex-data:
- spelling-cache:
web-data:
history-v1-buckets:
@@ -27,15 +25,16 @@ services:
env_file:
- dev.env
environment:
- - DOCKER_RUNNER=true
- TEXLIVE_IMAGE=texlive-full # docker build texlive -t texlive-full
- - COMPILES_HOST_DIR=${PWD}/compiles
+ - SANDBOXED_COMPILES=true
+ - SANDBOXED_COMPILES_HOST_DIR_COMPILES=${PWD}/compiles
+ - SANDBOXED_COMPILES_HOST_DIR_OUTPUT=${PWD}/output
user: root
volumes:
- ${PWD}/compiles:/overleaf/services/clsi/compiles
+ - ${PWD}/output:/overleaf/services/clsi/output
- ${DOCKER_SOCKET_PATH:-/var/run/docker.sock}:/var/run/docker.sock
- clsi-cache:/overleaf/services/clsi/cache
- - clsi-output:/overleaf/services/clsi/output
contacts:
build:
@@ -89,12 +88,20 @@ services:
- history-v1-buckets:/buckets
mongo:
- image: mongo:5
+ image: mongo:6.0
command: --replSet overleaf
ports:
- "127.0.0.1:27017:27017" # for debugging
volumes:
- mongo-data:/data/db
+ - ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
notifications:
build:
@@ -116,7 +123,7 @@ services:
dockerfile: services/real-time/Dockerfile
env_file:
- dev.env
-
+
redis:
image: redis:5
ports:
@@ -124,14 +131,12 @@ services:
volumes:
- redis-data:/data
- spelling:
+ references:
build:
context: ..
- dockerfile: services/spelling/Dockerfile
+ dockerfile: services/references/Dockerfile
env_file:
- dev.env
- volumes:
- - spelling-cache:/overleaf/services/spelling/cache
web:
build:
@@ -142,11 +147,11 @@ services:
- dev.env
environment:
- APP_NAME=Overleaf Community Edition
- - ENABLED_LINKED_FILE_TYPES=project_file,project_output_file
+ - ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url
- EMAIL_CONFIRMATION_DISABLED=true
- NODE_ENV=development
- OVERLEAF_ALLOW_PUBLIC_ACCESS=true
- command: ["node", "app.js"]
+ command: ["node", "app.mjs"]
volumes:
- sharelatex-data:/var/lib/overleaf
- web-data:/overleaf/services/web/data
@@ -163,13 +168,13 @@ services:
- notifications
- project-history
- real-time
- - spelling
+ - references
webpack:
build:
context: ..
dockerfile: services/web/Dockerfile
- target: dev
+ target: webpack
command: ["npx", "webpack", "serve", "--config", "webpack.config.dev-env.js"]
ports:
- "127.0.0.1:80:3808"
diff --git a/doc/logo.png b/doc/logo.png
index 106926b095..f154ac0cca 100644
Binary files a/doc/logo.png and b/doc/logo.png differ
diff --git a/doc/screenshot.png b/doc/screenshot.png
index 1c1f339630..92633192a5 100644
Binary files a/doc/screenshot.png and b/doc/screenshot.png differ
diff --git a/docker-compose.yml b/docker-compose.yml
index 10a74780e3..962adfb5d8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -32,7 +32,7 @@ services:
OVERLEAF_REDIS_HOST: redis
REDIS_HOST: redis
- ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
+ ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file,url'
# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS: 'true'
@@ -40,10 +40,6 @@ services:
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED: 'true'
- # temporary fix for LuaLaTex compiles
- # see https://github.com/overleaf/overleaf/issues/695
- TEXMFVAR: /var/lib/overleaf/tmp/texmf-var
-
## Set for SSL via nginx-proxy
#VIRTUAL_HOST: 103.112.212.22
@@ -77,11 +73,19 @@ services:
## Server Pro ##
################
- ## Sandboxed Compiles: https://github.com/overleaf/overleaf/wiki/Server-Pro:-Sandboxed-Compiles
+ ## The Community Edition is intended for use in environments where all users are trusted and is not appropriate for
+ ## scenarios where isolation of users is required. Sandboxed Compiles are not available in the Community Edition,
+ ## so the following environment variables must be commented out to avoid compile issues.
+ ##
+ ## Sandboxed Compiles: https://docs.overleaf.com/on-premises/configuration/overleaf-toolkit/server-pro-only-configuration/sandboxed-compiles
SANDBOXED_COMPILES: 'true'
- SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
### Bind-mount source for /var/lib/overleaf/data/compiles inside the container.
- SANDBOXED_COMPILES_HOST_DIR: '/home/user/sharelatex_data/data/compiles'
+ SANDBOXED_COMPILES_HOST_DIR_COMPILES: '/home/user/sharelatex_data/data/compiles'
+ ### Bind-mount source for /var/lib/overleaf/data/output inside the container.
+ SANDBOXED_COMPILES_HOST_DIR_OUTPUT: '/home/user/sharelatex_data/data/output'
+ ### Backwards compatibility (before Server Pro 5.5)
+ DOCKER_RUNNER: 'true'
+ SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
## Works with test LDAP server shown at bottom of docker compose
# OVERLEAF_LDAP_URL: 'ldap://ldap:389'
@@ -102,12 +106,12 @@ services:
mongo:
restart: always
- image: mongo:5.0
+ image: mongo:6.0
container_name: mongo
command: '--replSet overleaf'
volumes:
- ~/mongo_data:/data/db
- - ./mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ - ./bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
environment:
MONGO_INITDB_DATABASE: sharelatex
extra_hosts:
@@ -115,7 +119,7 @@ services:
# This override is not needed when running the setup after starting up mongo.
- mongo:127.0.0.1
healthcheck:
- test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
+ test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 10s
retries: 5
diff --git a/libraries/access-token-encryptor/.dockerignore b/libraries/access-token-encryptor/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/access-token-encryptor/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/access-token-encryptor/.gitignore b/libraries/access-token-encryptor/.gitignore
deleted file mode 100644
index 66936c4121..0000000000
--- a/libraries/access-token-encryptor/.gitignore
+++ /dev/null
@@ -1,46 +0,0 @@
-compileFolder
-
-Compiled source #
-###################
-*.com
-*.class
-*.dll
-*.exe
-*.o
-*.so
-
-# Packages #
-############
-# it's better to unpack these files and commit the raw source
-# git has its own built in compression methods
-*.7z
-*.dmg
-*.gz
-*.iso
-*.jar
-*.rar
-*.tar
-*.zip
-
-# Logs and databases #
-######################
-*.log
-*.sql
-*.sqlite
-
-# OS generated files #
-######################
-.DS_Store?
-ehthumbs.db
-Icon?
-Thumbs.db
-
-/node_modules/*
-data/*/*
-
-**.swp
-
-/log.json
-hash_folder
-
-.npmrc
diff --git a/libraries/access-token-encryptor/.nvmrc b/libraries/access-token-encryptor/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/access-token-encryptor/.nvmrc
+++ b/libraries/access-token-encryptor/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/access-token-encryptor/buildscript.txt b/libraries/access-token-encryptor/buildscript.txt
index be1d515ca1..8f08720e7e 100644
--- a/libraries/access-token-encryptor/buildscript.txt
+++ b/libraries/access-token-encryptor/buildscript.txt
@@ -1,10 +1,10 @@
access-token-encryptor
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/access-token-encryptor/lib/js/AccessTokenEncryptor.js b/libraries/access-token-encryptor/lib/js/AccessTokenEncryptor.js
index d5ad31905f..aa8078ceed 100644
--- a/libraries/access-token-encryptor/lib/js/AccessTokenEncryptor.js
+++ b/libraries/access-token-encryptor/lib/js/AccessTokenEncryptor.js
@@ -1,5 +1,5 @@
-const { promisify } = require('util')
-const crypto = require('crypto')
+const { promisify } = require('node:util')
+const crypto = require('node:crypto')
const ALGORITHM = 'aes-256-ctr'
diff --git a/libraries/access-token-encryptor/package.json b/libraries/access-token-encryptor/package.json
index 73734fb8fa..b767f50cf5 100644
--- a/libraries/access-token-encryptor/package.json
+++ b/libraries/access-token-encryptor/package.json
@@ -21,7 +21,7 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"typescript": "^5.0.4"
}
diff --git a/libraries/access-token-encryptor/test/setup.js b/libraries/access-token-encryptor/test/setup.js
index 09068185a8..9af82f6236 100644
--- a/libraries/access-token-encryptor/test/setup.js
+++ b/libraries/access-token-encryptor/test/setup.js
@@ -1,4 +1,13 @@
const chai = require('chai')
const chaiAsPromised = require('chai-as-promised')
+const SandboxedModule = require('sandboxed-module')
chai.use(chaiAsPromised)
+
+SandboxedModule.configure({
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
+})
diff --git a/libraries/fetch-utils/.dockerignore b/libraries/fetch-utils/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/fetch-utils/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/fetch-utils/.gitignore b/libraries/fetch-utils/.gitignore
deleted file mode 100644
index edb0f85350..0000000000
--- a/libraries/fetch-utils/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/libraries/fetch-utils/.nvmrc b/libraries/fetch-utils/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/fetch-utils/.nvmrc
+++ b/libraries/fetch-utils/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/fetch-utils/buildscript.txt b/libraries/fetch-utils/buildscript.txt
index 9f3b5aff00..7008a533a6 100644
--- a/libraries/fetch-utils/buildscript.txt
+++ b/libraries/fetch-utils/buildscript.txt
@@ -1,10 +1,10 @@
fetch-utils
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/fetch-utils/index.js b/libraries/fetch-utils/index.js
index 2167e9f407..60e8180c7d 100644
--- a/libraries/fetch-utils/index.js
+++ b/libraries/fetch-utils/index.js
@@ -1,9 +1,9 @@
const _ = require('lodash')
-const { Readable } = require('stream')
+const { Readable } = require('node:stream')
const OError = require('@overleaf/o-error')
const fetch = require('node-fetch')
-const http = require('http')
-const https = require('https')
+const http = require('node:http')
+const https = require('node:https')
/**
* @import { Response } from 'node-fetch'
@@ -23,11 +23,11 @@ async function fetchJson(url, opts = {}) {
}
async function fetchJsonWithResponse(url, opts = {}) {
- const { fetchOpts } = parseOpts(opts)
+ const { fetchOpts, detachSignal } = parseOpts(opts)
fetchOpts.headers = fetchOpts.headers ?? {}
fetchOpts.headers.Accept = fetchOpts.headers.Accept ?? 'application/json'
- const response = await performRequest(url, fetchOpts)
+ const response = await performRequest(url, fetchOpts, detachSignal)
if (!response.ok) {
const body = await maybeGetResponseBody(response)
throw new RequestFailedError(url, opts, response, body)
@@ -53,8 +53,8 @@ async function fetchStream(url, opts = {}) {
}
async function fetchStreamWithResponse(url, opts = {}) {
- const { fetchOpts, abortController } = parseOpts(opts)
- const response = await performRequest(url, fetchOpts)
+ const { fetchOpts, abortController, detachSignal } = parseOpts(opts)
+ const response = await performRequest(url, fetchOpts, detachSignal)
if (!response.ok) {
const body = await maybeGetResponseBody(response)
@@ -76,8 +76,8 @@ async function fetchStreamWithResponse(url, opts = {}) {
* @throws {RequestFailedError} if the response has a failure status code
*/
async function fetchNothing(url, opts = {}) {
- const { fetchOpts } = parseOpts(opts)
- const response = await performRequest(url, fetchOpts)
+ const { fetchOpts, detachSignal } = parseOpts(opts)
+ const response = await performRequest(url, fetchOpts, detachSignal)
if (!response.ok) {
const body = await maybeGetResponseBody(response)
throw new RequestFailedError(url, opts, response, body)
@@ -95,9 +95,22 @@ async function fetchNothing(url, opts = {}) {
* @throws {RequestFailedError} if the response has a non redirect status code or missing Location header
*/
async function fetchRedirect(url, opts = {}) {
- const { fetchOpts } = parseOpts(opts)
+ const { location } = await fetchRedirectWithResponse(url, opts)
+ return location
+}
+
+/**
+ * Make a request and extract the redirect from the response.
+ *
+ * @param {string | URL} url - request URL
+ * @param {object} opts - fetch options
+ * @return {Promise<{location: string, response: Response}>}
+ * @throws {RequestFailedError} if the response has a non redirect status code or missing Location header
+ */
+async function fetchRedirectWithResponse(url, opts = {}) {
+ const { fetchOpts, detachSignal } = parseOpts(opts)
fetchOpts.redirect = 'manual'
- const response = await performRequest(url, fetchOpts)
+ const response = await performRequest(url, fetchOpts, detachSignal)
if (response.status < 300 || response.status >= 400) {
const body = await maybeGetResponseBody(response)
throw new RequestFailedError(url, opts, response, body)
@@ -112,7 +125,7 @@ async function fetchRedirect(url, opts = {}) {
)
}
await discardResponseBody(response)
- return location
+ return { location, response }
}
/**
@@ -129,8 +142,8 @@ async function fetchString(url, opts = {}) {
}
async function fetchStringWithResponse(url, opts = {}) {
- const { fetchOpts } = parseOpts(opts)
- const response = await performRequest(url, fetchOpts)
+ const { fetchOpts, detachSignal } = parseOpts(opts)
+ const response = await performRequest(url, fetchOpts, detachSignal)
if (!response.ok) {
const body = await maybeGetResponseBody(response)
throw new RequestFailedError(url, opts, response, body)
@@ -165,13 +178,14 @@ function parseOpts(opts) {
const abortController = new AbortController()
fetchOpts.signal = abortController.signal
+ let detachSignal = () => {}
if (opts.signal) {
- abortOnSignal(abortController, opts.signal)
+ detachSignal = abortOnSignal(abortController, opts.signal)
}
if (opts.body instanceof Readable) {
abortOnDestroyedRequest(abortController, fetchOpts.body)
}
- return { fetchOpts, abortController }
+ return { fetchOpts, abortController, detachSignal }
}
function setupJsonBody(fetchOpts, json) {
@@ -195,6 +209,9 @@ function abortOnSignal(abortController, signal) {
abortController.abort(signal.reason)
}
signal.addEventListener('abort', listener)
+ return () => {
+ signal.removeEventListener('abort', listener)
+ }
}
function abortOnDestroyedRequest(abortController, stream) {
@@ -213,11 +230,12 @@ function abortOnDestroyedResponse(abortController, response) {
})
}
-async function performRequest(url, fetchOpts) {
+async function performRequest(url, fetchOpts, detachSignal) {
let response
try {
response = await fetch(url, fetchOpts)
} catch (err) {
+ detachSignal()
if (fetchOpts.body instanceof Readable) {
fetchOpts.body.destroy()
}
@@ -226,6 +244,7 @@ async function performRequest(url, fetchOpts) {
method: fetchOpts.method ?? 'GET',
})
}
+ response.body.on('close', detachSignal)
if (fetchOpts.body instanceof Readable) {
response.body.on('close', () => {
if (!fetchOpts.body.readableEnded) {
@@ -297,6 +316,7 @@ module.exports = {
fetchStreamWithResponse,
fetchNothing,
fetchRedirect,
+ fetchRedirectWithResponse,
fetchString,
fetchStringWithResponse,
RequestFailedError,
diff --git a/libraries/fetch-utils/package.json b/libraries/fetch-utils/package.json
index a0ac42e756..95c4d1383b 100644
--- a/libraries/fetch-utils/package.json
+++ b/libraries/fetch-utils/package.json
@@ -20,8 +20,8 @@
"body-parser": "^1.20.3",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "mocha": "^10.2.0",
+ "express": "^4.21.2",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
},
"dependencies": {
diff --git a/libraries/fetch-utils/test/unit/FetchUtilsTests.js b/libraries/fetch-utils/test/unit/FetchUtilsTests.js
index 03c9fe8642..691e90778d 100644
--- a/libraries/fetch-utils/test/unit/FetchUtilsTests.js
+++ b/libraries/fetch-utils/test/unit/FetchUtilsTests.js
@@ -1,7 +1,10 @@
const { expect } = require('chai')
+const fs = require('node:fs')
+const events = require('node:events')
const { FetchError, AbortError } = require('node-fetch')
-const { Readable } = require('stream')
-const { once } = require('events')
+const { Readable } = require('node:stream')
+const { pipeline } = require('node:stream/promises')
+const { once } = require('node:events')
const { TestServer } = require('./helpers/TestServer')
const selfsigned = require('selfsigned')
const {
@@ -24,13 +27,17 @@ const pems = selfsigned.generate(attrs, { days: 365 })
const PRIVATE_KEY = pems.private
const PUBLIC_CERT = pems.cert
-const dns = require('dns')
+const dns = require('node:dns')
const _originalLookup = dns.lookup
// Custom DNS resolver function
dns.lookup = (hostname, options, callback) => {
if (hostname === 'example.com') {
// If the hostname is our test case, return the ip address for the test server
- callback(null, '127.0.0.1', 4)
+ if (options?.all) {
+ callback(null, [{ address: '127.0.0.1', family: 4 }])
+ } else {
+ callback(null, '127.0.0.1', 4)
+ }
} else {
// Otherwise, use the default lookup
_originalLookup(hostname, options, callback)
@@ -199,6 +206,31 @@ describe('fetch-utils', function () {
).to.be.rejectedWith(AbortError)
expect(stream.destroyed).to.be.true
})
+
+ it('detaches from signal on success', async function () {
+ const signal = AbortSignal.timeout(10_000)
+ for (let i = 0; i < 20; i++) {
+ const s = await fetchStream(this.url('/hello'), { signal })
+ expect(events.getEventListeners(signal, 'abort')).to.have.length(1)
+ await pipeline(s, fs.createWriteStream('/dev/null'))
+ expect(events.getEventListeners(signal, 'abort')).to.have.length(0)
+ }
+ })
+
+ it('detaches from signal on error', async function () {
+ const signal = AbortSignal.timeout(10_000)
+ for (let i = 0; i < 20; i++) {
+ try {
+ await fetchStream(this.url('/500'), { signal })
+ } catch (err) {
+ if (err instanceof RequestFailedError && err.response.status === 500)
+ continue
+ throw err
+ } finally {
+ expect(events.getEventListeners(signal, 'abort')).to.have.length(0)
+ }
+ }
+ })
})
describe('fetchNothing', function () {
@@ -387,9 +419,16 @@ async function* infiniteIterator() {
async function abortOnceReceived(func, server) {
const controller = new AbortController()
const promise = func(controller.signal)
+ expect(events.getEventListeners(controller.signal, 'abort')).to.have.length(1)
await once(server.events, 'request-received')
controller.abort()
- return await promise
+ try {
+ return await promise
+ } finally {
+ expect(events.getEventListeners(controller.signal, 'abort')).to.have.length(
+ 0
+ )
+ }
}
async function expectRequestAborted(req) {
diff --git a/libraries/fetch-utils/test/unit/helpers/TestServer.js b/libraries/fetch-utils/test/unit/helpers/TestServer.js
index 094664d061..49727772ce 100644
--- a/libraries/fetch-utils/test/unit/helpers/TestServer.js
+++ b/libraries/fetch-utils/test/unit/helpers/TestServer.js
@@ -1,9 +1,9 @@
const express = require('express')
const bodyParser = require('body-parser')
-const { EventEmitter } = require('events')
-const http = require('http')
-const https = require('https')
-const { promisify } = require('util')
+const { EventEmitter } = require('node:events')
+const http = require('node:http')
+const https = require('node:https')
+const { promisify } = require('node:util')
class TestServer {
constructor() {
diff --git a/libraries/logger/.dockerignore b/libraries/logger/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/logger/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/logger/.gitignore b/libraries/logger/.gitignore
deleted file mode 100644
index 2006c875a4..0000000000
--- a/libraries/logger/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-
-.npmrc
diff --git a/libraries/logger/.nvmrc b/libraries/logger/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/logger/.nvmrc
+++ b/libraries/logger/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/logger/buildscript.txt b/libraries/logger/buildscript.txt
index 1d51315f6c..e2520c4800 100644
--- a/libraries/logger/buildscript.txt
+++ b/libraries/logger/buildscript.txt
@@ -1,10 +1,10 @@
logger
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/logger/log-level-checker.js b/libraries/logger/log-level-checker.js
index b1b041d037..fd2f984042 100644
--- a/libraries/logger/log-level-checker.js
+++ b/libraries/logger/log-level-checker.js
@@ -1,5 +1,5 @@
const { fetchString } = require('@overleaf/fetch-utils')
-const fs = require('fs')
+const fs = require('node:fs')
class LogLevelChecker {
constructor(logger, defaultLevel) {
diff --git a/libraries/logger/logging-manager.js b/libraries/logger/logging-manager.js
index 7268fd258a..edf922be72 100644
--- a/libraries/logger/logging-manager.js
+++ b/libraries/logger/logging-manager.js
@@ -1,7 +1,6 @@
-const Stream = require('stream')
+const Stream = require('node:stream')
const bunyan = require('bunyan')
const GCPManager = require('./gcp-manager')
-const SentryManager = require('./sentry-manager')
const Serializers = require('./serializers')
const {
FileLogLevelChecker,
@@ -15,8 +14,10 @@ const LoggingManager = {
initialize(name) {
this.isProduction =
(process.env.NODE_ENV || '').toLowerCase() === 'production'
+ const isTest = (process.env.NODE_ENV || '').toLowerCase() === 'test'
this.defaultLevel =
- process.env.LOG_LEVEL || (this.isProduction ? 'info' : 'debug')
+ process.env.LOG_LEVEL ||
+ (this.isProduction ? 'info' : isTest ? 'fatal' : 'debug')
this.loggerName = name
this.logger = bunyan.createLogger({
name,
@@ -33,10 +34,6 @@ const LoggingManager = {
return this
},
- initializeErrorReporting(dsn, options) {
- this.sentryManager = new SentryManager()
- },
-
/**
* @param {Record|string} attributes - Attributes to log (nice serialization for err, req, res)
* @param {string} [message] - Optional message
@@ -68,9 +65,6 @@ const LoggingManager = {
})
}
this.logger.error(attributes, message, ...Array.from(args))
- if (this.sentryManager) {
- this.sentryManager.captureExceptionRateLimited(attributes, message)
- }
},
/**
@@ -98,9 +92,6 @@ const LoggingManager = {
*/
fatal(attributes, message) {
this.logger.fatal(attributes, message)
- if (this.sentryManager) {
- this.sentryManager.captureException(attributes, message, 'fatal')
- }
},
_getOutputStreamConfig() {
diff --git a/libraries/logger/package.json b/libraries/logger/package.json
index 6c939dda70..0e7fd2d0cc 100644
--- a/libraries/logger/package.json
+++ b/libraries/logger/package.json
@@ -23,12 +23,11 @@
"@google-cloud/logging-bunyan": "^5.1.0",
"@overleaf/fetch-utils": "*",
"@overleaf/o-error": "*",
- "@sentry/node": "^6.13.2",
"bunyan": "^1.8.14"
},
"devDependencies": {
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
diff --git a/libraries/logger/sentry-manager.js b/libraries/logger/sentry-manager.js
deleted file mode 100644
index 15a667fd2a..0000000000
--- a/libraries/logger/sentry-manager.js
+++ /dev/null
@@ -1,106 +0,0 @@
-const Serializers = require('./serializers')
-const RATE_LIMIT_MAX_ERRORS = 5
-const RATE_LIMIT_INTERVAL_MS = 60000
-
-class SentryManager {
- constructor(dsn, options) {
- this.Sentry = require('@sentry/node')
- this.Sentry.init({ dsn, ...options })
- // for rate limiting on sentry reporting
- this.lastErrorTimeStamp = 0
- this.lastErrorCount = 0
- }
-
- captureExceptionRateLimited(attributes, message) {
- const now = Date.now()
- // have we recently reported an error?
- const recentSentryReport =
- now - this.lastErrorTimeStamp < RATE_LIMIT_INTERVAL_MS
- // if so, increment the error count
- if (recentSentryReport) {
- this.lastErrorCount++
- } else {
- this.lastErrorCount = 0
- this.lastErrorTimeStamp = now
- }
- // only report 5 errors every minute to avoid overload
- if (this.lastErrorCount < RATE_LIMIT_MAX_ERRORS) {
- // add a note if the rate limit has been hit
- const note =
- this.lastErrorCount + 1 === RATE_LIMIT_MAX_ERRORS
- ? '(rate limited)'
- : ''
- // report the exception
- this.captureException(attributes, message, `error${note}`)
- }
- }
-
- captureException(attributes, message, level) {
- // handle case of logger.error "message"
- if (typeof attributes === 'string') {
- attributes = { err: new Error(attributes) }
- }
-
- // extract any error object
- let error = Serializers.err(attributes.err || attributes.error)
-
- // avoid reporting errors twice
- for (const key in attributes) {
- const value = attributes[key]
- if (value instanceof Error && value.reportedToSentry) {
- return
- }
- }
-
- // include our log message in the error report
- if (error == null) {
- if (typeof message === 'string') {
- error = { message }
- }
- } else if (message != null) {
- attributes.description = message
- }
-
- // report the error
- if (error != null) {
- // capture attributes and use *_id objects as tags
- const tags = {}
- const extra = {}
- for (const key in attributes) {
- let value = attributes[key]
- if (Serializers[key]) {
- value = Serializers[key](value)
- }
- if (key.match(/_id/) && typeof value === 'string') {
- tags[key] = value
- }
- extra[key] = value
- }
-
- // OError integration
- extra.info = error.info
- delete error.info
-
- // Sentry wants to receive an Error instance.
- const errInstance = new Error(error.message)
- Object.assign(errInstance, error)
-
- try {
- // send the error to sentry
- this.Sentry.captureException(errInstance, { tags, extra, level })
-
- // put a flag on the errors to avoid reporting them multiple times
- for (const key in attributes) {
- const value = attributes[key]
- if (value instanceof Error) {
- value.reportedToSentry = true
- }
- }
- } catch (err) {
- // ignore Sentry errors
- }
- }
- }
-}
-
-module.exports = SentryManager
diff --git a/libraries/logger/test/setup.js b/libraries/logger/test/setup.js
index 78e563f853..eb16fac2c4 100644
--- a/libraries/logger/test/setup.js
+++ b/libraries/logger/test/setup.js
@@ -8,4 +8,9 @@ chai.use(sinonChai)
SandboxedModule.configure({
globals: { Buffer, JSON, console, process },
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
diff --git a/libraries/logger/test/unit/log-level-checker-tests.js b/libraries/logger/test/unit/log-level-checker-tests.js
index b26be378eb..64ae6d9d86 100644
--- a/libraries/logger/test/unit/log-level-checker-tests.js
+++ b/libraries/logger/test/unit/log-level-checker-tests.js
@@ -1,5 +1,5 @@
-const Path = require('path')
-const { promisify } = require('util')
+const Path = require('node:path')
+const { promisify } = require('node:util')
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
diff --git a/libraries/logger/test/unit/logging-manager-tests.js b/libraries/logger/test/unit/logging-manager-tests.js
index 378de57345..9b571c3ce5 100644
--- a/libraries/logger/test/unit/logging-manager-tests.js
+++ b/libraries/logger/test/unit/logging-manager-tests.js
@@ -1,7 +1,7 @@
const SandboxedModule = require('sandboxed-module')
const bunyan = require('bunyan')
const { expect } = require('chai')
-const path = require('path')
+const path = require('node:path')
const sinon = require('sinon')
const MODULE_PATH = path.join(__dirname, '../../logging-manager.js')
@@ -43,20 +43,14 @@ describe('LoggingManager', function () {
.stub()
.returns(this.GCEMetadataLogLevelChecker),
}
- this.SentryManager = {
- captureException: sinon.stub(),
- captureExceptionRateLimited: sinon.stub(),
- }
this.LoggingManager = SandboxedModule.require(MODULE_PATH, {
requires: {
bunyan: this.Bunyan,
'./log-level-checker': this.LogLevelChecker,
- './sentry-manager': sinon.stub().returns(this.SentryManager),
},
})
this.loggerName = 'test'
this.logger = this.LoggingManager.initialize(this.loggerName)
- this.logger.initializeErrorReporting('test_dsn')
})
afterEach(function () {
@@ -160,13 +154,6 @@ describe('LoggingManager', function () {
})
})
- describe('logger.error', function () {
- it('should report errors to Sentry', function () {
- this.logger.error({ foo: 'bar' }, 'message')
- expect(this.SentryManager.captureExceptionRateLimited).to.have.been.called
- })
- })
-
describe('ringbuffer', function () {
beforeEach(function () {
this.logBufferMock = [
diff --git a/libraries/logger/test/unit/sentry-manager-tests.js b/libraries/logger/test/unit/sentry-manager-tests.js
deleted file mode 100644
index d00c10ca4d..0000000000
--- a/libraries/logger/test/unit/sentry-manager-tests.js
+++ /dev/null
@@ -1,247 +0,0 @@
-const Path = require('path')
-const SandboxedModule = require('sandboxed-module')
-const { expect } = require('chai')
-const sinon = require('sinon')
-
-const MODULE_PATH = Path.join(__dirname, '../../sentry-manager.js')
-
-describe('SentryManager', function () {
- beforeEach(function () {
- this.clock = sinon.useFakeTimers(Date.now())
- this.Sentry = {
- init: sinon.stub(),
- captureException: sinon.stub(),
- }
- this.SentryManager = SandboxedModule.require(MODULE_PATH, {
- requires: {
- '@sentry/node': this.Sentry,
- },
- })
- this.sentryManager = new this.SentryManager('test_dsn')
- })
-
- afterEach(function () {
- this.clock.restore()
- })
-
- describe('captureExceptionRateLimited', function () {
- it('should report a single error to sentry', function () {
- this.sentryManager.captureExceptionRateLimited({ foo: 'bar' }, 'message')
- expect(this.Sentry.captureException).to.have.been.calledOnce
- })
-
- it('should report the same error to sentry only once', function () {
- const error1 = new Error('this is the error')
- this.sentryManager.captureExceptionRateLimited(
- { foo: error1 },
- 'first message'
- )
- this.sentryManager.captureExceptionRateLimited(
- { bar: error1 },
- 'second message'
- )
- expect(this.Sentry.captureException).to.have.been.calledOnce
- })
-
- it('should report two different errors to sentry individually', function () {
- const error1 = new Error('this is the error')
- const error2 = new Error('this is the error')
- this.sentryManager.captureExceptionRateLimited(
- { foo: error1 },
- 'first message'
- )
- this.sentryManager.captureExceptionRateLimited(
- { bar: error2 },
- 'second message'
- )
- expect(this.Sentry.captureException).to.have.been.calledTwice
- })
-
- it('for multiple errors should only report a maximum of 5 errors to sentry', function () {
- for (let i = 0; i < 10; i++) {
- this.sentryManager.captureExceptionRateLimited(
- { foo: 'bar' },
- 'message'
- )
- }
- expect(this.Sentry.captureException).to.have.callCount(5)
- })
-
- it('for multiple errors with a minute delay should report 10 errors to sentry', function () {
- for (let i = 0; i < 10; i++) {
- this.sentryManager.captureExceptionRateLimited(
- { foo: 'bar' },
- 'message'
- )
- }
- expect(this.Sentry.captureException).to.have.callCount(5)
-
- // allow a minute to pass
- this.clock.tick(61 * 1000)
-
- for (let i = 0; i < 10; i++) {
- this.sentryManager.captureExceptionRateLimited(
- { foo: 'bar' },
- 'message'
- )
- }
- expect(this.Sentry.captureException).to.have.callCount(10)
- })
- })
-
- describe('captureException', function () {
- it('should remove the path from fs errors', function () {
- const fsError = new Error(
- "Error: ENOENT: no such file or directory, stat '/tmp/3279b8d0-da10-11e8-8255-efd98985942b'"
- )
- fsError.path = '/tmp/3279b8d0-da10-11e8-8255-efd98985942b'
- this.sentryManager.captureException({ err: fsError }, 'message', 'error')
- expect(this.Sentry.captureException).to.have.been.calledWith(
- sinon.match.has(
- 'message',
- 'Error: ENOENT: no such file or directory, stat'
- )
- )
- })
-
- it('should sanitize error', function () {
- const err = {
- name: 'CustomError',
- message: 'hello',
- _oErrorTags: [{ stack: 'here:1', info: { one: 1 } }],
- stack: 'here:0',
- info: { key: 'value' },
- code: 42,
- signal: 9,
- path: '/foo',
- }
- this.sentryManager.captureException({ err }, 'message', 'error')
- const expectedErr = {
- name: 'CustomError',
- message: 'hello',
- stack: 'here:0\nhere:1',
- code: 42,
- signal: 9,
- path: '/foo',
- }
- expect(this.Sentry.captureException).to.have.been.calledWith(
- sinon.match(expectedErr),
- sinon.match({
- tags: sinon.match.any,
- level: sinon.match.any,
- extra: {
- description: 'message',
- info: sinon.match({
- one: 1,
- key: 'value',
- }),
- },
- })
- )
- // Chai is very picky with comparing Error instances. Go the long way of comparing all the fields manually.
- const gotErr = this.Sentry.captureException.args[0][0]
- for (const [key, wanted] of Object.entries(expectedErr)) {
- expect(gotErr).to.have.property(key, wanted)
- }
- })
- it('should sanitize request', function () {
- const req = {
- ip: '1.2.3.4',
- method: 'GET',
- url: '/foo',
- headers: {
- referer: 'abc',
- 'content-length': 1337,
- 'user-agent': 'curl',
- authorization: '42',
- },
- }
- this.sentryManager.captureException({ req }, 'message', 'error')
- const expectedReq = {
- remoteAddress: '1.2.3.4',
- method: 'GET',
- url: '/foo',
- headers: {
- referer: 'abc',
- 'content-length': 1337,
- 'user-agent': 'curl',
- },
- }
- expect(this.Sentry.captureException).to.have.been.calledWith(
- sinon.match({
- message: 'message',
- }),
- sinon.match({
- tags: sinon.match.any,
- level: sinon.match.any,
- extra: {
- info: sinon.match.any,
- req: expectedReq,
- },
- })
- )
- expect(this.Sentry.captureException.args[0][1].extra.req).to.deep.equal(
- expectedReq
- )
- })
- it('should sanitize response', function () {
- const res = {
- statusCode: 417,
- body: Buffer.from('foo'),
- getHeader(key) {
- expect(key).to.be.oneOf(['content-length'])
- if (key === 'content-length') return 1337
- },
- }
- this.sentryManager.captureException({ res }, 'message', 'error')
- const expectedRes = {
- statusCode: 417,
- headers: {
- 'content-length': 1337,
- },
- }
- expect(this.Sentry.captureException).to.have.been.calledWith(
- sinon.match({
- message: 'message',
- }),
- sinon.match({
- tags: sinon.match.any,
- level: sinon.match.any,
- extra: {
- info: sinon.match.any,
- res: expectedRes,
- },
- })
- )
- expect(this.Sentry.captureException.args[0][1].extra.res).to.deep.equal(
- expectedRes
- )
- })
-
- describe('reportedToSentry', function () {
- it('should mark the error as reported to sentry', function () {
- const err = new Error()
- this.sentryManager.captureException({ err }, 'message')
- expect(this.Sentry.captureException).to.have.been.called
- expect(err.reportedToSentry).to.equal(true)
- })
-
- it('should mark two errors as reported to sentry', function () {
- const err1 = new Error()
- const err2 = new Error()
- this.sentryManager.captureException({ err: err1, err2 }, 'message')
- expect(this.Sentry.captureException).to.have.been.called
- expect(err1.reportedToSentry).to.equal(true)
- expect(err2.reportedToSentry).to.equal(true)
- })
-
- it('should not mark arbitrary objects as reported to sentry', function () {
- const err = new Error()
- const ctx = { foo: 'bar' }
- this.sentryManager.captureException({ err, ctx }, 'message')
- expect(this.Sentry.captureException).to.have.been.called
- expect(ctx.reportedToSentry).not.to.exist
- })
- })
- })
-})
diff --git a/libraries/metrics/.dockerignore b/libraries/metrics/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/metrics/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/metrics/.gitignore b/libraries/metrics/.gitignore
deleted file mode 100644
index 2006c875a4..0000000000
--- a/libraries/metrics/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-
-.npmrc
diff --git a/libraries/metrics/.nvmrc b/libraries/metrics/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/metrics/.nvmrc
+++ b/libraries/metrics/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/metrics/buildscript.txt b/libraries/metrics/buildscript.txt
index fd6931c9d7..d1e272c356 100644
--- a/libraries/metrics/buildscript.txt
+++ b/libraries/metrics/buildscript.txt
@@ -1,10 +1,10 @@
metrics
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/metrics/initialize.js b/libraries/metrics/initialize.js
index 63be4e5d2e..f1a77666c7 100644
--- a/libraries/metrics/initialize.js
+++ b/libraries/metrics/initialize.js
@@ -5,6 +5,8 @@
* before any other module to support code instrumentation.
*/
+const metricsModuleImportStartTime = performance.now()
+
const APP_NAME = process.env.METRICS_APP_NAME || 'unknown'
const BUILD_VERSION = process.env.BUILD_VERSION
const ENABLE_PROFILE_AGENT = process.env.ENABLE_PROFILE_AGENT === 'true'
@@ -88,7 +90,7 @@ function initializeProfileAgent() {
}
function initializePrometheus() {
- const os = require('os')
+ const os = require('node:os')
const promClient = require('prom-client')
promClient.register.setDefaultLabels({ app: APP_NAME, host: os.hostname() })
promClient.collectDefaultMetrics({ timeout: 5000, prefix: '' })
@@ -103,3 +105,5 @@ function recordProcessStart() {
const metrics = require('.')
metrics.inc('process_startup')
}
+
+module.exports = { metricsModuleImportStartTime }
diff --git a/libraries/metrics/leaked_sockets.js b/libraries/metrics/leaked_sockets.js
index cdfb16822b..d250fc4052 100644
--- a/libraries/metrics/leaked_sockets.js
+++ b/libraries/metrics/leaked_sockets.js
@@ -6,8 +6,8 @@
* logged along with the corresponding information from /proc/net/tcp.
*/
-const fs = require('fs')
-const diagnosticsChannel = require('diagnostics_channel')
+const fs = require('node:fs')
+const diagnosticsChannel = require('node:diagnostics_channel')
const SOCKET_MONITOR_INTERVAL = 60 * 1000
// set the threshold for logging leaked sockets in minutes, defaults to 15
diff --git a/libraries/metrics/open_sockets.js b/libraries/metrics/open_sockets.js
index eb120bcf91..da7241d46c 100644
--- a/libraries/metrics/open_sockets.js
+++ b/libraries/metrics/open_sockets.js
@@ -11,13 +11,13 @@ const seconds = 1000
// In Node 0.10 the default is 5, which means only 5 open connections at one.
// Node 0.12 has a default of Infinity. Make sure we have no limit set,
// regardless of Node version.
-require('http').globalAgent.maxSockets = Infinity
-require('https').globalAgent.maxSockets = Infinity
+require('node:http').globalAgent.maxSockets = Infinity
+require('node:https').globalAgent.maxSockets = Infinity
-const SOCKETS_HTTP = require('http').globalAgent.sockets
-const SOCKETS_HTTPS = require('https').globalAgent.sockets
-const FREE_SOCKETS_HTTP = require('http').globalAgent.freeSockets
-const FREE_SOCKETS_HTTPS = require('https').globalAgent.freeSockets
+const SOCKETS_HTTP = require('node:http').globalAgent.sockets
+const SOCKETS_HTTPS = require('node:https').globalAgent.sockets
+const FREE_SOCKETS_HTTP = require('node:http').globalAgent.freeSockets
+const FREE_SOCKETS_HTTPS = require('node:https').globalAgent.freeSockets
// keep track of set gauges and reset them in the next collection cycle
const SEEN_HOSTS_HTTP = new Set()
diff --git a/libraries/metrics/package.json b/libraries/metrics/package.json
index 3aa50c9c71..19b566c2b0 100644
--- a/libraries/metrics/package.json
+++ b/libraries/metrics/package.json
@@ -9,7 +9,7 @@
"main": "index.js",
"dependencies": {
"@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
- "@google-cloud/profiler": "^6.0.0",
+ "@google-cloud/profiler": "^6.0.3",
"@opentelemetry/api": "^1.4.1",
"@opentelemetry/auto-instrumentations-node": "^0.39.1",
"@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
@@ -23,7 +23,7 @@
"devDependencies": {
"bunyan": "^1.0.0",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
diff --git a/libraries/metrics/test/acceptance/metrics_tests.js b/libraries/metrics/test/acceptance/metrics_tests.js
index 307cabc56c..88f6138948 100644
--- a/libraries/metrics/test/acceptance/metrics_tests.js
+++ b/libraries/metrics/test/acceptance/metrics_tests.js
@@ -1,6 +1,6 @@
-const { promisify } = require('util')
-const os = require('os')
-const http = require('http')
+const { promisify } = require('node:util')
+const os = require('node:os')
+const http = require('node:http')
const { expect } = require('chai')
const Metrics = require('../..')
@@ -316,7 +316,7 @@ async function checkSummaryValues(key, values) {
for (const quantile of Object.keys(values)) {
expect(found[quantile]).to.be.within(
values[quantile] - 5,
- values[quantile] + 5,
+ values[quantile] + 15,
`quantile: ${quantile}`
)
}
diff --git a/libraries/metrics/test/unit/js/event_loop.js b/libraries/metrics/test/unit/js/event_loop.js
index a5fb8f7d4e..97b9fddf42 100644
--- a/libraries/metrics/test/unit/js/event_loop.js
+++ b/libraries/metrics/test/unit/js/event_loop.js
@@ -5,7 +5,7 @@
*/
const chai = require('chai')
const { expect } = chai
-const path = require('path')
+const path = require('node:path')
const modulePath = path.join(__dirname, '../../../event_loop.js')
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
diff --git a/libraries/metrics/test/unit/js/http.js b/libraries/metrics/test/unit/js/http.js
index f049f293fd..7b6bb309e7 100644
--- a/libraries/metrics/test/unit/js/http.js
+++ b/libraries/metrics/test/unit/js/http.js
@@ -1,4 +1,4 @@
-const Path = require('path')
+const Path = require('node:path')
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
diff --git a/libraries/mongo-utils/.nvmrc b/libraries/mongo-utils/.nvmrc
new file mode 100644
index 0000000000..fc37597bcc
--- /dev/null
+++ b/libraries/mongo-utils/.nvmrc
@@ -0,0 +1 @@
+22.17.0
diff --git a/libraries/mongo-utils/batchedUpdate.js b/libraries/mongo-utils/batchedUpdate.js
new file mode 100644
index 0000000000..41af41f0d4
--- /dev/null
+++ b/libraries/mongo-utils/batchedUpdate.js
@@ -0,0 +1,321 @@
+// @ts-check
+/* eslint-disable no-console */
+const { ObjectId, ReadPreference } = require('mongodb')
+
+const READ_PREFERENCE_SECONDARY =
+ process.env.MONGO_HAS_SECONDARIES === 'true'
+ ? ReadPreference.secondary.mode
+ : ReadPreference.secondaryPreferred.mode
+
+const ONE_MONTH_IN_MS = 1000 * 60 * 60 * 24 * 31
+let ID_EDGE_PAST
+const ID_EDGE_FUTURE = objectIdFromMs(Date.now() + 1000)
+let BATCH_DESCENDING
+let BATCH_SIZE
+let VERBOSE_LOGGING
+let BATCH_RANGE_START
+let BATCH_RANGE_END
+let BATCH_MAX_TIME_SPAN_IN_MS
+let BATCHED_UPDATE_RUNNING = false
+
+/**
+ * @typedef {import("mongodb").Collection} Collection
+ * @typedef {import("mongodb-legacy").Collection} LegacyCollection
+ * @typedef {import("mongodb").Document} Document
+ * @typedef {import("mongodb").FindOptions} FindOptions
+ * @typedef {import("mongodb").UpdateFilter} UpdateDocument
+ */
+
+/**
+ * @typedef {Object} BatchedUpdateOptions
+ * @property {string} [BATCH_DESCENDING]
+ * @property {string} [BATCH_LAST_ID]
+ * @property {string} [BATCH_MAX_TIME_SPAN_IN_MS]
+ * @property {string} [BATCH_RANGE_END]
+ * @property {string} [BATCH_RANGE_START]
+ * @property {string} [BATCH_SIZE]
+ * @property {string} [VERBOSE_LOGGING]
+ * @property {(progress: string) => Promise} [trackProgress]
+ */
+
+/**
+ * @param {BatchedUpdateOptions} options
+ */
+function refreshGlobalOptionsForBatchedUpdate(options = {}) {
+ options = Object.assign({}, options, process.env)
+
+ BATCH_DESCENDING = options.BATCH_DESCENDING === 'true'
+ BATCH_SIZE = parseInt(options.BATCH_SIZE || '1000', 10) || 1000
+ VERBOSE_LOGGING = options.VERBOSE_LOGGING === 'true'
+ if (options.BATCH_LAST_ID) {
+ BATCH_RANGE_START = objectIdFromInput(options.BATCH_LAST_ID)
+ } else if (options.BATCH_RANGE_START) {
+ BATCH_RANGE_START = objectIdFromInput(options.BATCH_RANGE_START)
+ } else {
+ if (BATCH_DESCENDING) {
+ BATCH_RANGE_START = ID_EDGE_FUTURE
+ } else {
+ BATCH_RANGE_START = ID_EDGE_PAST
+ }
+ }
+ BATCH_MAX_TIME_SPAN_IN_MS = parseInt(
+ options.BATCH_MAX_TIME_SPAN_IN_MS || ONE_MONTH_IN_MS.toString(),
+ 10
+ )
+ if (options.BATCH_RANGE_END) {
+ BATCH_RANGE_END = objectIdFromInput(options.BATCH_RANGE_END)
+ } else {
+ if (BATCH_DESCENDING) {
+ BATCH_RANGE_END = ID_EDGE_PAST
+ } else {
+ BATCH_RANGE_END = ID_EDGE_FUTURE
+ }
+ }
+}
+
+/**
+ * @param {Collection | LegacyCollection} collection
+ * @param {Document} query
+ * @param {ObjectId} start
+ * @param {ObjectId} end
+ * @param {Document} projection
+ * @param {FindOptions} findOptions
+ * @return {Promise>}
+ */
+async function getNextBatch(
+ collection,
+ query,
+ start,
+ end,
+ projection,
+ findOptions
+) {
+ if (BATCH_DESCENDING) {
+ query._id = {
+ $gt: end,
+ $lte: start,
+ }
+ } else {
+ query._id = {
+ $gt: start,
+ $lte: end,
+ }
+ }
+ return await collection
+ .find(query, findOptions)
+ .project(projection)
+ .sort({ _id: BATCH_DESCENDING ? -1 : 1 })
+ .limit(BATCH_SIZE)
+ .toArray()
+}
+
+/**
+ * @param {Collection | LegacyCollection} collection
+ * @param {Array} nextBatch
+ * @param {UpdateDocument} update
+ * @return {Promise}
+ */
+async function performUpdate(collection, nextBatch, update) {
+ await collection.updateMany(
+ { _id: { $in: nextBatch.map(entry => entry._id) } },
+ update
+ )
+}
+
+/**
+ * @param {string} input
+ * @return {ObjectId}
+ */
+function objectIdFromInput(input) {
+ if (input.includes('T')) {
+ const t = new Date(input).getTime()
+ if (Number.isNaN(t)) throw new Error(`${input} is not a valid date`)
+ return objectIdFromMs(t)
+ } else {
+ return new ObjectId(input)
+ }
+}
+
+/**
+ * @param {ObjectId} objectId
+ * @return {string}
+ */
+function renderObjectId(objectId) {
+ return `${objectId} (${objectId.getTimestamp().toISOString()})`
+}
+
+/**
+ * @param {number} ms
+ * @return {ObjectId}
+ */
+function objectIdFromMs(ms) {
+ return ObjectId.createFromTime(ms / 1000)
+}
+
+/**
+ * @param {ObjectId} id
+ * @return {number}
+ */
+function getMsFromObjectId(id) {
+ return id.getTimestamp().getTime()
+}
+
+/**
+ * @param {ObjectId} start
+ * @return {ObjectId}
+ */
+function getNextEnd(start) {
+ let end
+ if (BATCH_DESCENDING) {
+ end = objectIdFromMs(getMsFromObjectId(start) - BATCH_MAX_TIME_SPAN_IN_MS)
+ if (getMsFromObjectId(end) <= getMsFromObjectId(BATCH_RANGE_END)) {
+ end = BATCH_RANGE_END
+ }
+ } else {
+ end = objectIdFromMs(getMsFromObjectId(start) + BATCH_MAX_TIME_SPAN_IN_MS)
+ if (getMsFromObjectId(end) >= getMsFromObjectId(BATCH_RANGE_END)) {
+ end = BATCH_RANGE_END
+ }
+ }
+ return end
+}
+
+/**
+ * @param {Collection | LegacyCollection} collection
+ * @return {Promise}
+ */
+async function getIdEdgePast(collection) {
+ const [first] = await collection
+ .find({})
+ .project({ _id: 1 })
+ .sort({ _id: 1 })
+ .limit(1)
+ .toArray()
+ if (!first) return null
+ // Go one second further into the past in order to include the first entry via
+ // first._id > ID_EDGE_PAST
+ return objectIdFromMs(Math.max(0, getMsFromObjectId(first._id) - 1000))
+}
+
+/**
+ * @param {Collection | LegacyCollection} collection
+ * @param {Document} query
+ * @param {UpdateDocument | ((batch: Array) => Promise)} update
+ * @param {Document} [projection]
+ * @param {FindOptions} [findOptions]
+ * @param {BatchedUpdateOptions} [batchedUpdateOptions]
+ */
+async function batchedUpdate(
+ collection,
+ query,
+ update,
+ projection,
+ findOptions,
+ batchedUpdateOptions = {}
+) {
+ // only a single batchedUpdate can run at a time due to global variables
+ if (BATCHED_UPDATE_RUNNING) {
+ throw new Error('batchedUpdate is already running')
+ }
+ try {
+ BATCHED_UPDATE_RUNNING = true
+ ID_EDGE_PAST = await getIdEdgePast(collection)
+ if (!ID_EDGE_PAST) {
+ console.warn(
+ `The collection ${collection.collectionName} appears to be empty.`
+ )
+ return 0
+ }
+ refreshGlobalOptionsForBatchedUpdate(batchedUpdateOptions)
+ const { trackProgress = async progress => console.warn(progress) } =
+ batchedUpdateOptions
+
+ findOptions = findOptions || {}
+ findOptions.readPreference = READ_PREFERENCE_SECONDARY
+
+ projection = projection || { _id: 1 }
+ let nextBatch
+ let updated = 0
+ let start = BATCH_RANGE_START
+
+ while (start !== BATCH_RANGE_END) {
+ let end = getNextEnd(start)
+ nextBatch = await getNextBatch(
+ collection,
+ query,
+ start,
+ end,
+ projection,
+ findOptions
+ )
+ if (nextBatch.length > 0) {
+ end = nextBatch[nextBatch.length - 1]._id
+ updated += nextBatch.length
+
+ if (VERBOSE_LOGGING) {
+ console.log(
+ `Running update on batch with ids ${JSON.stringify(
+ nextBatch.map(entry => entry._id)
+ )}`
+ )
+ }
+ await trackProgress(
+ `Running update on batch ending ${renderObjectId(end)}`
+ )
+
+ if (typeof update === 'function') {
+ await update(nextBatch)
+ } else {
+ await performUpdate(collection, nextBatch, update)
+ }
+ }
+ await trackProgress(`Completed batch ending ${renderObjectId(end)}`)
+ start = end
+ }
+ return updated
+ } finally {
+ BATCHED_UPDATE_RUNNING = false
+ }
+}
+
+/**
+ * @param {Collection | LegacyCollection} collection
+ * @param {Document} query
+ * @param {UpdateDocument | ((batch: Array) => Promise)} update
+ * @param {Document} [projection]
+ * @param {FindOptions} [findOptions]
+ * @param {BatchedUpdateOptions} [batchedUpdateOptions]
+ */
+function batchedUpdateWithResultHandling(
+ collection,
+ query,
+ update,
+ projection,
+ findOptions,
+ batchedUpdateOptions
+) {
+ batchedUpdate(
+ collection,
+ query,
+ update,
+ projection,
+ findOptions,
+ batchedUpdateOptions
+ )
+ .then(processed => {
+ console.error({ processed })
+ process.exit(0)
+ })
+ .catch(error => {
+ console.error({ error })
+ process.exit(1)
+ })
+}
+
+module.exports = {
+ READ_PREFERENCE_SECONDARY,
+ objectIdFromInput,
+ renderObjectId,
+ batchedUpdate,
+ batchedUpdateWithResultHandling,
+}
diff --git a/libraries/mongo-utils/buildscript.txt b/libraries/mongo-utils/buildscript.txt
new file mode 100644
index 0000000000..ff07040970
--- /dev/null
+++ b/libraries/mongo-utils/buildscript.txt
@@ -0,0 +1,10 @@
+mongo-utils
+--dependencies=None
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
+--env-add=
+--env-pass-through=
+--esmock-loader=False
+--is-library=True
+--node-version=22.17.0
+--public-repo=False
+--script-version=4.7.0
diff --git a/libraries/mongo-utils/index.js b/libraries/mongo-utils/index.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/libraries/mongo-utils/package.json b/libraries/mongo-utils/package.json
new file mode 100644
index 0000000000..51e2148f45
--- /dev/null
+++ b/libraries/mongo-utils/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@overleaf/mongo-utils",
+ "version": "0.0.1",
+ "description": "utilities to help working with mongo",
+ "main": "index.js",
+ "scripts": {
+ "test": "npm run lint && npm run format && npm run types:check && npm run test:unit",
+ "test:unit": "mocha --exit test/**/*.{js,cjs}",
+ "lint": "eslint --ext .js --ext .cjs --ext .ts --max-warnings 0 --format unix .",
+ "lint:fix": "eslint --fix --ext .js --ext .cjs --ext .ts .",
+ "format": "prettier --list-different $PWD/'**/*.{js,cjs,ts}'",
+ "format:fix": "prettier --write $PWD/'**/*.{js,cjs,ts}'",
+ "test:ci": "npm run test:unit",
+ "types:check": "tsc --noEmit"
+ },
+ "author": "Overleaf (https://www.overleaf.com)",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "mongodb": "6.12.0",
+ "mongodb-legacy": "6.1.3"
+ },
+ "devDependencies": {
+ "chai": "^4.3.6",
+ "mocha": "^11.1.0",
+ "sandboxed-module": "^2.0.4",
+ "sinon": "^9.2.4",
+ "sinon-chai": "^3.7.0",
+ "typescript": "^5.0.4"
+ }
+}
diff --git a/libraries/mongo-utils/test/setup.js b/libraries/mongo-utils/test/setup.js
new file mode 100644
index 0000000000..78e563f853
--- /dev/null
+++ b/libraries/mongo-utils/test/setup.js
@@ -0,0 +1,11 @@
+const chai = require('chai')
+const sinonChai = require('sinon-chai')
+const SandboxedModule = require('sandboxed-module')
+
+// Chai configuration
+chai.should()
+chai.use(sinonChai)
+
+SandboxedModule.configure({
+ globals: { Buffer, JSON, console, process },
+})
diff --git a/libraries/mongo-utils/tsconfig.json b/libraries/mongo-utils/tsconfig.json
new file mode 100644
index 0000000000..d43bb2470a
--- /dev/null
+++ b/libraries/mongo-utils/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig.backend.json",
+ "include": [
+ "**/*.js",
+ "**/*.cjs"
+ ]
+}
diff --git a/libraries/o-error/.dockerignore b/libraries/o-error/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/o-error/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/o-error/.gitignore b/libraries/o-error/.gitignore
deleted file mode 100644
index cf2f0ad3fb..0000000000
--- a/libraries/o-error/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.nyc_output
-coverage
-node_modules/
-
-.npmrc
diff --git a/libraries/o-error/.nvmrc b/libraries/o-error/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/o-error/.nvmrc
+++ b/libraries/o-error/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/o-error/buildscript.txt b/libraries/o-error/buildscript.txt
index 9b1ce7c0aa..6a9334411a 100644
--- a/libraries/o-error/buildscript.txt
+++ b/libraries/o-error/buildscript.txt
@@ -1,10 +1,10 @@
o-error
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/o-error/doc/demo.js b/libraries/o-error/doc/demo.js
index 845a2bf671..9ebef2db56 100644
--- a/libraries/o-error/doc/demo.js
+++ b/libraries/o-error/doc/demo.js
@@ -70,7 +70,7 @@ sayHi3(43, (err, result) => {
}
})
-const promisify = require('util').promisify
+const promisify = require('node:util').promisify
demoDatabase.findUserAsync = promisify(demoDatabase.findUser)
async function sayHi4NoHandling(userId) {
diff --git a/libraries/o-error/index.cjs b/libraries/o-error/index.cjs
index ef08b45f16..0bb7da653a 100644
--- a/libraries/o-error/index.cjs
+++ b/libraries/o-error/index.cjs
@@ -1,20 +1,34 @@
+// @ts-check
+
/**
* Light-weight helpers for handling JavaScript Errors in node.js and the
* browser.
*/
class OError extends Error {
+ /**
+ * The error that is the underlying cause of this error
+ *
+ * @type {unknown}
+ */
+ cause
+
+ /**
+ * List of errors encountered as the callback chain is unwound
+ *
+ * @type {TaggedError[] | undefined}
+ */
+ _oErrorTags
+
/**
* @param {string} message as for built-in Error
* @param {Object} [info] extra data to attach to the error
- * @param {Error} [cause] the internal error that caused this error
+ * @param {unknown} [cause] the internal error that caused this error
*/
constructor(message, info, cause) {
super(message)
this.name = this.constructor.name
if (info) this.info = info
if (cause) this.cause = cause
- /** @private @type {Array | undefined} */
- this._oErrorTags // eslint-disable-line
}
/**
@@ -31,7 +45,7 @@ class OError extends Error {
/**
* Wrap the given error, which caused this error.
*
- * @param {Error} cause the internal error that caused this error
+ * @param {unknown} cause the internal error that caused this error
* @return {this}
*/
withCause(cause) {
@@ -65,13 +79,16 @@ class OError extends Error {
* }
* }
*
- * @param {Error} error the error to tag
+ * @template {unknown} E
+ * @param {E} error the error to tag
* @param {string} [message] message with which to tag `error`
* @param {Object} [info] extra data with wich to tag `error`
- * @return {Error} the modified `error` argument
+ * @return {E} the modified `error` argument
*/
static tag(error, message, info) {
- const oError = /** @type{OError} */ (error)
+ const oError = /** @type {{ _oErrorTags: TaggedError[] | undefined }} */ (
+ error
+ )
if (!oError._oErrorTags) oError._oErrorTags = []
@@ -102,7 +119,7 @@ class OError extends Error {
*
* If an info property is repeated, the last one wins.
*
- * @param {Error | null | undefined} error any error (may or may not be an `OError`)
+ * @param {unknown} error any error (may or may not be an `OError`)
* @return {Object}
*/
static getFullInfo(error) {
@@ -129,7 +146,7 @@ class OError extends Error {
* Return the `stack` property from `error`, including the `stack`s for any
* tagged errors added with `OError.tag` and for any `cause`s.
*
- * @param {Error | null | undefined} error any error (may or may not be an `OError`)
+ * @param {unknown} error any error (may or may not be an `OError`)
* @return {string}
*/
static getFullStack(error) {
@@ -143,7 +160,7 @@ class OError extends Error {
stack += `\n${oError._oErrorTags.map(tag => tag.stack).join('\n')}`
}
- const causeStack = oError.cause && OError.getFullStack(oError.cause)
+ const causeStack = OError.getFullStack(oError.cause)
if (causeStack) {
stack += '\ncaused by:\n' + indent(causeStack)
}
diff --git a/libraries/o-error/package.json b/libraries/o-error/package.json
index 4a34b1bcdc..9e17e85be5 100644
--- a/libraries/o-error/package.json
+++ b/libraries/o-error/package.json
@@ -34,7 +34,7 @@
"@types/chai": "^4.3.0",
"@types/node": "^18.17.4",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
diff --git a/libraries/o-error/test/o-error-util.test.js b/libraries/o-error/test/o-error-util.test.js
index c13f032541..b29dd4900a 100644
--- a/libraries/o-error/test/o-error-util.test.js
+++ b/libraries/o-error/test/o-error-util.test.js
@@ -1,5 +1,5 @@
const { expect } = require('chai')
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const OError = require('..')
@@ -268,6 +268,11 @@ describe('utils', function () {
expect(OError.getFullInfo(null)).to.deep.equal({})
})
+ it('works when given a string', function () {
+ const err = 'not an error instance'
+ expect(OError.getFullInfo(err)).to.deep.equal({})
+ })
+
it('works on a normal error', function () {
const err = new Error('foo')
expect(OError.getFullInfo(err)).to.deep.equal({})
diff --git a/libraries/o-error/test/o-error.test.js b/libraries/o-error/test/o-error.test.js
index 84244ec92e..db87f56992 100644
--- a/libraries/o-error/test/o-error.test.js
+++ b/libraries/o-error/test/o-error.test.js
@@ -35,6 +35,14 @@ describe('OError', function () {
expect(err2.cause.message).to.equal('cause 2')
})
+ it('accepts non-Error causes', function () {
+ const err1 = new OError('foo', {}, 'not-an-error')
+ expect(err1.cause).to.equal('not-an-error')
+
+ const err2 = new OError('foo').withCause('not-an-error')
+ expect(err2.cause).to.equal('not-an-error')
+ })
+
it('handles a custom error type with a cause', function () {
function doSomethingBadInternally() {
throw new Error('internal error')
diff --git a/libraries/o-error/test/support/index.js b/libraries/o-error/test/support/index.js
index 93bd846631..00d9dbb392 100644
--- a/libraries/o-error/test/support/index.js
+++ b/libraries/o-error/test/support/index.js
@@ -23,7 +23,7 @@ exports.expectError = function OErrorExpectError(e, expected) {
).to.be.true
expect(
- require('util').types.isNativeError(e),
+ require('node:util').types.isNativeError(e),
'error should be recognised by util.types.isNativeError'
).to.be.true
diff --git a/libraries/object-persistor/.dockerignore b/libraries/object-persistor/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/object-persistor/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/object-persistor/.gitignore b/libraries/object-persistor/.gitignore
deleted file mode 100644
index 6a20893208..0000000000
--- a/libraries/object-persistor/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/node_modules
-*.swp
-
-.npmrc
diff --git a/libraries/object-persistor/.nvmrc b/libraries/object-persistor/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/object-persistor/.nvmrc
+++ b/libraries/object-persistor/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/object-persistor/buildscript.txt b/libraries/object-persistor/buildscript.txt
index 839d639317..897e789700 100644
--- a/libraries/object-persistor/buildscript.txt
+++ b/libraries/object-persistor/buildscript.txt
@@ -1,10 +1,10 @@
object-persistor
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/object-persistor/package.json b/libraries/object-persistor/package.json
index 3aed927437..2cc70b4131 100644
--- a/libraries/object-persistor/package.json
+++ b/libraries/object-persistor/package.json
@@ -24,7 +24,8 @@
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
"@overleaf/o-error": "*",
- "aws-sdk": "^2.718.0",
+ "@overleaf/stream-utils": "*",
+ "aws-sdk": "^2.1691.0",
"fast-crc32c": "overleaf/node-fast-crc32c#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51",
"glob": "^7.1.6",
"range-parser": "^1.2.1",
@@ -33,9 +34,9 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"mock-fs": "^5.2.0",
- "mongodb": "^6.1.0",
+ "mongodb": "6.12.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
diff --git a/libraries/object-persistor/src/AbstractPersistor.js b/libraries/object-persistor/src/AbstractPersistor.js
index b17d3e7325..3352766655 100644
--- a/libraries/object-persistor/src/AbstractPersistor.js
+++ b/libraries/object-persistor/src/AbstractPersistor.js
@@ -1,6 +1,12 @@
const { NotImplementedError } = require('./Errors')
module.exports = class AbstractPersistor {
+ /**
+ * @param location
+ * @param target
+ * @param {string} source
+ * @return {Promise}
+ */
async sendFile(location, target, source) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'sendFile',
@@ -10,6 +16,13 @@ module.exports = class AbstractPersistor {
})
}
+ /**
+ * @param location
+ * @param target
+ * @param {NodeJS.ReadableStream} sourceStream
+ * @param {Object} opts
+ * @return {Promise}
+ */
async sendStream(location, target, sourceStream, opts = {}) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'sendStream',
@@ -22,12 +35,12 @@ module.exports = class AbstractPersistor {
/**
* @param location
* @param name
- * @param {Object} opts
- * @param {Number} opts.start
- * @param {Number} opts.end
- * @return {Promise}
+ * @param {Object} [opts]
+ * @param {Number} [opts.start]
+ * @param {Number} [opts.end]
+ * @return {Promise}
*/
- async getObjectStream(location, name, opts) {
+ async getObjectStream(location, name, opts = {}) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'getObjectStream',
location,
@@ -36,6 +49,11 @@ module.exports = class AbstractPersistor {
})
}
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @return {Promise}
+ */
async getRedirectUrl(location, name) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'getRedirectUrl',
@@ -44,7 +62,13 @@ module.exports = class AbstractPersistor {
})
}
- async getObjectSize(location, name) {
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @param {Object} opts
+ * @return {Promise}
+ */
+ async getObjectSize(location, name, opts) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'getObjectSize',
location,
@@ -52,7 +76,13 @@ module.exports = class AbstractPersistor {
})
}
- async getObjectMd5Hash(location, name) {
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @param {Object} opts
+ * @return {Promise}
+ */
+ async getObjectMd5Hash(location, name, opts) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'getObjectMd5Hash',
location,
@@ -60,7 +90,14 @@ module.exports = class AbstractPersistor {
})
}
- async copyObject(location, fromName, toName) {
+ /**
+ * @param {string} location
+ * @param {string} fromName
+ * @param {string} toName
+ * @param {Object} opts
+ * @return {Promise}
+ */
+ async copyObject(location, fromName, toName, opts) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'copyObject',
location,
@@ -69,6 +106,11 @@ module.exports = class AbstractPersistor {
})
}
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @return {Promise}
+ */
async deleteObject(location, name) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'deleteObject',
@@ -77,7 +119,13 @@ module.exports = class AbstractPersistor {
})
}
- async deleteDirectory(location, name) {
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @param {string} [continuationToken]
+ * @return {Promise}
+ */
+ async deleteDirectory(location, name, continuationToken) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'deleteDirectory',
location,
@@ -85,7 +133,13 @@ module.exports = class AbstractPersistor {
})
}
- async checkIfObjectExists(location, name) {
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @param {Object} opts
+ * @return {Promise}
+ */
+ async checkIfObjectExists(location, name, opts) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'checkIfObjectExists',
location,
@@ -93,7 +147,13 @@ module.exports = class AbstractPersistor {
})
}
- async directorySize(location, name) {
+ /**
+ * @param {string} location
+ * @param {string} name
+ * @param {string} [continuationToken]
+ * @return {Promise}
+ */
+ async directorySize(location, name, continuationToken) {
throw new NotImplementedError('method not implemented in persistor', {
method: 'directorySize',
location,
diff --git a/libraries/object-persistor/src/Errors.js b/libraries/object-persistor/src/Errors.js
index 0e32a3efe0..0c9dd52f68 100644
--- a/libraries/object-persistor/src/Errors.js
+++ b/libraries/object-persistor/src/Errors.js
@@ -5,6 +5,8 @@ class WriteError extends OError {}
class ReadError extends OError {}
class SettingsError extends OError {}
class NotImplementedError extends OError {}
+class AlreadyWrittenError extends OError {}
+class NoKEKMatchedError extends OError {}
module.exports = {
NotFoundError,
@@ -12,4 +14,6 @@ module.exports = {
ReadError,
SettingsError,
NotImplementedError,
+ AlreadyWrittenError,
+ NoKEKMatchedError,
}
diff --git a/libraries/object-persistor/src/FSPersistor.js b/libraries/object-persistor/src/FSPersistor.js
index 3752ad3756..38a81407df 100644
--- a/libraries/object-persistor/src/FSPersistor.js
+++ b/libraries/object-persistor/src/FSPersistor.js
@@ -1,20 +1,26 @@
-const crypto = require('crypto')
-const fs = require('fs')
-const fsPromises = require('fs/promises')
+const crypto = require('node:crypto')
+const fs = require('node:fs')
+const fsPromises = require('node:fs/promises')
const globCallbacks = require('glob')
-const Path = require('path')
-const { PassThrough } = require('stream')
-const { pipeline } = require('stream/promises')
-const { promisify } = require('util')
+const Path = require('node:path')
+const { PassThrough } = require('node:stream')
+const { pipeline } = require('node:stream/promises')
+const { promisify } = require('node:util')
const AbstractPersistor = require('./AbstractPersistor')
-const { ReadError, WriteError } = require('./Errors')
+const { ReadError, WriteError, NotImplementedError } = require('./Errors')
const PersistorHelper = require('./PersistorHelper')
const glob = promisify(globCallbacks)
module.exports = class FSPersistor extends AbstractPersistor {
constructor(settings = {}) {
+ if (settings.storageClass) {
+ throw new NotImplementedError(
+ 'FS backend does not support storage classes'
+ )
+ }
+
super()
this.useSubdirectories = Boolean(settings.useSubdirectories)
}
@@ -36,6 +42,14 @@ module.exports = class FSPersistor extends AbstractPersistor {
}
async sendStream(location, target, sourceStream, opts = {}) {
+ if (opts.ifNoneMatch === '*') {
+ // The standard library only has fs.rename(), which does not support exclusive flags.
+ // Refuse to act on this write operation.
+ throw new NotImplementedError(
+ 'Overwrite protection required by caller, but it is not available is FS backend. Configure GCS or S3 backend instead, get in touch with support for further information.'
+ )
+ }
+
const targetPath = this._getFsPath(location, target)
try {
@@ -55,7 +69,7 @@ module.exports = class FSPersistor extends AbstractPersistor {
throw PersistorHelper.wrapError(
err,
'failed to write stream',
- { location, target },
+ { location, target, ifNoneMatch: opts.ifNoneMatch },
WriteError
)
}
@@ -63,6 +77,11 @@ module.exports = class FSPersistor extends AbstractPersistor {
// opts may be {start: Number, end: Number}
async getObjectStream(location, name, opts = {}) {
+ if (opts.autoGunzip) {
+ throw new NotImplementedError(
+ 'opts.autoGunzip is not supported by FS backend. Configure GCS or S3 backend instead, get in touch with support for further information.'
+ )
+ }
const observer = new PersistorHelper.ObserverStream({
metric: 'fs.ingress', // ingress to us from disk
bucket: location,
@@ -286,8 +305,10 @@ module.exports = class FSPersistor extends AbstractPersistor {
async _listDirectory(path) {
if (this.useSubdirectories) {
+ // eslint-disable-next-line @typescript-eslint/return-await
return await glob(Path.join(path, '**'))
} else {
+ // eslint-disable-next-line @typescript-eslint/return-await
return await glob(`${path}_*`)
}
}
diff --git a/libraries/object-persistor/src/GcsPersistor.js b/libraries/object-persistor/src/GcsPersistor.js
index b8c542bb62..0485373ae5 100644
--- a/libraries/object-persistor/src/GcsPersistor.js
+++ b/libraries/object-persistor/src/GcsPersistor.js
@@ -1,17 +1,28 @@
-const fs = require('fs')
-const { pipeline } = require('stream/promises')
-const { PassThrough } = require('stream')
+const fs = require('node:fs')
+const { pipeline } = require('node:stream/promises')
+const { PassThrough } = require('node:stream')
const { Storage, IdempotencyStrategy } = require('@google-cloud/storage')
-const { WriteError, ReadError, NotFoundError } = require('./Errors')
+const {
+ WriteError,
+ ReadError,
+ NotFoundError,
+ NotImplementedError,
+} = require('./Errors')
const asyncPool = require('tiny-async-pool')
const AbstractPersistor = require('./AbstractPersistor')
const PersistorHelper = require('./PersistorHelper')
const Logger = require('@overleaf/logger')
+const zlib = require('node:zlib')
module.exports = class GcsPersistor extends AbstractPersistor {
constructor(settings) {
- super()
+ if (settings.storageClass) {
+ throw new NotImplementedError(
+ 'Use default bucket class for GCS instead of settings.storageClass'
+ )
+ }
+ super()
this.settings = settings
// endpoint settings will be null by default except for tests
@@ -78,10 +89,14 @@ module.exports = class GcsPersistor extends AbstractPersistor {
writeOptions.metadata = writeOptions.metadata || {}
writeOptions.metadata.contentEncoding = opts.contentEncoding
}
+ const fileOptions = {}
+ if (opts.ifNoneMatch === '*') {
+ fileOptions.generation = 0
+ }
const uploadStream = this.storage
.bucket(bucketName)
- .file(key)
+ .file(key, fileOptions)
.createWriteStream(writeOptions)
await pipeline(readStream, observer, uploadStream)
@@ -97,7 +112,7 @@ module.exports = class GcsPersistor extends AbstractPersistor {
throw PersistorHelper.wrapError(
err,
'upload to GCS failed',
- { bucketName, key },
+ { bucketName, key, ifNoneMatch: opts.ifNoneMatch },
WriteError
)
}
@@ -113,12 +128,14 @@ module.exports = class GcsPersistor extends AbstractPersistor {
.file(key)
.createReadStream({ decompress: false, ...opts })
+ let contentEncoding
try {
await new Promise((resolve, reject) => {
stream.on('response', res => {
switch (res.statusCode) {
case 200: // full response
case 206: // partial response
+ contentEncoding = res.headers['content-encoding']
return resolve()
case 404:
return reject(new NotFoundError())
@@ -139,7 +156,11 @@ module.exports = class GcsPersistor extends AbstractPersistor {
}
// Return a PassThrough stream with a minimal interface. It will buffer until the caller starts reading. It will emit errors from the source stream (Stream.pipeline passes errors along).
const pass = new PassThrough()
- pipeline(stream, observer, pass).catch(() => {})
+ const transformer = []
+ if (contentEncoding === 'gzip' && opts.autoGunzip) {
+ transformer.push(zlib.createGunzip())
+ }
+ pipeline(stream, observer, ...transformer, pass).catch(() => {})
return pass
}
@@ -176,7 +197,7 @@ module.exports = class GcsPersistor extends AbstractPersistor {
.bucket(bucketName)
.file(key)
.getMetadata()
- return metadata.size
+ return parseInt(metadata.size, 10)
} catch (err) {
throw PersistorHelper.wrapError(
err,
@@ -285,7 +306,10 @@ module.exports = class GcsPersistor extends AbstractPersistor {
)
}
- return files.reduce((acc, file) => Number(file.metadata.size) + acc, 0)
+ return files.reduce(
+ (acc, file) => parseInt(file.metadata.size, 10) + acc,
+ 0
+ )
}
async checkIfObjectExists(bucketName, key) {
diff --git a/libraries/object-persistor/src/MigrationPersistor.js b/libraries/object-persistor/src/MigrationPersistor.js
index 3f44c38cee..0cb665fa00 100644
--- a/libraries/object-persistor/src/MigrationPersistor.js
+++ b/libraries/object-persistor/src/MigrationPersistor.js
@@ -1,8 +1,8 @@
const AbstractPersistor = require('./AbstractPersistor')
const Logger = require('@overleaf/logger')
const Metrics = require('@overleaf/metrics')
-const Stream = require('stream')
-const { pipeline } = require('stream/promises')
+const Stream = require('node:stream')
+const { pipeline } = require('node:stream/promises')
const { NotFoundError, WriteError } = require('./Errors')
// Persistor that wraps two other persistors. Talks to the 'primary' by default,
diff --git a/libraries/object-persistor/src/PerProjectEncryptedS3Persistor.js b/libraries/object-persistor/src/PerProjectEncryptedS3Persistor.js
new file mode 100644
index 0000000000..a0230128fe
--- /dev/null
+++ b/libraries/object-persistor/src/PerProjectEncryptedS3Persistor.js
@@ -0,0 +1,483 @@
+// @ts-check
+const Crypto = require('node:crypto')
+const Stream = require('node:stream')
+const fs = require('node:fs')
+const { promisify } = require('node:util')
+const { WritableBuffer } = require('@overleaf/stream-utils')
+const { S3Persistor, SSECOptions } = require('./S3Persistor.js')
+const {
+ AlreadyWrittenError,
+ NoKEKMatchedError,
+ NotFoundError,
+ NotImplementedError,
+ ReadError,
+} = require('./Errors')
+const logger = require('@overleaf/logger')
+const Path = require('node:path')
+
+const generateKey = promisify(Crypto.generateKey)
+const hkdf = promisify(Crypto.hkdf)
+
+const AES256_KEY_LENGTH = 32
+
+/**
+ * @typedef {import('aws-sdk').AWSError} AWSError
+ */
+
+/**
+ * @typedef {Object} Settings
+ * @property {boolean} automaticallyRotateDEKEncryption
+ * @property {string} dataEncryptionKeyBucketName
+ * @property {boolean} ignoreErrorsFromDEKReEncryption
+ * @property {(bucketName: string, path: string) => string} pathToProjectFolder
+ * @property {() => Promise>} getRootKeyEncryptionKeys
+ */
+
+/**
+ * @typedef {import('./types').ListDirectoryResult} ListDirectoryResult
+ */
+
+/**
+ * Helper function to make TS happy when accessing error properties
+ * AWSError is not an actual class, so we cannot use instanceof.
+ * @param {any} err
+ * @return {err is AWSError}
+ */
+function isAWSError(err) {
+ return !!err
+}
+
+/**
+ * @param {any} err
+ * @return {boolean}
+ */
+function isForbiddenError(err) {
+ if (!err || !(err instanceof ReadError || err instanceof NotFoundError)) {
+ return false
+ }
+ const cause = err.cause
+ if (!isAWSError(cause)) return false
+ return cause.statusCode === 403
+}
+
+class RootKeyEncryptionKey {
+ /** @type {Buffer} */
+ #keyEncryptionKey
+ /** @type {Buffer} */
+ #salt
+
+ /**
+ * @param {Buffer} keyEncryptionKey
+ * @param {Buffer} salt
+ */
+ constructor(keyEncryptionKey, salt) {
+ if (keyEncryptionKey.byteLength !== AES256_KEY_LENGTH) {
+ throw new Error(`kek is not ${AES256_KEY_LENGTH} bytes long`)
+ }
+ this.#keyEncryptionKey = keyEncryptionKey
+ this.#salt = salt
+ }
+
+ /**
+ * @param {string} prefix
+ * @return {Promise}
+ */
+ async forProject(prefix) {
+ return new SSECOptions(
+ Buffer.from(
+ await hkdf(
+ 'sha256',
+ this.#keyEncryptionKey,
+ this.#salt,
+ prefix,
+ AES256_KEY_LENGTH
+ )
+ )
+ )
+ }
+}
+
+class PerProjectEncryptedS3Persistor extends S3Persistor {
+ /** @type {Settings} */
+ #settings
+ /** @type {Promise>} */
+ #availableKeyEncryptionKeysPromise
+
+ /**
+ * @param {Settings} settings
+ */
+ constructor(settings) {
+ if (!settings.dataEncryptionKeyBucketName) {
+ throw new Error('settings.dataEncryptionKeyBucketName is missing')
+ }
+ super(settings)
+ this.#settings = settings
+ this.#availableKeyEncryptionKeysPromise = settings
+ .getRootKeyEncryptionKeys()
+ .then(rootKEKs => {
+ if (rootKEKs.length === 0) throw new Error('no root kek provided')
+ return rootKEKs
+ })
+ }
+
+ async ensureKeyEncryptionKeysLoaded() {
+ await this.#availableKeyEncryptionKeysPromise
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {{dekPath: string, projectFolder: string}}
+ */
+ #buildProjectPaths(bucketName, path) {
+ const projectFolder = this.#settings.pathToProjectFolder(bucketName, path)
+ const dekPath = Path.join(projectFolder, 'dek')
+ return { projectFolder, dekPath }
+ }
+
+ /**
+ * @param {string} projectFolder
+ * @return {Promise}
+ */
+ async #getCurrentKeyEncryptionKey(projectFolder) {
+ const [currentRootKEK] = await this.#availableKeyEncryptionKeysPromise
+ return await currentRootKEK.forProject(projectFolder)
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ */
+ async getDataEncryptionKeySize(bucketName, path) {
+ const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
+ for (const rootKEK of await this.#availableKeyEncryptionKeysPromise) {
+ const ssecOptions = await rootKEK.forProject(projectFolder)
+ try {
+ return await super.getObjectSize(
+ this.#settings.dataEncryptionKeyBucketName,
+ dekPath,
+ { ssecOptions }
+ )
+ } catch (err) {
+ if (isForbiddenError(err)) continue
+ throw err
+ }
+ }
+ throw new NoKEKMatchedError('no kek matched')
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async forProject(bucketName, path) {
+ return new CachedPerProjectEncryptedS3Persistor(
+ this,
+ await this.#getDataEncryptionKeyOptions(bucketName, path)
+ )
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async forProjectRO(bucketName, path) {
+ return new CachedPerProjectEncryptedS3Persistor(
+ this,
+ await this.#getExistingDataEncryptionKeyOptions(bucketName, path)
+ )
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async generateDataEncryptionKey(bucketName, path) {
+ return new CachedPerProjectEncryptedS3Persistor(
+ this,
+ await this.#generateDataEncryptionKeyOptions(bucketName, path)
+ )
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async #generateDataEncryptionKeyOptions(bucketName, path) {
+ const dataEncryptionKey = (
+ await generateKey('aes', { length: 256 })
+ ).export()
+ const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
+ await super.sendStream(
+ this.#settings.dataEncryptionKeyBucketName,
+ dekPath,
+ Stream.Readable.from([dataEncryptionKey]),
+ {
+ // Do not overwrite any objects if already created
+ ifNoneMatch: '*',
+ ssecOptions: await this.#getCurrentKeyEncryptionKey(projectFolder),
+ contentLength: 32,
+ }
+ )
+ return new SSECOptions(dataEncryptionKey)
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async #getExistingDataEncryptionKeyOptions(bucketName, path) {
+ const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
+ let res
+ let kekIndex = 0
+ for (const rootKEK of await this.#availableKeyEncryptionKeysPromise) {
+ const ssecOptions = await rootKEK.forProject(projectFolder)
+ try {
+ res = await super.getObjectStream(
+ this.#settings.dataEncryptionKeyBucketName,
+ dekPath,
+ { ssecOptions }
+ )
+ break
+ } catch (err) {
+ if (isForbiddenError(err)) {
+ kekIndex++
+ continue
+ }
+ throw err
+ }
+ }
+ if (!res) throw new NoKEKMatchedError('no kek matched')
+ const buf = new WritableBuffer()
+ await Stream.promises.pipeline(res, buf)
+
+ if (kekIndex !== 0 && this.#settings.automaticallyRotateDEKEncryption) {
+ const ssecOptions = await this.#getCurrentKeyEncryptionKey(projectFolder)
+ try {
+ await super.sendStream(
+ this.#settings.dataEncryptionKeyBucketName,
+ dekPath,
+ Stream.Readable.from([buf.getContents()]),
+ { ssecOptions }
+ )
+ } catch (err) {
+ if (this.#settings.ignoreErrorsFromDEKReEncryption) {
+ logger.warn({ err, dekPath }, 'failed to persist re-encrypted DEK')
+ } else {
+ throw err
+ }
+ }
+ }
+
+ return new SSECOptions(buf.getContents())
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async #getDataEncryptionKeyOptions(bucketName, path) {
+ try {
+ return await this.#getExistingDataEncryptionKeyOptions(bucketName, path)
+ } catch (err) {
+ if (err instanceof NotFoundError) {
+ try {
+ return await this.#generateDataEncryptionKeyOptions(bucketName, path)
+ } catch (err2) {
+ if (err2 instanceof AlreadyWrittenError) {
+ // Concurrent initial write
+ return await this.#getExistingDataEncryptionKeyOptions(
+ bucketName,
+ path
+ )
+ }
+ throw err2
+ }
+ }
+ throw err
+ }
+ }
+
+ async sendStream(bucketName, path, sourceStream, opts = {}) {
+ const ssecOptions =
+ opts.ssecOptions ||
+ (await this.#getDataEncryptionKeyOptions(bucketName, path))
+ return await super.sendStream(bucketName, path, sourceStream, {
+ ...opts,
+ ssecOptions,
+ })
+ }
+
+ async getObjectStream(bucketName, path, opts = {}) {
+ const ssecOptions =
+ opts.ssecOptions ||
+ (await this.#getExistingDataEncryptionKeyOptions(bucketName, path))
+ return await super.getObjectStream(bucketName, path, {
+ ...opts,
+ ssecOptions,
+ })
+ }
+
+ async getObjectSize(bucketName, path, opts = {}) {
+ const ssecOptions =
+ opts.ssecOptions ||
+ (await this.#getExistingDataEncryptionKeyOptions(bucketName, path))
+ return await super.getObjectSize(bucketName, path, { ...opts, ssecOptions })
+ }
+
+ async getObjectStorageClass(bucketName, path, opts = {}) {
+ const ssecOptions =
+ opts.ssecOptions ||
+ (await this.#getExistingDataEncryptionKeyOptions(bucketName, path))
+ return await super.getObjectStorageClass(bucketName, path, {
+ ...opts,
+ ssecOptions,
+ })
+ }
+
+ async directorySize(bucketName, path, continuationToken) {
+ // Note: Listing a bucket does not require SSE-C credentials.
+ return await super.directorySize(bucketName, path, continuationToken)
+ }
+
+ async deleteDirectory(bucketName, path, continuationToken) {
+ // Let [Settings.pathToProjectFolder] validate the project path before deleting things.
+ const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
+ // Note: Listing/Deleting a prefix does not require SSE-C credentials.
+ await super.deleteDirectory(bucketName, path, continuationToken)
+ if (projectFolder === path) {
+ await super.deleteObject(
+ this.#settings.dataEncryptionKeyBucketName,
+ dekPath
+ )
+ }
+ }
+
+ async getObjectMd5Hash(bucketName, path, opts = {}) {
+ // The ETag in object metadata is not the MD5 content hash, skip the HEAD request.
+ opts = { ...opts, etagIsNotMD5: true }
+ return await super.getObjectMd5Hash(bucketName, path, opts)
+ }
+
+ async copyObject(bucketName, sourcePath, destinationPath, opts = {}) {
+ const ssecOptions =
+ opts.ssecOptions ||
+ (await this.#getDataEncryptionKeyOptions(bucketName, destinationPath))
+ const ssecSrcOptions =
+ opts.ssecSrcOptions ||
+ (await this.#getExistingDataEncryptionKeyOptions(bucketName, sourcePath))
+ return await super.copyObject(bucketName, sourcePath, destinationPath, {
+ ...opts,
+ ssecOptions,
+ ssecSrcOptions,
+ })
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async getRedirectUrl(bucketName, path) {
+ throw new NotImplementedError('signed links are not supported with SSE-C')
+ }
+}
+
+/**
+ * Helper class for batch updates to avoid repeated fetching of the project path.
+ *
+ * A general "cache" for project keys is another alternative. For now, use a helper class.
+ */
+class CachedPerProjectEncryptedS3Persistor {
+ /** @type SSECOptions */
+ #projectKeyOptions
+ /** @type PerProjectEncryptedS3Persistor */
+ #parent
+
+ /**
+ * @param {PerProjectEncryptedS3Persistor} parent
+ * @param {SSECOptions} projectKeyOptions
+ */
+ constructor(parent, projectKeyOptions) {
+ this.#parent = parent
+ this.#projectKeyOptions = projectKeyOptions
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @param {string} fsPath
+ */
+ async sendFile(bucketName, path, fsPath) {
+ return await this.sendStream(bucketName, path, fs.createReadStream(fsPath))
+ }
+
+ /**
+ *
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async getObjectSize(bucketName, path) {
+ return await this.#parent.getObjectSize(bucketName, path)
+ }
+
+ /**
+ *
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {Promise}
+ */
+ async listDirectory(bucketName, path) {
+ return await this.#parent.listDirectory(bucketName, path)
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @param {NodeJS.ReadableStream} sourceStream
+ * @param {Object} opts
+ * @param {string} [opts.contentType]
+ * @param {string} [opts.contentEncoding]
+ * @param {number} [opts.contentLength]
+ * @param {'*'} [opts.ifNoneMatch]
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @param {string} [opts.sourceMd5]
+ * @return {Promise}
+ */
+ async sendStream(bucketName, path, sourceStream, opts = {}) {
+ return await this.#parent.sendStream(bucketName, path, sourceStream, {
+ ...opts,
+ ssecOptions: this.#projectKeyOptions,
+ })
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} path
+ * @param {Object} opts
+ * @param {number} [opts.start]
+ * @param {number} [opts.end]
+ * @param {boolean} [opts.autoGunzip]
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async getObjectStream(bucketName, path, opts = {}) {
+ return await this.#parent.getObjectStream(bucketName, path, {
+ ...opts,
+ ssecOptions: this.#projectKeyOptions,
+ })
+ }
+}
+
+module.exports = {
+ PerProjectEncryptedS3Persistor,
+ CachedPerProjectEncryptedS3Persistor,
+ RootKeyEncryptionKey,
+}
diff --git a/libraries/object-persistor/src/PersistorFactory.js b/libraries/object-persistor/src/PersistorFactory.js
index 7923f9c06c..3f11507503 100644
--- a/libraries/object-persistor/src/PersistorFactory.js
+++ b/libraries/object-persistor/src/PersistorFactory.js
@@ -1,15 +1,20 @@
const Logger = require('@overleaf/logger')
const { SettingsError } = require('./Errors')
const GcsPersistor = require('./GcsPersistor')
-const S3Persistor = require('./S3Persistor')
+const { S3Persistor } = require('./S3Persistor')
const FSPersistor = require('./FSPersistor')
const MigrationPersistor = require('./MigrationPersistor')
+const {
+ PerProjectEncryptedS3Persistor,
+} = require('./PerProjectEncryptedS3Persistor')
function getPersistor(backend, settings) {
switch (backend) {
case 'aws-sdk':
case 's3':
return new S3Persistor(settings.s3)
+ case 's3SSEC':
+ return new PerProjectEncryptedS3Persistor(settings.s3SSEC)
case 'fs':
return new FSPersistor({
useSubdirectories: settings.useSubdirectories,
diff --git a/libraries/object-persistor/src/PersistorHelper.js b/libraries/object-persistor/src/PersistorHelper.js
index ac34b768cb..ad0a705d68 100644
--- a/libraries/object-persistor/src/PersistorHelper.js
+++ b/libraries/object-persistor/src/PersistorHelper.js
@@ -1,9 +1,9 @@
-const Crypto = require('crypto')
-const Stream = require('stream')
-const { pipeline } = require('stream/promises')
+const Crypto = require('node:crypto')
+const Stream = require('node:stream')
+const { pipeline } = require('node:stream/promises')
const Logger = require('@overleaf/logger')
const Metrics = require('@overleaf/metrics')
-const { WriteError, NotFoundError } = require('./Errors')
+const { WriteError, NotFoundError, AlreadyWrittenError } = require('./Errors')
const _128KiB = 128 * 1024
const TIMING_BUCKETS = [
@@ -26,12 +26,14 @@ const SIZE_BUCKETS = [
*/
class ObserverStream extends Stream.Transform {
/**
- * @param {string} metric prefix for metrics
- * @param {string} bucket name of source/target bucket
- * @param {string} hash optional hash algorithm, e.g. 'md5'
+ * @param {Object} opts
+ * @param {string} opts.metric prefix for metrics
+ * @param {string} opts.bucket name of source/target bucket
+ * @param {string} [opts.hash] optional hash algorithm, e.g. 'md5'
*/
- constructor({ metric, bucket, hash = '' }) {
+ constructor(opts) {
super({ autoDestroy: true })
+ const { metric, bucket, hash = '' } = opts
this.bytes = 0
this.start = performance.now()
@@ -138,6 +140,10 @@ async function verifyMd5(persistor, bucket, key, sourceMd5, destMd5 = null) {
}
function wrapError(error, message, params, ErrorType) {
+ params = {
+ ...params,
+ cause: error,
+ }
if (
error instanceof NotFoundError ||
['NoSuchKey', 'NotFound', 404, 'AccessDenied', 'ENOENT'].includes(
@@ -146,6 +152,13 @@ function wrapError(error, message, params, ErrorType) {
(error.response && error.response.statusCode === 404)
) {
return new NotFoundError('no such file', params, error)
+ } else if (
+ params.ifNoneMatch === '*' &&
+ (error.code === 'PreconditionFailed' ||
+ error.response?.statusCode === 412 ||
+ error instanceof AlreadyWrittenError)
+ ) {
+ return new AlreadyWrittenError(message, params, error)
} else {
return new ErrorType(message, params, error)
}
diff --git a/libraries/object-persistor/src/S3Persistor.js b/libraries/object-persistor/src/S3Persistor.js
index 8df65d80f0..1849838ba4 100644
--- a/libraries/object-persistor/src/S3Persistor.js
+++ b/libraries/object-persistor/src/S3Persistor.js
@@ -1,5 +1,6 @@
-const http = require('http')
-const https = require('https')
+// @ts-check
+const http = require('node:http')
+const https = require('node:https')
if (http.globalAgent.maxSockets < 300) {
http.globalAgent.maxSockets = 300
}
@@ -7,27 +8,104 @@ if (https.globalAgent.maxSockets < 300) {
https.globalAgent.maxSockets = 300
}
+const Crypto = require('node:crypto')
const Metrics = require('@overleaf/metrics')
const AbstractPersistor = require('./AbstractPersistor')
const PersistorHelper = require('./PersistorHelper')
-const { pipeline, PassThrough } = require('stream')
-const fs = require('fs')
+const { pipeline, PassThrough } = require('node:stream')
+const fs = require('node:fs')
const S3 = require('aws-sdk/clients/s3')
-const { URL } = require('url')
+const { URL } = require('node:url')
const { WriteError, ReadError, NotFoundError } = require('./Errors')
+const zlib = require('node:zlib')
+
+/**
+ * @typedef {import('aws-sdk/clients/s3').ListObjectsV2Output} ListObjectsV2Output
+ */
+
+/**
+ * @typedef {import('aws-sdk/clients/s3').Object} S3Object
+ */
+
+/**
+ * @typedef {import('./types').ListDirectoryResult} ListDirectoryResult
+ */
+
+/**
+ * Wrapper with private fields to avoid revealing them on console, JSON.stringify or similar.
+ */
+class SSECOptions {
+ #keyAsBuffer
+ #keyMD5
+
+ /**
+ * @param {Buffer} keyAsBuffer
+ */
+ constructor(keyAsBuffer) {
+ this.#keyAsBuffer = keyAsBuffer
+ this.#keyMD5 = Crypto.createHash('md5').update(keyAsBuffer).digest('base64')
+ }
+
+ getPutOptions() {
+ return {
+ SSECustomerKey: this.#keyAsBuffer,
+ SSECustomerKeyMD5: this.#keyMD5,
+ SSECustomerAlgorithm: 'AES256',
+ }
+ }
+
+ getGetOptions() {
+ return {
+ SSECustomerKey: this.#keyAsBuffer,
+ SSECustomerKeyMD5: this.#keyMD5,
+ SSECustomerAlgorithm: 'AES256',
+ }
+ }
+
+ getCopyOptions() {
+ return {
+ CopySourceSSECustomerKey: this.#keyAsBuffer,
+ CopySourceSSECustomerKeyMD5: this.#keyMD5,
+ CopySourceSSECustomerAlgorithm: 'AES256',
+ }
+ }
+}
+
+class S3Persistor extends AbstractPersistor {
+ /** @type {Map} */
+ #clients = new Map()
-module.exports = class S3Persistor extends AbstractPersistor {
constructor(settings = {}) {
super()
+ settings.storageClass = settings.storageClass || {}
this.settings = settings
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {string} fsPath
+ * @return {Promise}
+ */
async sendFile(bucketName, key, fsPath) {
- return await this.sendStream(bucketName, key, fs.createReadStream(fsPath))
+ await this.sendStream(bucketName, key, fs.createReadStream(fsPath))
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {NodeJS.ReadableStream} readStream
+ * @param {Object} opts
+ * @param {string} [opts.contentType]
+ * @param {string} [opts.contentEncoding]
+ * @param {number} [opts.contentLength]
+ * @param {'*'} [opts.ifNoneMatch]
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @param {string} [opts.sourceMd5]
+ * @return {Promise}
+ */
async sendStream(bucketName, key, readStream, opts = {}) {
try {
const observeOptions = {
@@ -39,42 +117,71 @@ module.exports = class S3Persistor extends AbstractPersistor {
// observer will catch errors, clean up and log a warning
pipeline(readStream, observer, () => {})
- // if we have an md5 hash, pass this to S3 to verify the upload
+ /** @type {S3.PutObjectRequest} */
const uploadOptions = {
Bucket: bucketName,
Key: key,
Body: observer,
}
+ if (this.settings.storageClass[bucketName]) {
+ uploadOptions.StorageClass = this.settings.storageClass[bucketName]
+ }
+
if (opts.contentType) {
uploadOptions.ContentType = opts.contentType
}
if (opts.contentEncoding) {
uploadOptions.ContentEncoding = opts.contentEncoding
}
+ if (opts.contentLength) {
+ uploadOptions.ContentLength = opts.contentLength
+ }
+ if (opts.ifNoneMatch === '*') {
+ uploadOptions.IfNoneMatch = '*'
+ }
+ if (opts.ssecOptions) {
+ Object.assign(uploadOptions, opts.ssecOptions.getPutOptions())
+ }
// if we have an md5 hash, pass this to S3 to verify the upload - otherwise
// we rely on the S3 client's checksum calculation to validate the upload
- const clientOptions = {}
+ let computeChecksums = false
if (opts.sourceMd5) {
uploadOptions.ContentMD5 = PersistorHelper.hexToBase64(opts.sourceMd5)
} else {
- clientOptions.computeChecksums = true
+ computeChecksums = true
}
- await this._getClientForBucket(bucketName, clientOptions)
- .upload(uploadOptions, { partSize: this.settings.partSize })
- .promise()
+ if (this.settings.disableMultiPartUpload) {
+ await this._getClientForBucket(bucketName, computeChecksums)
+ .putObject(uploadOptions)
+ .promise()
+ } else {
+ await this._getClientForBucket(bucketName, computeChecksums)
+ .upload(uploadOptions, { partSize: this.settings.partSize })
+ .promise()
+ }
} catch (err) {
throw PersistorHelper.wrapError(
err,
'upload to S3 failed',
- { bucketName, key },
+ { bucketName, key, ifNoneMatch: opts.ifNoneMatch },
WriteError
)
}
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} [opts]
+ * @param {number} [opts.start]
+ * @param {number} [opts.end]
+ * @param {boolean} [opts.autoGunzip]
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
async getObjectStream(bucketName, key, opts) {
opts = opts || {}
@@ -85,6 +192,9 @@ module.exports = class S3Persistor extends AbstractPersistor {
if (opts.start != null && opts.end != null) {
params.Range = `bytes=${opts.start}-${opts.end}`
}
+ if (opts.ssecOptions) {
+ Object.assign(params, opts.ssecOptions.getGetOptions())
+ }
const observer = new PersistorHelper.ObserverStream({
metric: 's3.ingress', // ingress from S3 to us
bucket: bucketName,
@@ -93,18 +203,21 @@ module.exports = class S3Persistor extends AbstractPersistor {
const req = this._getClientForBucket(bucketName).getObject(params)
const stream = req.createReadStream()
+ let contentEncoding
try {
await new Promise((resolve, reject) => {
- req.on('httpHeaders', statusCode => {
+ req.on('httpHeaders', (statusCode, headers) => {
switch (statusCode) {
case 200: // full response
case 206: // partial response
- return resolve()
- case 403: // AccessDenied is handled the same as NoSuchKey
+ contentEncoding = headers['content-encoding']
+ return resolve(undefined)
+ case 403: // AccessDenied
+ return // handled by stream.on('error') handler below
case 404: // NoSuchKey
- return reject(new NotFoundError())
+ return reject(new NotFoundError('not found'))
default:
- return reject(new Error('non success status: ' + statusCode))
+ // handled by stream.on('error') handler below
}
})
// The AWS SDK is forwarding any errors from the request to the stream.
@@ -122,23 +235,32 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
// Return a PassThrough stream with a minimal interface. It will buffer until the caller starts reading. It will emit errors from the source stream (Stream.pipeline passes errors along).
const pass = new PassThrough()
- pipeline(stream, observer, pass, err => {
+ const transformer = []
+ if (contentEncoding === 'gzip' && opts.autoGunzip) {
+ transformer.push(zlib.createGunzip())
+ }
+ pipeline(stream, observer, ...transformer, pass, err => {
if (err) req.abort()
})
return pass
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @return {Promise}
+ */
async getRedirectUrl(bucketName, key) {
const expiresSeconds = Math.round(this.settings.signedUrlExpiryInMs / 1000)
try {
- const url = await this._getClientForBucket(
- bucketName
- ).getSignedUrlPromise('getObject', {
- Bucket: bucketName,
- Key: key,
- Expires: expiresSeconds,
- })
- return url
+ return await this._getClientForBucket(bucketName).getSignedUrlPromise(
+ 'getObject',
+ {
+ Bucket: bucketName,
+ Key: key,
+ Expires: expiresSeconds,
+ }
+ )
} catch (err) {
throw PersistorHelper.wrapError(
err,
@@ -149,28 +271,20 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {string} [continuationToken]
+ * @return {Promise}
+ */
async deleteDirectory(bucketName, key, continuationToken) {
- let response
- const options = { Bucket: bucketName, Prefix: key }
- if (continuationToken) {
- options.ContinuationToken = continuationToken
- }
-
- try {
- response = await this._getClientForBucket(bucketName)
- .listObjectsV2(options)
- .promise()
- } catch (err) {
- throw PersistorHelper.wrapError(
- err,
- 'failed to list objects in S3',
- { bucketName, key },
- ReadError
- )
- }
-
- const objects = response.Contents.map(item => ({ Key: item.Key }))
- if (objects.length) {
+ const { contents, response } = await this.listDirectory(
+ bucketName,
+ key,
+ continuationToken
+ )
+ const objects = contents.map(item => ({ Key: item.Key || '' }))
+ if (objects?.length) {
try {
await this._getClientForBucket(bucketName)
.deleteObjects({
@@ -200,12 +314,52 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
- async getObjectSize(bucketName, key) {
+ /**
+ *
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {string} [continuationToken]
+ * @return {Promise}
+ */
+ async listDirectory(bucketName, key, continuationToken) {
+ let response
+ const options = { Bucket: bucketName, Prefix: key }
+ if (continuationToken) {
+ options.ContinuationToken = continuationToken
+ }
+
try {
- const response = await this._getClientForBucket(bucketName)
- .headObject({ Bucket: bucketName, Key: key })
+ response = await this._getClientForBucket(bucketName)
+ .listObjectsV2(options)
+ .promise()
+ } catch (err) {
+ throw PersistorHelper.wrapError(
+ err,
+ 'failed to list objects in S3',
+ { bucketName, key },
+ ReadError
+ )
+ }
+
+ return { contents: response.Contents ?? [], response }
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async #headObject(bucketName, key, opts = {}) {
+ const params = { Bucket: bucketName, Key: key }
+ if (opts.ssecOptions) {
+ Object.assign(params, opts.ssecOptions.getGetOptions())
+ }
+ try {
+ return await this._getClientForBucket(bucketName)
+ .headObject(params)
.promise()
- return response.ContentLength
} catch (err) {
throw PersistorHelper.wrapError(
err,
@@ -216,19 +370,51 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
- async getObjectMd5Hash(bucketName, key) {
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async getObjectSize(bucketName, key, opts = {}) {
+ const response = await this.#headObject(bucketName, key, opts)
+ return response.ContentLength || 0
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async getObjectStorageClass(bucketName, key, opts = {}) {
+ const response = await this.#headObject(bucketName, key, opts)
+ return response.StorageClass
+ }
+
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @param {boolean} [opts.etagIsNotMD5]
+ * @return {Promise}
+ */
+ async getObjectMd5Hash(bucketName, key, opts = {}) {
try {
- const response = await this._getClientForBucket(bucketName)
- .headObject({ Bucket: bucketName, Key: key })
- .promise()
- const md5 = S3Persistor._md5FromResponse(response)
- if (md5) {
- return md5
+ if (!opts.etagIsNotMD5) {
+ const response = await this.#headObject(bucketName, key, opts)
+ const md5 = S3Persistor._md5FromResponse(response)
+ if (md5) {
+ return md5
+ }
}
// etag is not in md5 format
Metrics.inc('s3.md5Download')
return await PersistorHelper.calculateStreamMd5(
- await this.getObjectStream(bucketName, key)
+ await this.getObjectStream(bucketName, key, opts)
)
} catch (err) {
throw PersistorHelper.wrapError(
@@ -240,6 +426,11 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @return {Promise}
+ */
async deleteObject(bucketName, key) {
try {
await this._getClientForBucket(bucketName)
@@ -256,12 +447,27 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
- async copyObject(bucketName, sourceKey, destKey) {
+ /**
+ * @param {string} bucketName
+ * @param {string} sourceKey
+ * @param {string} destKey
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecSrcOptions]
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async copyObject(bucketName, sourceKey, destKey, opts = {}) {
const params = {
Bucket: bucketName,
Key: destKey,
CopySource: `${bucketName}/${sourceKey}`,
}
+ if (opts.ssecSrcOptions) {
+ Object.assign(params, opts.ssecSrcOptions.getCopyOptions())
+ }
+ if (opts.ssecOptions) {
+ Object.assign(params, opts.ssecOptions.getPutOptions())
+ }
try {
await this._getClientForBucket(bucketName).copyObject(params).promise()
} catch (err) {
@@ -274,9 +480,16 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
- async checkIfObjectExists(bucketName, key) {
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {Object} opts
+ * @param {SSECOptions} [opts.ssecOptions]
+ * @return {Promise}
+ */
+ async checkIfObjectExists(bucketName, key, opts) {
try {
- await this.getObjectSize(bucketName, key)
+ await this.getObjectSize(bucketName, key, opts)
return true
} catch (err) {
if (err instanceof NotFoundError) {
@@ -291,6 +504,12 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
+ /**
+ * @param {string} bucketName
+ * @param {string} key
+ * @param {string} [continuationToken]
+ * @return {Promise}
+ */
async directorySize(bucketName, key, continuationToken) {
try {
const options = {
@@ -304,7 +523,8 @@ module.exports = class S3Persistor extends AbstractPersistor {
.listObjectsV2(options)
.promise()
- const size = response.Contents.reduce((acc, item) => item.Size + acc, 0)
+ const size =
+ response.Contents?.reduce((acc, item) => (item.Size || 0) + acc, 0) || 0
if (response.IsTruncated) {
return (
size +
@@ -326,15 +546,38 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
- _getClientForBucket(bucket, clientOptions) {
- return new S3(
- this._buildClientOptions(
- this.settings.bucketCreds?.[bucket],
- clientOptions
+ /**
+ * @param {string} bucket
+ * @param {boolean} computeChecksums
+ * @return {S3}
+ * @private
+ */
+ _getClientForBucket(bucket, computeChecksums = false) {
+ /** @type {S3.Types.ClientConfiguration} */
+ const clientOptions = {}
+ const cacheKey = `${bucket}:${computeChecksums}`
+ if (computeChecksums) {
+ clientOptions.computeChecksums = true
+ }
+ let client = this.#clients.get(cacheKey)
+ if (!client) {
+ client = new S3(
+ this._buildClientOptions(
+ this.settings.bucketCreds?.[bucket],
+ clientOptions
+ )
)
- )
+ this.#clients.set(cacheKey, client)
+ }
+ return client
}
+ /**
+ * @param {Object} bucketCredentials
+ * @param {S3.Types.ClientConfiguration} clientOptions
+ * @return {S3.Types.ClientConfiguration}
+ * @private
+ */
_buildClientOptions(bucketCredentials, clientOptions) {
const options = clientOptions || {}
@@ -356,7 +599,7 @@ module.exports = class S3Persistor extends AbstractPersistor {
if (this.settings.endpoint) {
const endpoint = new URL(this.settings.endpoint)
options.endpoint = this.settings.endpoint
- options.sslEnabled = endpoint.protocol === 'https'
+ options.sslEnabled = endpoint.protocol === 'https:'
}
// path-style access is only used for acceptance tests
@@ -370,9 +613,22 @@ module.exports = class S3Persistor extends AbstractPersistor {
}
}
+ if (options.sslEnabled && this.settings.ca && !options.httpOptions?.agent) {
+ options.httpOptions = options.httpOptions || {}
+ options.httpOptions.agent = new https.Agent({
+ rejectUnauthorized: true,
+ ca: this.settings.ca,
+ })
+ }
+
return options
}
+ /**
+ * @param {S3.HeadObjectOutput} response
+ * @return {string|null}
+ * @private
+ */
static _md5FromResponse(response) {
const md5 = (response.ETag || '').replace(/[ "]/g, '')
if (!md5.match(/^[a-f0-9]{32}$/)) {
@@ -382,3 +638,8 @@ module.exports = class S3Persistor extends AbstractPersistor {
return md5
}
}
+
+module.exports = {
+ S3Persistor,
+ SSECOptions,
+}
diff --git a/libraries/object-persistor/src/types.d.ts b/libraries/object-persistor/src/types.d.ts
new file mode 100644
index 0000000000..5640685a5f
--- /dev/null
+++ b/libraries/object-persistor/src/types.d.ts
@@ -0,0 +1,6 @@
+import type { ListObjectsV2Output, Object } from 'aws-sdk/clients/s3'
+
+export type ListDirectoryResult = {
+ contents: Array
+ response: ListObjectsV2Output
+}
diff --git a/libraries/object-persistor/test/Init.js b/libraries/object-persistor/test/Init.js
index 3fe772b36b..2721d2f7c5 100644
--- a/libraries/object-persistor/test/Init.js
+++ b/libraries/object-persistor/test/Init.js
@@ -25,4 +25,9 @@ SandboxedModule.configure({
},
},
globals: { Buffer, Math, console, process, URL },
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
diff --git a/libraries/object-persistor/test/unit/FSPersistorTests.js b/libraries/object-persistor/test/unit/FSPersistorTests.js
index 804de81849..dc7a5c50d7 100644
--- a/libraries/object-persistor/test/unit/FSPersistorTests.js
+++ b/libraries/object-persistor/test/unit/FSPersistorTests.js
@@ -1,10 +1,10 @@
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const { expect } = require('chai')
const mockFs = require('mock-fs')
-const fs = require('fs')
-const fsPromises = require('fs/promises')
-const Path = require('path')
-const StreamPromises = require('stream/promises')
+const fs = require('node:fs')
+const fsPromises = require('node:fs/promises')
+const Path = require('node:path')
+const StreamPromises = require('node:stream/promises')
const SandboxedModule = require('sandboxed-module')
const Errors = require('../../src/Errors')
diff --git a/libraries/object-persistor/test/unit/GcsPersistorTests.js b/libraries/object-persistor/test/unit/GcsPersistorTests.js
index 6a2b10f1e8..16a42c772c 100644
--- a/libraries/object-persistor/test/unit/GcsPersistorTests.js
+++ b/libraries/object-persistor/test/unit/GcsPersistorTests.js
@@ -1,4 +1,4 @@
-const { EventEmitter } = require('events')
+const { EventEmitter } = require('node:events')
const sinon = require('sinon')
const chai = require('chai')
const { expect } = chai
@@ -45,11 +45,11 @@ describe('GcsPersistorTests', function () {
files = [
{
- metadata: { size: 11, md5Hash: '/////wAAAAD/////AAAAAA==' },
+ metadata: { size: '11', md5Hash: '/////wAAAAD/////AAAAAA==' },
delete: sinon.stub(),
},
{
- metadata: { size: 22, md5Hash: '/////wAAAAD/////AAAAAA==' },
+ metadata: { size: '22', md5Hash: '/////wAAAAD/////AAAAAA==' },
delete: sinon.stub(),
},
]
@@ -63,7 +63,7 @@ describe('GcsPersistorTests', function () {
read() {
if (this.err) return this.emit('error', this.err)
- this.emit('response', { statusCode: this.statusCode })
+ this.emit('response', { statusCode: this.statusCode, headers: {} })
}
}
@@ -302,7 +302,7 @@ describe('GcsPersistorTests', function () {
})
it('should return the object size', function () {
- expect(size).to.equal(files[0].metadata.size)
+ expect(size).to.equal(11)
})
it('should pass the bucket and key to GCS', function () {
diff --git a/libraries/object-persistor/test/unit/PersistorFactoryTests.js b/libraries/object-persistor/test/unit/PersistorFactoryTests.js
index 0bbc6e67ce..7f71be89e5 100644
--- a/libraries/object-persistor/test/unit/PersistorFactoryTests.js
+++ b/libraries/object-persistor/test/unit/PersistorFactoryTests.js
@@ -1,7 +1,7 @@
const chai = require('chai')
const { expect } = chai
const SandboxedModule = require('sandboxed-module')
-const StreamPromises = require('stream/promises')
+const StreamPromises = require('node:stream/promises')
const MODULE_PATH = '../../src/PersistorFactory.js'
@@ -32,7 +32,7 @@ describe('PersistorManager', function () {
Settings = {}
const requires = {
'./GcsPersistor': GcsPersistor,
- './S3Persistor': S3Persistor,
+ './S3Persistor': { S3Persistor },
'./FSPersistor': FSPersistor,
'@overleaf/logger': {
info() {},
diff --git a/libraries/object-persistor/test/unit/S3PersistorTests.js b/libraries/object-persistor/test/unit/S3PersistorTests.js
index 7866247f23..822a4ac811 100644
--- a/libraries/object-persistor/test/unit/S3PersistorTests.js
+++ b/libraries/object-persistor/test/unit/S3PersistorTests.js
@@ -3,7 +3,7 @@ const chai = require('chai')
const { expect } = chai
const SandboxedModule = require('sandboxed-module')
const Errors = require('../../src/Errors')
-const { EventEmitter } = require('events')
+const { EventEmitter } = require('node:events')
const MODULE_PATH = '../../src/S3Persistor.js'
@@ -91,8 +91,22 @@ describe('S3PersistorTests', function () {
createReadStream() {
setTimeout(() => {
+ if (this.notFoundSSEC) {
+ // special case for AWS S3: 404 NoSuchKey wrapped in a 400. A single request received a single response, and multiple httpHeaders events are triggered. Don't ask.
+ this.emit('httpHeaders', 400, {})
+ this.emit('httpHeaders', 404, {})
+ ReadStream.emit('error', S3NotFoundError)
+ return
+ }
+
if (this.err) return ReadStream.emit('error', this.err)
- this.emit('httpHeaders', this.statusCode)
+ this.emit('httpHeaders', this.statusCode, {})
+ if (this.statusCode === 403) {
+ ReadStream.emit('error', S3AccessDeniedError)
+ }
+ if (this.statusCode === 404) {
+ ReadStream.emit('error', S3NotFoundError)
+ }
})
return ReadStream
}
@@ -133,7 +147,7 @@ describe('S3PersistorTests', function () {
deleteObjects: sinon.stub().returns(EmptyPromise),
getSignedUrlPromise: sinon.stub().resolves(redirectUrl),
}
- S3 = sinon.stub().returns(S3Client)
+ S3 = sinon.stub().callsFake(() => Object.assign({}, S3Client))
Hash = {
end: sinon.stub(),
@@ -159,7 +173,7 @@ describe('S3PersistorTests', function () {
crypto,
},
globals: { console, Buffer },
- }))(settings)
+ }).S3Persistor)(settings)
})
describe('getObjectStream', function () {
@@ -338,6 +352,34 @@ describe('S3PersistorTests', function () {
})
})
+ describe("when the file doesn't exist -- SSEC", function () {
+ let error, stream
+
+ beforeEach(async function () {
+ S3GetObjectRequest.notFoundSSEC = 404
+ try {
+ stream = await S3Persistor.getObjectStream(bucket, key)
+ } catch (err) {
+ error = err
+ }
+ })
+ it('does not return a stream', function () {
+ expect(stream).not.to.exist
+ })
+
+ it('throws a NotFoundError', function () {
+ expect(error).to.be.an.instanceOf(Errors.NotFoundError)
+ })
+
+ it('wraps the error', function () {
+ expect(error.cause).to.exist
+ })
+
+ it('stores the bucket and key in the error', function () {
+ expect(error.info).to.include({ bucketName: bucket, key })
+ })
+ })
+
describe('when access to the file is denied', function () {
let error, stream
@@ -359,7 +401,7 @@ describe('S3PersistorTests', function () {
})
it('wraps the error', function () {
- expect(error.cause).to.exist
+ expect(error.cause).to.equal(S3AccessDeniedError)
})
it('stores the bucket and key in the error', function () {
@@ -985,4 +1027,22 @@ describe('S3PersistorTests', function () {
})
})
})
+
+ describe('_getClientForBucket', function () {
+ it('should return same instance for same bucket', function () {
+ const a = S3Persistor._getClientForBucket('foo')
+ const b = S3Persistor._getClientForBucket('foo')
+ expect(a).to.equal(b)
+ })
+ it('should return different instance for different bucket', function () {
+ const a = S3Persistor._getClientForBucket('foo')
+ const b = S3Persistor._getClientForBucket('bar')
+ expect(a).to.not.equal(b)
+ })
+ it('should return different instance for same bucket different computeChecksums', function () {
+ const a = S3Persistor._getClientForBucket('foo', false)
+ const b = S3Persistor._getClientForBucket('foo', true)
+ expect(a).to.not.equal(b)
+ })
+ })
})
diff --git a/libraries/overleaf-editor-core/.dockerignore b/libraries/overleaf-editor-core/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/overleaf-editor-core/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/overleaf-editor-core/.gitignore b/libraries/overleaf-editor-core/.gitignore
deleted file mode 100644
index 869500a2c7..0000000000
--- a/libraries/overleaf-editor-core/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/coverage
-/node_modules
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/libraries/overleaf-editor-core/.nvmrc b/libraries/overleaf-editor-core/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/overleaf-editor-core/.nvmrc
+++ b/libraries/overleaf-editor-core/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/overleaf-editor-core/buildscript.txt b/libraries/overleaf-editor-core/buildscript.txt
index 3e55ea2ba6..c0391ca30a 100644
--- a/libraries/overleaf-editor-core/buildscript.txt
+++ b/libraries/overleaf-editor-core/buildscript.txt
@@ -1,10 +1,10 @@
overleaf-editor-core
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/overleaf-editor-core/index.js b/libraries/overleaf-editor-core/index.js
index df3548c2ed..33b3dcf5dc 100644
--- a/libraries/overleaf-editor-core/index.js
+++ b/libraries/overleaf-editor-core/index.js
@@ -18,6 +18,7 @@ const MoveFileOperation = require('./lib/operation/move_file_operation')
const SetCommentStateOperation = require('./lib/operation/set_comment_state_operation')
const EditFileOperation = require('./lib/operation/edit_file_operation')
const EditNoOperation = require('./lib/operation/edit_no_operation')
+const EditOperationTransformer = require('./lib/operation/edit_operation_transformer')
const SetFileMetadataOperation = require('./lib/operation/set_file_metadata_operation')
const NoOperation = require('./lib/operation/no_operation')
const Operation = require('./lib/operation')
@@ -43,6 +44,8 @@ const TrackingProps = require('./lib/file_data/tracking_props')
const Range = require('./lib/range')
const CommentList = require('./lib/file_data/comment_list')
const LazyStringFileData = require('./lib/file_data/lazy_string_file_data')
+const StringFileData = require('./lib/file_data/string_file_data')
+const EditOperationBuilder = require('./lib/operation/edit_operation_builder')
exports.AddCommentOperation = AddCommentOperation
exports.Author = Author
@@ -58,6 +61,7 @@ exports.DeleteCommentOperation = DeleteCommentOperation
exports.File = File
exports.FileMap = FileMap
exports.LazyStringFileData = LazyStringFileData
+exports.StringFileData = StringFileData
exports.History = History
exports.Label = Label
exports.AddFileOperation = AddFileOperation
@@ -65,6 +69,8 @@ exports.MoveFileOperation = MoveFileOperation
exports.SetCommentStateOperation = SetCommentStateOperation
exports.EditFileOperation = EditFileOperation
exports.EditNoOperation = EditNoOperation
+exports.EditOperationBuilder = EditOperationBuilder
+exports.EditOperationTransformer = EditOperationTransformer
exports.SetFileMetadataOperation = SetFileMetadataOperation
exports.NoOperation = NoOperation
exports.Operation = Operation
diff --git a/libraries/overleaf-editor-core/lib/blob.js b/libraries/overleaf-editor-core/lib/blob.js
index 8acd0b6dcd..7f1b7bb042 100644
--- a/libraries/overleaf-editor-core/lib/blob.js
+++ b/libraries/overleaf-editor-core/lib/blob.js
@@ -40,6 +40,11 @@ class Blob {
static NotFoundError = NotFoundError
+ /**
+ * @param {string} hash
+ * @param {number} byteLength
+ * @param {number} [stringLength]
+ */
constructor(hash, byteLength, stringLength) {
this.setHash(hash)
this.setByteLength(byteLength)
@@ -63,14 +68,14 @@ class Blob {
/**
* Hex hash.
- * @return {?String}
+ * @return {String}
*/
getHash() {
return this.hash
}
setHash(hash) {
- assert.maybe.match(hash, Blob.HEX_HASH_RX, 'bad hash')
+ assert.match(hash, Blob.HEX_HASH_RX, 'bad hash')
this.hash = hash
}
@@ -83,13 +88,13 @@ class Blob {
}
setByteLength(byteLength) {
- assert.maybe.integer(byteLength, 'bad byteLength')
+ assert.integer(byteLength, 'bad byteLength')
this.byteLength = byteLength
}
/**
* Utf-8 length of the blob content, if it appears to be valid UTF-8.
- * @return {?number}
+ * @return {number|undefined}
*/
getStringLength() {
return this.stringLength
diff --git a/libraries/overleaf-editor-core/lib/change.js b/libraries/overleaf-editor-core/lib/change.js
index 63b49265fb..cfc3447251 100644
--- a/libraries/overleaf-editor-core/lib/change.js
+++ b/libraries/overleaf-editor-core/lib/change.js
@@ -13,7 +13,7 @@ const V2DocVersions = require('./v2_doc_versions')
/**
* @import Author from "./author"
- * @import { BlobStore } from "./types"
+ * @import { BlobStore, RawChange, ReadonlyBlobStore } from "./types"
*/
/**
@@ -54,7 +54,7 @@ class Change {
/**
* For serialization.
*
- * @return {Object}
+ * @return {RawChange}
*/
toRaw() {
function toRaw(object) {
@@ -100,6 +100,9 @@ class Change {
)
}
+ /**
+ * @return {Operation[]}
+ */
getOperations() {
return this.operations
}
@@ -216,7 +219,7 @@ class Change {
* If this Change contains any File objects, load them.
*
* @param {string} kind see {File#load}
- * @param {BlobStore} blobStore
+ * @param {ReadonlyBlobStore} blobStore
* @return {Promise}
*/
async loadFiles(kind, blobStore) {
@@ -248,6 +251,24 @@ class Change {
* @param {boolean} [opts.strict] - Do not ignore recoverable errors
*/
applyTo(snapshot, opts = {}) {
+ // eslint-disable-next-line no-unused-vars
+ for (const operation of this.iterativelyApplyTo(snapshot, opts)) {
+ // Nothing to do: we're just consuming the iterator for the side effects
+ }
+ }
+
+ /**
+ * Generator that applies this change to a snapshot and yields each
+ * operation after it has been applied.
+ *
+ * Recoverable errors (caused by historical bad data) are ignored unless
+ * opts.strict is true
+ *
+ * @param {Snapshot} snapshot modified in place
+ * @param {object} opts
+ * @param {boolean} [opts.strict] - Do not ignore recoverable errors
+ */
+ *iterativelyApplyTo(snapshot, opts = {}) {
assert.object(snapshot, 'bad snapshot')
for (const operation of this.operations) {
@@ -261,6 +282,7 @@ class Change {
throw err
}
}
+ yield operation
}
// update project version if present in change
diff --git a/libraries/overleaf-editor-core/lib/change_note.js b/libraries/overleaf-editor-core/lib/change_note.js
index 94bd344130..37042953fd 100644
--- a/libraries/overleaf-editor-core/lib/change_note.js
+++ b/libraries/overleaf-editor-core/lib/change_note.js
@@ -10,7 +10,7 @@ const Change = require('./change')
class ChangeNote {
/**
* @param {number} baseVersion the new base version for the change
- * @param {?Change} change
+ * @param {Change} [change]
*/
constructor(baseVersion, change) {
assert.integer(baseVersion, 'bad baseVersion')
diff --git a/libraries/overleaf-editor-core/lib/file.js b/libraries/overleaf-editor-core/lib/file.js
index 2b7117eef3..b5321c39b2 100644
--- a/libraries/overleaf-editor-core/lib/file.js
+++ b/libraries/overleaf-editor-core/lib/file.js
@@ -95,7 +95,7 @@ class File {
/**
* @param {number} byteLength
- * @param {number?} stringLength
+ * @param {number} [stringLength]
* @param {Object} [metadata]
* @return {File}
*/
diff --git a/libraries/overleaf-editor-core/lib/file_data/clear_tracking_props.js b/libraries/overleaf-editor-core/lib/file_data/clear_tracking_props.js
index ba7f0bf00b..b3ddbab7d8 100644
--- a/libraries/overleaf-editor-core/lib/file_data/clear_tracking_props.js
+++ b/libraries/overleaf-editor-core/lib/file_data/clear_tracking_props.js
@@ -1,7 +1,7 @@
// @ts-check
/**
- * @import { ClearTrackingPropsRawData } from '../types'
+ * @import { ClearTrackingPropsRawData, TrackingDirective } from '../types'
*/
class ClearTrackingProps {
@@ -11,12 +11,27 @@ class ClearTrackingProps {
/**
* @param {any} other
- * @returns {boolean}
+ * @returns {other is ClearTrackingProps}
*/
equals(other) {
return other instanceof ClearTrackingProps
}
+ /**
+ * @param {TrackingDirective} other
+ * @returns {other is ClearTrackingProps}
+ */
+ canMergeWith(other) {
+ return other instanceof ClearTrackingProps
+ }
+
+ /**
+ * @param {TrackingDirective} other
+ */
+ mergeWith(other) {
+ return this
+ }
+
/**
* @returns {ClearTrackingPropsRawData}
*/
diff --git a/libraries/overleaf-editor-core/lib/file_data/index.js b/libraries/overleaf-editor-core/lib/file_data/index.js
index 0e6f50325f..a6ae574a26 100644
--- a/libraries/overleaf-editor-core/lib/file_data/index.js
+++ b/libraries/overleaf-editor-core/lib/file_data/index.js
@@ -47,7 +47,7 @@ class FileData {
/** @see File.createHollow
* @param {number} byteLength
- * @param {number|null} stringLength
+ * @param {number} [stringLength]
*/
static createHollow(byteLength, stringLength) {
if (stringLength == null) {
@@ -63,20 +63,14 @@ class FileData {
*/
static createLazyFromBlobs(blob, rangesBlob) {
assert.instance(blob, Blob, 'FileData: bad blob')
- if (blob.getStringLength() == null) {
- return new BinaryFileData(
- // TODO(das7pad): see call-sites
- // @ts-ignore
- blob.getHash(),
- blob.getByteLength()
- )
+ const stringLength = blob.getStringLength()
+ if (stringLength == null) {
+ return new BinaryFileData(blob.getHash(), blob.getByteLength())
}
return new LazyStringFileData(
- // TODO(das7pad): see call-sites
- // @ts-ignore
blob.getHash(),
rangesBlob?.getHash(),
- blob.getStringLength()
+ stringLength
)
}
diff --git a/libraries/overleaf-editor-core/lib/file_data/lazy_string_file_data.js b/libraries/overleaf-editor-core/lib/file_data/lazy_string_file_data.js
index bc11b3e98d..abc720d10c 100644
--- a/libraries/overleaf-editor-core/lib/file_data/lazy_string_file_data.js
+++ b/libraries/overleaf-editor-core/lib/file_data/lazy_string_file_data.js
@@ -11,7 +11,7 @@ const EditOperation = require('../operation/edit_operation')
const EditOperationBuilder = require('../operation/edit_operation_builder')
/**
- * @import { BlobStore, ReadonlyBlobStore, RangesBlob, RawFileData, RawLazyStringFileData } from '../types'
+ * @import { BlobStore, ReadonlyBlobStore, RangesBlob, RawHashFileData, RawLazyStringFileData } from '../types'
*/
class LazyStringFileData extends FileData {
@@ -159,11 +159,11 @@ class LazyStringFileData extends FileData {
/** @inheritdoc
* @param {BlobStore} blobStore
- * @return {Promise}
+ * @return {Promise}
*/
async store(blobStore) {
if (this.operations.length === 0) {
- /** @type RawFileData */
+ /** @type RawHashFileData */
const raw = { hash: this.hash }
if (this.rangesHash) {
raw.rangesHash = this.rangesHash
@@ -171,9 +171,11 @@ class LazyStringFileData extends FileData {
return raw
}
const eager = await this.toEager(blobStore)
+ const raw = await eager.store(blobStore)
+ this.hash = raw.hash
+ this.rangesHash = raw.rangesHash
this.operations.length = 0
- /** @type RawFileData */
- return await eager.store(blobStore)
+ return raw
}
}
diff --git a/libraries/overleaf-editor-core/lib/file_data/string_file_data.js b/libraries/overleaf-editor-core/lib/file_data/string_file_data.js
index 04d486b6b0..c78c1e0414 100644
--- a/libraries/overleaf-editor-core/lib/file_data/string_file_data.js
+++ b/libraries/overleaf-editor-core/lib/file_data/string_file_data.js
@@ -8,7 +8,7 @@ const CommentList = require('./comment_list')
const TrackedChangeList = require('./tracked_change_list')
/**
- * @import { StringFileRawData, RawFileData, BlobStore, CommentRawData } from "../types"
+ * @import { StringFileRawData, RawHashFileData, BlobStore, CommentRawData } from "../types"
* @import { TrackedChangeRawData, RangesBlob } from "../types"
* @import EditOperation from "../operation/edit_operation"
*/
@@ -88,6 +88,14 @@ class StringFileData extends FileData {
return content
}
+ /**
+ * Return docstore view of a doc: each line separated
+ * @return {string[]}
+ */
+ getLines() {
+ return this.getContent({ filterTrackedDeletes: true }).split('\n')
+ }
+
/** @inheritdoc */
getByteLength() {
return Buffer.byteLength(this.content)
@@ -131,7 +139,7 @@ class StringFileData extends FileData {
/**
* @inheritdoc
* @param {BlobStore} blobStore
- * @return {Promise}
+ * @return {Promise}
*/
async store(blobStore) {
const blob = await blobStore.putString(this.content)
@@ -142,12 +150,8 @@ class StringFileData extends FileData {
trackedChanges: this.trackedChanges.toRaw(),
}
const rangesBlob = await blobStore.putObject(ranges)
- // TODO(das7pad): Provide interface that guarantees hash exists?
- // @ts-ignore
return { hash: blob.getHash(), rangesHash: rangesBlob.getHash() }
}
- // TODO(das7pad): Provide interface that guarantees hash exists?
- // @ts-ignore
return { hash: blob.getHash() }
}
}
diff --git a/libraries/overleaf-editor-core/lib/file_data/tracked_change.js b/libraries/overleaf-editor-core/lib/file_data/tracked_change.js
index d0e6517d0f..e789a427b0 100644
--- a/libraries/overleaf-editor-core/lib/file_data/tracked_change.js
+++ b/libraries/overleaf-editor-core/lib/file_data/tracked_change.js
@@ -84,6 +84,21 @@ class TrackedChange {
)
)
}
+
+ /**
+ * Return an equivalent tracked change whose extent is limited to the given
+ * range
+ *
+ * @param {Range} range
+ * @returns {TrackedChange | null} - the result or null if the intersection is empty
+ */
+ intersectRange(range) {
+ const intersection = this.range.intersect(range)
+ if (intersection == null) {
+ return null
+ }
+ return new TrackedChange(intersection, this.tracking)
+ }
}
module.exports = TrackedChange
diff --git a/libraries/overleaf-editor-core/lib/file_data/tracked_change_list.js b/libraries/overleaf-editor-core/lib/file_data/tracked_change_list.js
index 263b37ab50..b302865c70 100644
--- a/libraries/overleaf-editor-core/lib/file_data/tracked_change_list.js
+++ b/libraries/overleaf-editor-core/lib/file_data/tracked_change_list.js
@@ -2,9 +2,11 @@
const Range = require('../range')
const TrackedChange = require('./tracked_change')
const TrackingProps = require('../file_data/tracking_props')
+const { InsertOp, RemoveOp, RetainOp } = require('../operation/scan_op')
/**
* @import { TrackingDirective, TrackedChangeRawData } from "../types"
+ * @import TextOperation from "../operation/text_operation"
*/
class TrackedChangeList {
@@ -58,6 +60,22 @@ class TrackedChangeList {
return this._trackedChanges.filter(change => range.contains(change.range))
}
+ /**
+ * Returns tracked changes that overlap with the given range
+ * @param {Range} range
+ * @returns {TrackedChange[]}
+ */
+ intersectRange(range) {
+ const changes = []
+ for (const change of this._trackedChanges) {
+ const intersection = change.intersectRange(range)
+ if (intersection != null) {
+ changes.push(intersection)
+ }
+ }
+ return changes
+ }
+
/**
* Returns the tracking props for a given range.
* @param {Range} range
@@ -89,6 +107,8 @@ class TrackedChangeList {
/**
* Collapses consecutive (and compatible) ranges
+ *
+ * @private
* @returns {void}
*/
_mergeRanges() {
@@ -117,12 +137,28 @@ class TrackedChangeList {
}
/**
+ * Apply an insert operation
*
* @param {number} cursor
* @param {string} insertedText
* @param {{tracking?: TrackingProps}} opts
*/
applyInsert(cursor, insertedText, opts = {}) {
+ this._applyInsert(cursor, insertedText, opts)
+ this._mergeRanges()
+ }
+
+ /**
+ * Apply an insert operation
+ *
+ * This method will not merge ranges at the end
+ *
+ * @private
+ * @param {number} cursor
+ * @param {string} insertedText
+ * @param {{tracking?: TrackingProps}} [opts]
+ */
+ _applyInsert(cursor, insertedText, opts = {}) {
const newTrackedChanges = []
for (const trackedChange of this._trackedChanges) {
if (
@@ -171,15 +207,29 @@ class TrackedChangeList {
newTrackedChanges.push(newTrackedChange)
}
this._trackedChanges = newTrackedChanges
- this._mergeRanges()
}
/**
+ * Apply a delete operation to the list of tracked changes
*
* @param {number} cursor
* @param {number} length
*/
applyDelete(cursor, length) {
+ this._applyDelete(cursor, length)
+ this._mergeRanges()
+ }
+
+ /**
+ * Apply a delete operation to the list of tracked changes
+ *
+ * This method will not merge ranges at the end
+ *
+ * @private
+ * @param {number} cursor
+ * @param {number} length
+ */
+ _applyDelete(cursor, length) {
const newTrackedChanges = []
for (const trackedChange of this._trackedChanges) {
const deletedRange = new Range(cursor, length)
@@ -205,15 +255,31 @@ class TrackedChangeList {
}
}
this._trackedChanges = newTrackedChanges
+ }
+
+ /**
+ * Apply a retain operation to the list of tracked changes
+ *
+ * @param {number} cursor
+ * @param {number} length
+ * @param {{tracking?: TrackingDirective}} [opts]
+ */
+ applyRetain(cursor, length, opts = {}) {
+ this._applyRetain(cursor, length, opts)
this._mergeRanges()
}
/**
+ * Apply a retain operation to the list of tracked changes
+ *
+ * This method will not merge ranges at the end
+ *
+ * @private
* @param {number} cursor
* @param {number} length
* @param {{tracking?: TrackingDirective}} opts
*/
- applyRetain(cursor, length, opts = {}) {
+ _applyRetain(cursor, length, opts = {}) {
// If there's no tracking info, leave everything as-is
if (!opts.tracking) {
return
@@ -269,6 +335,31 @@ class TrackedChangeList {
newTrackedChanges.push(newTrackedChange)
}
this._trackedChanges = newTrackedChanges
+ }
+
+ /**
+ * Apply a text operation to the list of tracked changes
+ *
+ * Ranges are merged only once at the end, for performance and to avoid
+ * problematic edge cases where intermediate ranges get incorrectly merged.
+ *
+ * @param {TextOperation} operation
+ */
+ applyTextOperation(operation) {
+ // this cursor tracks the destination document that gets modified as
+ // operations are applied to it.
+ let cursor = 0
+ for (const op of operation.ops) {
+ if (op instanceof InsertOp) {
+ this._applyInsert(cursor, op.insertion, { tracking: op.tracking })
+ cursor += op.insertion.length
+ } else if (op instanceof RemoveOp) {
+ this._applyDelete(cursor, op.length)
+ } else if (op instanceof RetainOp) {
+ this._applyRetain(cursor, op.length, { tracking: op.tracking })
+ cursor += op.length
+ }
+ }
this._mergeRanges()
}
}
diff --git a/libraries/overleaf-editor-core/lib/file_data/tracking_props.js b/libraries/overleaf-editor-core/lib/file_data/tracking_props.js
index 75ec95c566..82d731a232 100644
--- a/libraries/overleaf-editor-core/lib/file_data/tracking_props.js
+++ b/libraries/overleaf-editor-core/lib/file_data/tracking_props.js
@@ -62,6 +62,35 @@ class TrackingProps {
this.ts.getTime() === other.ts.getTime()
)
}
+
+ /**
+ * Are these tracking props compatible with the other tracking props for merging
+ * ranges?
+ *
+ * @param {TrackingDirective} other
+ * @returns {other is TrackingProps}
+ */
+ canMergeWith(other) {
+ if (!(other instanceof TrackingProps)) {
+ return false
+ }
+ return this.type === other.type && this.userId === other.userId
+ }
+
+ /**
+ * Merge two tracking props
+ *
+ * Assumes that `canMerge(other)` returns true
+ *
+ * @param {TrackingDirective} other
+ */
+ mergeWith(other) {
+ if (!this.canMergeWith(other)) {
+ throw new Error('Cannot merge with incompatible tracking props')
+ }
+ const ts = this.ts <= other.ts ? this.ts : other.ts
+ return new TrackingProps(this.type, this.userId, ts)
+ }
}
module.exports = TrackingProps
diff --git a/libraries/overleaf-editor-core/lib/file_map.js b/libraries/overleaf-editor-core/lib/file_map.js
index 328b7539d2..4412319ae3 100644
--- a/libraries/overleaf-editor-core/lib/file_map.js
+++ b/libraries/overleaf-editor-core/lib/file_map.js
@@ -22,7 +22,7 @@ class NonUniquePathnameError extends PathnameError {
* @param {string[]} pathnames
*/
constructor(pathnames) {
- super('pathnames are not unique: ' + pathnames, { pathnames })
+ super('pathnames are not unique', { pathnames })
this.pathnames = pathnames
}
}
@@ -30,9 +30,13 @@ class NonUniquePathnameError extends PathnameError {
class BadPathnameError extends PathnameError {
/**
* @param {string} pathname
+ * @param {string} reason
*/
- constructor(pathname) {
- super(pathname + ' is not a valid pathname', { pathname })
+ constructor(pathname, reason) {
+ if (pathname.length > 10) {
+ pathname = pathname.slice(0, 5) + '...' + pathname.slice(-5)
+ }
+ super('invalid pathname', { reason, pathname })
this.pathname = pathname
}
}
@@ -42,7 +46,7 @@ class PathnameConflictError extends PathnameError {
* @param {string} pathname
*/
constructor(pathname) {
- super(`pathname '${pathname}' conflicts with another file`, { pathname })
+ super('pathname conflicts with another file', { pathname })
this.pathname = pathname
}
}
@@ -52,7 +56,7 @@ class FileNotFoundError extends PathnameError {
* @param {string} pathname
*/
constructor(pathname) {
- super(`file ${pathname} does not exist`, { pathname })
+ super('file does not exist', { pathname })
this.pathname = pathname
}
}
@@ -315,8 +319,9 @@ function checkPathnamesAreUnique(files) {
*/
function checkPathname(pathname) {
assert.nonEmptyString(pathname, 'bad pathname')
- if (safePathname.isClean(pathname)) return
- throw new FileMap.BadPathnameError(pathname)
+ const [isClean, reason] = safePathname.isCleanDebug(pathname)
+ if (isClean) return
+ throw new FileMap.BadPathnameError(pathname, reason)
}
/**
diff --git a/libraries/overleaf-editor-core/lib/history.js b/libraries/overleaf-editor-core/lib/history.js
index a2e222acd3..6a97a6f8a9 100644
--- a/libraries/overleaf-editor-core/lib/history.js
+++ b/libraries/overleaf-editor-core/lib/history.js
@@ -7,7 +7,7 @@ const Change = require('./change')
const Snapshot = require('./snapshot')
/**
- * @import { BlobStore } from "./types"
+ * @import { BlobStore, ReadonlyBlobStore } from "./types"
*/
class History {
@@ -85,7 +85,7 @@ class History {
* If this History contains any File objects, load them.
*
* @param {string} kind see {File#load}
- * @param {BlobStore} blobStore
+ * @param {ReadonlyBlobStore} blobStore
* @return {Promise}
*/
async loadFiles(kind, blobStore) {
@@ -109,7 +109,7 @@ class History {
* @param {BlobStore} blobStore
* @param {number} [concurrency] applies separately to files, changes and
* operations
- * @return {Promise.}
+ * @return {Promise}
*/
async store(blobStore, concurrency) {
assert.maybe.number(concurrency, 'bad concurrency')
diff --git a/libraries/overleaf-editor-core/lib/operation/edit_operation_builder.js b/libraries/overleaf-editor-core/lib/operation/edit_operation_builder.js
index febdebc034..7d5bb81aae 100644
--- a/libraries/overleaf-editor-core/lib/operation/edit_operation_builder.js
+++ b/libraries/overleaf-editor-core/lib/operation/edit_operation_builder.js
@@ -36,6 +36,20 @@ class EditOperationBuilder {
}
throw new Error('Unsupported operation in EditOperationBuilder.fromJSON')
}
+
+ /**
+ * @param {unknown} raw
+ * @return {raw is RawEditOperation}
+ */
+ static isValid(raw) {
+ return (
+ isTextOperation(raw) ||
+ isRawAddCommentOperation(raw) ||
+ isRawDeleteCommentOperation(raw) ||
+ isRawSetCommentStateOperation(raw) ||
+ isRawEditNoOperation(raw)
+ )
+ }
}
/**
diff --git a/libraries/overleaf-editor-core/lib/operation/index.js b/libraries/overleaf-editor-core/lib/operation/index.js
index ebc6f73907..ae7f2bcf01 100644
--- a/libraries/overleaf-editor-core/lib/operation/index.js
+++ b/libraries/overleaf-editor-core/lib/operation/index.js
@@ -13,7 +13,7 @@ let EditFileOperation = null
let SetFileMetadataOperation = null
/**
- * @import { BlobStore } from "../types"
+ * @import { ReadonlyBlobStore } from "../types"
* @import Snapshot from "../snapshot"
*/
@@ -80,7 +80,7 @@ class Operation {
* If this operation references any files, load the files.
*
* @param {string} kind see {File#load}
- * @param {BlobStore} blobStore
+ * @param {ReadOnlyBlobStore} blobStore
* @return {Promise}
*/
async loadFiles(kind, blobStore) {}
diff --git a/libraries/overleaf-editor-core/lib/operation/scan_op.js b/libraries/overleaf-editor-core/lib/operation/scan_op.js
index 4f179f24b4..fd322459cc 100644
--- a/libraries/overleaf-editor-core/lib/operation/scan_op.js
+++ b/libraries/overleaf-editor-core/lib/operation/scan_op.js
@@ -175,7 +175,7 @@ class InsertOp extends ScanOp {
return false
}
if (this.tracking) {
- if (!this.tracking.equals(other.tracking)) {
+ if (!other.tracking || !this.tracking.canMergeWith(other.tracking)) {
return false
}
} else if (other.tracking) {
@@ -198,7 +198,10 @@ class InsertOp extends ScanOp {
throw new Error('Cannot merge with incompatible operation')
}
this.insertion += other.insertion
- // We already have the same tracking info and commentIds
+ if (this.tracking != null && other.tracking != null) {
+ this.tracking = this.tracking.mergeWith(other.tracking)
+ }
+ // We already have the same commentIds
}
/**
@@ -306,9 +309,13 @@ class RetainOp extends ScanOp {
return false
}
if (this.tracking) {
- return this.tracking.equals(other.tracking)
+ if (!other.tracking || !this.tracking.canMergeWith(other.tracking)) {
+ return false
+ }
+ } else if (other.tracking) {
+ return false
}
- return !other.tracking
+ return true
}
/**
@@ -319,6 +326,9 @@ class RetainOp extends ScanOp {
throw new Error('Cannot merge with incompatible operation')
}
this.length += other.length
+ if (this.tracking != null && other.tracking != null) {
+ this.tracking = this.tracking.mergeWith(other.tracking)
+ }
}
/**
diff --git a/libraries/overleaf-editor-core/lib/operation/text_operation.js b/libraries/overleaf-editor-core/lib/operation/text_operation.js
index 4f556012c6..61c7f124b4 100644
--- a/libraries/overleaf-editor-core/lib/operation/text_operation.js
+++ b/libraries/overleaf-editor-core/lib/operation/text_operation.js
@@ -56,18 +56,34 @@ class TextOperation extends EditOperation {
constructor() {
super()
- // When an operation is applied to an input string, you can think of this as
- // if an imaginary cursor runs over the entire string and skips over some
- // parts, removes some parts and inserts characters at some positions. These
- // actions (skip/remove/insert) are stored as an array in the "ops" property.
- /** @type {ScanOp[]} */
+
+ /**
+ * When an operation is applied to an input string, you can think of this as
+ * if an imaginary cursor runs over the entire string and skips over some
+ * parts, removes some parts and inserts characters at some positions. These
+ * actions (skip/remove/insert) are stored as an array in the "ops" property.
+ * @type {ScanOp[]}
+ */
this.ops = []
- // An operation's baseLength is the length of every string the operation
- // can be applied to.
+
+ /**
+ * An operation's baseLength is the length of every string the operation
+ * can be applied to.
+ */
this.baseLength = 0
- // The targetLength is the length of every string that results from applying
- // the operation on a valid input string.
+
+ /**
+ * The targetLength is the length of every string that results from applying
+ * the operation on a valid input string.
+ */
this.targetLength = 0
+
+ /**
+ * The expected content hash after this operation is applied
+ *
+ * @type {string | null}
+ */
+ this.contentHash = null
}
/**
@@ -223,7 +239,12 @@ class TextOperation extends EditOperation {
* @returns {RawTextOperation}
*/
toJSON() {
- return { textOperation: this.ops.map(op => op.toJSON()) }
+ /** @type {RawTextOperation} */
+ const json = { textOperation: this.ops.map(op => op.toJSON()) }
+ if (this.contentHash != null) {
+ json.contentHash = this.contentHash
+ }
+ return json
}
/**
@@ -231,7 +252,7 @@ class TextOperation extends EditOperation {
* @param {RawTextOperation} obj
* @returns {TextOperation}
*/
- static fromJSON = function ({ textOperation: ops }) {
+ static fromJSON = function ({ textOperation: ops, contentHash }) {
const o = new TextOperation()
for (const op of ops) {
if (isRetain(op)) {
@@ -250,6 +271,9 @@ class TextOperation extends EditOperation {
throw new UnprocessableError('unknown operation: ' + JSON.stringify(op))
}
}
+ if (contentHash != null) {
+ o.contentHash = contentHash
+ }
return o
}
@@ -290,25 +314,18 @@ class TextOperation extends EditOperation {
str
)
}
- file.trackedChanges.applyRetain(result.length, op.length, {
- tracking: op.tracking,
- })
result += str.slice(inputCursor, inputCursor + op.length)
inputCursor += op.length
} else if (op instanceof InsertOp) {
if (containsNonBmpChars(op.insertion)) {
throw new InvalidInsertionError(str, op.toJSON())
}
- file.trackedChanges.applyInsert(result.length, op.insertion, {
- tracking: op.tracking,
- })
file.comments.applyInsert(
new Range(result.length, op.insertion.length),
{ commentIds: op.commentIds }
)
result += op.insertion
} else if (op instanceof RemoveOp) {
- file.trackedChanges.applyDelete(result.length, op.length)
file.comments.applyDelete(new Range(result.length, op.length))
inputCursor += op.length
} else {
@@ -328,6 +345,8 @@ class TextOperation extends EditOperation {
throw new TextOperation.TooLongError(operation, result.length)
}
+ file.trackedChanges.applyTextOperation(this)
+
file.content = result
}
@@ -376,44 +395,36 @@ class TextOperation extends EditOperation {
for (let i = 0, l = ops.length; i < l; i++) {
const op = ops[i]
if (op instanceof RetainOp) {
- // Where we need to end up after the retains
- const target = strIndex + op.length
- // A previous retain could have overriden some tracking info. Now we
- // need to restore it.
- const previousRanges = previousState.trackedChanges.inRange(
- new Range(strIndex, op.length)
- )
-
- let removeTrackingInfoIfNeeded
if (op.tracking) {
- removeTrackingInfoIfNeeded = new ClearTrackingProps()
- }
+ // Where we need to end up after the retains
+ const target = strIndex + op.length
+ // A previous retain could have overriden some tracking info. Now we
+ // need to restore it.
+ const previousChanges = previousState.trackedChanges.intersectRange(
+ new Range(strIndex, op.length)
+ )
- for (const trackedChange of previousRanges) {
- if (strIndex < trackedChange.range.start) {
- inverse.retain(trackedChange.range.start - strIndex, {
- tracking: removeTrackingInfoIfNeeded,
+ for (const change of previousChanges) {
+ if (strIndex < change.range.start) {
+ inverse.retain(change.range.start - strIndex, {
+ tracking: new ClearTrackingProps(),
+ })
+ strIndex = change.range.start
+ }
+ inverse.retain(change.range.length, {
+ tracking: change.tracking,
})
- strIndex = trackedChange.range.start
+ strIndex += change.range.length
}
- if (trackedChange.range.end < strIndex + op.length) {
- inverse.retain(trackedChange.range.length, {
- tracking: trackedChange.tracking,
+ if (strIndex < target) {
+ inverse.retain(target - strIndex, {
+ tracking: new ClearTrackingProps(),
})
- strIndex = trackedChange.range.end
+ strIndex = target
}
- if (trackedChange.range.end !== strIndex) {
- // No need to split the range at the end
- const [left] = trackedChange.range.splitAt(strIndex)
- inverse.retain(left.length, { tracking: trackedChange.tracking })
- strIndex = left.end
- }
- }
- if (strIndex < target) {
- inverse.retain(target - strIndex, {
- tracking: removeTrackingInfoIfNeeded,
- })
- strIndex = target
+ } else {
+ inverse.retain(op.length)
+ strIndex += op.length
}
} else if (op instanceof InsertOp) {
inverse.remove(op.insertion.length)
diff --git a/libraries/overleaf-editor-core/lib/range.js b/libraries/overleaf-editor-core/lib/range.js
index bc47632f92..b3fb2bd78b 100644
--- a/libraries/overleaf-editor-core/lib/range.js
+++ b/libraries/overleaf-editor-core/lib/range.js
@@ -86,10 +86,32 @@ class Range {
}
/**
- * @param {Range} range
+ * Does this range overlap another range?
+ *
+ * Overlapping means that the two ranges have at least one character in common
+ *
+ * @param {Range} other - the other range
*/
- overlaps(range) {
- return this.start < range.end && this.end > range.start
+ overlaps(other) {
+ return this.start < other.end && this.end > other.start
+ }
+
+ /**
+ * Does this range overlap the start of another range?
+ *
+ * @param {Range} other - the other range
+ */
+ overlapsStart(other) {
+ return this.start <= other.start && this.end > other.start
+ }
+
+ /**
+ * Does this range overlap the end of another range?
+ *
+ * @param {Range} other - the other range
+ */
+ overlapsEnd(other) {
+ return this.start < other.end && this.end >= other.end
}
/**
@@ -227,6 +249,26 @@ class Range {
)
return [rangeUpToCursor, rangeAfterCursor]
}
+
+ /**
+ * Returns the intersection of this range with another range
+ *
+ * @param {Range} other - the other range
+ * @return {Range | null} the intersection or null if the intersection is empty
+ */
+ intersect(other) {
+ if (this.contains(other)) {
+ return other
+ } else if (other.contains(this)) {
+ return this
+ } else if (other.overlapsStart(this)) {
+ return new Range(this.pos, other.end - this.start)
+ } else if (other.overlapsEnd(this)) {
+ return new Range(other.pos, this.end - other.start)
+ } else {
+ return null
+ }
+ }
}
module.exports = Range
diff --git a/libraries/overleaf-editor-core/lib/safe_pathname.js b/libraries/overleaf-editor-core/lib/safe_pathname.js
index 1bd5b6c8b2..91bbd5beb6 100644
--- a/libraries/overleaf-editor-core/lib/safe_pathname.js
+++ b/libraries/overleaf-editor-core/lib/safe_pathname.js
@@ -64,17 +64,57 @@ function cleanPart(filename) {
* @return {String}
*/
exports.clean = function (pathname) {
+ return exports.cleanDebug(pathname)[0]
+}
+
+/**
+ * See clean
+ * @param {string} pathname
+ * @return {[string,string]}
+ */
+exports.cleanDebug = function (pathname) {
+ let prev = pathname
+ let reason = ''
+
+ /**
+ * @param {string} label
+ */
+ function recordReasonIfChanged(label) {
+ if (pathname === prev) return
+ if (reason) reason += ','
+ reason += label
+ prev = pathname
+ }
pathname = path.normalize(pathname)
- pathname = pathname.replace(/\\/g, '/') // workaround for IE
- pathname = pathname.replace(/\/+/g, '/') // no multiple slashes
- pathname = pathname.replace(/^(\/.*)$/, '_$1') // no leading /
- pathname = pathname.replace(/^(.+)\/$/, '$1') // no trailing /
- pathname = pathname.replace(/^ *(.*)$/, '$1') // no leading spaces
- pathname = pathname.replace(/^(.*[^ ]) *$/, '$1') // no trailing spaces
+ recordReasonIfChanged('normalize')
+
+ pathname = pathname.replace(/\\/g, '/')
+ recordReasonIfChanged('workaround for IE')
+
+ pathname = pathname.replace(/\/+/g, '/')
+ recordReasonIfChanged('no multiple slashes')
+
+ pathname = pathname.replace(/^(\/.*)$/, '_$1')
+ recordReasonIfChanged('no leading /')
+
+ pathname = pathname.replace(/^(.+)\/$/, '$1')
+ recordReasonIfChanged('no trailing /')
+
+ pathname = pathname.replace(/^ *(.*)$/, '$1')
+ recordReasonIfChanged('no leading spaces')
+
+ pathname = pathname.replace(/^(.*[^ ]) *$/, '$1')
+ recordReasonIfChanged('no trailing spaces')
+
if (pathname.length === 0) pathname = '_'
+ recordReasonIfChanged('empty')
+
pathname = pathname.split('/').map(cleanPart).join('/')
+ recordReasonIfChanged('cleanPart')
+
pathname = pathname.replace(BLOCKED_FILE_RX, '@$1')
- return pathname
+ recordReasonIfChanged('BLOCKED_FILE_RX')
+ return [pathname, reason]
}
/**
@@ -84,9 +124,19 @@ exports.clean = function (pathname) {
* @return {Boolean}
*/
exports.isClean = function pathnameIsClean(pathname) {
- return (
- exports.clean(pathname) === pathname &&
- pathname.length <= MAX_PATH &&
- pathname.length > 0
- )
+ return exports.isCleanDebug(pathname)[0]
+}
+
+/**
+ * A pathname is clean (see clean) and not too long.
+ *
+ * @param {string} pathname
+ * @return {[boolean,string]}
+ */
+exports.isCleanDebug = function (pathname) {
+ if (pathname.length > MAX_PATH) return [false, 'MAX_PATH']
+ if (pathname.length === 0) return [false, 'empty']
+ const [cleanPathname, reason] = exports.cleanDebug(pathname)
+ if (cleanPathname !== pathname) return [false, reason]
+ return [true, '']
}
diff --git a/libraries/overleaf-editor-core/lib/snapshot.js b/libraries/overleaf-editor-core/lib/snapshot.js
index d7cbe62ae9..c33b48f829 100644
--- a/libraries/overleaf-editor-core/lib/snapshot.js
+++ b/libraries/overleaf-editor-core/lib/snapshot.js
@@ -224,7 +224,7 @@ class Snapshot {
*
* @param {string} kind see {File#load}
* @param {ReadonlyBlobStore} blobStore
- * @return {Promise} an object where keys are the pathnames and
+ * @return {Promise>} an object where keys are the pathnames and
* values are the files in the snapshot
*/
async loadFiles(kind, blobStore) {
diff --git a/libraries/overleaf-editor-core/lib/types.ts b/libraries/overleaf-editor-core/lib/types.ts
index 604cc93414..53bf0622c4 100644
--- a/libraries/overleaf-editor-core/lib/types.ts
+++ b/libraries/overleaf-editor-core/lib/types.ts
@@ -132,6 +132,7 @@ export type RawScanOp = RawInsertOp | RawRemoveOp | RawRetainOp
export type RawTextOperation = {
textOperation: RawScanOp[]
+ contentHash?: string
}
export type RawAddCommentOperation = {
diff --git a/libraries/overleaf-editor-core/lib/v2_doc_versions.js b/libraries/overleaf-editor-core/lib/v2_doc_versions.js
index 4d313bb2dd..2cfada5b2a 100644
--- a/libraries/overleaf-editor-core/lib/v2_doc_versions.js
+++ b/libraries/overleaf-editor-core/lib/v2_doc_versions.js
@@ -27,7 +27,7 @@ class V2DocVersions {
}
/**
- * @return {?RawV2DocVersions}
+ * @return {RawV2DocVersions|null}
*/
toRaw() {
if (!this.data) return null
diff --git a/libraries/overleaf-editor-core/package.json b/libraries/overleaf-editor-core/package.json
index bc0cdebbf7..f5d826ab38 100644
--- a/libraries/overleaf-editor-core/package.json
+++ b/libraries/overleaf-editor-core/package.json
@@ -20,7 +20,7 @@
"@types/check-types": "^7.3.7",
"@types/path-browserify": "^1.0.2",
"chai": "^3.3.0",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
},
diff --git a/libraries/overleaf-editor-core/test/lazy_string_file_data.test.js b/libraries/overleaf-editor-core/test/lazy_string_file_data.test.js
index 4c9f4aa497..946e6cd5d1 100644
--- a/libraries/overleaf-editor-core/test/lazy_string_file_data.test.js
+++ b/libraries/overleaf-editor-core/test/lazy_string_file_data.test.js
@@ -193,4 +193,13 @@ describe('LazyStringFileData', function () {
expect(fileData.getStringLength()).to.equal(longString.length)
expect(fileData.getOperations()).to.have.length(1)
})
+
+ it('truncates its operations after being stored', async function () {
+ const testHash = File.EMPTY_FILE_HASH
+ const fileData = new LazyStringFileData(testHash, undefined, 0)
+ fileData.edit(new TextOperation().insert('abc'))
+ const stored = await fileData.store(this.blobStore)
+ expect(fileData.hash).to.equal(stored.hash)
+ expect(fileData.operations).to.deep.equal([])
+ })
})
diff --git a/libraries/overleaf-editor-core/test/range.test.js b/libraries/overleaf-editor-core/test/range.test.js
index daad8fd6ed..9a048d5c03 100644
--- a/libraries/overleaf-editor-core/test/range.test.js
+++ b/libraries/overleaf-editor-core/test/range.test.js
@@ -1,4 +1,3 @@
-// @ts-check
'use strict'
const { expect } = require('chai')
@@ -449,4 +448,44 @@ describe('Range', function () {
expect(() => range.insertAt(16, 3)).to.throw()
})
})
+
+ describe('intersect', function () {
+ it('should handle partially overlapping ranges', function () {
+ const range1 = new Range(5, 10)
+ const range2 = new Range(3, 6)
+ const intersection1 = range1.intersect(range2)
+ expect(intersection1.pos).to.equal(5)
+ expect(intersection1.length).to.equal(4)
+ const intersection2 = range2.intersect(range1)
+ expect(intersection2.pos).to.equal(5)
+ expect(intersection2.length).to.equal(4)
+ })
+
+ it('should intersect with itself', function () {
+ const range = new Range(5, 10)
+ const intersection = range.intersect(range)
+ expect(intersection.pos).to.equal(5)
+ expect(intersection.length).to.equal(10)
+ })
+
+ it('should handle nested ranges', function () {
+ const range1 = new Range(5, 10)
+ const range2 = new Range(7, 2)
+ const intersection1 = range1.intersect(range2)
+ expect(intersection1.pos).to.equal(7)
+ expect(intersection1.length).to.equal(2)
+ const intersection2 = range2.intersect(range1)
+ expect(intersection2.pos).to.equal(7)
+ expect(intersection2.length).to.equal(2)
+ })
+
+ it('should handle disconnected ranges', function () {
+ const range1 = new Range(5, 10)
+ const range2 = new Range(20, 30)
+ const intersection1 = range1.intersect(range2)
+ expect(intersection1).to.be.null
+ const intersection2 = range2.intersect(range1)
+ expect(intersection2).to.be.null
+ })
+ })
})
diff --git a/libraries/overleaf-editor-core/test/safe_pathname.test.js b/libraries/overleaf-editor-core/test/safe_pathname.test.js
index c123b20662..bfde298f58 100644
--- a/libraries/overleaf-editor-core/test/safe_pathname.test.js
+++ b/libraries/overleaf-editor-core/test/safe_pathname.test.js
@@ -5,10 +5,11 @@ const ot = require('..')
const safePathname = ot.safePathname
describe('safePathname', function () {
- function expectClean(input, output) {
+ function expectClean(input, output, reason = '') {
// check expected output and also idempotency
- const cleanedInput = safePathname.clean(input)
+ const [cleanedInput, gotReason] = safePathname.cleanDebug(input)
expect(cleanedInput).to.equal(output)
+ expect(gotReason).to.equal(reason)
expect(safePathname.clean(cleanedInput)).to.equal(cleanedInput)
expect(safePathname.isClean(cleanedInput)).to.be.true
}
@@ -22,44 +23,56 @@ describe('safePathname', function () {
expect(safePathname.isClean('rm -rf /')).to.be.falsy
// replace invalid characters with underscores
- expectClean('test-s*\u0001\u0002m\u0007st\u0008.jpg', 'test-s___m_st_.jpg')
+ expectClean(
+ 'test-s*\u0001\u0002m\u0007st\u0008.jpg',
+ 'test-s___m_st_.jpg',
+ 'cleanPart'
+ )
// keep slashes, normalize paths, replace ..
- expectClean('./foo', 'foo')
- expectClean('../foo', '__/foo')
- expectClean('foo/./bar', 'foo/bar')
- expectClean('foo/../bar', 'bar')
- expectClean('../../tricky/foo.bar', '__/__/tricky/foo.bar')
- expectClean('foo/../../tricky/foo.bar', '__/tricky/foo.bar')
- expectClean('foo/bar/../../tricky/foo.bar', 'tricky/foo.bar')
- expectClean('foo/bar/baz/../../tricky/foo.bar', 'foo/tricky/foo.bar')
+ expectClean('./foo', 'foo', 'normalize')
+ expectClean('../foo', '__/foo', 'cleanPart')
+ expectClean('foo/./bar', 'foo/bar', 'normalize')
+ expectClean('foo/../bar', 'bar', 'normalize')
+ expectClean('../../tricky/foo.bar', '__/__/tricky/foo.bar', 'cleanPart')
+ expectClean(
+ 'foo/../../tricky/foo.bar',
+ '__/tricky/foo.bar',
+ 'normalize,cleanPart'
+ )
+ expectClean('foo/bar/../../tricky/foo.bar', 'tricky/foo.bar', 'normalize')
+ expectClean(
+ 'foo/bar/baz/../../tricky/foo.bar',
+ 'foo/tricky/foo.bar',
+ 'normalize'
+ )
// remove illegal chars even when there is no extension
- expectClean('**foo', '__foo')
+ expectClean('**foo', '__foo', 'cleanPart')
// remove windows file paths
- expectClean('c:\\temp\\foo.txt', 'c:/temp/foo.txt')
+ expectClean('c:\\temp\\foo.txt', 'c:/temp/foo.txt', 'workaround for IE')
// do not allow a leading slash (relative paths only)
- expectClean('/foo', '_/foo')
- expectClean('//foo', '_/foo')
+ expectClean('/foo', '_/foo', 'no leading /')
+ expectClean('//foo', '_/foo', 'normalize,no leading /')
// do not allow multiple leading slashes
- expectClean('//foo', '_/foo')
+ expectClean('//foo', '_/foo', 'normalize,no leading /')
// do not allow a trailing slash
- expectClean('/', '_')
- expectClean('foo/', 'foo')
- expectClean('foo.tex/', 'foo.tex')
+ expectClean('/', '_', 'no leading /,no trailing /')
+ expectClean('foo/', 'foo', 'no trailing /')
+ expectClean('foo.tex/', 'foo.tex', 'no trailing /')
// do not allow multiple trailing slashes
- expectClean('//', '_')
- expectClean('///', '_')
- expectClean('foo//', 'foo')
+ expectClean('//', '_', 'normalize,no leading /,no trailing /')
+ expectClean('///', '_', 'normalize,no leading /,no trailing /')
+ expectClean('foo//', 'foo', 'normalize,no trailing /')
// file and folder names that consist of . and .. are not OK
- expectClean('.', '_')
- expectClean('..', '__')
+ expectClean('.', '_', 'cleanPart')
+ expectClean('..', '__', 'cleanPart')
// we will allow name with more dots e.g. ... and ....
expectClean('...', '...')
expectClean('....', '....')
@@ -82,10 +95,10 @@ describe('safePathname', function () {
expectClean('a b.png', 'a b.png')
// leading and trailing spaces are not OK
- expectClean(' foo', 'foo')
- expectClean(' foo', 'foo')
- expectClean('foo ', 'foo')
- expectClean('foo ', 'foo')
+ expectClean(' foo', 'foo', 'no leading spaces')
+ expectClean(' foo', 'foo', 'no leading spaces')
+ expectClean('foo ', 'foo', 'no trailing spaces')
+ expectClean('foo ', 'foo', 'no trailing spaces')
// reserved file names on Windows should not be OK, but we already have
// some in the old system, so have to allow them for now
@@ -100,14 +113,14 @@ describe('safePathname', function () {
// there's no particular reason to allow multiple slashes; sometimes people
// seem to rename files to URLs (https://domain/path) in an attempt to
// upload a file, and this results in an empty directory name
- expectClean('foo//bar.png', 'foo/bar.png')
- expectClean('foo///bar.png', 'foo/bar.png')
+ expectClean('foo//bar.png', 'foo/bar.png', 'normalize')
+ expectClean('foo///bar.png', 'foo/bar.png', 'normalize')
// Check javascript property handling
expectClean('foo/prototype', 'foo/prototype') // OK as part of a pathname
expectClean('prototype/test.txt', 'prototype/test.txt')
- expectClean('prototype', '@prototype') // not OK as whole pathname
- expectClean('hasOwnProperty', '@hasOwnProperty')
- expectClean('**proto**', '@__proto__')
+ expectClean('prototype', '@prototype', 'BLOCKED_FILE_RX') // not OK as whole pathname
+ expectClean('hasOwnProperty', '@hasOwnProperty', 'BLOCKED_FILE_RX')
+ expectClean('**proto**', '@__proto__', 'cleanPart,BLOCKED_FILE_RX')
})
})
diff --git a/libraries/overleaf-editor-core/test/scan_op.test.js b/libraries/overleaf-editor-core/test/scan_op.test.js
index 80ab69114e..98f4834d48 100644
--- a/libraries/overleaf-editor-core/test/scan_op.test.js
+++ b/libraries/overleaf-editor-core/test/scan_op.test.js
@@ -107,7 +107,7 @@ describe('RetainOp', function () {
expect(op1.equals(new RetainOp(3))).to.be.true
})
- it('cannot merge with another RetainOp if tracking info is different', function () {
+ it('cannot merge with another RetainOp if the tracking user is different', function () {
const op1 = new RetainOp(
4,
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
@@ -120,14 +120,14 @@ describe('RetainOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
- it('can merge with another RetainOp if tracking info is the same', function () {
+ it('can merge with another RetainOp if the tracking user is the same', function () {
const op1 = new RetainOp(
4,
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
)
const op2 = new RetainOp(
4,
- new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
+ new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:01.000Z'))
)
op1.mergeWith(op2)
expect(
@@ -310,7 +310,7 @@ describe('InsertOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
- it('cannot merge with another InsertOp if tracking info is different', function () {
+ it('cannot merge with another InsertOp if tracking user is different', function () {
const op1 = new InsertOp(
'a',
new TrackingProps('insert', 'user1', new Date('2024-01-01T00:00:00.000Z'))
@@ -323,7 +323,7 @@ describe('InsertOp', function () {
expect(() => op1.mergeWith(op2)).to.throw(Error)
})
- it('can merge with another InsertOp if tracking and comment info is the same', function () {
+ it('can merge with another InsertOp if tracking user and comment info is the same', function () {
const op1 = new InsertOp(
'a',
new TrackingProps(
@@ -338,7 +338,7 @@ describe('InsertOp', function () {
new TrackingProps(
'insert',
'user1',
- new Date('2024-01-01T00:00:00.000Z')
+ new Date('2024-01-01T00:00:01.000Z')
),
['1', '2']
)
diff --git a/libraries/overleaf-editor-core/test/text_operation.test.js b/libraries/overleaf-editor-core/test/text_operation.test.js
index fa9bc62dc3..43b8c707a6 100644
--- a/libraries/overleaf-editor-core/test/text_operation.test.js
+++ b/libraries/overleaf-editor-core/test/text_operation.test.js
@@ -322,6 +322,47 @@ describe('TextOperation', function () {
new TextOperation().retain(4).remove(4).retain(3)
)
})
+
+ it('undoing a tracked delete restores the tracked changes', function () {
+ expectInverseToLeadToInitialState(
+ new StringFileData(
+ 'the quick brown fox jumps over the lazy dog',
+ undefined,
+ [
+ {
+ range: { pos: 5, length: 5 },
+ tracking: {
+ ts: '2023-01-01T00:00:00.000Z',
+ type: 'insert',
+ userId: 'user1',
+ },
+ },
+ {
+ range: { pos: 12, length: 3 },
+ tracking: {
+ ts: '2023-01-01T00:00:00.000Z',
+ type: 'delete',
+ userId: 'user1',
+ },
+ },
+ {
+ range: { pos: 18, length: 5 },
+ tracking: {
+ ts: '2023-01-01T00:00:00.000Z',
+ type: 'insert',
+ userId: 'user1',
+ },
+ },
+ ]
+ ),
+ new TextOperation()
+ .retain(7)
+ .retain(13, {
+ tracking: new TrackingProps('delete', 'user1', new Date()),
+ })
+ .retain(23)
+ )
+ })
})
describe('compose', function () {
diff --git a/libraries/promise-utils/.dockerignore b/libraries/promise-utils/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/promise-utils/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/promise-utils/.gitignore b/libraries/promise-utils/.gitignore
deleted file mode 100644
index edb0f85350..0000000000
--- a/libraries/promise-utils/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/libraries/promise-utils/.nvmrc b/libraries/promise-utils/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/promise-utils/.nvmrc
+++ b/libraries/promise-utils/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/promise-utils/buildscript.txt b/libraries/promise-utils/buildscript.txt
index 1fcf89f4d5..a9f0fb0c76 100644
--- a/libraries/promise-utils/buildscript.txt
+++ b/libraries/promise-utils/buildscript.txt
@@ -1,10 +1,10 @@
promise-utils
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/promise-utils/index.js b/libraries/promise-utils/index.js
index 043bd43630..557210ae26 100644
--- a/libraries/promise-utils/index.js
+++ b/libraries/promise-utils/index.js
@@ -1,4 +1,4 @@
-const { promisify, callbackify } = require('util')
+const { promisify, callbackify } = require('node:util')
const pLimit = require('p-limit')
module.exports = {
@@ -13,6 +13,7 @@ module.exports = {
expressify,
expressifyErrorHandler,
promiseMapWithLimit,
+ promiseMapSettledWithLimit,
}
/**
@@ -253,8 +254,30 @@ function expressifyErrorHandler(fn) {
* Map values in `array` with the async function `fn`
*
* Limit the number of unresolved promises to `concurrency`.
+ * @template T
+ * @template V
+ * @param {number} concurrency
+ * @param {Array} array
+ * @param {(arg: T) => Promise} fn
+ * @return {Promise>>}
*/
-function promiseMapWithLimit(concurrency, array, fn) {
+async function promiseMapWithLimit(concurrency, array, fn) {
const limit = pLimit(concurrency)
- return Promise.all(array.map(x => limit(() => fn(x))))
+ return await Promise.all(array.map(x => limit(() => fn(x))))
+}
+
+/**
+ * Map values in `array` with the async function `fn`
+ *
+ * Limit the number of unresolved promises to `concurrency`.
+ *
+ * @template T, U
+ * @param {number} concurrency
+ * @param {Array} array
+ * @param {(T) => Promise} fn
+ * @return {Promise>>}
+ */
+function promiseMapSettledWithLimit(concurrency, array, fn) {
+ const limit = pLimit(concurrency)
+ return Promise.allSettled(array.map(x => limit(() => fn(x))))
}
diff --git a/libraries/promise-utils/package.json b/libraries/promise-utils/package.json
index b9464a45bf..40f05b74cb 100644
--- a/libraries/promise-utils/package.json
+++ b/libraries/promise-utils/package.json
@@ -18,7 +18,7 @@
"devDependencies": {
"chai": "^4.3.10",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
},
"dependencies": {
diff --git a/libraries/ranges-tracker/.dockerignore b/libraries/ranges-tracker/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/ranges-tracker/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/ranges-tracker/.gitignore b/libraries/ranges-tracker/.gitignore
deleted file mode 100644
index eac200248b..0000000000
--- a/libraries/ranges-tracker/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-**.swp
-
-app.js
-app/js/
-test/unit/js/
-public/build/
-
-node_modules/
-
-/public/js/chat.js
-plato/
-
-.npmrc
diff --git a/libraries/ranges-tracker/.nvmrc b/libraries/ranges-tracker/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/ranges-tracker/.nvmrc
+++ b/libraries/ranges-tracker/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/ranges-tracker/buildscript.txt b/libraries/ranges-tracker/buildscript.txt
index 3b07d58c95..013d56f3ba 100644
--- a/libraries/ranges-tracker/buildscript.txt
+++ b/libraries/ranges-tracker/buildscript.txt
@@ -1,10 +1,10 @@
ranges-tracker
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/ranges-tracker/index.cjs b/libraries/ranges-tracker/index.cjs
index 8d3cb840c0..a94e265e80 100644
--- a/libraries/ranges-tracker/index.cjs
+++ b/libraries/ranges-tracker/index.cjs
@@ -145,11 +145,7 @@ class RangesTracker {
}
removeChangeId(changeId) {
- const change = this.getChange(changeId)
- if (change == null) {
- return
- }
- this._removeChange(change)
+ this.removeChangeIds([changeId])
}
removeChangeIds(ids) {
@@ -316,7 +312,7 @@ class RangesTracker {
const movedChanges = []
const removeChanges = []
const newChanges = []
-
+ const trackedDeletesAtOpPosition = []
for (let i = 0; i < this.changes.length; i++) {
change = this.changes[i]
const changeStart = change.op.p
@@ -327,13 +323,15 @@ class RangesTracker {
change.op.p += opLength
movedChanges.push(change)
} else if (opStart === changeStart) {
- // If we are undoing, then we want to cancel any existing delete ranges if we can.
- // Check if the insert matches the start of the delete, and just remove it from the delete instead if so.
if (
+ !alreadyMerged &&
undoing &&
change.op.d.length >= op.i.length &&
change.op.d.slice(0, op.i.length) === op.i
) {
+ // If we are undoing, then we want to reject any existing tracked delete if we can.
+ // Check if the insert matches the start of the delete, and just
+ // remove it from the delete instead if so.
change.op.d = change.op.d.slice(op.i.length)
change.op.p += op.i.length
if (change.op.d === '') {
@@ -342,9 +340,25 @@ class RangesTracker {
movedChanges.push(change)
}
alreadyMerged = true
+
+ // Any tracked delete that came before this tracked delete
+ // rejection was moved after the incoming insert. Move them back
+ // so that they appear before the tracked delete rejection.
+ for (const trackedDelete of trackedDeletesAtOpPosition) {
+ trackedDelete.op.p -= opLength
+ }
} else {
+ // We're not rejecting that tracked delete. Move it after the
+ // insert.
change.op.p += opLength
movedChanges.push(change)
+
+ // Keep track of tracked deletes that are at the same position as the
+ // insert. If we find a tracked delete to reject, we'll want to
+ // reposition them.
+ if (!alreadyMerged) {
+ trackedDeletesAtOpPosition.push(change)
+ }
}
}
} else if (change.op.i != null) {
@@ -624,9 +638,11 @@ class RangesTracker {
}
_addOp(op, metadata) {
+ // Don't take a reference to the existing op since we'll modify this in place with future changes
+ op = this._clone(op)
const change = {
id: this.newId(),
- op: this._clone(op), // Don't take a reference to the existing op since we'll modify this in place with future changes
+ op,
metadata: this._clone(metadata),
}
this.changes.push(change)
@@ -649,7 +665,7 @@ class RangesTracker {
}
_removeChange(change) {
- this.changes = this.changes.filter(c => c.id !== change.id)
+ this.changes = this.changes.filter(c => c !== change)
this._markAsDirty(change, 'change', 'removed')
}
diff --git a/libraries/ranges-tracker/package.json b/libraries/ranges-tracker/package.json
index 9bf65ef84b..8aa0a00606 100644
--- a/libraries/ranges-tracker/package.json
+++ b/libraries/ranges-tracker/package.json
@@ -20,7 +20,7 @@
},
"devDependencies": {
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
diff --git a/libraries/ranges-tracker/test/unit/ranges-tracker-test.js b/libraries/ranges-tracker/test/unit/ranges-tracker-test.js
index 75d7024d09..d20734962f 100644
--- a/libraries/ranges-tracker/test/unit/ranges-tracker-test.js
+++ b/libraries/ranges-tracker/test/unit/ranges-tracker-test.js
@@ -4,6 +4,7 @@ const RangesTracker = require('../..')
describe('RangesTracker', function () {
describe('with duplicate change ids', function () {
beforeEach(function () {
+ this.comments = []
this.changes = [
{ id: 'id1', op: { p: 1, i: 'hello' } },
{ id: 'id2', op: { p: 10, i: 'world' } },
@@ -26,4 +27,199 @@ describe('RangesTracker', function () {
expect(this.rangesTracker.changes).to.deep.equal([this.changes[2]])
})
})
+
+ describe('with duplicate tracked insert ids', function () {
+ beforeEach(function () {
+ this.comments = []
+ this.changes = [
+ { id: 'id1', op: { p: 10, i: 'one' } },
+ { id: 'id1', op: { p: 20, i: 'two' } },
+ { id: 'id1', op: { p: 30, d: 'three' } },
+ ]
+ this.rangesTracker = new RangesTracker(this.changes, this.comments)
+ })
+
+ it("deleting one tracked insert doesn't delete the others", function () {
+ this.rangesTracker.applyOp({ p: 20, d: 'two' })
+ expect(this.rangesTracker.changes).to.deep.equal([
+ this.changes[0],
+ this.changes[2],
+ ])
+ })
+ })
+
+ describe('with duplicate tracked delete ids', function () {
+ beforeEach(function () {
+ this.comments = []
+ this.changes = [
+ { id: 'id1', op: { p: 10, d: 'one' } },
+ { id: 'id1', op: { p: 20, d: 'two' } },
+ { id: 'id1', op: { p: 30, d: 'three' } },
+ ]
+ this.rangesTracker = new RangesTracker(this.changes, this.comments)
+ })
+
+ it('deleting over tracked deletes in tracked changes mode removes the tracked deletes covered', function () {
+ this.rangesTracker.track_changes = true
+ this.rangesTracker.applyOp({
+ p: 15,
+ d: '567890123456789012345',
+ })
+ expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
+ { p: 10, d: 'one' },
+ { p: 15, d: '56789two0123456789three012345' },
+ ])
+ })
+
+ it('a tracked delete between two tracked deletes joins them into a single tracked delete', function () {
+ this.rangesTracker.track_changes = true
+ this.rangesTracker.applyOp({
+ p: 20,
+ d: '0123456789',
+ })
+ expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
+ { p: 10, d: 'one' },
+ { p: 20, d: 'two0123456789three' },
+ ])
+ })
+
+ it("rejecting one tracked delete doesn't reject the others", function () {
+ this.rangesTracker.track_changes = true
+ this.rangesTracker.applyOp({
+ p: 20,
+ i: 'two',
+ u: true,
+ })
+ expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
+ { p: 10, d: 'one' },
+ { p: 33, d: 'three' },
+ ])
+ })
+
+ it("rejecting all tracked deletes doesn't introduce tracked inserts", function () {
+ this.rangesTracker.track_changes = true
+ this.rangesTracker.applyOp({
+ p: 10,
+ i: 'one',
+ u: true,
+ })
+ this.rangesTracker.applyOp({
+ p: 23,
+ i: 'two',
+ u: true,
+ })
+ this.rangesTracker.applyOp({
+ p: 36,
+ i: 'three',
+ u: true,
+ })
+ expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([])
+ })
+ })
+
+ describe('with multiple tracked deletes at the same position', function () {
+ beforeEach(function () {
+ this.comments = []
+ this.changes = [
+ { id: 'id1', op: { p: 33, d: 'before' } },
+ { id: 'id2', op: { p: 50, d: 'right before' } },
+ { id: 'id3', op: { p: 50, d: 'this one' } },
+ { id: 'id4', op: { p: 50, d: 'right after' } },
+ { id: 'id5', op: { p: 75, d: 'long after' } },
+ ]
+ this.rangesTracker = new RangesTracker(this.changes, this.comments)
+ })
+
+ it('preserves the text order when rejecting changes', function () {
+ this.rangesTracker.applyOp(
+ { p: 50, i: 'this one', u: true },
+ { user_id: 'user-id' }
+ )
+ expect(this.rangesTracker.changes).to.deep.equal([
+ { id: 'id1', op: { p: 33, d: 'before' } },
+ { id: 'id2', op: { p: 50, d: 'right before' } },
+ { id: 'id4', op: { p: 58, d: 'right after' } },
+ { id: 'id5', op: { p: 83, d: 'long after' } },
+ ])
+ })
+
+ it('moves all tracked deletes after the insert if not rejecting changes', function () {
+ this.rangesTracker.applyOp(
+ { p: 50, i: 'some other text', u: true, orderedRejections: true },
+ { user_id: 'user-id' }
+ )
+ expect(this.rangesTracker.changes).to.deep.equal([
+ { id: 'id1', op: { p: 33, d: 'before' } },
+ { id: 'id2', op: { p: 65, d: 'right before' } },
+ { id: 'id3', op: { p: 65, d: 'this one' } },
+ { id: 'id4', op: { p: 65, d: 'right after' } },
+ { id: 'id5', op: { p: 90, d: 'long after' } },
+ ])
+ })
+ })
+
+ describe('with multiple tracked deletes at the same position with the same content', function () {
+ beforeEach(function () {
+ this.comments = []
+ this.changes = [
+ { id: 'id1', op: { p: 10, d: 'cat' } },
+ { id: 'id2', op: { p: 10, d: 'giraffe' } },
+ { id: 'id3', op: { p: 10, d: 'cat' } },
+ { id: 'id4', op: { p: 10, d: 'giraffe' } },
+ ]
+ this.rangesTracker = new RangesTracker(this.changes, this.comments)
+ })
+
+ it('removes only the first matching tracked delete', function () {
+ this.rangesTracker.applyOp(
+ { p: 10, i: 'giraffe', u: true },
+ { user_id: 'user-id' }
+ )
+ expect(this.rangesTracker.changes).to.deep.equal([
+ { id: 'id1', op: { p: 10, d: 'cat' } },
+ { id: 'id3', op: { p: 17, d: 'cat' } },
+ { id: 'id4', op: { p: 17, d: 'giraffe' } },
+ ])
+ })
+ })
+
+ describe('with a tracked insert at the same position as a tracked delete', function () {
+ beforeEach(function () {
+ this.comments = []
+ this.changes = [
+ {
+ id: 'id1',
+ op: { p: 5, d: 'before' },
+ metadata: { user_id: 'user-id' },
+ },
+ {
+ id: 'id2',
+ op: { p: 10, d: 'delete' },
+ metadata: { user_id: 'user-id' },
+ },
+ {
+ id: 'id3',
+ op: { p: 10, i: 'insert' },
+ metadata: { user_id: 'user-id' },
+ },
+ ]
+ this.rangesTracker = new RangesTracker(this.changes, this.comments)
+ })
+
+ it('places a tracked insert at the same position before both the delete and the insert', function () {
+ this.rangesTracker.track_changes = true
+ this.rangesTracker.applyOp(
+ { p: 10, i: 'incoming' },
+ { user_id: 'user-id' }
+ )
+ expect(this.rangesTracker.changes.map(change => change.op)).to.deep.equal(
+ [
+ { p: 5, d: 'before' },
+ { p: 10, i: 'incoming' },
+ { p: 18, d: 'delete' },
+ { p: 18, i: 'insert' },
+ ]
+ )
+ })
+ })
})
diff --git a/libraries/redis-wrapper/.dockerignore b/libraries/redis-wrapper/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/redis-wrapper/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/redis-wrapper/.gitignore b/libraries/redis-wrapper/.gitignore
deleted file mode 100644
index eac200248b..0000000000
--- a/libraries/redis-wrapper/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-**.swp
-
-app.js
-app/js/
-test/unit/js/
-public/build/
-
-node_modules/
-
-/public/js/chat.js
-plato/
-
-.npmrc
diff --git a/services/spelling/.mocharc.json b/libraries/redis-wrapper/.mocharc.json
similarity index 100%
rename from services/spelling/.mocharc.json
rename to libraries/redis-wrapper/.mocharc.json
diff --git a/libraries/redis-wrapper/.nvmrc b/libraries/redis-wrapper/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/redis-wrapper/.nvmrc
+++ b/libraries/redis-wrapper/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/redis-wrapper/RedisLocker.js b/libraries/redis-wrapper/RedisLocker.js
index 9185927887..17ad514246 100644
--- a/libraries/redis-wrapper/RedisLocker.js
+++ b/libraries/redis-wrapper/RedisLocker.js
@@ -1,8 +1,8 @@
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const metrics = require('@overleaf/metrics')
const logger = require('@overleaf/logger')
-const os = require('os')
-const crypto = require('crypto')
+const os = require('node:os')
+const crypto = require('node:crypto')
const HOST = os.hostname()
const PID = process.pid
@@ -97,7 +97,8 @@ module.exports = class RedisLocker {
}
/**
- * @param {Callback} callback
+ * @param {string} id
+ * @param {function(Error, boolean, string): void} callback
*/
tryLock(id, callback) {
if (callback == null) {
@@ -106,7 +107,7 @@ module.exports = class RedisLocker {
const lockValue = this.randomLock()
const key = this.getKey(id)
const startTime = Date.now()
- return this.rclient.set(
+ this.rclient.set(
key,
lockValue,
'EX',
@@ -121,7 +122,7 @@ module.exports = class RedisLocker {
const timeTaken = Date.now() - startTime
if (timeTaken > MAX_REDIS_REQUEST_LENGTH) {
// took too long, so try to free the lock
- return this.releaseLock(id, lockValue, function (err, result) {
+ this.releaseLock(id, lockValue, function (err, result) {
if (err != null) {
return callback(err)
} // error freeing lock
@@ -139,7 +140,8 @@ module.exports = class RedisLocker {
}
/**
- * @param {Callback} callback
+ * @param {string} id
+ * @param {function(Error, string): void} callback
*/
getLock(id, callback) {
if (callback == null) {
@@ -153,7 +155,7 @@ module.exports = class RedisLocker {
return callback(e)
}
- return this.tryLock(id, (error, gotLock, lockValue) => {
+ this.tryLock(id, (error, gotLock, lockValue) => {
if (error != null) {
return callback(error)
}
@@ -173,14 +175,15 @@ module.exports = class RedisLocker {
}
/**
- * @param {Callback} callback
+ * @param {string} id
+ * @param {function(Error, boolean): void} callback
*/
checkLock(id, callback) {
if (callback == null) {
callback = function () {}
}
const key = this.getKey(id)
- return this.rclient.exists(key, (err, exists) => {
+ this.rclient.exists(key, (err, exists) => {
if (err != null) {
return callback(err)
}
@@ -196,30 +199,26 @@ module.exports = class RedisLocker {
}
/**
- * @param {Callback} callback
+ * @param {string} id
+ * @param {string} lockValue
+ * @param {function(Error, boolean): void} callback
*/
releaseLock(id, lockValue, callback) {
const key = this.getKey(id)
- return this.rclient.eval(
- UNLOCK_SCRIPT,
- 1,
- key,
- lockValue,
- (err, result) => {
- if (err != null) {
- return callback(err)
- } else if (result != null && result !== 1) {
- // successful unlock should release exactly one key
- logger.error(
- { id, key, lockValue, redis_err: err, redis_result: result },
- 'unlocking error'
- )
- metrics.inc(this.metricsPrefix + '-unlock-error')
- return callback(new Error('tried to release timed out lock'))
- } else {
- return callback(null, result)
- }
+ this.rclient.eval(UNLOCK_SCRIPT, 1, key, lockValue, (err, result) => {
+ if (err != null) {
+ return callback(err)
+ } else if (result != null && result !== 1) {
+ // successful unlock should release exactly one key
+ logger.error(
+ { id, key, lockValue, redis_err: err, redis_result: result },
+ 'unlocking error'
+ )
+ metrics.inc(this.metricsPrefix + '-unlock-error')
+ return callback(new Error('tried to release timed out lock'))
+ } else {
+ return callback(null, result)
}
- )
+ })
}
}
diff --git a/libraries/redis-wrapper/RedisWebLocker.js b/libraries/redis-wrapper/RedisWebLocker.js
index aebf7dfeaf..dac315b64b 100644
--- a/libraries/redis-wrapper/RedisWebLocker.js
+++ b/libraries/redis-wrapper/RedisWebLocker.js
@@ -1,8 +1,8 @@
-const { callbackify, promisify } = require('util')
+const { callbackify, promisify } = require('node:util')
const metrics = require('@overleaf/metrics')
const logger = require('@overleaf/logger')
-const os = require('os')
-const crypto = require('crypto')
+const os = require('node:os')
+const crypto = require('node:crypto')
const async = require('async')
const HOST = os.hostname()
diff --git a/libraries/redis-wrapper/buildscript.txt b/libraries/redis-wrapper/buildscript.txt
index 4c48d48b21..54d43d5092 100644
--- a/libraries/redis-wrapper/buildscript.txt
+++ b/libraries/redis-wrapper/buildscript.txt
@@ -1,10 +1,10 @@
redis-wrapper
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/redis-wrapper/index.js b/libraries/redis-wrapper/index.js
index 8d7c45a746..2e16014490 100644
--- a/libraries/redis-wrapper/index.js
+++ b/libraries/redis-wrapper/index.js
@@ -1,6 +1,6 @@
-const crypto = require('crypto')
-const os = require('os')
-const { promisify } = require('util')
+const crypto = require('node:crypto')
+const os = require('node:os')
+const { promisify } = require('node:util')
const Redis = require('ioredis')
diff --git a/libraries/redis-wrapper/package.json b/libraries/redis-wrapper/package.json
index 56372e1dba..2f15cb062f 100644
--- a/libraries/redis-wrapper/package.json
+++ b/libraries/redis-wrapper/package.json
@@ -35,7 +35,7 @@
"@overleaf/logger": "*",
"@overleaf/o-error": "*",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
diff --git a/libraries/redis-wrapper/test/setup.js b/libraries/redis-wrapper/test/setup.js
new file mode 100644
index 0000000000..6369c6374c
--- /dev/null
+++ b/libraries/redis-wrapper/test/setup.js
@@ -0,0 +1,9 @@
+const SandboxedModule = require('sandboxed-module')
+
+SandboxedModule.configure({
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
+})
diff --git a/libraries/redis-wrapper/test/unit/src/test.js b/libraries/redis-wrapper/test/unit/src/test.js
index 03d42217ae..a71dcf0230 100644
--- a/libraries/redis-wrapper/test/unit/src/test.js
+++ b/libraries/redis-wrapper/test/unit/src/test.js
@@ -6,8 +6,8 @@
*/
require('chai').should()
const SandboxedModule = require('sandboxed-module')
-const assert = require('assert')
-const path = require('path')
+const assert = require('node:assert')
+const path = require('node:path')
const sinon = require('sinon')
const modulePath = path.join(__dirname, './../../../index.js')
const redisLockerModulePath = path.join(__dirname, './../../../RedisLocker.js')
diff --git a/libraries/settings/.dockerignore b/libraries/settings/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/settings/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/settings/.gitignore b/libraries/settings/.gitignore
deleted file mode 100644
index 06d8e1ddb2..0000000000
--- a/libraries/settings/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/.npmrc
-/node_modules
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/libraries/settings/.nvmrc b/libraries/settings/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/settings/.nvmrc
+++ b/libraries/settings/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/settings/Settings.js b/libraries/settings/Settings.js
index 02f5af763c..3a5f31c33c 100644
--- a/libraries/settings/Settings.js
+++ b/libraries/settings/Settings.js
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const { merge } = require('./merge')
const CWD = process.cwd()
diff --git a/libraries/settings/buildscript.txt b/libraries/settings/buildscript.txt
index 95c754b5e3..9c7632f23f 100644
--- a/libraries/settings/buildscript.txt
+++ b/libraries/settings/buildscript.txt
@@ -1,10 +1,10 @@
settings
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/settings/package.json b/libraries/settings/package.json
index c7d049098f..5ddb514613 100644
--- a/libraries/settings/package.json
+++ b/libraries/settings/package.json
@@ -15,7 +15,7 @@
"types:check": "tsc --noEmit"
},
"devDependencies": {
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
diff --git a/libraries/stream-utils/.dockerignore b/libraries/stream-utils/.dockerignore
deleted file mode 100644
index c2658d7d1b..0000000000
--- a/libraries/stream-utils/.dockerignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/libraries/stream-utils/.gitignore b/libraries/stream-utils/.gitignore
deleted file mode 100644
index edb0f85350..0000000000
--- a/libraries/stream-utils/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/libraries/stream-utils/.nvmrc b/libraries/stream-utils/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/libraries/stream-utils/.nvmrc
+++ b/libraries/stream-utils/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/libraries/stream-utils/buildscript.txt b/libraries/stream-utils/buildscript.txt
index ac2155c1d1..5af61cc683 100644
--- a/libraries/stream-utils/buildscript.txt
+++ b/libraries/stream-utils/buildscript.txt
@@ -1,10 +1,10 @@
stream-utils
--dependencies=None
---docker-repos=gcr.io/overleaf-ops
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
--is-library=True
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/libraries/stream-utils/index.js b/libraries/stream-utils/index.js
index ac3e6238a1..7719d409a4 100644
--- a/libraries/stream-utils/index.js
+++ b/libraries/stream-utils/index.js
@@ -1,8 +1,8 @@
-const { Writable, Readable, PassThrough, Transform } = require('stream')
+const { Writable, Readable, PassThrough, Transform } = require('node:stream')
/**
* A writable stream that stores all data written to it in a node Buffer.
- * @extends stream.Writable
+ * @extends Writable
* @example
* const { WritableBuffer } = require('@overleaf/stream-utils')
* const bufferStream = new WritableBuffer()
@@ -43,7 +43,7 @@ class WritableBuffer extends Writable {
/**
* A readable stream created from a string.
- * @extends stream.Readable
+ * @extends Readable
* @example
* const { ReadableString } = require('@overleaf/stream-utils')
* const stringStream = new ReadableString('hello world')
@@ -66,7 +66,7 @@ class SizeExceededError extends Error {}
/**
* Limited size stream which will emit a SizeExceededError if the size is exceeded
- * @extends stream.Transform
+ * @extends Transform
*/
class LimitedStream extends Transform {
constructor(maxSize) {
@@ -93,7 +93,7 @@ class AbortError extends Error {}
/**
* TimeoutStream which will emit an AbortError if it exceeds a user specified timeout
- * @extends stream.PassThrough
+ * @extends PassThrough
*/
class TimeoutStream extends PassThrough {
constructor(timeout) {
@@ -111,7 +111,7 @@ class TimeoutStream extends PassThrough {
/**
* LoggerStream which will call the provided logger function when the stream exceeds a user specified limit. It will call the provided function again when flushing the stream and it exceeded the user specified limit before.
- * @extends stream.Transform
+ * @extends Transform
*/
class LoggerStream extends Transform {
/**
@@ -145,6 +145,24 @@ class LoggerStream extends Transform {
}
}
+class MeteredStream extends Transform {
+ #Metrics
+ #metric
+ #labels
+
+ constructor(Metrics, metric, labels) {
+ super()
+ this.#Metrics = Metrics
+ this.#metric = metric
+ this.#labels = labels
+ }
+
+ _transform(chunk, encoding, callback) {
+ this.#Metrics.count(this.#metric, chunk.byteLength, 1, this.#labels)
+ callback(null, chunk)
+ }
+}
+
// Export our classes
module.exports = {
@@ -153,6 +171,7 @@ module.exports = {
LoggerStream,
LimitedStream,
TimeoutStream,
+ MeteredStream,
SizeExceededError,
AbortError,
}
diff --git a/libraries/stream-utils/package.json b/libraries/stream-utils/package.json
index 83f03146d7..686084a5e6 100644
--- a/libraries/stream-utils/package.json
+++ b/libraries/stream-utils/package.json
@@ -18,7 +18,7 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
diff --git a/package-lock.json b/package-lock.json
index 146de00e0e..d9d8285618 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "overleaf",
- "lockfileVersion": 2,
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
@@ -12,6 +12,7 @@
"services/analytics",
"services/chat",
"services/clsi",
+ "services/clsi-cache",
"services/clsi-perf",
"services/contacts",
"services/docstore",
@@ -26,20 +27,22 @@
"services/project-history",
"services/real-time",
"services/references",
- "services/spelling",
"services/templates",
"services/third-party-datastore",
"services/third-party-references",
"services/tpdsworker",
- "services/web"
+ "services/web",
+ "tools/saas-e2e"
],
"dependencies": {
"patch-package": "^8.0.0"
},
"devDependencies": {
+ "@types/chai": "^4.3.0",
+ "@types/chai-as-promised": "^7.1.8",
"@types/mocha": "^10.0.6",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
- "@typescript-eslint/parser": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.30.1",
+ "@typescript-eslint/parser": "^8.30.1",
"eslint": "^8.15.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0",
@@ -48,11 +51,15 @@
"eslint-plugin-cypress": "^2.15.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-mocha": "^10.1.0",
- "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-n": "^15.7.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^6.0.0",
- "prettier": "3.3.3",
- "typescript": "^5.5.4"
+ "eslint-plugin-unicorn": "^56.0.0",
+ "prettier": "3.6.2",
+ "typescript": "^5.8.3"
+ },
+ "engines": {
+ "npm": "11.4.2"
}
},
"jobs/mirror-documentation": {
@@ -90,7 +97,7 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"typescript": "^5.0.4"
}
@@ -104,7 +111,7 @@
"lodash": "^4.17.21"
},
"devDependencies": {
- "@typescript-eslint/parser": "^6.7.5"
+ "@typescript-eslint/parser": "^8.30.1"
}
},
"libraries/eslint-plugin/node_modules/@typescript-eslint/parser": {
@@ -173,8 +180,8 @@
"body-parser": "^1.20.3",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "mocha": "^10.2.0",
+ "express": "^4.21.2",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -186,12 +193,11 @@
"@google-cloud/logging-bunyan": "^5.1.0",
"@overleaf/fetch-utils": "*",
"@overleaf/o-error": "*",
- "@sentry/node": "^6.13.2",
"bunyan": "^1.8.14"
},
"devDependencies": {
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
@@ -206,7 +212,7 @@
"version": "4.2.0",
"dependencies": {
"@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
- "@google-cloud/profiler": "^6.0.0",
+ "@google-cloud/profiler": "^6.0.3",
"@opentelemetry/api": "^1.4.1",
"@opentelemetry/auto-instrumentations-node": "^0.39.1",
"@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
@@ -220,7 +226,7 @@
"devDependencies": {
"bunyan": "^1.0.0",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
@@ -229,6 +235,15 @@
"@overleaf/logger": "*"
}
},
+ "libraries/metrics/node_modules/@opentelemetry/api": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"libraries/metrics/node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
@@ -237,6 +252,23 @@
"node": ">=6"
}
},
+ "libraries/mongo-utils": {
+ "name": "@overleaf/mongo-utils",
+ "version": "0.0.1",
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "mongodb": "6.12.0",
+ "mongodb-legacy": "6.1.3"
+ },
+ "devDependencies": {
+ "chai": "^4.3.6",
+ "mocha": "^11.1.0",
+ "sandboxed-module": "^2.0.4",
+ "sinon": "^9.2.4",
+ "sinon-chai": "^3.7.0",
+ "typescript": "^5.0.4"
+ }
+ },
"libraries/o-error": {
"name": "@overleaf/o-error",
"version": "3.4.0",
@@ -245,7 +277,7 @@
"@types/chai": "^4.3.0",
"@types/node": "^18.17.4",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -258,7 +290,8 @@
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
"@overleaf/o-error": "*",
- "aws-sdk": "^2.718.0",
+ "@overleaf/stream-utils": "*",
+ "aws-sdk": "^2.1691.0",
"fast-crc32c": "overleaf/node-fast-crc32c#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51",
"glob": "^7.1.6",
"range-parser": "^1.2.1",
@@ -267,74 +300,42 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"mock-fs": "^5.2.0",
- "mongodb": "^6.1.0",
+ "mongodb": "6.12.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
"typescript": "^5.0.4"
}
},
- "libraries/object-persistor/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
+ "libraries/object-persistor/node_modules/aws-sdk": {
+ "version": "2.1691.0",
+ "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1691.0.tgz",
+ "integrity": "sha512-/F2YC+DlsY3UBM2Bdnh5RLHOPNibS/+IcjUuhP8XuctyrN+MlL+fWDAiela32LTDk7hMy4rx8MTgvbJ+0blO5g==",
+ "hasInstallScript": true,
"dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
+ "buffer": "4.9.2",
+ "events": "1.1.1",
+ "ieee754": "1.1.13",
+ "jmespath": "0.16.0",
+ "querystring": "0.2.0",
+ "sax": "1.2.1",
+ "url": "0.10.3",
+ "util": "^0.12.4",
+ "uuid": "8.0.0",
+ "xml2js": "0.6.2"
},
"engines": {
- "node": ">=12"
+ "node": ">= 10.0.0"
}
},
- "libraries/object-persistor/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dev": true,
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
+ "libraries/object-persistor/node_modules/uuid": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
+ "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
},
"libraries/overleaf-editor-core": {
@@ -351,7 +352,7 @@
"@types/check-types": "^7.3.7",
"@types/path-browserify": "^1.0.2",
"chai": "^3.3.0",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
}
@@ -406,7 +407,7 @@
"license": "Proprietary",
"devDependencies": {
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -420,7 +421,7 @@
"devDependencies": {
"chai": "^4.3.10",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -472,7 +473,7 @@
"name": "@overleaf/ranges-tracker",
"devDependencies": {
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -488,7 +489,7 @@
"@overleaf/logger": "*",
"@overleaf/o-error": "*",
"chai": "^4.3.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
@@ -503,7 +504,7 @@
"name": "@overleaf/settings",
"version": "3.0.0",
"devDependencies": {
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -514,17 +515,16 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "engines": {
- "node": ">=0.10.0"
- }
+ "node_modules/@adobe/css-tools": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz",
+ "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@ampproject/remapping": {
"version": "2.2.1",
@@ -610,6 +610,7 @@
"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
"integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/util": "^3.0.0",
"@aws-sdk/types": "^3.222.0",
@@ -620,13 +621,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-crypto/ie11-detection": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
"integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^1.11.1"
}
@@ -635,13 +638,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-crypto/sha256-browser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
"integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/ie11-detection": "^3.0.0",
"@aws-crypto/sha256-js": "^3.0.0",
@@ -657,13 +662,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-crypto/sha256-js": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
"integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/util": "^3.0.0",
"@aws-sdk/types": "^3.222.0",
@@ -674,13 +681,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-crypto/supports-web-crypto": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
"integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^1.11.1"
}
@@ -689,13 +698,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-crypto/util": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
"integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "^3.222.0",
"@aws-sdk/util-utf8-browser": "^3.0.0",
@@ -706,13 +717,15 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/@aws-sdk/client-cognito-identity": {
"version": "3.363.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.363.0.tgz",
"integrity": "sha512-tsJzgBSCpna85IVsuS7FBIK9wkSl7fs8TJ/QzapIgu8rKss0ySHVO6TeMVAdw2BvaQl7CxU9c3PosjhLWHu6KQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -760,6 +773,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz",
"integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -804,6 +818,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz",
"integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -848,6 +863,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz",
"integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@@ -896,6 +912,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.363.0.tgz",
"integrity": "sha512-5x42JvqEsBUrm6/qdf0WWe4mlmJjPItxamQhRjuOzeQD/BxsA2W5VS/7n0Ws0e27DNhlnUErcIJd+bBy6j1fqA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.363.0",
"@aws-sdk/types": "3.357.0",
@@ -912,6 +929,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz",
"integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/property-provider": "^1.0.1",
@@ -927,6 +945,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz",
"integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/credential-provider-env": "3.363.0",
"@aws-sdk/credential-provider-process": "3.363.0",
@@ -948,6 +967,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz",
"integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/credential-provider-env": "3.363.0",
"@aws-sdk/credential-provider-ini": "3.363.0",
@@ -970,6 +990,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz",
"integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/property-provider": "^1.0.1",
@@ -986,6 +1007,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz",
"integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/client-sso": "3.363.0",
"@aws-sdk/token-providers": "3.363.0",
@@ -1004,6 +1026,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz",
"integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/property-provider": "^1.0.1",
@@ -1019,6 +1042,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.363.0.tgz",
"integrity": "sha512-hVa1DdYasnLud2EKjDAlDHiV/+H/Zq52chHU00c/R8XwPu1s0kZX3NMmlt0D2HhYqC1mUwtdmE58Jra2POviQQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.363.0",
"@aws-sdk/client-sso": "3.363.0",
@@ -1045,6 +1069,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz",
"integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/protocol-http": "^1.1.0",
@@ -1060,6 +1085,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz",
"integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/types": "^1.1.0",
@@ -1074,6 +1100,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz",
"integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/protocol-http": "^1.1.0",
@@ -1089,6 +1116,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz",
"integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/middleware-signing": "3.363.0",
"@aws-sdk/types": "3.357.0",
@@ -1104,6 +1132,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz",
"integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/property-provider": "^1.0.1",
@@ -1122,6 +1151,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz",
"integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@aws-sdk/util-endpoints": "3.357.0",
@@ -1138,6 +1168,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz",
"integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/client-sso-oidc": "3.363.0",
"@aws-sdk/types": "3.357.0",
@@ -1155,6 +1186,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz",
"integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -1167,6 +1199,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz",
"integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"tslib": "^2.5.0"
@@ -1180,6 +1213,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz",
"integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -1192,6 +1226,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz",
"integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/types": "^1.1.0",
@@ -1204,6 +1239,7 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz",
"integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-sdk/types": "3.357.0",
"@smithy/node-config-provider": "^1.0.1",
@@ -1227,15 +1263,17 @@
"resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
"integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.3.1"
}
},
"node_modules/@babel/cli": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz",
- "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.0.tgz",
+ "integrity": "sha512-bZfxn8DRxwiVzDO5CEeV+7IqXeCkzI4yYnrQbpwjT76CUyossQc6RYE7n+xfm0/2k40lPaCpW0FhxYs7EBAetw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"commander": "^6.2.0",
@@ -1254,7 +1292,7 @@
},
"optionalDependencies": {
"@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
- "chokidar": "^3.4.0"
+ "chokidar": "^3.6.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
@@ -1276,12 +1314,14 @@
"dev": true
},
"node_modules/@babel/code-frame": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
- "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.24.7",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
},
"engines": {
@@ -1289,30 +1329,32 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
- "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
- "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-module-transforms": "^7.25.2",
- "@babel/helpers": "^7.25.0",
- "@babel/parser": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.2",
- "@babel/types": "^7.25.2",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -1334,40 +1376,30 @@
"dev": true
},
"node_modules/@babel/generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
- "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
+ "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.0",
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
+ "jsesc": "^3.0.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
- "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
- "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
- "dev": true,
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1387,14 +1419,15 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
- "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.25.2",
- "@babel/helper-validator-option": "^7.24.8",
- "browserslist": "^4.23.1",
+ "@babel/compat-data": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
@@ -1403,17 +1436,18 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
- "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz",
+ "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/traverse": "^7.25.0",
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.27.0",
"semver": "^6.3.1"
},
"engines": {
@@ -1424,13 +1458,14 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
- "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz",
+ "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "regexpu-core": "^5.3.1",
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
"semver": "^6.3.1"
},
"engines": {
@@ -1441,10 +1476,11 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz",
+ "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1457,41 +1493,43 @@
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
- "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.24.8",
- "@babel/types": "^7.24.8"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
- "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
- "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-simple-access": "^7.24.7",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.2"
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1501,35 +1539,38 @@
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
- "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.24.7"
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
- "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
- "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-wrap-function": "^7.25.0",
- "@babel/traverse": "^7.25.0"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1539,14 +1580,15 @@
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
- "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/traverse": "^7.25.0"
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -1555,105 +1597,83 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/helper-simple-access": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
- "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
- "dev": true,
- "dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
- "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
- "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
- "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
- "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
- "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.0",
- "@babel/types": "^7.25.0"
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
- "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
+ "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
- "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.24.7",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
- "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+ "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.25.2"
+ "@babel/types": "^7.27.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1663,13 +1683,14 @@
}
},
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
- "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.3"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1679,12 +1700,13 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
- "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1694,12 +1716,13 @@
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
- "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1709,14 +1732,15 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
- "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1726,13 +1750,14 @@
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
- "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.0"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1741,6 +1766,43 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+ "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.0-placeholder-for-preset-env.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
@@ -1753,37 +1815,13 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.9.tgz",
+ "integrity": "sha512-F3FVgxwamIRS3+kfjNaPARX0DSAiH1exrQUVajXiR34hkdA9eyK+8rJbnu55DQjKL/ayuXqjNr2HDXwBEMEtFQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1792,37 +1830,14 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
- "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1832,12 +1847,13 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
- "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1858,25 +1874,14 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
- "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -1885,42 +1890,6 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
@@ -1933,67 +1902,14 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
- "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2019,12 +1935,13 @@
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
- "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2034,15 +1951,15 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
- "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
+ "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-remap-async-to-generator": "^7.25.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/traverse": "^7.25.0"
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.26.8"
},
"engines": {
"node": ">=6.9.0"
@@ -2052,14 +1969,15 @@
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
- "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-remap-async-to-generator": "^7.24.7"
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2069,12 +1987,13 @@
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
- "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -2084,12 +2003,13 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
- "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz",
+ "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -2099,13 +2019,14 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
- "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2115,14 +2036,14 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
- "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2132,16 +2053,17 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
- "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/traverse": "^7.25.0",
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
"globals": "^11.1.0"
},
"engines": {
@@ -2152,13 +2074,14 @@
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
- "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/template": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2168,12 +2091,13 @@
}
},
"node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
- "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2183,13 +2107,14 @@
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
- "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2199,12 +2124,13 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
- "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2214,13 +2140,14 @@
}
},
"node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
- "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2230,13 +2157,13 @@
}
},
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
- "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2246,13 +2173,13 @@
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
- "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2262,13 +2189,29 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
- "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz",
+ "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-flow": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2278,13 +2221,14 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
- "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz",
+ "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2294,14 +2238,15 @@
}
},
"node_modules/@babel/plugin-transform-function-name": {
- "version": "7.25.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
- "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.1"
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2311,13 +2256,13 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
- "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2327,12 +2272,13 @@
}
},
"node_modules/@babel/plugin-transform-literals": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
- "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2342,13 +2288,13 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
- "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2358,12 +2304,13 @@
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
- "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2373,13 +2320,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
- "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2389,14 +2337,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
- "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-simple-access": "^7.24.7"
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2406,15 +2354,16 @@
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
- "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.0"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2424,13 +2373,14 @@
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
- "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2440,13 +2390,14 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
- "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2456,12 +2407,13 @@
}
},
"node_modules/@babel/plugin-transform-new-target": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
- "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2471,13 +2423,13 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
- "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
+ "version": "7.26.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -2487,13 +2439,13 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
- "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2518,15 +2470,15 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
- "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.7"
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2536,13 +2488,14 @@
}
},
"node_modules/@babel/plugin-transform-object-super": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
- "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-replace-supers": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2552,13 +2505,13 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
- "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2568,14 +2521,14 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
- "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2585,12 +2538,13 @@
}
},
"node_modules/@babel/plugin-transform-parameters": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
- "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2600,13 +2554,14 @@
}
},
"node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
- "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2616,15 +2571,15 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
- "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2634,12 +2589,13 @@
}
},
"node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
- "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2664,12 +2620,13 @@
}
},
"node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
- "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2695,16 +2652,17 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz",
- "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/plugin-syntax-jsx": "^7.24.7",
- "@babel/types": "^7.25.2"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2714,12 +2672,45 @@
}
},
"node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
- "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.24.7"
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2729,13 +2720,14 @@
}
},
"node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
- "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2745,12 +2737,13 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
- "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz",
+ "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
+ "@babel/helper-plugin-utils": "^7.26.5",
"regenerator-transform": "^0.15.2"
},
"engines": {
@@ -2760,13 +2753,31 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
- "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2776,12 +2787,13 @@
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
- "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2791,13 +2803,14 @@
}
},
"node_modules/@babel/plugin-transform-spread": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
- "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2807,12 +2820,13 @@
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
- "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2822,12 +2836,13 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
- "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
+ "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -2837,12 +2852,13 @@
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
- "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz",
+ "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.8"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -2852,16 +2868,17 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz",
- "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz",
+ "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-create-class-features-plugin": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-syntax-typescript": "^7.24.7"
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.27.0",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2871,12 +2888,13 @@
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
- "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2886,13 +2904,14 @@
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
- "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2902,13 +2921,14 @@
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
- "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2918,13 +2938,14 @@
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
- "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2953,93 +2974,80 @@
"hasInstallScript": true
},
"node_modules/@babel/preset-env": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
- "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz",
+ "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.25.2",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-option": "^7.24.8",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
+ "@babel/compat-data": "^7.26.8",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.24.7",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.24.7",
- "@babel/plugin-transform-async-generator-functions": "^7.25.0",
- "@babel/plugin-transform-async-to-generator": "^7.24.7",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
- "@babel/plugin-transform-block-scoping": "^7.25.0",
- "@babel/plugin-transform-class-properties": "^7.24.7",
- "@babel/plugin-transform-class-static-block": "^7.24.7",
- "@babel/plugin-transform-classes": "^7.25.0",
- "@babel/plugin-transform-computed-properties": "^7.24.7",
- "@babel/plugin-transform-destructuring": "^7.24.8",
- "@babel/plugin-transform-dotall-regex": "^7.24.7",
- "@babel/plugin-transform-duplicate-keys": "^7.24.7",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
- "@babel/plugin-transform-dynamic-import": "^7.24.7",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
- "@babel/plugin-transform-export-namespace-from": "^7.24.7",
- "@babel/plugin-transform-for-of": "^7.24.7",
- "@babel/plugin-transform-function-name": "^7.25.1",
- "@babel/plugin-transform-json-strings": "^7.24.7",
- "@babel/plugin-transform-literals": "^7.25.2",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
- "@babel/plugin-transform-member-expression-literals": "^7.24.7",
- "@babel/plugin-transform-modules-amd": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.8",
- "@babel/plugin-transform-modules-systemjs": "^7.25.0",
- "@babel/plugin-transform-modules-umd": "^7.24.7",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
- "@babel/plugin-transform-new-target": "^7.24.7",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
- "@babel/plugin-transform-numeric-separator": "^7.24.7",
- "@babel/plugin-transform-object-rest-spread": "^7.24.7",
- "@babel/plugin-transform-object-super": "^7.24.7",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.8",
- "@babel/plugin-transform-parameters": "^7.24.7",
- "@babel/plugin-transform-private-methods": "^7.24.7",
- "@babel/plugin-transform-private-property-in-object": "^7.24.7",
- "@babel/plugin-transform-property-literals": "^7.24.7",
- "@babel/plugin-transform-regenerator": "^7.24.7",
- "@babel/plugin-transform-reserved-words": "^7.24.7",
- "@babel/plugin-transform-shorthand-properties": "^7.24.7",
- "@babel/plugin-transform-spread": "^7.24.7",
- "@babel/plugin-transform-sticky-regex": "^7.24.7",
- "@babel/plugin-transform-template-literals": "^7.24.7",
- "@babel/plugin-transform-typeof-symbol": "^7.24.8",
- "@babel/plugin-transform-unicode-escapes": "^7.24.7",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.26.8",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.26.5",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.26.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.26.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.26.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.26.8",
+ "@babel/plugin-transform-typeof-symbol": "^7.26.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.4",
+ "babel-plugin-polyfill-corejs3": "^0.11.0",
"babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.37.1",
+ "core-js-compat": "^3.40.0",
"semver": "^6.3.1"
},
"engines": {
@@ -3049,6 +3057,23 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/preset-flow": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.9.tgz",
+ "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-flow-strip-types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/preset-modules": {
"version": "0.1.6-no-external-plugins",
"resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
@@ -3064,17 +3089,18 @@
}
},
"node_modules/@babel/preset-react": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
- "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz",
+ "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-validator-option": "^7.24.7",
- "@babel/plugin-transform-react-display-name": "^7.24.7",
- "@babel/plugin-transform-react-jsx": "^7.24.7",
- "@babel/plugin-transform-react-jsx-development": "^7.24.7",
- "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -3084,16 +3110,17 @@
}
},
"node_modules/@babel/preset-typescript": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz",
- "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz",
+ "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-validator-option": "^7.24.7",
- "@babel/plugin-syntax-jsx": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.7",
- "@babel/plugin-transform-typescript": "^7.24.7"
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.26.3",
+ "@babel/plugin-transform-typescript": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
@@ -3103,10 +3130,11 @@
}
},
"node_modules/@babel/register": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
- "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz",
+ "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"clone-deep": "^4.0.1",
"find-cache-dir": "^2.0.0",
@@ -3121,16 +3149,11 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
- "dev": true
- },
"node_modules/@babel/runtime": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
- "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
+ "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
+ "license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -3138,25 +3161,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/runtime-corejs2": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.16.7.tgz",
- "integrity": "sha512-ec0BM0J/9M5Cncha++AlgvvDlk+uM+m6f7K0t74ClcYzsE8LgX4RstRreksMSCI82o3LJS//UswmA0pUWkJpqg==",
- "dependencies": {
- "core-js": "^2.6.5",
- "regenerator-runtime": "^0.13.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/runtime-corejs2/node_modules/core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
- "hasInstallScript": true
- },
"node_modules/@babel/runtime-corejs3": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz",
@@ -3175,30 +3179,32 @@
"integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
},
"node_modules/@babel/template": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
- "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+ "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/parser": "^7.25.0",
- "@babel/types": "^7.25.0"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
- "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
+ "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.2",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.27.0",
+ "@babel/parser": "^7.27.0",
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -3207,23 +3213,23 @@
}
},
"node_modules/@babel/types": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
- "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+ "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@base2/pretty-print-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz",
- "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==",
- "dev": true
+ "node_modules/@balena/dockerignore": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz",
+ "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==",
+ "license": "Apache-2.0"
},
"node_modules/@bcoe/v8-coverage": {
"version": "0.2.3",
@@ -3232,28 +3238,24 @@
"dev": true
},
"node_modules/@codemirror/autocomplete": {
- "version": "6.18.0",
- "resolved": "git+ssh://git@github.com/overleaf/codemirror-autocomplete.git#d69a03afc6e29a58eb267084a1e3b5a99ff72cc2",
- "integrity": "sha512-nks52ChYx6ZrwsJA+0kNK3u2Etylgq9KnxVzT27mzbVprddnv2AHzv9HhX2gpHZbIKE1kalYxMHO9GalyTyrnQ==",
+ "version": "6.18.4",
+ "resolved": "git+ssh://git@github.com/overleaf/codemirror-autocomplete.git#6445cd056671c98d12d1c597ba705e11327ec4c5",
+ "integrity": "sha512-NOpHncgkcZ2w92bO+H6mIzcSToAKt1fWQRImKnDsNbYvp4X/638d6SOuEoE7pSZ7tryJbqKDrE3Zs6nVIXACUA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0"
- },
- "peerDependencies": {
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "@lezer/common": "^1.0.0"
}
},
"node_modules/@codemirror/commands": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz",
- "integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==",
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz",
+ "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.4.0",
@@ -3262,52 +3264,59 @@
}
},
"node_modules/@codemirror/lang-css": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.0.0.tgz",
- "integrity": "sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz",
+ "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
- "@lezer/css": "^1.0.0"
+ "@lezer/common": "^1.0.2",
+ "@lezer/css": "^1.1.7"
}
},
"node_modules/@codemirror/lang-html": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.1.0.tgz",
- "integrity": "sha512-gA7NmJxqvnhwza05CvR7W/39Ap9r/4Vs9uiC0IeFYo1hSlJzc/8N6Evviz6vTW1x8SpHcRYyqKOf6rpl6LfWtg==",
+ "version": "6.4.9",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz",
+ "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
"@codemirror/lang-css": "^6.0.0",
"@codemirror/lang-javascript": "^6.0.0",
- "@codemirror/language": "^6.0.0",
+ "@codemirror/language": "^6.4.0",
"@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0",
- "@lezer/html": "^1.0.0"
+ "@lezer/css": "^1.1.0",
+ "@lezer/html": "^1.3.0"
}
},
"node_modules/@codemirror/lang-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.0.1.tgz",
- "integrity": "sha512-kjGbBEosl+ozDU5ruDV48w4v3H6KECTFiDjqMLT0KhVwESPfv3wOvnDrTT0uaMOg3YRGnBWsyiIoKHl/tNWWDg==",
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz",
+ "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
- "@codemirror/language": "^6.0.0",
+ "@codemirror/language": "^6.6.0",
"@codemirror/lint": "^6.0.0",
"@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
+ "@codemirror/view": "^6.17.0",
"@lezer/common": "^1.0.0",
"@lezer/javascript": "^1.0.0"
}
},
"node_modules/@codemirror/lang-markdown": {
- "version": "6.2.5",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.2.5.tgz",
- "integrity": "sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==",
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.3.2.tgz",
+ "integrity": "sha512-c/5MYinGbFxYl4itE9q/rgN/sMTjOr8XL5OWnC+EaRMLfCbVUmmubTJfdgpfcSS2SCaT7b+Q+xi3l6CgoE+BsA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.7.1",
"@codemirror/lang-html": "^6.0.0",
@@ -3319,10 +3328,11 @@
}
},
"node_modules/@codemirror/language": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
- "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz",
+ "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.23.0",
@@ -3333,20 +3343,21 @@
}
},
"node_modules/@codemirror/lint": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz",
- "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==",
+ "version": "6.8.5",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz",
+ "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
+ "@codemirror/view": "^6.35.0",
"crelt": "^1.0.5"
}
},
"node_modules/@codemirror/search": {
- "version": "6.5.4",
- "resolved": "git+ssh://git@github.com/overleaf/codemirror-search.git#29f7a871969ad64b89341bacbe5d46dda02eee12",
- "integrity": "sha512-aMLQYaC/xv/kNkhp49jx24APK4fvxjypcgS7GfFUoLdhx39fDMw3Z4EGl56NDMFCdEJhG8yXk+hyvU+pxEQSfA==",
+ "version": "6.5.8",
+ "resolved": "git+ssh://git@github.com/overleaf/codemirror-search.git#04380a528c339cd4b78fb10b3ef017f657ec17bd",
+ "integrity": "sha512-G2sM4Rfnbb8S59HPgLXa2NWS4a9TDf+3cKos/58JPtDQtbBCcHz1c8Oy3x5PhQ+vJS+Mr282WLG8PE/MbhE0eg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3356,18 +3367,23 @@
}
},
"node_modules/@codemirror/state": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
- "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==",
- "dev": true
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz",
+ "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@marijn/find-cluster-break": "^1.0.0"
+ }
},
"node_modules/@codemirror/view": {
- "version": "6.32.0",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.32.0.tgz",
- "integrity": "sha512-AgVNvED2QTsZp5e3syoHLsrWtwJFYWdx1Vr/m3f4h1ATQz0ax60CfXF3Htdmk69k2MlYZw8gXesnQdHtzyVmAw==",
+ "version": "6.36.8",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.8.tgz",
+ "integrity": "sha512-yoRo4f+FdnD01fFt4XpfpMCcCAo9QvZOtbrXExn4SqzH32YC6LgzqxfLZw/r6Ge65xyY03mK/UfUqrVw1gFiFg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@codemirror/state": "^6.4.0",
+ "@codemirror/state": "^6.5.0",
"style-mod": "^4.1.0",
"w3c-keyname": "^2.2.4"
}
@@ -4116,6 +4132,90 @@
"postcss-selector-parser": "^6.0.10"
}
},
+ "node_modules/@customerio/cdp-analytics-core": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@customerio/cdp-analytics-core/-/cdp-analytics-core-0.3.0.tgz",
+ "integrity": "sha512-5BJ8VgUkLT2YuDZ7Dr+oWnpFNObF5tgfj1hU/E01+kxUAvzUoOiLNL6NjKy9AeZYIFuzqgzYCfmR/1mGYdngsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@lukeed/uuid": "^2.0.0",
+ "dset": "^3.1.2",
+ "tslib": "^2.4.1"
+ }
+ },
+ "node_modules/@customerio/cdp-analytics-node": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@customerio/cdp-analytics-node/-/cdp-analytics-node-0.3.0.tgz",
+ "integrity": "sha512-p8WCtj+O3JoOooaFeENQzGPD8SDJ8x7z3P6s6xHtIaxsYjPFVfFVRV1avJQb3YTA+Z4Ak5h1oK/zayTIBJA6pQ==",
+ "dependencies": {
+ "@customerio/cdp-analytics-core": "0.3.0",
+ "@lukeed/uuid": "^2.0.0",
+ "buffer": "^6.0.3",
+ "node-fetch": "^2.6.7",
+ "tslib": "^2.4.1",
+ "uuid": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@customerio/cdp-analytics-node/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/@customerio/cdp-analytics-node/node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@customerio/cdp-analytics-node/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/@cypress/request": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
@@ -4261,391 +4361,453 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz",
+ "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz",
+ "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz",
+ "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz",
+ "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz",
+ "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz",
+ "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz",
+ "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz",
+ "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz",
+ "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz",
+ "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz",
+ "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz",
+ "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==",
"cpu": [
"loong64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz",
+ "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==",
"cpu": [
"mips64el"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz",
+ "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==",
"cpu": [
"ppc64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz",
+ "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==",
"cpu": [
"riscv64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz",
+ "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==",
"cpu": [
"s390x"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz",
+ "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz",
+ "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==",
"cpu": [
- "x64"
+ "arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz",
+ "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz",
+ "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz",
+ "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz",
+ "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz",
+ "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz",
+ "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz",
+ "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.3.0"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
- "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -4698,9 +4860,10 @@
}
},
"node_modules/@eslint/js": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
- "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
@@ -4726,17 +4889,6 @@
"node": ">=10"
}
},
- "node_modules/@google-cloud/bigquery/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
"node_modules/@google-cloud/bigquery/node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -4764,17 +4916,6 @@
"node": ">=10"
}
},
- "node_modules/@google-cloud/common/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
"node_modules/@google-cloud/logging": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.1.0.tgz",
@@ -4931,219 +5072,202 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/@google-cloud/logging-min": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/logging-min/-/logging-min-10.4.0.tgz",
- "integrity": "sha512-TcblDYAATO9hHcDcWYFh+vqt3pAV7Qddaih1JK3cpkzLa+BWjD5gAVAWww8W9Wr5yxOX+8CkssanH/xSS4n76Q==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/logging-min/-/logging-min-11.2.0.tgz",
+ "integrity": "sha512-o1mwzi1+9NMEjwYZJ0X3tK64obf9PzPVBAhzEJv65L0h7jVl3Fw7GswtsMUkdUvZexf96vAvlZZMvXB9jAIW2Q==",
+ "license": "Apache-2.0",
"dependencies": {
- "@google-cloud/common": "^4.0.0",
- "@google-cloud/paginator": "^4.0.0",
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
+ "@google-cloud/common": "^5.0.0",
+ "@google-cloud/paginator": "^5.0.0",
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
+ "@opentelemetry/api": "^1.7.0",
"arrify": "^2.0.1",
"dot-prop": "^6.0.0",
"eventid": "^2.0.0",
"extend": "^3.0.2",
- "gcp-metadata": "^4.0.0",
- "google-auth-library": "^8.0.2",
- "google-gax": "^3.5.2",
+ "gcp-metadata": "^6.0.0",
+ "google-auth-library": "^9.0.0",
+ "google-gax": "^4.0.3",
"on-finished": "^2.3.0",
"pumpify": "^2.0.1",
"stream-events": "^1.0.5",
"uuid": "^9.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
}
},
"node_modules/@google-cloud/logging-min/node_modules/@google-cloud/common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
- "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
+ "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
+ "@google-cloud/projectify": "^4.0.0",
+ "@google-cloud/promisify": "^4.0.0",
"arrify": "^2.0.1",
"duplexify": "^4.1.1",
- "ent": "^2.2.0",
"extend": "^3.0.2",
- "google-auth-library": "^8.0.2",
- "retry-request": "^5.0.0",
- "teeny-request": "^8.0.0"
+ "google-auth-library": "^9.0.0",
+ "html-entities": "^2.5.2",
+ "retry-request": "^7.0.0",
+ "teeny-request": "^9.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
}
},
"node_modules/@google-cloud/logging-min/node_modules/@google-cloud/paginator": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz",
- "integrity": "sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
+ "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
+ "license": "Apache-2.0",
"dependencies": {
"arrify": "^2.0.0",
"extend": "^3.0.2"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
}
},
"node_modules/@google-cloud/logging-min/node_modules/@google-cloud/projectify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
- "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
+ "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
}
},
"node_modules/@google-cloud/logging-min/node_modules/@google-cloud/promisify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
- "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.1.0.tgz",
+ "integrity": "sha512-G/FQx5cE/+DqBbOpA5jKsegGwdPniU6PuIEMt+qxWgFxvxuFOzVmp6zYchtYuwAWV5/8Dgs0yAmjvNZv3uXLQg==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
+ "node_modules/@google-cloud/logging-min/node_modules/@opentelemetry/api": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/google-auth-library": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz",
- "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==",
+ "node_modules/@google-cloud/logging-min/node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@google-cloud/logging-min/node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.3.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=14"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/google-auth-library/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+ "node_modules/@google-cloud/logging-min/node_modules/gaxios/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
"dependencies": {
- "gaxios": "^5.0.0",
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@google-cloud/logging-min/node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
"json-bigint": "^1.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/google-gax": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz",
- "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==",
+ "node_modules/@google-cloud/logging-min/node_modules/google-auth-library": {
+ "version": "9.15.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+ "license": "Apache-2.0",
"dependencies": {
- "@grpc/grpc-js": "~1.8.0",
- "@grpc/proto-loader": "^0.7.0",
- "@types/long": "^4.0.0",
- "@types/rimraf": "^3.0.2",
- "abort-controller": "^3.0.0",
- "duplexify": "^4.0.0",
- "fast-text-encoding": "^1.0.3",
- "google-auth-library": "^8.0.2",
- "is-stream-ended": "^0.1.4",
- "node-fetch": "^2.6.1",
- "object-hash": "^3.0.0",
- "proto3-json-serializer": "^1.0.0",
- "protobufjs": "7.2.4",
- "protobufjs-cli": "1.1.1",
- "retry-request": "^5.0.0"
- },
- "bin": {
- "compileProtos": "build/tools/compileProtos.js",
- "minifyProtoJson": "build/tools/minify.js"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@google-cloud/logging-min/node_modules/google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "dependencies": {
- "node-forge": "^1.3.1"
- },
- "bin": {
- "gp12-pem": "build/src/bin/gp12-pem.js"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@google-cloud/logging-min/node_modules/gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "dependencies": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "gaxios": "^6.1.1",
+ "gcp-metadata": "^6.1.0",
+ "gtoken": "^7.0.0",
"jws": "^4.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/@google-cloud/logging-min/node_modules/gtoken": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "gaxios": "^6.0.0",
+ "jws": "^4.0.0"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/@google-cloud/logging-min/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==",
- "engines": {
- "node": ">= 6"
+ "node": ">=14.0.0"
}
},
"node_modules/@google-cloud/logging-min/node_modules/retry-request": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
- "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
+ "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
+ "@types/request": "^2.48.8",
+ "extend": "^3.0.2",
+ "teeny-request": "^9.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14"
}
},
"node_modules/@google-cloud/logging-min/node_modules/teeny-request": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz",
- "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+ "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+ "license": "Apache-2.0",
"dependencies": {
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.1",
+ "node-fetch": "^2.6.9",
"stream-events": "^1.0.5",
"uuid": "^9.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14"
}
},
"node_modules/@google-cloud/logging-min/node_modules/uuid": {
@@ -5154,15 +5278,11 @@
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
+ "license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
- "node_modules/@google-cloud/logging-min/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
"node_modules/@google-cloud/logging/node_modules/@google-cloud/common": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
@@ -5237,17 +5357,6 @@
}
}
},
- "node_modules/@google-cloud/logging/node_modules/duplexify": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
- "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.2"
- }
- },
"node_modules/@google-cloud/logging/node_modules/gaxios": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
@@ -5396,18 +5505,6 @@
"@opentelemetry/semantic-conventions": "^1.0.0"
}
},
- "node_modules/@google-cloud/opentelemetry-resource-util/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@google-cloud/paginator": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz",
@@ -5421,22 +5518,24 @@
}
},
"node_modules/@google-cloud/profiler": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-6.0.0.tgz",
- "integrity": "sha512-EAxPbDiNRidAKOEnlUK3M+CcOlqG+REkUEZKirLtxFwzI/m7LmGqDzQvrVWTOSFSEYJ9qQRRnO+Q1osNGk3NUg==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-6.0.3.tgz",
+ "integrity": "sha512-Ey8li6Vc2CbfEzOTSZaqKolxPMGacxVUQuhChNT0Wi55a3nfImMiiuDgqYw1In/a9Q3Z62O7jUg2L8f1XwMN7Q==",
+ "license": "Apache-2.0",
"dependencies": {
"@google-cloud/common": "^5.0.0",
- "@google-cloud/logging-min": "^10.0.0",
+ "@google-cloud/logging-min": "^11.0.0",
+ "@google-cloud/promisify": "~4.0.0",
"@types/console-log-level": "^1.4.0",
"@types/semver": "^7.0.0",
"console-log-level": "^1.4.0",
"delay": "^5.0.0",
"extend": "^3.0.2",
"gcp-metadata": "^6.0.0",
- "parse-duration": "^1.0.0",
- "pprof": "3.2.1",
+ "ms": "^2.1.3",
+ "pprof": "4.0.0",
"pretty-ms": "^7.0.0",
- "protobufjs": "~7.2.4",
+ "protobufjs": "~7.4.0",
"semver": "^7.0.0",
"teeny-request": "^9.0.0"
},
@@ -5445,18 +5544,19 @@
}
},
"node_modules/@google-cloud/profiler/node_modules/@google-cloud/common": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.0.tgz",
- "integrity": "sha512-IsbTVr7Ag+04GMT87X738vDs85QU1rMvaesm2wEQrtTbZAR92tGmUQ8/D/kdnYgAi98Q4zmfhF+T8Xs/Lw4zAA==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
+ "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==",
+ "license": "Apache-2.0",
"dependencies": {
"@google-cloud/projectify": "^4.0.0",
"@google-cloud/promisify": "^4.0.0",
"arrify": "^2.0.1",
"duplexify": "^4.1.1",
- "ent": "^2.2.0",
"extend": "^3.0.2",
"google-auth-library": "^9.0.0",
- "retry-request": "^6.0.0",
+ "html-entities": "^2.5.2",
+ "retry-request": "^7.0.0",
"teeny-request": "^9.0.0"
},
"engines": {
@@ -5467,6 +5567,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
"integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=14.0.0"
}
@@ -5475,68 +5576,43 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
"integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=14"
}
},
"node_modules/@google-cloud/profiler/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
- "dependencies": {
- "debug": "^4.3.4"
- },
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "license": "MIT",
"engines": {
"node": ">= 14"
}
},
- "node_modules/@google-cloud/profiler/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@google-cloud/profiler/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
"node_modules/@google-cloud/profiler/node_modules/gaxios": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
- "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==",
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
"dependencies": {
"extend": "^3.0.2",
"https-proxy-agent": "^7.0.1",
"is-stream": "^2.0.0",
- "node-fetch": "^2.6.9"
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@google-cloud/profiler/node_modules/gaxios/node_modules/https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
@@ -5544,11 +5620,13 @@
}
},
"node_modules/@google-cloud/profiler/node_modules/gcp-metadata": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz",
- "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
"dependencies": {
- "gaxios": "^6.0.0",
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
"json-bigint": "^1.0.0"
},
"engines": {
@@ -5556,26 +5634,27 @@
}
},
"node_modules/@google-cloud/profiler/node_modules/google-auth-library": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz",
- "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==",
+ "version": "9.15.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+ "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+ "license": "Apache-2.0",
"dependencies": {
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
- "gaxios": "^6.0.0",
- "gcp-metadata": "^6.0.0",
+ "gaxios": "^6.1.1",
+ "gcp-metadata": "^6.1.0",
"gtoken": "^7.0.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
+ "jws": "^4.0.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@google-cloud/profiler/node_modules/gtoken": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz",
- "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+ "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+ "license": "MIT",
"dependencies": {
"gaxios": "^6.0.0",
"jws": "^4.0.0"
@@ -5584,41 +5663,49 @@
"node": ">=14.0.0"
}
},
- "node_modules/@google-cloud/profiler/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/@google-cloud/profiler/node_modules/protobufjs": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
+ "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "yallist": "^4.0.0"
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12.0.0"
}
},
- "node_modules/@google-cloud/profiler/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
"node_modules/@google-cloud/profiler/node_modules/retry-request": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-6.0.0.tgz",
- "integrity": "sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
+ "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
+ "@types/request": "^2.48.8",
+ "extend": "^3.0.2",
+ "teeny-request": "^9.0.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@google-cloud/profiler/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -5630,6 +5717,7 @@
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
"integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+ "license": "Apache-2.0",
"dependencies": {
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
@@ -5649,15 +5737,11 @@
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
+ "license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
- "node_modules/@google-cloud/profiler/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
"node_modules/@google-cloud/projectify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz",
@@ -5674,6 +5758,17 @@
"node": ">=10"
}
},
+ "node_modules/@google-cloud/secret-manager": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/secret-manager/-/secret-manager-5.6.0.tgz",
+ "integrity": "sha512-0daW/OXQEVc6VQKPyJTQNyD+563I/TYQ7GCQJx4dq3lB666R9FUPvqHx9b/o/qQtZ5pfuoCbGZl3krpxgTSW8Q==",
+ "dependencies": {
+ "google-gax": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@google-cloud/storage": {
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.10.1.tgz",
@@ -5717,29 +5812,6 @@
"node": ">=12"
}
},
- "node_modules/@google-cloud/storage/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "node_modules/@google-cloud/storage/node_modules/gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@google-cloud/storage/node_modules/google-auth-library": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz",
@@ -5857,15 +5929,16 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/@grpc/grpc-js": {
- "version": "1.8.22",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.22.tgz",
- "integrity": "sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz",
+ "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@grpc/proto-loader": "^0.7.0",
- "@types/node": ">=12.12.47"
+ "@grpc/proto-loader": "^0.7.13",
+ "@js-sdsl/ordered-map": "^4.4.2"
},
"engines": {
- "node": "^8.13.0 || >=10.10.0"
+ "node": ">=12.10.0"
}
},
"node_modules/@grpc/proto-loader": {
@@ -6010,11 +6083,13 @@
"integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw=="
},
"node_modules/@humanwhocodes/config-array": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
- "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "license": "Apache-2.0",
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.2",
+ "@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
@@ -6039,21 +6114,22 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
"node_modules/@icons/material": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
"integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"react": "*"
}
},
+ "node_modules/@ioredis/commands": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
+ "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==",
+ "license": "MIT"
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -6150,6 +6226,29 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/@isomorphic-git/idb-keyval": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@isomorphic-git/idb-keyval/-/idb-keyval-3.3.2.tgz",
+ "integrity": "sha512-r8/AdpiS0/WJCNR/t/gsgL+M8NMVj/ek7s60uz3LmpCaTF2mEVlZJlB01ZzalgYzRLXwSPC92o+pdzjM7PN/pA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@isomorphic-git/lightning-fs": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@isomorphic-git/lightning-fs/-/lightning-fs-4.6.0.tgz",
+ "integrity": "sha512-tfon8f1h6LawjFI/d8lZPWRPTxmdvyTMbkT/j5yo6dB0hALhKw5D9JsdCcUu/D1pAcMMiU7GZFDsDGqylerr7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@isomorphic-git/idb-keyval": "3.3.2",
+ "isomorphic-textencoder": "1.0.1",
+ "just-debounce-it": "1.1.0",
+ "just-once": "1.1.0"
+ },
+ "bin": {
+ "superblocktxt": "src/superblocktxt.js"
+ }
+ },
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@@ -6274,10 +6373,11 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
@@ -6303,22 +6403,12 @@
"resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
"integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="
},
- "node_modules/@jsdoc/salty": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
- "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
- "dependencies": {
- "lodash": "^4.17.21"
- },
- "engines": {
- "node": ">=v12.0.0"
- }
- },
"node_modules/@jsonjoy.com/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=10.0"
},
@@ -6331,10 +6421,11 @@
}
},
"node_modules/@jsonjoy.com/json-pack": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz",
- "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz",
+ "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@jsonjoy.com/base64": "^1.1.1",
"@jsonjoy.com/util": "^1.1.2",
@@ -6353,10 +6444,11 @@
}
},
"node_modules/@jsonjoy.com/util": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz",
- "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz",
+ "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=10.0"
},
@@ -6375,32 +6467,37 @@
"dev": true
},
"node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
- "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
- "dev": true
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@lezer/common": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
- "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==",
- "dev": true
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz",
+ "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@lezer/css": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.0.0.tgz",
- "integrity": "sha512-616VqgDKumHmYIuxs3tnX1irEQmoDHgF/TlP4O5ICWwyHwLMErq+8iKVuzTkOdBqvYAVmObqThcDEAaaMJjAdg==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.2.0.tgz",
+ "integrity": "sha512-8FLXsWpwKWMqQ6XjDP0DWbMP4YdeqhIcwN8IulcBinGpu30PG74zz0c6w+Yi2DeQD9/4FXfeLp+XP90NflIkGA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "@lezer/common": "^1.2.0",
"@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0"
+ "@lezer/lr": "^1.3.0"
}
},
"node_modules/@lezer/generator": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.0.tgz",
- "integrity": "sha512-IJ16tx3biLKlCXUzcK4v8S10AVa2BSM2rB12rtAL6f1hL2TS/HQQlGCoWRvanlL2J4mCYEEIv9uG7n4kVMkVDA==",
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.3.tgz",
+ "integrity": "sha512-vAI2O1tPF8QMMgp+bdUeeJCneJNkOZvqsrtyb4ohnFVFdboSqPwBEacnt0HH4E+5h+qsIwTHUSAhffU4hzKl1A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@lezer/common": "^1.1.0",
"@lezer/lr": "^1.3.0"
@@ -6410,62 +6507,89 @@
}
},
"node_modules/@lezer/highlight": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
- "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz",
+ "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==",
"dev": true,
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/html": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.0.0.tgz",
- "integrity": "sha512-wZHBcieArLTxEi198hqRBBHMySzDKo5suWaESdUw0t44IXp01vkSRwX2brG1qBbKdwJ+C6U0iMl00vWNiyAROg==",
+ "version": "1.3.10",
+ "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz",
+ "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "@lezer/common": "^1.2.0",
"@lezer/highlight": "^1.0.0",
"@lezer/lr": "^1.0.0"
}
},
"node_modules/@lezer/javascript": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.0.1.tgz",
- "integrity": "sha512-t7fpf3+gi/jiAtW+Gv734TbKdpPg6b8qATH01/jprW9H2oR++Tb688IHwJvZbk9F4GjpCEv86beuHMpUyC1b5g==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz",
+ "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0"
+ "@lezer/common": "^1.2.0",
+ "@lezer/highlight": "^1.1.3",
+ "@lezer/lr": "^1.3.0"
}
},
"node_modules/@lezer/lr": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz",
- "integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz",
+ "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==",
"dev": true,
"dependencies": {
"@lezer/common": "^1.0.0"
}
},
"node_modules/@lezer/markdown": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.3.0.tgz",
- "integrity": "sha512-ErbEQ15eowmJUyT095e9NJc3BI9yZ894fjSDtHftD0InkfUBGgnKSU6dvan9jqsZuNHg2+ag/1oyDRxNsENupQ==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.4.3.tgz",
+ "integrity": "sha512-kfw+2uMrQ/wy/+ONfrH83OkdFNM0ye5Xq96cLlaCy7h5UT9FO54DU4oRoIc0CSBh5NWmWuiIJA7NGLMJbQ+Oxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@lezer/common": "^1.0.0",
"@lezer/highlight": "^1.0.0"
}
},
- "node_modules/@mapbox/node-pre-gyp": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz",
- "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==",
+ "node_modules/@lukeed/csprng": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz",
+ "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@lukeed/uuid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz",
+ "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==",
+ "license": "MIT",
"dependencies": {
- "detect-libc": "^1.0.3",
+ "@lukeed/csprng": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+ "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
"https-proxy-agent": "^5.0.0",
"make-dir": "^3.1.0",
- "node-fetch": "^2.6.5",
+ "node-fetch": "^2.6.7",
"nopt": "^5.0.0",
"npmlog": "^5.0.1",
"rimraf": "^3.0.2",
@@ -6509,20 +6633,6 @@
"semver": "bin/semver.js"
}
},
- "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@@ -6542,6 +6652,13 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
+ "node_modules/@marijn/find-cluster-break": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz",
+ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@maxmind/geoip2-node": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-5.0.0.tgz",
@@ -6552,10 +6669,11 @@
}
},
"node_modules/@mdx-js/react": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz",
- "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz",
+ "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/mdx": "^2.0.0"
},
@@ -6569,13 +6687,284 @@
}
},
"node_modules/@mongodb-js/saslprep": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
- "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
+ "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
"dependencies": {
"sparse-bitfield": "^3.0.3"
}
},
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
+ "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
+ "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
+ "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
+ "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
+ "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
+ "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@napi-rs/canvas": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.68.tgz",
+ "integrity": "sha512-LQESrePLEBLvhuFkXx9jjBXRC2ClYsO5mqQ1m/puth5z9SOuM3N/B3vDuqnC3RJFktDktyK9khGvo7dTkqO9uQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas-android-arm64": "0.1.68",
+ "@napi-rs/canvas-darwin-arm64": "0.1.68",
+ "@napi-rs/canvas-darwin-x64": "0.1.68",
+ "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.68",
+ "@napi-rs/canvas-linux-arm64-gnu": "0.1.68",
+ "@napi-rs/canvas-linux-arm64-musl": "0.1.68",
+ "@napi-rs/canvas-linux-riscv64-gnu": "0.1.68",
+ "@napi-rs/canvas-linux-x64-gnu": "0.1.68",
+ "@napi-rs/canvas-linux-x64-musl": "0.1.68",
+ "@napi-rs/canvas-win32-x64-msvc": "0.1.68"
+ }
+ },
+ "node_modules/@napi-rs/canvas-android-arm64": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.68.tgz",
+ "integrity": "sha512-h1KcSR4LKLfRfzeBH65xMxbWOGa1OtMFQbCMVlxPCkN1Zr+2gK+70pXO5ktojIYcUrP6KDcOwoc8clho5ccM/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-darwin-arm64": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.68.tgz",
+ "integrity": "sha512-/VURlrAD4gDoxW1GT/b0nP3fRz/fhxmHI/xznTq2FTwkQLPOlLkDLCvTmQ7v6LtGKdc2Ed6rvYpRan+JXThInQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-darwin-x64": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.68.tgz",
+ "integrity": "sha512-tEpvGR6vCLTo1Tx9wmDnoOKROpw57wiCWwCpDOuVlj/7rqEJOUYr9ixW4aRJgmeGBrZHgevI0EURys2ER6whmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.68.tgz",
+ "integrity": "sha512-U9xbJsumPOiAYeAFZMlHf62b9dGs2HJ6Q5xt7xTB0uEyPeurwhgYBWGgabdsEidyj38YuzI/c3LGBbSQB3vagw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm64-gnu": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.68.tgz",
+ "integrity": "sha512-KFkn8wEm3mPnWD4l8+OUUkxylSJuN5q9PnJRZJgv15RtCA1bgxIwTkBhI/+xuyVMcHqON9sXq7cDkEJtHm35dg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-arm64-musl": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.68.tgz",
+ "integrity": "sha512-IQzts91rCdOALXBWQxLZRCEDrfFTGDtNRJMNu+2SKZ1uT8cmPQkPwVk5rycvFpvgAcmiFiOSCp1aRrlfU8KPpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-riscv64-gnu": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.68.tgz",
+ "integrity": "sha512-e9AS5UttoIKqXSmBzKZdd3NErSVyOEYzJfNOCGtafGk1//gibTwQXGlSXmAKuErqMp09pyk9aqQRSYzm1AQfBw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-x64-gnu": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.68.tgz",
+ "integrity": "sha512-Pa/I36VE3j57I3Obhrr+J48KGFfkZk2cJN/2NmW/vCgmoF7kCP6aTVq5n+cGdGWLd/cN9CJ9JvNwEoMRDghu0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-linux-x64-musl": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.68.tgz",
+ "integrity": "sha512-9c6rkc5195wNxuUHJdf4/mmnq433OQey9TNvQ9LspJazvHbfSkTij8wtKjASVQsJyPDva4fkWOeV/OQ7cLw0GQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/canvas-win32-x64-msvc": {
+ "version": "0.1.68",
+ "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.68.tgz",
+ "integrity": "sha512-Fc5Dez23u0FoSATurT6/w1oMytiRnKWEinHivdMvXpge6nG4YvhrASrtqMk8dGJMVQpHr8QJYF45rOrx2YU2Aw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/@nicolo-ribaudo/chokidar-2": {
"version": "2.1.8-no-fsevents.3",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
@@ -6583,6 +6972,18 @@
"dev": true,
"optional": true
},
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@node-oauth/formats": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@node-oauth/formats/-/formats-1.0.0.tgz",
@@ -6669,18 +7070,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
- "node_modules/@node-saml/node-saml/node_modules/xml-crypto": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.0.tgz",
- "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
- "dependencies": {
- "@xmldom/xmldom": "^0.8.8",
- "xpath": "0.0.32"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/@node-saml/node-saml/node_modules/xml-encryption": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.0.2.tgz",
@@ -6770,68 +7159,6 @@
"node": ">= 8"
}
},
- "node_modules/@octokit/endpoint": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
- "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
- "dependencies": {
- "@octokit/types": "^6.0.3",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
- }
- },
- "node_modules/@octokit/endpoint/node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@octokit/openapi-types": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
- "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA=="
- },
- "node_modules/@octokit/request": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
- "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
- "dependencies": {
- "@octokit/endpoint": "^6.0.1",
- "@octokit/request-error": "^2.1.0",
- "@octokit/types": "^6.16.1",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
- }
- },
- "node_modules/@octokit/request-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
- "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
- "dependencies": {
- "@octokit/types": "^6.0.3",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
- }
- },
- "node_modules/@octokit/request/node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@octokit/types": {
- "version": "6.34.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
- "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
- "dependencies": {
- "@octokit/openapi-types": "^11.2.0"
- }
- },
"node_modules/@opentelemetry/api": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
@@ -6919,32 +7246,6 @@
"@opentelemetry/api": ">=1.0.0 <1.5.0"
}
},
- "node_modules/@opentelemetry/context-zone": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-zone/-/context-zone-1.15.2.tgz",
- "integrity": "sha512-VdzdaETT7Tm7OXRGLe+I01L0MERR+eMcKK7KLbIyLQFA4ThVWK5TUW+A28jQQ1P0UfHRPw/kub7162yUui5YKw==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/context-zone-peer-dep": "1.15.2",
- "zone.js": "^0.11.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@opentelemetry/context-zone-peer-dep": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-1.15.2.tgz",
- "integrity": "sha512-AEi2rTyLCL6y8jjD33lSQ6tEUMOT4QJH6Ep1RpT56UdkrPQbf60uUSuSx5Ufpms0DNZt2AnFZYShzfYUZmvOJQ==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0",
- "zone.js": "^0.10.2 || ^0.11.0"
- }
- },
"node_modules/@opentelemetry/core": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz",
@@ -7769,24 +8070,6 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/instrumentation-xml-http-request": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.41.2.tgz",
- "integrity": "sha512-lRj9JPSVoE/lReUQ8afekoCyEAGdIWNrzF42Kv63cf5CCMqB/aoHH+NdnSXZ5ANsOvNQ9H65qTsqCbwkzn1x6g==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/sdk-trace-web": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
- }
- },
"node_modules/@opentelemetry/instrumentation/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -8001,18 +8284,6 @@
"@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@opentelemetry/resources": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz",
@@ -8152,23 +8423,6 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
- "node_modules/@opentelemetry/sdk-trace-web": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.15.2.tgz",
- "integrity": "sha512-OjCrwtu4b+cAt540wyIr7d0lCA/cY9y42lmYDFUfJ8Ixj2bByIUJ4yyd9M7mXHpQHdiR/Kq2vzsgS14Uj+RU0Q==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": ">=1.0.0 <1.5.0"
- }
- },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz",
@@ -8249,6 +8503,10 @@
"resolved": "services/clsi",
"link": true
},
+ "node_modules/@overleaf/clsi-cache": {
+ "resolved": "services/clsi-cache",
+ "link": true
+ },
"node_modules/@overleaf/clsi-perf": {
"resolved": "services/clsi-perf",
"link": true
@@ -8304,6 +8562,10 @@
"resolved": "libraries/metrics",
"link": true
},
+ "node_modules/@overleaf/mongo-utils": {
+ "resolved": "libraries/mongo-utils",
+ "link": true
+ },
"node_modules/@overleaf/notifications": {
"resolved": "services/notifications",
"link": true
@@ -8344,12 +8606,12 @@
"resolved": "services/references",
"link": true
},
- "node_modules/@overleaf/settings": {
- "resolved": "libraries/settings",
+ "node_modules/@overleaf/saas-e2e": {
+ "resolved": "tools/saas-e2e",
"link": true
},
- "node_modules/@overleaf/spelling": {
- "resolved": "services/spelling",
+ "node_modules/@overleaf/settings": {
+ "resolved": "libraries/settings",
"link": true
},
"node_modules/@overleaf/stream-utils": {
@@ -8376,6 +8638,28 @@
"resolved": "services/web",
"link": true
},
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
+ "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@phosphor-icons/react": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz",
+ "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8",
+ "react-dom": ">= 16.8"
+ }
+ },
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -8387,19 +8671,18 @@
}
},
"node_modules/@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz",
- "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==",
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz",
+ "integrity": "sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-html-community": "^0.0.8",
- "common-path-prefix": "^3.0.0",
+ "ansi-html": "^0.0.9",
"core-js-pure": "^3.23.3",
"error-stack-parser": "^2.0.6",
- "find-up": "^5.0.0",
"html-entities": "^2.1.0",
"loader-utils": "^2.0.4",
- "schema-utils": "^3.0.0",
+ "schema-utils": "^4.2.0",
"source-map": "^0.7.3"
},
"engines": {
@@ -8411,7 +8694,7 @@
"sockjs-client": "^1.4.0",
"type-fest": ">=0.17.0 <5.0.0",
"webpack": ">=4.43.0 <6.0.0",
- "webpack-dev-server": "3.x || 4.x",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
"webpack-hot-middleware": "2.x",
"webpack-plugin-serve": "0.x || 1.x"
},
@@ -8436,11 +8719,69 @@
}
}
},
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
"node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">= 8"
}
@@ -8547,12 +8888,38 @@
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@prettier/plugin-pug": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/@prettier/plugin-pug/-/plugin-pug-3.4.0.tgz",
+ "integrity": "sha512-Jzd5rE/ellJz3vqfxyVewPsCHXw1dmIzJ3AXhAnqVBKQOj2u73ZS2oUacji8CbQSsYyCy7GXFjXWDlDTMG1x2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/Shinigami92"
+ },
+ {
+ "type": "paypal",
+ "url": "https://www.paypal.com/donate/?hosted_button_id=L7GY729FBKTZY"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "pug-lexer": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=9.0.0"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0"
+ }
+ },
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -8608,10 +8975,11 @@
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
},
"node_modules/@react-aria/ssr": {
- "version": "3.9.4",
- "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz",
- "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==",
+ "version": "3.9.8",
+ "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz",
+ "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
},
@@ -8619,31 +8987,35 @@
"node": ">= 12"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
}
},
"node_modules/@react-dnd/asap": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz",
"integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@react-dnd/invariant": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz",
"integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@react-dnd/shallowequal": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz",
"integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@remix-run/router": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
- "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==",
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
+ "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
+ "license": "MIT",
"engines": {
"node": ">=14.0.0"
}
@@ -8653,7 +9025,6 @@
"resolved": "git+ssh://git@github.com/overleaf/codemirror-emacs.git#4394c03858f27053f8768258e9493866e06e938e",
"integrity": "sha512-5rEKNeFfYPi3ytelXa5IIXnRu5Wvpzz80W1xa9k7gorC2wHlFRveIiIeXdwcQQw92pe5cT5vtpldLLZW5xcAIg==",
"dev": true,
- "license": "MIT",
"peerDependencies": {
"@codemirror/autocomplete": "^6.0.2",
"@codemirror/commands": "^6.0.0",
@@ -8663,11 +9034,10 @@
}
},
"node_modules/@replit/codemirror-indentation-markers": {
- "version": "6.4.0",
- "resolved": "git+ssh://git@github.com/overleaf/codemirror-indentation-markers.git#1b1f93c0bcd04293aea6986aa2275185b2c56803",
- "integrity": "sha512-33syzlJuFicLpTzJR0Z8d5jqGFmKae5UxiwDdvHzLzQUKvVxc+9Pu7v1Yigf+wWqufPmt0DE2ub/amBB8HcmIw==",
+ "version": "6.5.3",
+ "resolved": "git+ssh://git@github.com/overleaf/codemirror-indentation-markers.git#78264032eb286bc47871569ae87bff5ca1c6c161",
+ "integrity": "sha512-M64D1BO2iLWI0ByW4oiiRj104pulG+07FZOz+NfkJMY2zmrbsidKii/8Ibwmp7kEuWY1n7STtTtWxqZZB/HsjA==",
"dev": true,
- "license": "MIT",
"peerDependencies": {
"@codemirror/language": "^6.0.0",
"@codemirror/state": "^6.0.0",
@@ -8675,9 +9045,9 @@
}
},
"node_modules/@replit/codemirror-vim": {
- "version": "6.1.0",
- "resolved": "git+ssh://git@github.com/overleaf/codemirror-vim.git#51ce0933e95705268256467fbbbcce5999ed3624",
- "integrity": "sha512-cdp9t2IY1gHPwW3khJAxb9ffay6af9BLE0ZNCsq/SK6dj5TTwqoxT4N6aXJC+05spYlqcLRIlsqIJ1QrU5KUKw==",
+ "version": "6.2.1",
+ "resolved": "git+ssh://git@github.com/overleaf/codemirror-vim.git#1bef138382d948018f3f9b8a4d7a70ab61774e4b",
+ "integrity": "sha512-ATm1ZFJptmNcNlGKMFsCFQv41PYKBlDwC5pPKpceSEwws0yX2pS1FrV/cMikT9Ylw15s3grYUibYX3ObHZq8sQ==",
"dev": true,
"peerDependencies": {
"@codemirror/commands": "^6.0.0",
@@ -8692,6 +9062,7 @@
"resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz",
"integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"dequal": "^2.0.3"
},
@@ -8700,19 +9071,20 @@
}
},
"node_modules/@restart/ui": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.9.tgz",
- "integrity": "sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw==",
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz",
+ "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.21.0",
- "@popperjs/core": "^2.11.6",
+ "@babel/runtime": "^7.26.0",
+ "@popperjs/core": "^2.11.8",
"@react-aria/ssr": "^3.5.0",
- "@restart/hooks": "^0.4.9",
- "@types/warning": "^3.0.0",
+ "@restart/hooks": "^0.5.0",
+ "@types/warning": "^3.0.3",
"dequal": "^2.0.3",
"dom-helpers": "^5.2.0",
- "uncontrollable": "^8.0.1",
+ "uncontrollable": "^8.0.4",
"warning": "^4.0.3"
},
"peerDependencies": {
@@ -8720,14 +9092,17 @@
"react-dom": ">=16.14.0"
}
},
- "node_modules/@restart/ui/node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "node_modules/@restart/ui/node_modules/@restart/hooks": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz",
+ "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
+ "dequal": "^2.0.3"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
}
},
"node_modules/@restart/ui/node_modules/uncontrollable": {
@@ -8735,18 +9110,297 @@
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz",
"integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"react": ">=16.14.0"
}
},
- "node_modules/@restart/ui/node_modules/warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz",
+ "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz",
+ "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz",
+ "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz",
+ "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz",
+ "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz",
+ "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz",
+ "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz",
+ "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz",
+ "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz",
+ "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz",
+ "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz",
+ "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz",
+ "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz",
+ "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz",
+ "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz",
+ "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz",
+ "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz",
+ "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz",
+ "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz",
+ "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@sentry-internal/tracing": {
"version": "7.46.0",
@@ -8805,94 +9459,6 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
- "node_modules/@sentry/core": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.3.tgz",
- "integrity": "sha512-h7WgrNL0RVlr8Dceh97ZiXNdmEumDutpoqFijjiX4x72IiC6zSaVD4IsqrdGln+v8iJ3l3lX44HHqzubDub1OQ==",
- "dependencies": {
- "@sentry/hub": "6.17.3",
- "@sentry/minimal": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/core/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/@sentry/hub": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.3.tgz",
- "integrity": "sha512-TDxv8nRvk45xvfQg6zs8GYzQzgo0EMhI3wjQZLiNfW2rzybKmIwVp2x3O4PAc3WPzwg4bYNgSAkYKVlHmYjRCg==",
- "dependencies": {
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/hub/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/@sentry/minimal": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.3.tgz",
- "integrity": "sha512-zvGGfHNNA92Lqx6P8ZwOUkmRmAiQl0AQFRXl9So1Ayq9bJRnFLJZv4YFVnp2wE4HXYIlfBYb51+GlGB5LIuPmw==",
- "dependencies": {
- "@sentry/hub": "6.17.3",
- "@sentry/types": "6.17.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/minimal/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/@sentry/node": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.17.3.tgz",
- "integrity": "sha512-LvpB6bCQTytoOlrcQgR80aeEEBi2Sm1hNf+VvoPT6CW7tKI1/6pMWXaNnRu2dpyWS/j6tooz8rd/3dl1SZoGvg==",
- "dependencies": {
- "@sentry/core": "6.17.3",
- "@sentry/hub": "6.17.3",
- "@sentry/tracing": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "cookie": "^0.4.1",
- "https-proxy-agent": "^5.0.0",
- "lru_map": "^0.3.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/node/node_modules/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/@sentry/node/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
"node_modules/@sentry/replay": {
"version": "7.46.0",
"resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.46.0.tgz",
@@ -8949,51 +9515,6 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
- "node_modules/@sentry/tracing": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.3.tgz",
- "integrity": "sha512-GnHugxw5qkWwYmeQbbrswuWpb0bpYqyJr/dO25QQOCwp+cckQrvBYTMC8zGJG10u94O4el0lQaQnNFz9WF3r6g==",
- "dependencies": {
- "@sentry/hub": "6.17.3",
- "@sentry/minimal": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/tracing/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/@sentry/types": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.3.tgz",
- "integrity": "sha512-0AXCjYcfl8Vx26GfyLY4rBQ78Lyt1oND3UozTTMaVXlcKYIjzV+f7TOo5IZx+Kbr6EGUNDLdpA4xfbkWdW/1NA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/utils": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.3.tgz",
- "integrity": "sha512-6/2awDIeHSj0JgiC7DDdV1lxvLmf+/BisWhw09dKvmhVQB3ADvQZbohjUgM+Qam5zE0xmZAfQhvuDwC41W8Wnw==",
- "dependencies": {
- "@sentry/types": "6.17.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/utils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
"node_modules/@sideway/address": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -9027,6 +9548,19 @@
"node": ">=10"
}
},
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
@@ -9100,6 +9634,7 @@
"resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz",
"integrity": "sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9113,6 +9648,7 @@
"resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.2.tgz",
"integrity": "sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"@smithy/util-config-provider": "^1.0.2",
@@ -9128,6 +9664,7 @@
"resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz",
"integrity": "sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/node-config-provider": "^1.0.2",
"@smithy/property-provider": "^1.0.2",
@@ -9144,6 +9681,7 @@
"resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz",
"integrity": "sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@aws-crypto/crc32": "3.0.0",
"@smithy/types": "^1.1.1",
@@ -9156,6 +9694,7 @@
"resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz",
"integrity": "sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/protocol-http": "^1.1.1",
"@smithy/querystring-builder": "^1.0.2",
@@ -9169,6 +9708,7 @@
"resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.2.tgz",
"integrity": "sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"@smithy/util-buffer-from": "^1.0.2",
@@ -9184,6 +9724,7 @@
"resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz",
"integrity": "sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9194,6 +9735,7 @@
"resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz",
"integrity": "sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9206,6 +9748,7 @@
"resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz",
"integrity": "sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/protocol-http": "^1.1.1",
"@smithy/types": "^1.1.1",
@@ -9220,6 +9763,7 @@
"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz",
"integrity": "sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/middleware-serde": "^1.0.2",
"@smithy/types": "^1.1.1",
@@ -9236,6 +9780,7 @@
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz",
"integrity": "sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/protocol-http": "^1.1.1",
"@smithy/service-error-classification": "^1.0.3",
@@ -9254,6 +9799,7 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"optional": true,
+ "peer": true,
"bin": {
"uuid": "dist/bin/uuid"
}
@@ -9263,6 +9809,7 @@
"resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz",
"integrity": "sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9276,6 +9823,7 @@
"resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz",
"integrity": "sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9288,6 +9836,7 @@
"resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz",
"integrity": "sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/property-provider": "^1.0.2",
"@smithy/shared-ini-file-loader": "^1.0.2",
@@ -9303,6 +9852,7 @@
"resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz",
"integrity": "sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/abort-controller": "^1.0.2",
"@smithy/protocol-http": "^1.1.1",
@@ -9319,6 +9869,7 @@
"resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.2.tgz",
"integrity": "sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9332,6 +9883,7 @@
"resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.1.tgz",
"integrity": "sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9345,6 +9897,7 @@
"resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz",
"integrity": "sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"@smithy/util-uri-escape": "^1.0.2",
@@ -9359,6 +9912,7 @@
"resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz",
"integrity": "sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9372,6 +9926,7 @@
"resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz",
"integrity": "sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA==",
"optional": true,
+ "peer": true,
"engines": {
"node": ">=14.0.0"
}
@@ -9381,6 +9936,7 @@
"resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz",
"integrity": "sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/types": "^1.1.1",
"tslib": "^2.5.0"
@@ -9394,6 +9950,7 @@
"resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.2.tgz",
"integrity": "sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/eventstream-codec": "^1.0.2",
"@smithy/is-array-buffer": "^1.0.2",
@@ -9413,6 +9970,7 @@
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.4.tgz",
"integrity": "sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/middleware-stack": "^1.0.2",
"@smithy/types": "^1.1.1",
@@ -9428,6 +9986,7 @@
"resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz",
"integrity": "sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9440,6 +9999,7 @@
"resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.2.tgz",
"integrity": "sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/querystring-parser": "^1.0.2",
"@smithy/types": "^1.1.1",
@@ -9451,6 +10011,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.2.tgz",
"integrity": "sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/util-buffer-from": "^1.0.2",
"tslib": "^2.5.0"
@@ -9464,6 +10025,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz",
"integrity": "sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
}
@@ -9473,6 +10035,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz",
"integrity": "sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9485,6 +10048,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz",
"integrity": "sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/is-array-buffer": "^1.0.2",
"tslib": "^2.5.0"
@@ -9498,6 +10062,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz",
"integrity": "sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9510,6 +10075,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz",
"integrity": "sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/property-provider": "^1.0.2",
"@smithy/types": "^1.1.1",
@@ -9525,6 +10091,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz",
"integrity": "sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/config-resolver": "^1.0.2",
"@smithy/credential-provider-imds": "^1.0.2",
@@ -9542,6 +10109,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz",
"integrity": "sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9554,6 +10122,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.2.tgz",
"integrity": "sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9566,6 +10135,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.4.tgz",
"integrity": "sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/service-error-classification": "^1.0.3",
"tslib": "^2.5.0"
@@ -9579,6 +10149,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.2.tgz",
"integrity": "sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/fetch-http-handler": "^1.0.2",
"@smithy/node-http-handler": "^1.0.3",
@@ -9598,6 +10169,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz",
"integrity": "sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg==",
"optional": true,
+ "peer": true,
"dependencies": {
"tslib": "^2.5.0"
},
@@ -9610,6 +10182,7 @@
"resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.2.tgz",
"integrity": "sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw==",
"optional": true,
+ "peer": true,
"dependencies": {
"@smithy/util-buffer-from": "^1.0.2",
"tslib": "^2.5.0"
@@ -9618,11 +10191,252 @@
"node": ">=14.0.0"
}
},
- "node_modules/@storybook/addon-styling-webpack": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/addon-styling-webpack/-/addon-styling-webpack-1.0.0.tgz",
- "integrity": "sha512-jo1kzn7pi+NA+LZxrWoRvW6w7dXIKY/BjTG80XX2uU92lIKT+X1k/9vYk/0KPVK3Bsf4tO6ToAuqIRyOk7MHtg==",
+ "node_modules/@storybook/addon-a11y": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.6.12.tgz",
+ "integrity": "sha512-H28zHiL8uuv29XsVNf9VjNWsCeht/l66GPYHT7aom1jh+f3fS9+sutrCGEBC/T7cnRpy8ZyuHCtihUqS+RI4pg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/addon-highlight": "8.6.12",
+ "@storybook/global": "^5.0.0",
+ "@storybook/test": "8.6.12",
+ "axe-core": "^4.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-actions": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.12.tgz",
+ "integrity": "sha512-B5kfiRvi35oJ0NIo53CGH66H471A3XTzrfaa6SxXEJsgxxSeKScG5YeXcCvLiZfvANRQ7QDsmzPUgg0o3hdMXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@types/uuid": "^9.0.1",
+ "dequal": "^2.0.2",
+ "polished": "^4.2.2",
+ "uuid": "^9.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-actions/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@storybook/addon-backgrounds": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.12.tgz",
+ "integrity": "sha512-lmIAma9BiiCTbJ8YfdZkXjpnAIrOUcgboLkt1f6XJ78vNEMnLNzD9gnh7Tssz1qrqvm34v9daDjIb+ggdiKp3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "memoizerific": "^1.11.3",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-controls": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.12.tgz",
+ "integrity": "sha512-9VSRPJWQVb9wLp21uvpxDGNctYptyUX0gbvxIWOHMH3R2DslSoq41lsC/oQ4l4zSHVdL+nq8sCTkhBxIsjKqdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "dequal": "^2.0.2",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-docs": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.12.tgz",
+ "integrity": "sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mdx-js/react": "^3.0.0",
+ "@storybook/blocks": "8.6.12",
+ "@storybook/csf-plugin": "8.6.12",
+ "@storybook/react-dom-shim": "8.6.12",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-essentials": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.12.tgz",
+ "integrity": "sha512-Y/7e8KFlttaNfv7q2zoHMPdX6hPXHdsuQMAjYl5NG9HOAJREu4XBy4KZpbcozRe4ApZ78rYsN/MO1EuA+bNMIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/addon-actions": "8.6.12",
+ "@storybook/addon-backgrounds": "8.6.12",
+ "@storybook/addon-controls": "8.6.12",
+ "@storybook/addon-docs": "8.6.12",
+ "@storybook/addon-highlight": "8.6.12",
+ "@storybook/addon-measure": "8.6.12",
+ "@storybook/addon-outline": "8.6.12",
+ "@storybook/addon-toolbars": "8.6.12",
+ "@storybook/addon-viewport": "8.6.12",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-highlight": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.12.tgz",
+ "integrity": "sha512-9FITVxdoycZ+eXuAZL9ElWyML/0fPPn9UgnnAkrU7zkMi+Segq/Tx7y+WWanC5zfWZrXAuG6WTOYEXeWQdm//w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-interactions": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.12.tgz",
+ "integrity": "sha512-cTAJlTq6uVZBEbtwdXkXoPQ4jHOAGKQnYSezBT4pfNkdjn/FnEeaQhMBDzf14h2wr5OgBnJa6Lmd8LD9ficz4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@storybook/instrumenter": "8.6.12",
+ "@storybook/test": "8.6.12",
+ "polished": "^4.2.2",
+ "ts-dedent": "^2.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-links": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.6.12.tgz",
+ "integrity": "sha512-AfKujFHoAxhxq4yu+6NwylltS9lf5MPs1eLLXvOlwo3l7Y/c68OdxJ7j68vLQhs9H173WVYjKyjbjFxJWf/YYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.12"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/addon-measure": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.12.tgz",
+ "integrity": "sha512-tACmwqqOvutaQSduw8SMb62wICaT1rWaHtMN3vtWXuxgDPSdJQxLP+wdVyRYMAgpxhLyIO7YRf++Hfha9RHgFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "tiny-invariant": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-outline": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.12.tgz",
+ "integrity": "sha512-1ylwm+n1s40S91No0v9T4tCjZORu3GbnjINlyjYTDLLhQHyBQd3nWR1Y1eewU4xH4cW9SnSLcMQFS/82xHqU6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-styling-webpack": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-styling-webpack/-/addon-styling-webpack-1.0.1.tgz",
+ "integrity": "sha512-5n+SXPfMTc4m7sWaJWPWjoHYWc6/B111M2Ia55toQ3GV4ON4vVlTgH9FX+EgCkDticElj99HLTMDJkHRj2yvkg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@storybook/node-logger": "^8.0.0-alpha.10"
},
@@ -9630,32 +10444,788 @@
"webpack": "^5.0.0"
}
},
- "node_modules/@storybook/addon-webpack5-compiler-babel": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz",
- "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==",
+ "node_modules/@storybook/addon-toolbars": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.12.tgz",
+ "integrity": "sha512-HEcSzo1DyFtIu5/ikVOmh5h85C1IvK9iFKSzBR6ice33zBOaehVJK+Z5f487MOXxPsZ63uvWUytwPyViGInj+g==",
"dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-viewport": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.12.tgz",
+ "integrity": "sha512-EXK2LArAnABsPP0leJKy78L/lbMWow+EIJfytEP5fHaW4EhMR6h7Hzaqzre6U0IMMr/jVFa1ci+m0PJ0eQc2bw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/core": "^7.23.7",
- "babel-loader": "^9.1.3"
+ "memoizerific": "^1.11.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/addon-webpack5-compiler-babel": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.6.tgz",
+ "integrity": "sha512-J4uVxEfkd2iAxPxcT90iebt5wuLSd0EYuMJa94t1jVUGlvZZAvnmqXAqscRITNU37nOr0c9yZ2YVS/sFOZyOVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.26.0",
+ "babel-loader": "^9.2.1"
},
"engines": {
"node": ">=18"
}
},
- "node_modules/@storybook/core": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.5.tgz",
- "integrity": "sha512-GOGfTvdioNa/n+Huwg4u/dsyYyBcM+gEcdxi3B7i5x4yJ3I912KoVshumQAOF2myKSRdI8h8aGWdx7nnjd0+5Q==",
+ "node_modules/@storybook/blocks": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.12.tgz",
+ "integrity": "sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@storybook/csf": "^0.1.11",
- "@types/express": "^4.17.21",
+ "@storybook/icons": "^1.2.12",
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "storybook": "^8.6.12"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/builder-webpack5": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.6.12.tgz",
+ "integrity": "sha512-Z7RsQ/1+HbxdbM69JrEFcTL+pnVKUTMmeURMn5/eOvYTGjBtM18vbQTj0LjCUDIjC+v9U+uX8ZJEUVxFbGcxBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core-webpack": "8.6.12",
+ "@types/semver": "^7.3.4",
+ "browser-assert": "^1.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "cjs-module-lexer": "^1.2.3",
+ "constants-browserify": "^1.0.0",
+ "css-loader": "^6.7.1",
+ "es-module-lexer": "^1.5.0",
+ "fork-ts-checker-webpack-plugin": "^8.0.0",
+ "html-webpack-plugin": "^5.5.0",
+ "magic-string": "^0.30.5",
+ "path-browserify": "^1.0.1",
+ "process": "^0.11.10",
+ "semver": "^7.3.7",
+ "style-loader": "^3.3.1",
+ "terser-webpack-plugin": "^5.3.1",
+ "ts-dedent": "^2.0.0",
+ "url": "^0.11.0",
+ "util": "^0.12.4",
+ "util-deprecate": "^1.0.2",
+ "webpack": "5",
+ "webpack-dev-middleware": "^6.1.2",
+ "webpack-hot-middleware": "^2.25.1",
+ "webpack-virtual-modules": "^0.6.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/schema-utils": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/url": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+ "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.12.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz",
+ "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.12",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/cli": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.6.12.tgz",
+ "integrity": "sha512-USOPHgQsckHguxqYItm7+i9lohjiPsCrNKBMl40XPU3dc1LqENBOF1JtJnOLTGegjUxRox7oaqrM10b9rkafWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/types": "^7.24.0",
+ "@storybook/codemod": "8.6.12",
+ "@types/semver": "^7.3.4",
+ "commander": "^12.1.0",
+ "create-storybook": "8.6.12",
+ "cross-spawn": "^7.0.3",
+ "envinfo": "^7.7.3",
+ "fd-package-json": "^1.2.0",
+ "find-up": "^5.0.0",
+ "giget": "^1.0.0",
+ "glob": "^10.0.0",
+ "globby": "^14.0.1",
+ "jscodeshift": "^0.15.1",
+ "leven": "^3.1.0",
+ "p-limit": "^6.2.0",
+ "prompts": "^2.4.0",
+ "semver": "^7.3.7",
+ "storybook": "8.6.12",
+ "tiny-invariant": "^1.3.1",
+ "ts-dedent": "^2.0.0"
+ },
+ "bin": {
+ "cli": "bin/index.cjs"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/globby": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
+ "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "ignore": "^7.0.3",
+ "path-type": "^6.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/ignore": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/jscodeshift": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz",
+ "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.0",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
+ "@babel/plugin-transform-optional-chaining": "^7.23.0",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/preset-flow": "^7.22.15",
+ "@babel/preset-typescript": "^7.23.0",
+ "@babel/register": "^7.22.15",
+ "babel-core": "^7.0.0-bridge.0",
+ "chalk": "^4.1.2",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.4",
+ "neo-async": "^2.5.0",
+ "node-dir": "^0.1.17",
+ "recast": "^0.23.3",
+ "temp": "^0.8.4",
+ "write-file-atomic": "^2.3.0"
+ },
+ "bin": {
+ "jscodeshift": "bin/jscodeshift.js"
+ },
+ "peerDependencies": {
+ "@babel/preset-env": "^7.1.6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/preset-env": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/p-limit": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
+ "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/path-type": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
+ "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/@storybook/cli/node_modules/write-file-atomic/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@storybook/cli/node_modules/yocto-queue": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
+ "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/codemod": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.6.12.tgz",
+ "integrity": "sha512-RFIGUI+dkFqrcuOyxNY97WuW7dskmuGL9yGALQsNmyGC490VUJ3scLOAgBChWBjsDfnN8uSb0Kvt/fB4OOyCmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/preset-env": "^7.24.4",
+ "@babel/types": "^7.24.0",
+ "@storybook/core": "8.6.12",
+ "@types/cross-spawn": "^6.0.2",
+ "cross-spawn": "^7.0.3",
+ "es-toolkit": "^1.22.0",
+ "globby": "^14.0.1",
+ "jscodeshift": "^0.15.1",
+ "prettier": "^3.1.1",
+ "recast": "^0.23.5",
+ "tiny-invariant": "^1.3.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/globby": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
+ "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "ignore": "^7.0.3",
+ "path-type": "^6.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/ignore": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/jscodeshift": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz",
+ "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.0",
+ "@babel/parser": "^7.23.0",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.0",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
+ "@babel/plugin-transform-optional-chaining": "^7.23.0",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/preset-flow": "^7.22.15",
+ "@babel/preset-typescript": "^7.23.0",
+ "@babel/register": "^7.22.15",
+ "babel-core": "^7.0.0-bridge.0",
+ "chalk": "^4.1.2",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.4",
+ "neo-async": "^2.5.0",
+ "node-dir": "^0.1.17",
+ "recast": "^0.23.3",
+ "temp": "^0.8.4",
+ "write-file-atomic": "^2.3.0"
+ },
+ "bin": {
+ "jscodeshift": "bin/jscodeshift.js"
+ },
+ "peerDependencies": {
+ "@babel/preset-env": "^7.1.6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/preset-env": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/path-type": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
+ "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/codemod/node_modules/write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/@storybook/components": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.12.tgz",
+ "integrity": "sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/core": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.12.tgz",
+ "integrity": "sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/theming": "8.6.12",
"better-opn": "^3.0.2",
"browser-assert": "^1.2.1",
- "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
"esbuild-register": "^3.5.0",
- "express": "^4.19.2",
"jsdoc-type-pratt-parser": "^4.0.0",
"process": "^0.11.10",
"recast": "^0.23.5",
@@ -9666,25 +11236,39 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
}
},
- "node_modules/@storybook/core/node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "node_modules/@storybook/core-webpack": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.6.12.tgz",
+ "integrity": "sha512-TiE+KOm0hxb/p0JxeGHKxqTNX+xnTOFsBh6uloCSuvodutJ5pR/XpxKVxwo1gtSc0Uq3qpgbMhW6qYlYQetnKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
+ "ts-dedent": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
}
},
"node_modules/@storybook/core/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -9692,41 +11276,204 @@
"node": ">=10"
}
},
- "node_modules/@storybook/csf": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz",
- "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==",
+ "node_modules/@storybook/csf-plugin": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.12.tgz",
+ "integrity": "sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "type-fest": "^2.19.0"
- }
- },
- "node_modules/@storybook/csf/node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
+ "unplugin": "^1.3.1"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
}
},
"node_modules/@storybook/global": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
"integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
- "dev": true
- },
- "node_modules/@storybook/node-logger": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.4.tgz",
- "integrity": "sha512-cALLHuX53vLQsoJamGRlquh2pfhPq9copXou2JTmFT6mrCcipo77SzhBDfeeuhaGv6vUWPfmGjPBEHXWGPe4+g==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@storybook/icons": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz",
+ "integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+ }
+ },
+ "node_modules/@storybook/instrumenter": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.12.tgz",
+ "integrity": "sha512-VK5fYAF8jMwWP/u3YsmSwKGh+FeSY8WZn78flzRUwirp2Eg1WWjsqPRubAk7yTpcqcC/km9YMF3KbqfzRv2s/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@vitest/utils": "^2.1.1"
+ },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/manager-api": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.12.tgz",
+ "integrity": "sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/node-logger": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.6.12.tgz",
+ "integrity": "sha512-Jk7mQWsu60BptBwYJAd69kMmsEqBAbGDuA/fqban+8vfNiSKgR3PRkhis0DsGEk53bpAEfbkCcyvYRCrrq4M3Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.6.12.tgz",
+ "integrity": "sha512-aCCHjR/jsVPVThRH7nK70wS0Od44M6hqkkakg3xr7LETZZGj99heen6t4VHvz8gcQYT9l6R/oZwCl7f/PQ3ZBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core-webpack": "8.6.12",
+ "@storybook/react": "8.6.12",
+ "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
+ "@types/semver": "^7.3.4",
+ "find-up": "^5.0.0",
+ "magic-string": "^0.30.5",
+ "react-docgen": "^7.0.0",
+ "resolve": "^1.22.8",
+ "semver": "^7.3.7",
+ "tsconfig-paths": "^4.2.0",
+ "webpack": "5"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.12"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@storybook/preview-api": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.12.tgz",
+ "integrity": "sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@storybook/react": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.12.tgz",
+ "integrity": "sha512-NzxlHLA5DkDgZM/dMwTYinuzRs6rsUPmlqP+NIv6YaciQ4NGnTYyOC7R/SqI6HHFm8ZZ5eMYvpfiFmhZ9rU+rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/components": "8.6.12",
+ "@storybook/global": "^5.0.0",
+ "@storybook/manager-api": "8.6.12",
+ "@storybook/preview-api": "8.6.12",
+ "@storybook/react-dom-shim": "8.6.12",
+ "@storybook/theming": "8.6.12"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "@storybook/test": "8.6.12",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.12",
+ "typescript": ">= 4.2.x"
+ },
+ "peerDependenciesMeta": {
+ "@storybook/test": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
}
},
"node_modules/@storybook/react-docgen-typescript-plugin": {
@@ -9734,6 +11481,7 @@
"resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz",
"integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^4.1.1",
"endent": "^2.0.1",
@@ -9753,6 +11501,7 @@
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
@@ -9770,6 +11519,7 @@
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"semver": "^6.0.0"
},
@@ -9780,13 +11530,97 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@swc/helpers": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz",
- "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==",
+ "node_modules/@storybook/react-dom-shim": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.12.tgz",
+ "integrity": "sha512-51QvoimkBzYs8s3rCYnY5h0cFqLz/Mh0vRcughwYaXckWzDBV8l67WBO5Xf5nBsukCbWyqBVPpEQLww8s7mrLA==",
"dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/react-webpack5": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.6.12.tgz",
+ "integrity": "sha512-wZOjPQ00gu85iQoKgwz5uvM3+bhXrQDVR0ppVAj7vVy6cvLEsJXmqNLHbXPCZuKPmvwzYr1QkslMLCIkF8OGdA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.4.0"
+ "@storybook/builder-webpack5": "8.6.12",
+ "@storybook/preset-react-webpack": "8.6.12",
+ "@storybook/react": "8.6.12"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.6.12",
+ "typescript": ">= 4.2.x"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@storybook/test": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.12.tgz",
+ "integrity": "sha512-0BK1Eg+VD0lNMB1BtxqHE3tP9FdkUmohtvWG7cq6lWvMrbCmAmh3VWai3RMCCDOukPFpjabOr8BBRLVvhNpv2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/global": "^5.0.0",
+ "@storybook/instrumenter": "8.6.12",
+ "@testing-library/dom": "10.4.0",
+ "@testing-library/jest-dom": "6.5.0",
+ "@testing-library/user-event": "14.5.2",
+ "@vitest/expect": "2.0.5",
+ "@vitest/spy": "2.0.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.6.12"
+ }
+ },
+ "node_modules/@storybook/theming": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.12.tgz",
+ "integrity": "sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.17",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz",
+ "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
}
},
"node_modules/@testing-library/cypress": {
@@ -9825,12 +11659,6 @@
"node": ">=14"
}
},
- "node_modules/@testing-library/cypress/node_modules/@types/aria-query": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.2.tgz",
- "integrity": "sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ==",
- "dev": true
- },
"node_modules/@testing-library/cypress/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -9875,22 +11703,23 @@
}
},
"node_modules/@testing-library/dom": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz",
- "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
- "@types/aria-query": "^4.2.0",
- "aria-query": "^5.0.0",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
"chalk": "^4.1.0",
"dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.4.4",
+ "lz-string": "^1.5.0",
"pretty-format": "^27.0.2"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
}
},
"node_modules/@testing-library/dom/node_modules/ansi-styles": {
@@ -9908,6 +11737,16 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/@testing-library/dom/node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
"node_modules/@testing-library/dom/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -9936,70 +11775,105 @@
"node": ">=8"
}
},
- "node_modules/@testing-library/react": {
- "version": "12.1.5",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz",
- "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==",
+ "node_modules/@testing-library/jest-dom": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
+ "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "@testing-library/dom": "^8.0.0",
- "@types/react-dom": "<18.0.0"
+ "@adobe/css-tools": "^4.4.0",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "lodash": "^4.17.21",
+ "redent": "^3.0.0"
},
"engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "react": "<18.0.0",
- "react-dom": "<18.0.0"
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
}
},
- "node_modules/@testing-library/react-hooks": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz",
- "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==",
+ "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.12.5",
- "react-error-boundary": "^3.1.0"
+ "color-convert": "^2.0.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "16.3.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz",
+ "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=18"
},
"peerDependencies": {
- "@types/react": "^16.9.0 || ^17.0.0",
- "react": "^16.9.0 || ^17.0.0",
- "react-dom": "^16.9.0 || ^17.0.0",
- "react-test-renderer": "^16.9.0 || ^17.0.0"
+ "@testing-library/dom": "^10.0.0",
+ "@types/react": "^18.0.0 || ^19.0.0",
+ "@types/react-dom": "^18.0.0 || ^19.0.0",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
- "react-dom": {
- "optional": true
- },
- "react-test-renderer": {
+ "@types/react-dom": {
"optional": true
}
}
},
- "node_modules/@testing-library/react-hooks/node_modules/react-error-boundary": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz",
- "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.12.5"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- },
- "peerDependencies": {
- "react": ">=16.13.1"
- }
- },
"node_modules/@testing-library/user-event": {
"version": "14.5.2",
"resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
@@ -10022,10 +11896,11 @@
}
},
"node_modules/@transloadit/prettier-bytes": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
- "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==",
- "dev": true
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz",
+ "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
@@ -10044,11 +11919,22 @@
"@types/node": "*"
}
},
+ "node_modules/@types/adm-zip": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz",
+ "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/aria-query": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
- "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==",
- "dev": true
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/aws-lambda": {
"version": "8.10.119",
@@ -10060,6 +11946,7 @@
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
@@ -10069,10 +11956,11 @@
}
},
"node_modules/@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
}
@@ -10082,16 +11970,18 @@
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
- "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.20.7"
}
@@ -10110,6 +12000,7 @@
"resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
"integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*"
}
@@ -10178,6 +12069,7 @@
"resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
"integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/express-serve-static-core": "*",
"@types/node": "*"
@@ -10196,7 +12088,8 @@
"node_modules/@types/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
+ "license": "MIT"
},
"node_modules/@types/cookiejar": {
"version": "2.1.2",
@@ -10215,10 +12108,21 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cross-spawn": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz",
+ "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/dateformat": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@types/dateformat/-/dateformat-5.0.2.tgz",
- "integrity": "sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw=="
+ "integrity": "sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw==",
+ "dev": true
},
"node_modules/@types/debug": {
"version": "4.1.7",
@@ -10234,46 +12138,41 @@
"integrity": "sha512-RWVEhh/zGXpAVF/ZChwNnv7r4rvqzJ7lYNSmZSVTxjV0PBLf6Qu7RNg+SUtkpzxmiNkjCx0Xn2tPp7FIkshJwQ==",
"dev": true
},
- "node_modules/@types/dompurify": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
- "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+ "node_modules/@types/doctrine": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
+ "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
"dev": true,
- "dependencies": {
- "@types/trusted-types": "*"
- }
- },
- "node_modules/@types/escodegen": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz",
- "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==",
- "dev": true
+ "license": "MIT"
},
"node_modules/@types/eslint": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
- "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/events": {
"version": "3.0.0",
@@ -10303,14 +12202,12 @@
"@types/send": "*"
}
},
- "node_modules/@types/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
- "dependencies": {
- "@types/minimatch": "^5.1.2",
- "@types/node": "*"
- }
+ "node_modules/@types/glob-to-regexp": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.4.tgz",
+ "integrity": "sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/hapi__catbox": {
"version": "10.2.4",
@@ -10348,19 +12245,11 @@
"@types/node": "*"
}
},
- "node_modules/@types/hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
- "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
- "dev": true,
- "dependencies": {
- "@types/unist": "*"
- }
- },
"node_modules/@types/hoist-non-react-statics": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
- "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz",
+ "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==",
+ "license": "MIT",
"dependencies": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
@@ -10383,10 +12272,11 @@
"integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
},
"node_modules/@types/http-proxy": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
- "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
+ "version": "1.17.16",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*"
}
@@ -10479,11 +12369,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
- },
"node_modules/@types/lodash": {
"version": "4.14.178",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz",
@@ -10495,25 +12380,12 @@
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
},
- "node_modules/@types/markdown-it": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz",
- "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==",
- "dependencies": {
- "@types/linkify-it": "^5",
- "@types/mdurl": "^2"
- }
- },
- "node_modules/@types/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
- },
"node_modules/@types/mdx": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.12.tgz",
- "integrity": "sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==",
- "dev": true
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/memcached": {
"version": "2.2.7",
@@ -10533,11 +12405,6 @@
"resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.1.tgz",
"integrity": "sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ=="
},
- "node_modules/@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
- },
"node_modules/@types/mocha": {
"version": "10.0.6",
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
@@ -10623,6 +12490,13 @@
"integrity": "sha512-ZkC5IUqqIFPXx3ASTTybTzmQdwHwe2C0u3eL75ldQ6T9E9IWFJodn6hIfbZGab73DfyiHN4Xw15gNxUq2FbvBA==",
"dev": true
},
+ "node_modules/@types/pdf-parse": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/@types/pdf-parse/-/pdf-parse-1.1.4.tgz",
+ "integrity": "sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/pg": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
@@ -10642,9 +12516,10 @@
}
},
"node_modules/@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
+ "version": "15.7.14",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
},
"node_modules/@types/qs": {
"version": "6.9.7",
@@ -10657,75 +12532,63 @@
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
},
"node_modules/@types/react": {
- "version": "17.0.40",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz",
- "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==",
+ "version": "18.3.20",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz",
+ "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==",
+ "license": "MIT",
"dependencies": {
"@types/prop-types": "*",
- "@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
- "node_modules/@types/react-bootstrap": {
- "version": "0.32.36",
- "resolved": "https://registry.npmjs.org/@types/react-bootstrap/-/react-bootstrap-0.32.36.tgz",
- "integrity": "sha512-xldfs2zixagAFEafy/XzRvZH1NtjRnLfbgL0cZ2a0Eykz+iILE/Xa46tnUFcLln6ZBq1Qp9uArhIbkkuhBU30g==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
"node_modules/@types/react-color": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz",
- "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==",
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.13.tgz",
+ "integrity": "sha512-2c/9FZ4ixC5T3JzN0LP5Cke2Mf0MKOP2Eh0NPDPWmuVH3NjPyhEjqNMQpN1Phr5m74egAy+p2lYNAFrX1z9Yrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/react": "*",
"@types/reactcss": "*"
+ },
+ "peerDependencies": {
+ "@types/react": "*"
}
},
"node_modules/@types/react-dom": {
- "version": "17.0.13",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz",
- "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==",
+ "version": "18.3.6",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz",
+ "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==",
"dev": true,
- "dependencies": {
- "@types/react": "*"
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
}
},
"node_modules/@types/react-google-recaptcha": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.5.tgz",
- "integrity": "sha512-iWTjmVttlNgp0teyh7eBXqNOQzVq2RWNiFROWjraOptRnb1OcHJehQnji0sjqIRAk9K0z8stjyhU+OLpPb0N6w==",
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.9.tgz",
+ "integrity": "sha512-nT31LrBDuoSZJN4QuwtQSF3O89FVHC4jLhM+NtKEmVF5R1e8OY0Jo4//x2Yapn2aNHguwgX5doAq8Zo+Ehd0ug==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-linkify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/react-linkify/-/react-linkify-1.0.0.tgz",
- "integrity": "sha512-2NKXPQGaHNfh/dCqkVC55k1tAhQyNoNZa31J50nIneMVwHqUI00FAP+Lyp8e0BarPf84kn4GRVAhtWX9XJBzSQ==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@types/react-linkify/-/react-linkify-1.0.4.tgz",
+ "integrity": "sha512-NOMw4X3kjvjY0lT5kXQdxZCXpPNi2hOuuqG+Kz+5EOQpi9rDUJJDitdE1j2JRNmrTnNIjrLnYG0HKyuOWN/uKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
- "node_modules/@types/react-overlays": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@types/react-overlays/-/react-overlays-1.1.3.tgz",
- "integrity": "sha512-oOq5NWbyfNz2w2sKvjkHdvGQSMA+VDVfI5UOfGPR0wkik2welad1RDVnVgH15jKf58jrZNBa1Ee4SVBgCGFxCg==",
- "dev": true,
- "dependencies": {
- "@types/react": "*",
- "@types/react-transition-group": "*"
- }
- },
"node_modules/@types/react-redux": {
- "version": "7.1.33",
- "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
- "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
+ "version": "7.1.34",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz",
+ "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==",
+ "license": "MIT",
"dependencies": {
"@types/hoist-non-react-statics": "^3.3.0",
"@types/react": "*",
@@ -10734,20 +12597,22 @@
}
},
"node_modules/@types/react-transition-group": {
- "version": "4.4.10",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
- "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
"dev": true,
- "dependencies": {
+ "license": "MIT",
+ "peerDependencies": {
"@types/react": "*"
}
},
"node_modules/@types/reactcss": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz",
- "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==",
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.13.tgz",
+ "integrity": "sha512-gi3S+aUi6kpkF5vdhUsnkwbiSEIU/BEJyD7kBy2SudWBUuKmJk8AQKE0OVcQQeEy40Azh0lV6uynxlikYIJuwg==",
"dev": true,
- "dependencies": {
+ "license": "MIT",
+ "peerDependencies": {
"@types/react": "*"
}
},
@@ -10785,7 +12650,8 @@
"version": "1.20.6",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
"integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/retry": {
"version": "0.12.2",
@@ -10793,20 +12659,6 @@
"integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
"dev": true
},
- "node_modules/@types/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==",
- "dependencies": {
- "@types/glob": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- },
"node_modules/@types/semver": {
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
@@ -10826,6 +12678,7 @@
"resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
"integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/express": "*"
}
@@ -10896,6 +12749,7 @@
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
"integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*"
}
@@ -10927,13 +12781,8 @@
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "dev": true
- },
- "node_modules/@types/unist": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
- "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"node_modules/@types/uuid": {
"version": "9.0.8",
@@ -10950,36 +12799,28 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz",
"integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
},
"node_modules/@types/whatwg-url": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
- "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
+ "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
"dependencies": {
- "@types/node": "*",
"@types/webidl-conversions": "*"
}
},
- "node_modules/@types/workerpool": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.7.tgz",
- "integrity": "sha512-DI2U4obcMzFViyNjLw0xXspim++qkAJ4BWRdYPVMMFtOpTvMr6PAk3UTZEoSqnZnvgUkJ3ck97Ybk+iIfuJHMg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/ws": {
- "version": "8.5.12",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz",
- "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==",
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*"
}
@@ -11043,20 +12884,21 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz",
- "integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
+ "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/type-utils": "8.0.1",
- "@typescript-eslint/utils": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
+ "@typescript-eslint/scope-manager": "8.35.1",
+ "@typescript-eslint/type-utils": "8.35.1",
+ "@typescript-eslint/utils": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11066,23 +12908,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
- "eslint": "^8.57.0 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "@typescript-eslint/parser": "^8.35.1",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
+ "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11093,10 +12932,11 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -11106,13 +12946,14 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
+ "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.35.1",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11123,27 +12964,52 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@typescript-eslint/parser": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz",
- "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==",
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
+ "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/typescript-estree": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
+ "@typescript-eslint/scope-manager": "8.35.1",
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/typescript-estree": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1",
"debug": "^4.3.4"
},
"engines": {
@@ -11154,22 +13020,19 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
+ "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11180,10 +13043,11 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -11193,19 +13057,22 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
+ "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
+ "@typescript-eslint/project-service": "8.35.1",
+ "@typescript-eslint/tsconfig-utils": "8.35.1",
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11214,20 +13081,19 @@
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
+ "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.35.1",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11237,31 +13103,24 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@typescript-eslint/parser/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@typescript-eslint/parser/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -11273,42 +13132,24 @@
}
},
"node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@typescript-eslint/parser/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -11319,17 +13160,12 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/@typescript-eslint/parser/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -11337,13 +13173,71 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/parser/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "node_modules/@typescript-eslint/parser/node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
+ "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.35.1",
+ "@typescript-eslint/types": "^8.35.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service/node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
"node_modules/@typescript-eslint/scope-manager": {
@@ -11363,16 +13257,34 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz",
- "integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
+ "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
+ "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.0.1",
- "@typescript-eslint/utils": "8.0.1",
+ "@typescript-eslint/typescript-estree": "8.35.1",
+ "@typescript-eslint/utils": "8.35.1",
"debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11381,17 +13293,17 @@
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -11401,19 +13313,22 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
+ "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
+ "@typescript-eslint/project-service": "8.35.1",
+ "@typescript-eslint/tsconfig-utils": "8.35.1",
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11422,20 +13337,19 @@
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
+ "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.35.1",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11445,31 +13359,24 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -11481,42 +13388,24 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -11527,17 +13416,12 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/@typescript-eslint/type-utils/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -11545,13 +13429,17 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/type-utils/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
"node_modules/@typescript-eslint/types": {
@@ -11693,15 +13581,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz",
- "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
+ "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/typescript-estree": "8.0.1"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.35.1",
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/typescript-estree": "8.35.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11711,17 +13600,19 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
+ "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11732,10 +13623,11 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -11745,19 +13637,22 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
+ "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
+ "@typescript-eslint/project-service": "8.35.1",
+ "@typescript-eslint/tsconfig-utils": "8.35.1",
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1",
"debug": "^4.3.4",
- "globby": "^11.1.0",
+ "fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11766,20 +13661,19 @@
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
+ "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.35.1",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -11789,31 +13683,24 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@typescript-eslint/utils/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -11825,42 +13712,24 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/@typescript-eslint/utils/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -11871,17 +13740,12 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -11889,13 +13753,17 @@
"node": ">=10"
}
},
- "node_modules/@typescript-eslint/utils/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "node_modules/@typescript-eslint/utils/node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
@@ -11932,11 +13800,176 @@
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
},
- "node_modules/@vitest/pretty-format": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.2.tgz",
- "integrity": "sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==",
+ "node_modules/@uppy/companion-client": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.8.2.tgz",
+ "integrity": "sha512-WLjZ0Y6Fe7lzwU1YPvvQ/YqooejcgIZkT2TC39xr+QQ7Y1FwJECsyUdlKwgi1ee8TNpjoCrj3Q1Hjel/+p0VhA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@uppy/utils": "^5.9.0",
+ "namespace-emitter": "^2.0.1",
+ "p-retry": "^6.1.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^3.13.1"
+ }
+ },
+ "node_modules/@uppy/core": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.13.1.tgz",
+ "integrity": "sha512-iQGAUO4ziQRpfv7kix6tO6JOWqjI0K4vt8AynvHWzDPZxYSba3zd6RojGNPsYWSR7Xv+dRXYx+GU8oTiK1FRUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/store-default": "^3.2.2",
+ "@uppy/utils": "^5.9.0",
+ "lodash": "^4.17.21",
+ "mime-match": "^1.0.2",
+ "namespace-emitter": "^2.0.1",
+ "nanoid": "^4.0.0",
+ "preact": "^10.5.13"
+ }
+ },
+ "node_modules/@uppy/informer": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.1.0.tgz",
+ "integrity": "sha512-vmpTLqzSLmZSuIVDZV0o19yXVqyTh5/uCbKUEiyfBhR726kQiuYQLP/ZHaKcvW3c1ESQGbNg53iNHbFBqF681w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@uppy/utils": "^5.7.4",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^3.9.3"
+ }
+ },
+ "node_modules/@uppy/provider-views": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.13.0.tgz",
+ "integrity": "sha512-Z2oI88A+GC2zIPk8beoeFN/miHKkhtF58mYjvb5miGCMMZM7p7LRj98sgb5OOdKsGrfeiuTavtgL424BvcVd8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@uppy/utils": "^5.9.0",
+ "classnames": "^2.2.6",
+ "nanoid": "^4.0.0",
+ "p-queue": "^7.3.4",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^3.13.0"
+ }
+ },
+ "node_modules/@uppy/provider-views/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@uppy/provider-views/node_modules/p-queue": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz",
+ "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "p-timeout": "^5.0.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@uppy/provider-views/node_modules/p-timeout": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
+ "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@uppy/status-bar": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.3.3.tgz",
+ "integrity": "sha512-TCcnBjTDbq/AmnGOcWbCpQNsv05Z6Y36zdmTCt/xNe2/gTVAYAzGRoGOrkeb6jf/E4AAi25VyOolSqL2ibB8Kw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@transloadit/prettier-bytes": "^0.3.4",
+ "@uppy/utils": "^5.9.0",
+ "classnames": "^2.2.6",
+ "preact": "^10.5.13"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^3.11.2"
+ }
+ },
+ "node_modules/@uppy/store-default": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.2.2.tgz",
+ "integrity": "sha512-OiSgT++Jj4nLK0N9WTeod3UNjCH81OXE5BcMJCd9oWzl2d0xPNq2T/E9Y6O72XVd+6Y7+tf5vZlPElutfMB3KQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@uppy/thumbnail-generator": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.1.0.tgz",
+ "integrity": "sha512-tDKK/cukC0CrM0F/OlHFmvpGGUq+Db4YfakhIGPKtT7ZO8aWOiIu5JIvaYUnKRxGq3RGsk4zhkxYXuoxVzzsGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@uppy/utils": "^5.7.5",
+ "exifr": "^7.0.0"
+ },
+ "peerDependencies": {
+ "@uppy/core": "^3.10.0"
+ }
+ },
+ "node_modules/@uppy/utils": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.9.0.tgz",
+ "integrity": "sha512-9Ubddd3orCOLYjf0KobwgJ+aTrABSxk9t4X/QdM4qJHVZuMIftkaMplrViRUO+kvIBCXEZDIP2AmS060siDNGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "preact": "^10.5.13"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
+ "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "2.0.5",
+ "@vitest/utils": "2.0.5",
+ "chai": "^5.1.1",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
+ "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"tinyrainbow": "^1.2.0"
},
@@ -11944,149 +13977,389 @@
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@webassemblyjs/ast": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
- "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
+ "node_modules/@vitest/expect/node_modules/@vitest/utils": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
+ "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ "@vitest/pretty-format": "2.0.5",
+ "estree-walker": "^3.0.3",
+ "loupe": "^3.1.1",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/chai": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
+ "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@vitest/expect/node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vitest/expect/node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz",
+ "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz",
+ "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.1.2",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz",
+ "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/@vitest/utils": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz",
+ "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.1.2",
+ "loupe": "^3.1.3",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vitest/runner/node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz",
+ "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.1.2",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz",
+ "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot/node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
+ "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz",
+ "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "2.1.9",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
},
"node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "dev": true
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "dev": true
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
- "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
- "dev": true
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
- "dev": true
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
- "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.12.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
}
},
"node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
- "dev": true
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
- "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-opt": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1",
- "@webassemblyjs/wast-printer": "1.12.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
- "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
- "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
- "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wast-printer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
- "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
}
},
@@ -12146,19 +14419,259 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/@yarnpkg/lockfile": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
"integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
},
+ "node_modules/5to6-codemod": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/5to6-codemod/-/5to6-codemod-1.8.0.tgz",
+ "integrity": "sha512-RUHjjwl9+p1d46USvmoKsmMaHODFUAESE1de/q0qQM+hwzgk/HssTwb1Nc5dbUpKEkJ7duLg6ggMIwScd+TRig==",
+ "dev": true,
+ "dependencies": {
+ "jscodeshift": "^0.6.3",
+ "lodash": "^4.17.4",
+ "recast": "^0.12.1"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/ast-types": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz",
+ "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/braces/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "dev": true,
+ "hasInstallScript": true
+ },
+ "node_modules/5to6-codemod/node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/fill-range/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/jscodeshift": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.6.4.tgz",
+ "integrity": "sha512-+NF/tlNbc2WEhXUuc4WEJLsJumF84tnaMUZW2hyJw3jThKKRvsPX4sPJVgO1lPE28z0gNL+gwniLG9d8mYvQCQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.1.6",
+ "@babel/parser": "^7.1.6",
+ "@babel/plugin-proposal-class-properties": "^7.1.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+ "@babel/preset-env": "^7.1.6",
+ "@babel/preset-flow": "^7.0.0",
+ "@babel/preset-typescript": "^7.1.0",
+ "@babel/register": "^7.0.0",
+ "babel-core": "^7.0.0-bridge.0",
+ "colors": "^1.1.2",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "neo-async": "^2.5.0",
+ "node-dir": "^0.1.17",
+ "recast": "^0.16.1",
+ "temp": "^0.8.1",
+ "write-file-atomic": "^2.3.0"
+ },
+ "bin": {
+ "jscodeshift": "bin/jscodeshift.js"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/jscodeshift/node_modules/ast-types": {
+ "version": "0.11.7",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz",
+ "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/jscodeshift/node_modules/recast": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.16.2.tgz",
+ "integrity": "sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A==",
+ "dev": true,
+ "dependencies": {
+ "ast-types": "0.11.7",
+ "esprima": "~4.0.0",
+ "private": "~0.1.5",
+ "source-map": "~0.6.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/recast": {
+ "version": "0.12.9",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz",
+ "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==",
+ "dev": true,
+ "dependencies": {
+ "ast-types": "0.10.1",
+ "core-js": "^2.4.1",
+ "esprima": "~4.0.0",
+ "private": "~0.1.5",
+ "source-map": "~0.6.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/5to6-codemod/node_modules/write-file-atomic": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+ "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
"node_modules/abab": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
@@ -12318,6 +14831,16 @@
"node": ">=8.9"
}
},
+ "node_modules/adm-zip": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz",
+ "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ }
+ },
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -12485,10 +15008,11 @@
}
},
"node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -12520,6 +15044,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/ansi-html": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+ "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
"node_modules/ansi-html-community": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
@@ -12540,33 +15077,6 @@
"node": ">=8"
}
},
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-styles/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/ansi-styles/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -12709,14 +15219,41 @@
"deep-equal": "^2.0.5"
}
},
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
},
"engines": {
"node": ">= 0.4"
@@ -12737,16 +15274,20 @@
"dev": true
},
"node_modules/array-includes": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "is-string": "^1.0.7"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -12774,15 +15315,69 @@
"node": ">=0.10.0"
}
},
- "node_modules/array.prototype.flat": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
- "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
+ "node_modules/array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
"dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -12792,15 +15387,16 @@
}
},
"node_modules/array.prototype.flatmap": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -12810,32 +15406,35 @@
}
},
"node_modules/array.prototype.tosorted": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
- "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.1.3"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -12857,6 +15456,15 @@
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
},
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
"node_modules/assert-never": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
@@ -12879,6 +15487,15 @@
"node": "*"
}
},
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ast-types": {
"version": "0.16.1",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
@@ -12892,10 +15509,11 @@
}
},
"node_modules/ast-types-flow": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
- "dev": true
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/astral-regex": {
"version": "2.0.0",
@@ -12911,6 +15529,22 @@
"resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
"integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
},
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/async-lock": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz",
+ "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/async-retry": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
@@ -12932,6 +15566,18 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true,
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
"node_modules/auth0-id-generator": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/auth0-id-generator/-/auth0-id-generator-0.2.0.tgz",
@@ -13051,18 +15697,20 @@
"integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
},
"node_modules/axe-core": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz",
- "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==",
+ "version": "4.10.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+ "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
"dev": true,
+ "license": "MPL-2.0",
"engines": {
"node": ">=4"
}
},
"node_modules/axios": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
- "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
+ "license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -13075,19 +15723,36 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/axobject-query": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
- "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
"dev": true,
- "dependencies": {
- "deep-equal": "^2.0.5"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/babel-core": {
+ "version": "7.0.0-bridge.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+ "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+ "dev": true,
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/babel-loader": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
- "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==",
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
+ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"find-cache-dir": "^4.0.0",
"schema-utils": "^4.0.0"
@@ -13360,13 +16025,14 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
- "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz",
+ "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "core-js-compat": "^3.36.1"
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "core-js-compat": "^3.40.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -13435,10 +16101,107 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
- "node_modules/base-x": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz",
- "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw=="
+ "node_modules/bare-events": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
+ "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/bare-fs": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz",
+ "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
+ "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
+ "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.21.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
"node_modules/base64-js": {
"version": "1.5.1",
@@ -13524,8 +16287,9 @@
"node_modules/batch": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/bcrypt": {
"version": "5.0.1",
@@ -13615,6 +16379,7 @@
"resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
"integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"open": "^8.0.4"
},
@@ -13655,6 +16420,7 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "license": "MIT",
"dependencies": {
"file-uri-to-path": "1.0.0"
}
@@ -13770,10 +16536,11 @@
}
},
"node_modules/bonjour-service": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
- "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
@@ -13796,9 +16563,9 @@
},
"node_modules/bootstrap-5": {
"name": "bootstrap",
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
- "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz",
+ "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==",
"dev": true,
"funding": [
{
@@ -13810,6 +16577,7 @@
"url": "https://opencollective.com/bootstrap"
}
],
+ "license": "MIT",
"peerDependencies": {
"@popperjs/core": "^2.11.8"
}
@@ -13855,12 +16623,13 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/browserslist": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
- "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"dev": true,
"funding": [
{
@@ -13876,11 +16645,12 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001663",
- "electron-to-chromium": "^1.5.28",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.0"
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
},
"bin": {
"browserslist": "cli.js"
@@ -13890,9 +16660,10 @@
}
},
"node_modules/bson": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
- "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==",
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz",
+ "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=16.20.1"
}
@@ -13963,6 +16734,15 @@
"node": ">= 0.10.x"
}
},
+ "node_modules/buildcheck": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz",
+ "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==",
+ "optional": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/builtin-modules": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
@@ -13976,37 +16756,21 @@
}
},
"node_modules/builtins": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.1.0.tgz",
- "integrity": "sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+ "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"semver": "^7.0.0"
}
},
- "node_modules/builtins/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/builtins/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -14014,13 +16778,6 @@
"node": ">=10"
}
},
- "node_modules/builtins/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- },
"node_modules/bull": {
"version": "3.29.3",
"resolved": "https://registry.npmjs.org/bull/-/bull-3.29.3.tgz",
@@ -14084,6 +16841,7 @@
"resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
"integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"run-applescript": "^7.0.0"
},
@@ -14156,21 +16914,6 @@
"node": ">=10.12.0"
}
},
- "node_modules/c8/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/c8/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -14198,6 +16941,36 @@
"node": ">=10"
}
},
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/cache-flow": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/cache-flow/-/cache-flow-1.9.0.tgz",
@@ -14220,15 +16993,44 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
@@ -14265,6 +17067,7 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -14311,9 +17114,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001667",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
- "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
+ "version": "1.0.30001714",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz",
+ "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==",
"dev": true,
"funding": [
{
@@ -14328,7 +17131,8 @@
"type": "github",
"url": "https://github.com/sponsors/ai"
}
- ]
+ ],
+ "license": "CC-BY-4.0"
},
"node_modules/canvas": {
"version": "2.11.2",
@@ -14337,6 +17141,7 @@
"dev": true,
"hasInstallScript": true,
"optional": true,
+ "peer": true,
"dependencies": {
"@mapbox/node-pre-gyp": "^1.0.0",
"nan": "^2.17.0",
@@ -14351,6 +17156,7 @@
"resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
"integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -14360,17 +17166,6 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
- "node_modules/catharsis": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
- "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
- "dependencies": {
- "lodash": "^4.17.15"
- },
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/celebrate": {
"version": "15.0.3",
"resolved": "https://registry.npmjs.org/celebrate/-/celebrate-15.0.3.tgz",
@@ -14534,50 +17329,6 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/chalk/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/character-entities": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
@@ -14697,16 +17448,11 @@
}
},
"node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
+ "license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -14719,6 +17465,9 @@
"engines": {
"node": ">= 8.10.0"
},
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
"optionalDependencies": {
"fsevents": "~2.3.2"
}
@@ -14726,7 +17475,8 @@
"node_modules/chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
},
"node_modules/chrome-trace-event": {
"version": "1.0.3",
@@ -14751,15 +17501,66 @@
"node": ">=8"
}
},
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
"node_modules/cjs-module-lexer": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
"integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="
},
+ "node_modules/class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
+ "dev": true
},
"node_modules/clean-css": {
"version": "5.3.0",
@@ -14773,6 +17574,13 @@
"node": ">= 10.0"
}
},
+ "node_modules/clean-git-ref": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz",
+ "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
"node_modules/clean-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
@@ -14802,18 +17610,6 @@
"node": ">=6"
}
},
- "node_modules/cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "dependencies": {
- "exit": "0.1.2",
- "glob": "^7.1.1"
- },
- "engines": {
- "node": ">=0.2.5"
- }
- },
"node_modules/cli-color": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz",
@@ -14962,6 +17758,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+ "dev": true,
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -15002,7 +17811,6 @@
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
- "optional": true,
"engines": {
"node": ">=0.1.90"
}
@@ -15018,13 +17826,18 @@
"node": ">= 0.8"
}
},
+ "node_modules/combobo": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/combobo/-/combobo-2.0.4.tgz",
+ "integrity": "sha512-FRaTwjtUKNAyBglThL+52VDYD7Jvodb1E1nimBwybqu5ckooZn24e65hYiXSofMp/9dsPEkoAc6v5DSaQ0ENZg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "engines": {
- "node": ">= 6"
- }
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "license": "MIT"
},
"node_modules/common-path-prefix": {
"version": "3.0.0",
@@ -15139,56 +17952,26 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"engines": [
- "node >= 0.8"
+ "node >= 6.0"
],
+ "license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
+ "readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
- "node_modules/concat-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/concat-stream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/concat-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/config": {
- "version": "1.31.0",
- "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz",
- "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==",
- "dependencies": {
- "json5": "^1.0.1"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/config-chain": {
"version": "1.1.13",
@@ -15200,16 +17983,12 @@
"proto-list": "~1.2.1"
}
},
- "node_modules/config/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/connect-flash": {
"version": "0.1.1",
@@ -15224,6 +18003,7 @@
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
"integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8"
}
@@ -15236,6 +18016,16 @@
"node": ">=12"
}
},
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
"node_modules/console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -15259,7 +18049,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
"integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/content-disposition": {
"version": "0.5.4",
@@ -15428,6 +18219,15 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
+ "node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/copy-webpack-plugin": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
@@ -15549,23 +18349,25 @@
}
},
"node_modules/core-js": {
- "version": "3.30.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz",
- "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==",
+ "version": "3.41.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz",
+ "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-js-compat": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
- "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
+ "version": "3.41.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz",
+ "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browserslist": "^4.23.3"
+ "browserslist": "^4.24.4"
},
"funding": {
"type": "opencollective",
@@ -15617,16 +18419,17 @@
}
},
"node_modules/cpu-features": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz",
- "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==",
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
+ "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
- "nan": "^2.14.1"
+ "buildcheck": "~0.0.6",
+ "nan": "^2.19.0"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">=10.0.0"
}
},
"node_modules/crc-32": {
@@ -15640,6 +18443,37 @@
"node": ">=0.8"
}
},
+ "node_modules/create-storybook": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/create-storybook/-/create-storybook-8.6.12.tgz",
+ "integrity": "sha512-2Yb2LuWNvOEATWjj/pDAfkGhGiTLdV1nqJZLjB6F08ItcyBSeGuFybimrac72zFq4u0GI8LkjzEg/J3B1NI4tA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "recast": "^0.23.5",
+ "semver": "^7.6.2"
+ },
+ "bin": {
+ "create-storybook": "bin/index.cjs"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/create-storybook/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/crelt": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
@@ -15666,75 +18500,6 @@
"node": ">=0.8"
}
},
- "node_modules/cross-env": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-4.0.0.tgz",
- "integrity": "sha512-dofkcyPqOy/AR14nbYSpk+TZ4IJZqg2as+/mQNkzh+7Xba2I1I1eyg/1G2dtSpD2LHjcEWwnGquiH2OP5LoeOw==",
- "dependencies": {
- "cross-spawn": "^5.1.0",
- "is-windows": "^1.0.0"
- },
- "bin": {
- "cross-env": "dist/bin/cross-env.js"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/cross-env/node_modules/cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
- "dependencies": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "node_modules/cross-env/node_modules/lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dependencies": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "node_modules/cross-env/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cross-env/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cross-env/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/cross-env/node_modules/yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
- },
"node_modules/cross-fetch": {
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
@@ -15744,9 +18509,10 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -15932,11 +18698,6 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
- "node_modules/css-mediaquery": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz",
- "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q=="
- },
"node_modules/css-minimizer-webpack-plugin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
@@ -16030,15 +18791,6 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
- "node_modules/css-minimizer-webpack-plugin/node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
"node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
@@ -16058,15 +18810,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/css-minimizer-webpack-plugin/node_modules/serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
"node_modules/css-prefers-color-scheme": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-8.0.2.tgz",
@@ -16291,9 +19034,10 @@
"dev": true
},
"node_modules/csstype": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
},
"node_modules/csurf": {
"version": "1.11.0",
@@ -16717,14 +19461,14 @@
}
},
"node_modules/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -16734,29 +19478,29 @@
}
},
"node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/inspect-js"
}
},
"node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"is-data-view": "^1.0.1"
},
@@ -16860,11 +19604,37 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/deep-diff": {
"version": "0.3.8",
@@ -16943,6 +19713,7 @@
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
"integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"bundle-name": "^4.1.0",
"default-browser-id": "^5.0.0"
@@ -16954,11 +19725,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/default-browser/node_modules/default-browser-id": {
+ "node_modules/default-browser-id": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
"integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -16966,18 +19738,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/defaults": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
@@ -17018,6 +19778,7 @@
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -17039,6 +19800,26 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/delay": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
@@ -17079,11 +19860,6 @@
"node": ">= 0.6"
}
},
- "node_modules/deprecation": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
- "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
- },
"node_modules/dequal": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -17103,21 +19879,20 @@
}
},
"node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=0.10"
+ "node": ">=8"
}
},
"node_modules/detect-node": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/devlop": {
"version": "1.1.0",
@@ -17136,17 +19911,17 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
"integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
- "dev": true,
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
}
@@ -17157,6 +19932,13 @@
"integrity": "sha512-UfwfKGxT/Wm2KaxFSZsp7/+YOnAgIzxQXs86zu1IFMLU/+3ouxnEvXqPDn3yxSxlsO4r1B+I2GGQHsIthp6/7Q==",
"license": "Apache-2.0"
},
+ "node_modules/diff3": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz",
+ "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/dijkstrajs": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
@@ -17175,27 +19957,12 @@
"node": ">=8"
}
},
- "node_modules/diskusage": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz",
- "integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==",
- "hasInstallScript": true,
- "dependencies": {
- "es6-promise": "^4.2.5",
- "nan": "^2.14.0"
- }
- },
- "node_modules/disrequire": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/disrequire/-/disrequire-1.1.2.tgz",
- "integrity": "sha512-UaachK0eL7neLyL2emXptVGyggGJKowJd24rqCZi9N2CDxuCQTk7wdePTgS7py4HMh+qxUI6zzTVinVwCDTbIA==",
- "dev": true
- },
"node_modules/dnd-core": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz",
"integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@react-dnd/asap": "^5.0.1",
"@react-dnd/invariant": "^4.0.1",
@@ -17203,10 +19970,11 @@
}
},
"node_modules/dns-packet": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz",
- "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==",
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
},
@@ -17215,31 +19983,87 @@
}
},
"node_modules/docker-modem": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz",
- "integrity": "sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw==",
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz",
+ "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==",
+ "license": "Apache-2.0",
"dependencies": {
"debug": "^4.1.1",
"readable-stream": "^3.5.0",
"split-ca": "^1.0.1",
- "ssh2": "^1.4.0"
+ "ssh2": "^1.15.0"
},
"engines": {
"node": ">= 8.0"
}
},
"node_modules/dockerode": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz",
- "integrity": "sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==",
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.7.tgz",
+ "integrity": "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==",
+ "license": "Apache-2.0",
"dependencies": {
- "docker-modem": "^3.0.0",
- "tar-fs": "~2.0.1"
+ "@balena/dockerignore": "^1.0.2",
+ "@grpc/grpc-js": "^1.11.1",
+ "@grpc/proto-loader": "^0.7.13",
+ "docker-modem": "^5.0.6",
+ "protobufjs": "^7.3.2",
+ "tar-fs": "~2.1.2",
+ "uuid": "^10.0.0"
},
"engines": {
"node": ">= 8.0"
}
},
+ "node_modules/dockerode/node_modules/protobufjs": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz",
+ "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/dockerode/node_modules/tar-fs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
+ "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/dockerode/node_modules/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -17272,11 +20096,14 @@
}
},
"node_modules/dom-helpers": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.1.2"
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
}
},
"node_modules/dom-serializer": {
@@ -17338,10 +20165,14 @@
}
},
"node_modules/dompurify": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz",
- "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==",
- "dev": true
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz",
+ "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==",
+ "dev": true,
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
},
"node_modules/domutils": {
"version": "2.8.0",
@@ -17395,21 +20226,36 @@
"integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
},
"node_modules/downshift": {
- "version": "6.1.7",
- "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz",
- "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==",
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.9.tgz",
+ "integrity": "sha512-ygOT8blgiz5liDuEFAIaPeU4dDEa+w9p6PHVUisPIjrkF5wfR59a52HpGWAVVMoWnoFO8po2mZSScKZueihS7g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.14.8",
- "compute-scroll-into-view": "^1.0.17",
- "prop-types": "^15.7.2",
- "react-is": "^17.0.2",
- "tslib": "^2.3.0"
+ "@babel/runtime": "^7.24.5",
+ "compute-scroll-into-view": "^3.1.0",
+ "prop-types": "^15.8.1",
+ "react-is": "18.2.0",
+ "tslib": "^2.6.2"
},
"peerDependencies": {
"react": ">=16.12.0"
}
},
+ "node_modules/downshift/node_modules/compute-scroll-into-view": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
+ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/downshift/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/dropbox": {
"version": "10.34.0",
"resolved": "https://registry.npmjs.org/dropbox/-/dropbox-10.34.0.tgz",
@@ -17424,6 +20270,15 @@
"@types/node-fetch": "^2.5.7"
}
},
+ "node_modules/dset": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
+ "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/dtrace-provider": {
"version": "0.8.8",
"resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz",
@@ -17436,6 +20291,32 @@
"node": ">=0.10"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+ "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.2"
+ }
+ },
"node_modules/duration": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
@@ -17568,10 +20449,11 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.34",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.34.tgz",
- "integrity": "sha512-/TZAiChbAflBNjCg+VvstbcwAtIL/VdMFO3NgRFIzBjpvPzWOTIbbO8kNb6RwU4bt9TP7K+3KqBKw/lOU+Y+GA==",
- "dev": true
+ "version": "1.5.137",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz",
+ "integrity": "sha512-/QSJaU2JyIuTbbABAo/crOs+SuAZLS+fVVS10PVrIT9hrRkmZl8Hb0xPSkKRUUWHQtYzXHpQUW3Dy5hwMzGZkA==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/email-addresses": {
"version": "5.0.0",
@@ -17619,6 +20501,7 @@
"resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz",
"integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"dedent": "^0.7.0",
"fast-json-parse": "^1.0.3",
@@ -17747,62 +20630,71 @@
"resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
"integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"stackframe": "^1.3.4"
}
},
"node_modules/es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
"license": "MIT",
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
"hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
+ "is-data-view": "^1.0.2",
"is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
},
"engines": {
"node": ">= 0.4"
@@ -17812,12 +20704,10 @@
}
},
"node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
@@ -17850,16 +20740,45 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+ "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.6",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "iterator.prototype": "^1.1.4",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
- "dev": true
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -17869,36 +20788,42 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has": "^1.0.3"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -17907,6 +20832,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-toolkit": {
+ "version": "1.35.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.35.0.tgz",
+ "integrity": "sha512-kVHyrRoC0eLc1hWJ6npG8nNFtOG+nWfcMI+XE0RaFO0gxd6Ions8r0O/U64QyZgY7IeidUnS5oZlRZYUgMGCAg==",
+ "dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks"
+ ]
+ },
"node_modules/es5-ext": {
"version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
@@ -17959,48 +20895,52 @@
}
},
"node_modules/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "version": "0.25.3",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz",
+ "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
+ "@esbuild/aix-ppc64": "0.25.3",
+ "@esbuild/android-arm": "0.25.3",
+ "@esbuild/android-arm64": "0.25.3",
+ "@esbuild/android-x64": "0.25.3",
+ "@esbuild/darwin-arm64": "0.25.3",
+ "@esbuild/darwin-x64": "0.25.3",
+ "@esbuild/freebsd-arm64": "0.25.3",
+ "@esbuild/freebsd-x64": "0.25.3",
+ "@esbuild/linux-arm": "0.25.3",
+ "@esbuild/linux-arm64": "0.25.3",
+ "@esbuild/linux-ia32": "0.25.3",
+ "@esbuild/linux-loong64": "0.25.3",
+ "@esbuild/linux-mips64el": "0.25.3",
+ "@esbuild/linux-ppc64": "0.25.3",
+ "@esbuild/linux-riscv64": "0.25.3",
+ "@esbuild/linux-s390x": "0.25.3",
+ "@esbuild/linux-x64": "0.25.3",
+ "@esbuild/netbsd-arm64": "0.25.3",
+ "@esbuild/netbsd-x64": "0.25.3",
+ "@esbuild/openbsd-arm64": "0.25.3",
+ "@esbuild/openbsd-x64": "0.25.3",
+ "@esbuild/sunos-x64": "0.25.3",
+ "@esbuild/win32-arm64": "0.25.3",
+ "@esbuild/win32-ia32": "0.25.3",
+ "@esbuild/win32-x64": "0.25.3"
}
},
"node_modules/esbuild-register": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz",
- "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^4.3.4"
},
@@ -18009,12 +20949,13 @@
}
},
"node_modules/esbuild-register/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -18025,16 +20966,11 @@
}
}
},
- "node_modules/esbuild-register/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -18077,15 +21013,17 @@
}
},
"node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@@ -18131,10 +21069,11 @@
}
},
"node_modules/eslint-config-prettier": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
- "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
"dev": true,
+ "license": "MIT",
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
@@ -18143,9 +21082,9 @@
}
},
"node_modules/eslint-config-standard": {
- "version": "17.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
- "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
+ "version": "17.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz",
+ "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==",
"dev": true,
"funding": [
{
@@ -18161,10 +21100,14 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
"peerDependencies": {
"eslint": "^8.0.1",
"eslint-plugin-import": "^2.25.2",
- "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
"eslint-plugin-promise": "^6.0.0"
}
},
@@ -18193,13 +21136,15 @@
}
},
"node_modules/eslint-import-resolver-node": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
- "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^3.2.7",
- "resolve": "^1.20.0"
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
}
},
"node_modules/eslint-import-resolver-node/node_modules/debug": {
@@ -18212,16 +21157,21 @@
}
},
"node_modules/eslint-module-utils": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
- "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^3.2.7",
- "find-up": "^2.1.0"
+ "debug": "^3.2.7"
},
"engines": {
"node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
"node_modules/eslint-module-utils/node_modules/debug": {
@@ -18233,90 +21183,25 @@
"ms": "^2.1.1"
}
},
- "node_modules/eslint-module-utils/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/eslint-plugin-chai-expect": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-3.0.0.tgz",
- "integrity": "sha512-NS0YBcToJl+BRKBSMCwRs/oHJIX67fG5Gvb4tGked+9Wnd1/PzKijd82B2QVKcSSOwRe+pp4RAJ2AULeck4eQw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-3.1.0.tgz",
+ "integrity": "sha512-a9F8b38hhJsR7fgDEfyMxppZXCnCW6OOHj7cQfygsm9guXqdSzfpwrHX5FT93gSExDqD71HQglF1lLkGBwhJ+g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": "10.* || 12.* || >= 14.*"
+ "node": "10.* || 12.* || || 14.* || 16.* || >= 18.*"
},
"peerDependencies": {
- "eslint": ">=2.0.0 <= 8.x"
+ "eslint": ">=2.0.0 <= 9.x"
}
},
"node_modules/eslint-plugin-chai-friendly": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz",
- "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==",
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.4.tgz",
+ "integrity": "sha512-PGPjJ8diYgX1mjLxGJqRop2rrGwZRKImoEOwUOgoIhg0p80MkTaqvmFLe5TF7/iagZHggasvIfQlUyHIhK/PYg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
},
@@ -18325,10 +21210,11 @@
}
},
"node_modules/eslint-plugin-cypress": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz",
- "integrity": "sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==",
+ "version": "2.15.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.2.tgz",
+ "integrity": "sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"globals": "^13.20.0"
},
@@ -18337,10 +21223,11 @@
}
},
"node_modules/eslint-plugin-cypress/node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"type-fest": "^0.20.2"
},
@@ -18356,7 +21243,6 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
"integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
- "peer": true,
"dependencies": {
"eslint-utils": "^2.0.0",
"regexpp": "^3.0.0"
@@ -18372,39 +21258,47 @@
}
},
"node_modules/eslint-plugin-import": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
- "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-includes": "^3.1.4",
- "array.prototype.flat": "^1.2.5",
- "debug": "^2.6.9",
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
+ "debug": "^3.2.7",
"doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-module-utils": "^2.7.3",
- "has": "^1.0.3",
- "is-core-module": "^2.8.1",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.1",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.16.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
- "object.values": "^1.1.5",
- "resolve": "^1.22.0",
- "tsconfig-paths": "^3.14.1"
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.1",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.9",
+ "tsconfig-paths": "^3.15.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
}
},
"node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
"node_modules/eslint-plugin-import/node_modules/doctrine": {
@@ -18412,6 +21306,7 @@
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
@@ -18419,56 +21314,63 @@
"node": ">=0.10.0"
}
},
- "node_modules/eslint-plugin-import/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
"node_modules/eslint-plugin-jsx-a11y": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
- "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.20.7",
- "aria-query": "^5.1.3",
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "ast-types-flow": "^0.0.7",
- "axe-core": "^4.6.2",
- "axobject-query": "^3.1.1",
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
"damerau-levenshtein": "^1.0.8",
"emoji-regex": "^9.2.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^3.3.3",
- "language-tags": "=1.0.5",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
"minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "semver": "^6.3.0"
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
},
"engines": {
"node": ">=4.0"
},
"peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/eslint-plugin-mocha": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz",
- "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz",
+ "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"eslint-utils": "^3.0.0",
- "rambda": "^7.1.0"
+ "globals": "^13.24.0",
+ "rambda": "^7.4.0"
},
"engines": {
"node": ">=14.0.0"
@@ -18482,6 +21384,7 @@
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^2.0.0"
},
@@ -18495,21 +21398,37 @@
"eslint": ">=5"
}
},
- "node_modules/eslint-plugin-n": {
- "version": "15.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.0.tgz",
- "integrity": "sha512-lWLg++jGwC88GDGGBX3CMkk0GIWq0y41aH51lavWApOKcMQcYoL3Ayd0lEdtD3SnQtR+3qBvWQS3qGbR2BxRWg==",
+ "node_modules/eslint-plugin-mocha/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "builtins": "^4.0.0",
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "15.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz",
+ "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "builtins": "^5.0.1",
"eslint-plugin-es": "^4.1.0",
"eslint-utils": "^3.0.0",
"ignore": "^5.1.1",
- "is-core-module": "^2.3.0",
- "minimatch": "^3.0.4",
- "resolve": "^1.10.1",
- "semver": "^6.3.0"
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
},
"engines": {
"node": ">=12.22.0"
@@ -18526,7 +21445,6 @@
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
- "peer": true,
"dependencies": {
"eslint-visitor-keys": "^2.0.0"
},
@@ -18540,55 +21458,30 @@
"eslint": ">=5"
}
},
- "node_modules/eslint-plugin-node": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
- "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+ "node_modules/eslint-plugin-n/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "dependencies": {
- "eslint-plugin-es": "^3.0.0",
- "eslint-utils": "^2.0.0",
- "ignore": "^5.1.1",
- "minimatch": "^3.0.4",
- "resolve": "^1.10.1",
- "semver": "^6.1.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=8.10.0"
- },
- "peerDependencies": {
- "eslint": ">=5.16.0"
- }
- },
- "node_modules/eslint-plugin-node/node_modules/eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
- "dev": true,
- "dependencies": {
- "eslint-utils": "^2.0.0",
- "regexpp": "^3.0.0"
- },
- "engines": {
- "node": ">=8.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=4.19.1"
+ "node": ">=10"
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
- "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=12.0.0"
},
"peerDependencies": {
"eslint": ">=7.28.0",
@@ -18601,51 +21494,60 @@
}
},
"node_modules/eslint-plugin-promise": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
- "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz",
+ "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
"peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"node_modules/eslint-plugin-react": {
- "version": "7.32.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
- "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
+ "version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+ "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.3",
+ "array.prototype.tosorted": "^1.1.4",
"doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.2.1",
"estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
+ "object.entries": "^1.1.9",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.1",
"prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
- "semver": "^6.3.0",
- "string.prototype.matchall": "^4.0.8"
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.12",
+ "string.prototype.repeat": "^1.0.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
"node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -18658,6 +21560,7 @@
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
@@ -18666,12 +21569,13 @@
}
},
"node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -18682,11 +21586,93 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/eslint-plugin-unicorn": {
- "version": "56.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.0.tgz",
- "integrity": "sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==",
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.5.3.tgz",
+ "integrity": "sha512-sZk5hIrx0p1ehvdS2qHefKwXHiEysiQN+FMGCzES6xRNUgwI3q4KdWMeAwpPDP9u0RDkNzJpebRUnNch1sJh+A==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "^8.15.0",
+ "@typescript-eslint/utils": "^8.15.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0",
+ "pnpm": "^9.14.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
+ "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/visitor-keys": "8.35.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
+ "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.35.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
+ "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.35.1",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.24.7",
"@eslint-community/eslint-utils": "^4.4.0",
@@ -18716,9 +21702,9 @@
}
},
"node_modules/eslint-plugin-unicorn/node_modules/ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
"dev": true,
"funding": [
{
@@ -18726,15 +21712,17 @@
"url": "https://github.com/sponsors/sibiraj-s"
}
],
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/eslint-plugin-unicorn/node_modules/globals": {
- "version": "15.11.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz",
- "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==",
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -18742,23 +21730,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/eslint-plugin-unicorn/node_modules/regjsparser": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz",
"integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"jsesc": "~0.5.0"
},
@@ -18776,10 +21753,11 @@
}
},
"node_modules/eslint-plugin-unicorn/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -18792,6 +21770,7 @@
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"min-indent": "^1.0.0"
},
@@ -18858,6 +21837,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -18872,6 +21852,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -18887,6 +21868,7 @@
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@@ -18902,6 +21884,7 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -18913,6 +21896,7 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -18921,9 +21905,10 @@
}
},
"node_modules/eslint/node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "license": "MIT",
"dependencies": {
"type-fest": "^0.20.2"
},
@@ -18934,26 +21919,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint/node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/eslint/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -19089,6 +22059,7 @@
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0"
}
@@ -19136,7 +22107,8 @@
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/eventid": {
"version": "2.0.1",
@@ -19178,50 +22150,6 @@
"node": ">=14.18"
}
},
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/execa/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/execa/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
"node_modules/executable": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
@@ -19324,56 +22252,114 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "node_modules/exifr": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz",
+ "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/expect": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/expect/-/expect-1.20.2.tgz",
- "integrity": "sha512-vUOB6rNLhhRgchrNzJZH72FXDgiHmmEqX07Nlb1363HyZm/GFzkNMq0X0eIygMtdc4f2okltziddtVM4D5q0Jw==",
+ "node_modules/expand-brackets/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
- "define-properties": "~1.1.2",
- "has": "^1.0.1",
- "is-equal": "^1.5.1",
- "is-regex": "^1.0.3",
- "object-inspect": "^1.1.0",
- "object-keys": "^1.0.9",
- "tmatch": "^2.0.1"
+ "ms": "2.0.0"
}
},
- "node_modules/expect/node_modules/define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "node_modules/expand-brackets/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
"dev": true,
"dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/expect-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz",
+ "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
}
},
"node_modules/express": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
- "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.6.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
@@ -19387,7 +22373,7 @@
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.13.0",
"range-parser": "~1.2.1",
@@ -19402,6 +22388,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express-basic-auth": {
@@ -19544,9 +22534,10 @@
]
},
"node_modules/express/node_modules/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -19641,6 +22632,71 @@
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
+ "node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "dev": true,
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -19678,6 +22734,22 @@
"node": ">=18"
}
},
+ "node_modules/fast-content-type-parse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
+ "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/fast-copy": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz",
@@ -19706,20 +22778,20 @@
"node_modules/fast-fifo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
},
"node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
@@ -19729,7 +22801,8 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz",
"integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-json-patch": {
"version": "3.1.1",
@@ -19749,8 +22822,7 @@
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
},
"node_modules/fast-text-encoding": {
"version": "1.0.3",
@@ -19778,6 +22850,7 @@
}
],
"optional": true,
+ "peer": true,
"dependencies": {
"strnum": "^1.0.5"
},
@@ -19813,6 +22886,7 @@
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"websocket-driver": ">=0.5.1"
},
@@ -19826,6 +22900,16 @@
"integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=",
"dev": true
},
+ "node_modules/fd-package-json": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz",
+ "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "walk-up-path": "^3.0.1"
+ }
+ },
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
@@ -19864,45 +22948,6 @@
"node": ">=4.0.0"
}
},
- "node_modules/fetch-mock": {
- "version": "9.11.0",
- "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz",
- "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.0.0",
- "@babel/runtime": "^7.0.0",
- "core-js": "^3.0.0",
- "debug": "^4.1.1",
- "glob-to-regexp": "^0.4.0",
- "is-subset": "^0.1.1",
- "lodash.isequal": "^4.5.0",
- "path-to-regexp": "^2.2.1",
- "querystring": "^0.2.0",
- "whatwg-url": "^6.5.0"
- },
- "engines": {
- "node": ">=4.0.0"
- },
- "funding": {
- "type": "charity",
- "url": "https://www.justgiving.com/refugee-support-europe"
- },
- "peerDependencies": {
- "node-fetch": "*"
- },
- "peerDependenciesMeta": {
- "node-fetch": {
- "optional": true
- }
- }
- },
- "node_modules/fetch-mock/node_modules/path-to-regexp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
- "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
- "dev": true
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -19972,7 +23017,8 @@
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT"
},
"node_modules/filelist": {
"version": "1.0.4",
@@ -20193,6 +23239,7 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz",
"integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==",
+ "license": "MIT",
"engines": {
"node": ">=0.8.22"
}
@@ -20218,25 +23265,20 @@
"node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/flat-cache/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/flatted": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
},
+ "node_modules/flow-parser": {
+ "version": "0.250.0",
+ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.250.0.tgz",
+ "integrity": "sha512-8mkLh/CotlvqA9vCyQMbhJoPx2upEg9oKxARAayz8zQ58wCdABnTZy6U4xhMHvHvbTUFgZQk4uH2cglOCOel5A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/flowstate": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/flowstate/-/flowstate-0.4.1.tgz",
@@ -20275,11 +23317,27 @@
}
},
"node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/foreach": {
@@ -20314,6 +23372,7 @@
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
"integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.16.7",
"chalk": "^4.1.2",
@@ -20342,6 +23401,7 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -20357,6 +23417,7 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -20368,26 +23429,12 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -20400,6 +23447,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -20407,12 +23455,6 @@
"node": ">=8"
}
},
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -20448,6 +23490,7 @@
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
"integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==",
"deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau",
+ "license": "MIT",
"funding": {
"url": "https://ko-fi.com/tunnckoCore/commissions"
}
@@ -20463,6 +23506,7 @@
"url": "https://opencollective.com/formik"
}
],
+ "license": "Apache-2.0",
"dependencies": {
"deepmerge": "^2.1.1",
"hoist-non-react-statics": "^3.3.0",
@@ -20481,6 +23525,7 @@
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
"integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -20489,7 +23534,8 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
+ "dev": true,
+ "license": "0BSD"
},
"node_modules/forwarded": {
"version": "0.2.0",
@@ -20512,6 +23558,18 @@
"url": "https://github.com/sponsors/rawify"
}
},
+ "node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+ "dev": true,
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/freegeoip": {
"resolved": "services/freegeoip",
"link": true
@@ -20585,11 +23643,12 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -20607,14 +23666,17 @@
}
},
"node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -20623,12 +23685,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true
- },
"node_modules/functions-have-names": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
@@ -20641,6 +23697,7 @@
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz",
"integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw==",
+ "dev": true,
"engines": {
"node": ">=6"
}
@@ -20679,30 +23736,15 @@
}
},
"node_modules/gcp-metadata": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
- "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+ "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
"dependencies": {
- "gaxios": "^4.0.0",
+ "gaxios": "^5.0.0",
"json-bigint": "^1.0.0"
},
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/gcp-metadata/node_modules/gaxios": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
- "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
- "dependencies": {
- "abort-controller": "^3.0.0",
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.1"
- },
- "engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/generic-pool": {
@@ -20740,15 +23782,21 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -20776,6 +23824,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -20792,14 +23853,14 @@
}
},
"node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -20808,6 +23869,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/getopts": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
@@ -20838,11 +23908,24 @@
"node": ">=0.8"
}
},
- "node_modules/github-slugger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
- "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
- "dev": true
+ "node_modules/giget": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz",
+ "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.6",
+ "nypm": "^0.5.4",
+ "pathe": "^2.0.3",
+ "tar": "^6.2.1"
+ },
+ "bin": {
+ "giget": "dist/cli.mjs"
+ }
},
"node_modules/glob": {
"version": "7.2.0",
@@ -20997,11 +24080,13 @@
}
},
"node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "license": "MIT",
"dependencies": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -21075,6 +24160,18 @@
"node": ">=10"
}
},
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+ "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+ "dependencies": {
+ "gaxios": "^4.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/google-auth-library/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -21152,17 +24249,6 @@
}
}
},
- "node_modules/google-gax/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
"node_modules/google-gax/node_modules/gaxios": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
@@ -21340,6 +24426,15 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/google-p12-pem": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
@@ -21394,18 +24489,6 @@
"node": ">=12.0.0"
}
},
- "node_modules/googleapis-common/node_modules/gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/googleapis-common/node_modules/google-auth-library": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.8.0.tgz",
@@ -21476,18 +24559,6 @@
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
- "node_modules/googleapis/node_modules/gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/googleapis/node_modules/google-auth-library": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.8.0.tgz",
@@ -21551,11 +24622,12 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -21575,6 +24647,7 @@
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
"integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+ "license": "MIT",
"dependencies": {
"lodash": "^4.17.15"
}
@@ -21660,7 +24733,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
"integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/handlebars": {
"version": "4.7.8",
@@ -21754,18 +24828,6 @@
"node": ">=6"
}
},
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -21794,10 +24856,13 @@
}
},
"node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
"license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -21806,9 +24871,10 @@
}
},
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -21836,6 +24902,69 @@
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
+ "node_modules/has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -21848,45 +24977,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hast-util-heading-rank": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
- "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-is-element": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
- "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz",
- "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -22016,8 +25106,9 @@
"node_modules/hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"obuf": "^1.0.0",
@@ -22028,14 +25119,16 @@
"node_modules/hpack.js/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -22051,6 +25144,7 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
@@ -22147,6 +25241,7 @@
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
@@ -22156,6 +25251,7 @@
"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
"integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
"dev": true,
+ "peer": true,
"engines": {
"node": ">=8"
},
@@ -22208,8 +25304,9 @@
"node_modules/http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
- "dev": true
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/http-errors": {
"version": "2.0.0",
@@ -22278,16 +25375,18 @@
"dev": true
},
"node_modules/http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
- "dev": true
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
+ "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
@@ -22311,10 +25410,11 @@
}
},
"node_modules/http-proxy-middleware": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
- "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
+ "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
@@ -22339,6 +25439,7 @@
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -22402,15 +25503,11 @@
"resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
"integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.18"
}
},
- "node_modules/hyphenate-style-name": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
- "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
- },
"node_modules/i18next": {
"version": "23.10.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
@@ -22735,14 +25832,14 @@
}
},
"node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -22760,6 +25857,8 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
}
@@ -22797,10 +25896,33 @@
"node": ">=6"
}
},
- "node_modules/ip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
- "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ=="
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ip-address/node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/ip-address/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "optional": true,
+ "peer": true
},
"node_modules/ip-regex": {
"version": "2.1.0",
@@ -22867,6 +25989,18 @@
"node": ">=8"
}
},
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
+ "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
@@ -22883,13 +26017,14 @@
}
},
"node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -22904,25 +26039,17 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
- "node_modules/is-arrow-function": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz",
- "integrity": "sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
- "dev": true,
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -22932,11 +26059,15 @@
}
},
"node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
"dependencies": {
- "has-bigints": "^1.0.1"
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -22955,12 +26086,13 @@
}
},
"node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -22969,6 +26101,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
"node_modules/is-builtin-module": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
@@ -22996,22 +26134,40 @@
}
},
"node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-data-view": {
+ "node_modules/is-data-descriptor": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
+ "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"license": "MIT",
"dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
"is-typed-array": "^1.1.13"
},
"engines": {
@@ -23022,11 +26178,13 @@
}
},
"node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -23035,6 +26193,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-descriptor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
+ "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/is-docker": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@@ -23049,42 +26220,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-equal": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/is-equal/-/is-equal-1.7.0.tgz",
- "integrity": "sha512-hErktGR9jmoYXNWlbrwGjc8eHh09mbY6TWSTTFtnMcKaCuSMN8z+Ni5ma/8mkbVpe4CbB7V6kN1MkCg9bCx5bA==",
- "dev": true,
- "dependencies": {
- "es-get-iterator": "^1.1.3",
- "es-to-primitive": "^1.2.1",
- "functions-have-names": "^1.2.3",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0",
- "is-arrow-function": "^2.0.3",
- "is-bigint": "^1.0.4",
- "is-boolean-object": "^1.1.2",
- "is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-generator-function": "^1.0.10",
- "is-number-object": "^1.0.7",
- "is-regex": "^1.1.4",
- "is-string": "^1.0.7",
- "is-symbol": "^1.0.4",
- "isarray": "^2.0.5",
- "object-inspect": "^1.13.1",
- "object.entries": "^1.1.7",
- "object.getprototypeof": "^1.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-expression": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
@@ -23094,6 +26229,18 @@
"object-assign": "^4.1.1"
}
},
+ "node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -23103,12 +26250,15 @@
}
},
"node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dev": true,
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -23152,6 +26302,7 @@
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-docker": "^3.0.0"
},
@@ -23170,6 +26321,7 @@
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"dev": true,
+ "license": "MIT",
"bin": {
"is-docker": "cli.js"
},
@@ -23209,10 +26361,13 @@
}
},
"node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -23274,11 +26429,13 @@
}
},
"node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -23303,6 +26460,16 @@
"node": ">=8"
}
},
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -23327,12 +26494,15 @@
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -23342,10 +26512,13 @@
}
},
"node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true,
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -23354,15 +26527,16 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz",
"integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -23382,17 +26556,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-stream-ended": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
- "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw=="
- },
"node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -23401,18 +26572,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-subset": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
- "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
- "dev": true
- },
"node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -23422,12 +26590,12 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"license": "MIT",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -23468,33 +26636,43 @@
"integrity": "sha512-X/kiF3Xndj6WI7l/yLyzR7V1IbQd6L4S4cewSL0fRciemPmHbaXIKR2qtf+zseH+lbMG0vFp4HvCUe7amGZVhw=="
},
"node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true,
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
- "dev": true,
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -23510,6 +26688,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -23544,6 +26723,79 @@
"node": ">=0.10.0"
}
},
+ "node_modules/isomorphic-git": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.29.0.tgz",
+ "integrity": "sha512-zWGqk8901cicvVEhVpN76AwKrS/TzHak2NQCtNXIAavpMIy/yqh+d/JtC9A8AUKZAauUdOyEWKI29tuCLAL+Zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-lock": "^1.4.1",
+ "clean-git-ref": "^2.0.1",
+ "crc-32": "^1.2.0",
+ "diff3": "0.0.3",
+ "ignore": "^5.1.4",
+ "minimisted": "^2.0.0",
+ "pako": "^1.0.10",
+ "path-browserify": "^1.0.1",
+ "pify": "^4.0.1",
+ "readable-stream": "^3.4.0",
+ "sha.js": "^2.4.9",
+ "simple-get": "^4.0.1"
+ },
+ "bin": {
+ "isogit": "cli.cjs"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/isomorphic-git/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/isomorphic-git/node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/isomorphic-textencoder": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-textencoder/-/isomorphic-textencoder-1.0.1.tgz",
+ "integrity": "sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-text-encoding": "^1.0.0"
+ }
+ },
"node_modules/isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -23612,6 +26864,40 @@
"node": ">=8"
}
},
+ "node_modules/iterator.prototype": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+ "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "get-proto": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jaeger-client": {
"version": "3.19.0",
"resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz",
@@ -23904,45 +27190,75 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/js2xmlparser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
- "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
- "dependencies": {
- "xmlcreate": "^2.0.4"
- }
- },
"node_modules/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
- "node_modules/jsdoc": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz",
- "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==",
+ "node_modules/jscodeshift": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-17.0.0.tgz",
+ "integrity": "sha512-Af+MFsNwLSVO+t4kKjJdJKh6iNbNHfDfFGdyltJ2wUFN3furgbvHguJmB85iou+fY7wbHgI8eiEKpp6doGgtKg==",
+ "dev": true,
"dependencies": {
- "@babel/parser": "^7.20.15",
- "@jsdoc/salty": "^0.2.1",
- "@types/markdown-it": "^14.1.1",
- "bluebird": "^3.7.2",
- "catharsis": "^0.9.0",
- "escape-string-regexp": "^2.0.0",
- "js2xmlparser": "^4.0.2",
- "klaw": "^3.0.0",
- "markdown-it": "^14.1.0",
- "markdown-it-anchor": "^8.6.7",
- "marked": "^4.0.10",
- "mkdirp": "^1.0.4",
- "requizzle": "^0.2.3",
- "strip-json-comments": "^3.1.0",
- "underscore": "~1.13.2"
+ "@babel/core": "^7.24.7",
+ "@babel/parser": "^7.24.7",
+ "@babel/plugin-transform-class-properties": "^7.24.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+ "@babel/plugin-transform-optional-chaining": "^7.24.7",
+ "@babel/plugin-transform-private-methods": "^7.24.7",
+ "@babel/preset-flow": "^7.24.7",
+ "@babel/preset-typescript": "^7.24.7",
+ "@babel/register": "^7.24.6",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.7",
+ "neo-async": "^2.5.0",
+ "picocolors": "^1.0.1",
+ "recast": "^0.23.9",
+ "temp": "^0.9.4",
+ "write-file-atomic": "^5.0.1"
},
"bin": {
- "jsdoc": "jsdoc.js"
+ "jscodeshift": "bin/jscodeshift.js"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "@babel/preset-env": "^7.1.6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/preset-env": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jscodeshift/node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/jscodeshift/node_modules/temp": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
+ "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
+ "dev": true,
+ "dependencies": {
+ "mkdirp": "^0.5.1",
+ "rimraf": "~2.6.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/jsdoc-type-pratt-parser": {
@@ -23950,29 +27266,11 @@
"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
"integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12.0.0"
}
},
- "node_modules/jsdoc/node_modules/escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jsdoc/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/jsdom": {
"version": "19.0.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
@@ -24066,15 +27364,16 @@
}
},
"node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
+ "license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
- "node": ">=4"
+ "node": ">=6"
}
},
"node_modules/json-bigint": {
@@ -24113,6 +27412,7 @@
"version": "3.0.15",
"resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz",
"integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==",
+ "license": "MIT",
"dependencies": {
"commander": "~4.1.1",
"graphlib": "^2.1.8",
@@ -24134,14 +27434,25 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
+ "node_modules/json-refs/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/json-refs/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==",
+ "license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -24154,6 +27465,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -24217,7 +27529,6 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
"bin": {
"json5": "lib/cli.js"
},
@@ -24354,24 +27665,41 @@
}
},
"node_modules/jsx-ast-utils": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
- "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-includes": "^3.1.5",
- "object.assign": "^4.1.3"
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
},
"engines": {
"node": ">=4.0"
}
},
+ "node_modules/just-debounce-it": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-1.1.0.tgz",
+ "integrity": "sha512-87Nnc0qZKgBZuhFZjYVjSraic0x7zwjhaTMrCKlj0QYKH6lh0KbFzVnfu6LHan03NO7J8ygjeBeD0epejn5Zcg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/just-extend": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
"integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
"dev": true
},
+ "node_modules/just-once": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/just-once/-/just-once-1.1.0.tgz",
+ "integrity": "sha512-+rZVpl+6VyTilK7vB/svlMPil4pxqIJZkbnN7DKZTOzyXfun6ZiFeq2Pk4EtCEHZ0VU4EkdFzG8ZK5F3PErcDw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jwa": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
@@ -24392,18 +27720,14 @@
}
},
"node_modules/kareem": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
- "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
+ "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=12.0.0"
}
},
- "node_modules/keycode": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz",
- "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg=="
- },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -24423,14 +27747,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/klaw": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
- "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
- "dependencies": {
- "graceful-fs": "^4.1.9"
- }
- },
"node_modules/klaw-sync": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
@@ -24541,12 +27857,16 @@
"dev": true
},
"node_modules/language-tags": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
- "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "language-subtag-registry": "~0.3.2"
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
"node_modules/latexqc": {
@@ -24554,10 +27874,11 @@
"link": true
},
"node_modules/launch-editor": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz",
- "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==",
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz",
+ "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"picocolors": "^1.0.0",
"shell-quote": "^1.8.1"
@@ -24778,6 +28099,16 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -24805,19 +28136,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
- "node_modules/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
- "dependencies": {
- "uc.micro": "^2.0.0"
- }
- },
- "node_modules/linkify-it/node_modules/uc.micro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
- "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
- },
"node_modules/listr2": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
@@ -24920,12 +28238,14 @@
"node_modules/lodash._arraypool": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz",
- "integrity": "sha1-6I7suS4ruEyQZWEv2VigcZzUf5Q="
+ "integrity": "sha512-tC2aLC7bbkDXKNrjDu9OLiVx9pFIvjinID2eD9PzNdAQGZScWUd/h8faqOw5d6oLsOvFRCRbz1ASoB+deyMVUw==",
+ "license": "MIT"
},
"node_modules/lodash._basebind": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz",
- "integrity": "sha1-6UC5690nwyfgqNqxtVkWxTQelXU=",
+ "integrity": "sha512-VGHm6DH+1UiuafQdE/DNMqxOcSyhRu0xO9+jPDq7xITRn5YOorGrHVQmavMVXCYmTm80YRTZZCn/jTW7MokwLg==",
+ "license": "MIT",
"dependencies": {
"lodash._basecreate": "~2.4.1",
"lodash._setbinddata": "~2.4.1",
@@ -24936,7 +28256,8 @@
"node_modules/lodash._baseclone": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz",
- "integrity": "sha1-MPgj5X4X43NdODvWK2Czh1Q7QYY=",
+ "integrity": "sha512-+zJVXs0VxC/Au+/7foiKzw8UaWvfSfPh20XhqK/6HFQiUeclL5fz05zY7G9yDAFItAKKZwB4cgpzGvxiwuG1wQ==",
+ "license": "MIT",
"dependencies": {
"lodash._getarray": "~2.4.1",
"lodash._releasearray": "~2.4.1",
@@ -24951,7 +28272,8 @@
"node_modules/lodash._basecreate": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz",
- "integrity": "sha1-+Ob1tXip405UEXm1a47uv0oofgg=",
+ "integrity": "sha512-8JJ3FnMPm54t3BwPLk8q8mPyQKQXm/rt9df+awr4NGtyJrtcCXM3Of1I86S6jVy1b4yAyFBb8wbKPEauuqzRmQ==",
+ "license": "MIT",
"dependencies": {
"lodash._isnative": "~2.4.1",
"lodash.isobject": "~2.4.1",
@@ -24961,7 +28283,8 @@
"node_modules/lodash._basecreatecallback": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz",
- "integrity": "sha1-fQsmdknLKeehOdAQO3wR+uhOSFE=",
+ "integrity": "sha512-SLczhg860fGW7AKlYcuOFstDtJuQhaANlJ4Y/jrOoRxhmVtK41vbJDH3OefVRSRkSCQo4HI82QVkAVsoGa5gSw==",
+ "license": "MIT",
"dependencies": {
"lodash._setbinddata": "~2.4.1",
"lodash.bind": "~2.4.1",
@@ -24972,7 +28295,8 @@
"node_modules/lodash._basecreatewrapper": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz",
- "integrity": "sha1-TTHy595+E0+/KAN2K4FQsyUZZm8=",
+ "integrity": "sha512-x2ja1fa/qmzbizuXgVM4QAP9svtMbdxjG8Anl9bCeDAwLOVQ1vLrA0hLb/NkpbGi9evjtkl0aWLTEoOlUdBPQA==",
+ "license": "MIT",
"dependencies": {
"lodash._basecreate": "~2.4.1",
"lodash._setbinddata": "~2.4.1",
@@ -24983,7 +28307,8 @@
"node_modules/lodash._createwrapper": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz",
- "integrity": "sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc=",
+ "integrity": "sha512-5TCfLt1haQpsa7bgLYRKNNE4yqhO4ZxIayN1btQmazMchO6Q8JYFRMqbJ3W+uNmMm4R0Jw7KGkZX5YfDDnywuw==",
+ "license": "MIT",
"dependencies": {
"lodash._basebind": "~2.4.1",
"lodash._basecreatewrapper": "~2.4.1",
@@ -24994,7 +28319,8 @@
"node_modules/lodash._getarray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz",
- "integrity": "sha1-+vH3+BD6mFolHCGHQESBCUg55e4=",
+ "integrity": "sha512-iIrScwY3atGvLVbQL/+CNUznaPwBJg78S/JO4cTUFXRkRsZgEBhscB27cVoT4tsIOUyFu/5M/0umfHNGJ6wYwg==",
+ "license": "MIT",
"dependencies": {
"lodash._arraypool": "~2.4.1"
}
@@ -25002,22 +28328,26 @@
"node_modules/lodash._isnative": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz",
- "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw="
+ "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==",
+ "license": "MIT"
},
"node_modules/lodash._maxpoolsize": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz",
- "integrity": "sha1-nUgvRjuOZq++WcLBTtsRcGAXIzQ="
+ "integrity": "sha512-xKDem1BxoIfcCtaJHotjtyfdIvZO9qrF+mv3G1+ngQmaI3MJt3Qm46i9HLk/CbzABbavUrr1/EomQT8KxtsrYA==",
+ "license": "MIT"
},
"node_modules/lodash._objecttypes": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz",
- "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE="
+ "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==",
+ "license": "MIT"
},
"node_modules/lodash._releasearray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz",
- "integrity": "sha1-phOWMNdtFTawfdyAliiJsIL2pkE=",
+ "integrity": "sha512-wwCwWX8PK/mYR5VZjcU5JFl6py/qrfLGMxzpKOfSqgA1PaZ6Z625CZLCxH1KsqyxSkOFmNm+mEYjeDpXlM4hrg==",
+ "license": "MIT",
"dependencies": {
"lodash._arraypool": "~2.4.1",
"lodash._maxpoolsize": "~2.4.1"
@@ -25026,7 +28356,8 @@
"node_modules/lodash._setbinddata": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz",
- "integrity": "sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI=",
+ "integrity": "sha512-Vx0XKzpg2DFbQw4wrp1xSWd2sfl3W/BG6bucSRZmftS1AzbWRemCmBQDxyQTNhlLNec428PXkuuja+VNBZgu2A==",
+ "license": "MIT",
"dependencies": {
"lodash._isnative": "~2.4.1",
"lodash.noop": "~2.4.1"
@@ -25035,7 +28366,8 @@
"node_modules/lodash._shimkeys": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz",
- "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
+ "integrity": "sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==",
+ "license": "MIT",
"dependencies": {
"lodash._objecttypes": "~2.4.1"
}
@@ -25043,12 +28375,14 @@
"node_modules/lodash._slice": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz",
- "integrity": "sha1-dFz0GlNZexj2iImFREBe+isG2Q8="
+ "integrity": "sha512-+odPJa4PE2UgYnQgJgkLs0UD03QU78R2ivhrFnG9GdtYOZdE6ObxOj7KiUEUlqOOgatFT+ZqSypFjDSduTigKg==",
+ "license": "MIT"
},
"node_modules/lodash.assign": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz",
- "integrity": "sha1-hMOVlt1xGBqXsGUpE6fJZ15Jsao=",
+ "integrity": "sha512-AqQ4AJz5buSx9ELXWt5dONwJyVPd4NTADMKhoVYWCugjoVf172/LpvVhwmSJn4g8/Dc0S8hxTe8rt5Dob3X9KQ==",
+ "license": "MIT",
"dependencies": {
"lodash._basecreatecallback": "~2.4.1",
"lodash._objecttypes": "~2.4.1",
@@ -25058,7 +28392,8 @@
"node_modules/lodash.bind": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz",
- "integrity": "sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc=",
+ "integrity": "sha512-hn2VWYZ+N9aYncRad4jORvlGgpFrn+axnPIWRvFxjk6CWcZH5b5alI8EymYsHITI23Z9wrW/+ORq+azrVFpOfw==",
+ "license": "MIT",
"dependencies": {
"lodash._createwrapper": "~2.4.1",
"lodash._slice": "~2.4.1"
@@ -25072,7 +28407,8 @@
"node_modules/lodash.clonedeep": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-2.4.1.tgz",
- "integrity": "sha1-8pIDtAsS/uCkXTYxZIJZvrq8eGg=",
+ "integrity": "sha512-zj5vReFLkR+lJOBKP1wyteZ13zut/KSmXtdCBgxcy/m4UTitcBxpeVZT7gwk8BQrztPI5dIgO4bhBppXV4rpTQ==",
+ "license": "MIT",
"dependencies": {
"lodash._baseclone": "~2.4.1",
"lodash._basecreatecallback": "~2.4.1"
@@ -25102,7 +28438,8 @@
"node_modules/lodash.foreach": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz",
- "integrity": "sha1-/j/Do0yGyUyrb5UiVgKCdB4BYwk=",
+ "integrity": "sha512-AvOobAkE7qBtIiHU5QHQIfveWH5Usr9pIcFIzBv7u4S6bvb3FWpFrh9ltqBY7UeL5lw6e8d+SggiUXQVyh+FpA==",
+ "license": "MIT",
"dependencies": {
"lodash._basecreatecallback": "~2.4.1",
"lodash.forown": "~2.4.1"
@@ -25111,7 +28448,8 @@
"node_modules/lodash.forown": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz",
- "integrity": "sha1-eLQer+FAX6lmRZ6kGT/VAtCEUks=",
+ "integrity": "sha512-VC+CKm/zSs5t3i/MHv71HZoQphuqOvez1xhjWBwHU5zAbsCYrqwHr+MyQyMk14HzA3hSRNA5lCqDMSw5G2Qscg==",
+ "license": "MIT",
"dependencies": {
"lodash._basecreatecallback": "~2.4.1",
"lodash._objecttypes": "~2.4.1",
@@ -25132,7 +28470,8 @@
"node_modules/lodash.identity": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz",
- "integrity": "sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE="
+ "integrity": "sha512-VRYX+8XipeLjorag5bz3YBBRJ+5kj8hVBzfnaHgXPZAVTYowBdY5l0M5ZnOmlAMCOXBFabQtm7f5VqjMKEji0w==",
+ "license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
@@ -25147,7 +28486,8 @@
"node_modules/lodash.isarray": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz",
- "integrity": "sha1-tSoybB9i9tfac6MdVAHfbvRPD6E=",
+ "integrity": "sha512-yRDd0z+APziDqbk0MqR6Qfwj/Qn3jLxFJbI9U8MuvdTnqIXdZ5YXyGLnwuzCpZmjr26F1GNOjKLMMZ10i/wy6A==",
+ "license": "MIT",
"dependencies": {
"lodash._isnative": "~2.4.1"
}
@@ -25160,12 +28500,15 @@
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
+ "license": "MIT"
},
"node_modules/lodash.isfunction": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz",
- "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE="
+ "integrity": "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==",
+ "license": "MIT"
},
"node_modules/lodash.isinteger": {
"version": "4.0.4",
@@ -25180,7 +28523,8 @@
"node_modules/lodash.isobject": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz",
- "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
+ "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==",
+ "license": "MIT",
"dependencies": {
"lodash._objecttypes": "~2.4.1"
}
@@ -25198,7 +28542,8 @@
"node_modules/lodash.keys": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+ "integrity": "sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==",
+ "license": "MIT",
"dependencies": {
"lodash._isnative": "~2.4.1",
"lodash._shimkeys": "~2.4.1",
@@ -25219,7 +28564,8 @@
"node_modules/lodash.noop": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz",
- "integrity": "sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o="
+ "integrity": "sha512-uNcV98/blRhInPUGQEnj9ekXXfG+q+rfoNSFZgl/eBfog9yBDW9gfUv2AHX/rAF7zZRlzWhbslGhbGQFZlCkZA==",
+ "license": "MIT"
},
"node_modules/lodash.once": {
"version": "4.1.1",
@@ -25229,13 +28575,14 @@
"node_modules/lodash.sortby": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
- "dev": true
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "license": "MIT"
},
"node_modules/lodash.support": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz",
- "integrity": "sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU=",
+ "integrity": "sha512-6SwqWwGFHhTXEiqB/yQgu8FYd//tm786d49y7kizHVCJH7zdzs191UQn3ES3tkkDbUddNRfkCRYqJFHtbLnbCw==",
+ "license": "MIT",
"dependencies": {
"lodash._isnative": "~2.4.1"
}
@@ -25244,7 +28591,8 @@
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/lodash.union": {
"version": "4.6.0",
@@ -25424,11 +28772,6 @@
"tslib": "^2.0.3"
}
},
- "node_modules/lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -25481,6 +28824,15 @@
"es5-ext": "~0.10.2"
}
},
+ "node_modules/luxon": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+ "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/lz-string": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
@@ -25491,22 +28843,40 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.8",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
- "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
- "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
+ "node_modules/mailtrap": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/mailtrap/-/mailtrap-3.4.0.tgz",
+ "integrity": "sha512-gegg90/gMY8hvfxB+WMtE8RRZyhQr90jUw00QOLApIAomItumqFBCpZv5IfG51EUKThu9+p7X4QdNA4buryenw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "axios": ">=0.27"
+ },
+ "engines": {
+ "node": ">=16.20.1",
+ "yarn": ">=1.22.17"
+ },
+ "peerDependencies": {
+ "@types/nodemailer": "^6.4.9",
+ "nodemailer": "^6.9.4"
+ },
+ "peerDependenciesMeta": {
+ "@types/nodemailer": {
+ "optional": true
+ },
+ "nodemailer": {
+ "optional": true
+ }
+ }
},
"node_modules/make-dir": {
"version": "2.1.0",
@@ -25539,6 +28909,15 @@
"semver": "bin/semver"
}
},
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/map-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
@@ -25551,49 +28930,21 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
"integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/markdown-it": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
- "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "node_modules/map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+ "dev": true,
"dependencies": {
- "argparse": "^2.0.1",
- "entities": "^4.4.0",
- "linkify-it": "^5.0.0",
- "mdurl": "^2.0.0",
- "punycode.js": "^2.3.1",
- "uc.micro": "^2.1.0"
+ "object-visit": "^1.0.0"
},
- "bin": {
- "markdown-it": "bin/markdown-it.mjs"
- }
- },
- "node_modules/markdown-it-anchor": {
- "version": "8.6.7",
- "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
- "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
- "peerDependencies": {
- "@types/markdown-it": "*",
- "markdown-it": "*"
- }
- },
- "node_modules/markdown-it/node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "node": ">=0.10.0"
}
},
- "node_modules/markdown-it/node_modules/uc.micro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
- "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
- },
"node_modules/marked": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz",
@@ -25615,19 +28966,21 @@
"remove-accents": "0.4.2"
}
},
- "node_modules/matchmediaquery": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.4.2.tgz",
- "integrity": "sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==",
- "dependencies": {
- "css-mediaquery": "^0.1.2"
- }
- },
"node_modules/material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
"integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/mathjax": {
"version": "3.2.2",
@@ -25665,11 +29018,6 @@
"integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
"dev": true
},
- "node_modules/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
- },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -25690,6 +29038,13 @@
"node": ">= 4.0.0"
}
},
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/memoizee": {
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
@@ -25711,6 +29066,7 @@
"resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
"integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"map-or-similar": "^1.5.0"
}
@@ -26223,11 +29579,12 @@
]
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@@ -26238,7 +29595,6 @@
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true,
"bin": {
"mime": "cli.js"
},
@@ -26247,9 +29603,10 @@
}
},
"node_modules/mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -26257,18 +29614,20 @@
"node_modules/mime-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
- "integrity": "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=",
+ "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"wildcard": "^1.1.0"
}
},
"node_modules/mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
- "mime-db": "1.51.0"
+ "mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
@@ -26283,6 +29642,19 @@
"node": ">=6"
}
},
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
@@ -26377,7 +29749,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/minimatch": {
"version": "3.1.2",
@@ -26398,6 +29771,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minimisted": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz",
+ "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ }
+ },
"node_modules/minipass": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
@@ -26435,6 +29818,19 @@
"resolved": "jobs/mirror-documentation",
"link": true
},
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/mixme": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz",
@@ -26468,7 +29864,34 @@
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "license": "MIT"
+ },
+ "node_modules/mlly": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
+ "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mlly/node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
"node_modules/mmdb-lib": {
"version": "2.0.2",
@@ -26492,43 +29915,39 @@
}
},
"node_modules/mocha": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
- "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz",
+ "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.4",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.2.0",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "5.0.1",
- "ms": "2.1.3",
- "nanoid": "3.3.3",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "workerpool": "6.2.1",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
+ "ansi-colors": "^4.1.3",
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.5",
+ "diff": "^5.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^10.4.5",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^5.1.6",
+ "ms": "^2.1.3",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^6.5.1",
+ "yargs": "^17.7.2",
+ "yargs-parser": "^21.1.1",
+ "yargs-unparser": "^2.0.0"
},
"bin": {
"_mocha": "bin/_mocha",
"mocha": "bin/mocha.js"
},
"engines": {
- "node": ">= 14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/mocha-each": {
@@ -26545,17 +29964,19 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/mocha/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -26566,17 +29987,66 @@
}
}
},
- "node_modules/mocha/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "node_modules/mocha/node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
},
"node_modules/mocha/node_modules/minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -26584,22 +30054,37 @@
"node": ">=10"
}
},
- "node_modules/mocha/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "node_modules/mocha/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mocha/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/mock-fs": {
@@ -26636,94 +30121,21 @@
}
},
"node_modules/mongodb": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
- "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.12.0.tgz",
+ "integrity": "sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==",
+ "license": "Apache-2.0",
"dependencies": {
- "bson": "^4.7.2",
- "mongodb-connection-string-url": "^2.6.0",
- "socks": "^2.7.1"
- },
- "engines": {
- "node": ">=12.9.0"
- },
- "optionalDependencies": {
- "@aws-sdk/credential-providers": "^3.186.0",
- "@mongodb-js/saslprep": "^1.1.0"
- }
- },
- "node_modules/mongodb-connection-string-url": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
- "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
- "dependencies": {
- "@types/whatwg-url": "^8.2.1",
- "whatwg-url": "^11.0.0"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
- "dependencies": {
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
- "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
- "dependencies": {
- "tr46": "^3.0.0",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mongodb-legacy": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb-legacy/-/mongodb-legacy-6.1.0.tgz",
- "integrity": "sha512-S/7HFTsCgbkFEM1hdA+uVRM1TBHR8+8RYVpjUnti9eyRQOdm+ecW6eUurjA2dh040nHEe5tMDxZNG5CReRKZhQ==",
- "dependencies": {
- "mongodb": "^6.0.0"
- },
- "engines": {
- "node": ">=16.20.1"
- }
- },
- "node_modules/mongodb-legacy/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mongodb-legacy/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
+ "@mongodb-js/saslprep": "^1.1.9",
+ "bson": "^6.10.1",
+ "mongodb-connection-string-url": "^3.0.0"
},
"engines": {
"node": ">=16.20.1"
},
"peerDependencies": {
"@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
+ "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
"gcp-metadata": "^5.2.0",
"kerberos": "^2.0.1",
"mongodb-client-encryption": ">=6.0.0 <7",
@@ -26754,95 +30166,72 @@
}
}
},
- "node_modules/mongodb/node_modules/bson": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
- "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+ "node_modules/mongodb-connection-string-url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
+ "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
"dependencies": {
- "buffer": "^5.6.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "@types/whatwg-url": "^11.0.2",
+ "whatwg-url": "^13.0.0"
}
},
- "node_modules/mongodb/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
+ "node_modules/mongodb-connection-string-url/node_modules/tr46": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
+ "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
"dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "punycode": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
+ "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
+ "dependencies": {
+ "tr46": "^4.1.1",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/mongodb-legacy": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/mongodb-legacy/-/mongodb-legacy-6.1.3.tgz",
+ "integrity": "sha512-XJ2PIbVEHUUF4/SyH00dfeprfeLOdWiHcKq8At+JoEZeTue+IAG39G2ixRwClnI7roPb/46K8IF713v9dgQ8rg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "mongodb": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=16.20.1"
}
},
"node_modules/mongoose": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.0.tgz",
- "integrity": "sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw==",
+ "version": "8.9.5",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.9.5.tgz",
+ "integrity": "sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==",
+ "license": "MIT",
"dependencies": {
- "bson": "^4.7.2",
- "kareem": "2.5.1",
- "mongodb": "4.17.1",
+ "bson": "^6.10.1",
+ "kareem": "2.6.3",
+ "mongodb": "~6.12.0",
"mpath": "0.9.0",
- "mquery": "4.0.3",
+ "mquery": "5.0.0",
"ms": "2.1.3",
- "sift": "16.0.1"
+ "sift": "17.1.3"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=16.20.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mongoose"
}
},
- "node_modules/mongoose/node_modules/bson": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
- "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
- "dependencies": {
- "buffer": "^5.6.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/mongoose/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
"node_modules/morgan": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
@@ -26887,19 +30276,21 @@
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
"integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+ "license": "MIT",
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/mquery": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
- "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
+ "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
+ "license": "MIT",
"dependencies": {
"debug": "4.x"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=14.0.0"
}
},
"node_modules/ms": {
@@ -26907,22 +30298,53 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
+ "node_modules/msgpackr": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz",
+ "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==",
+ "license": "MIT",
+ "optionalDependencies": {
+ "msgpackr-extract": "^3.0.2"
+ }
+ },
+ "node_modules/msgpackr-extract": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
+ "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "node-gyp-build-optional-packages": "5.2.2"
+ },
+ "bin": {
+ "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
+ }
+ },
"node_modules/multer": {
- "version": "1.4.5-lts.1",
- "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
- "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz",
+ "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
- "busboy": "^1.0.0",
- "concat-stream": "^1.5.2",
- "mkdirp": "^0.5.4",
+ "busboy": "^1.6.0",
+ "concat-stream": "^2.0.0",
+ "mkdirp": "^0.5.6",
"object-assign": "^4.1.1",
- "type-is": "^1.6.4",
- "xtend": "^4.0.0"
+ "type-is": "^1.6.18",
+ "xtend": "^4.0.2"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 10.16.0"
}
},
"node_modules/multicast-dns": {
@@ -26930,6 +30352,7 @@
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
"integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"dns-packet": "^5.2.2",
"thunky": "^1.0.2"
@@ -26989,12 +30412,14 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
"integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nan": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
- "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ=="
+ "version": "2.22.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz",
+ "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==",
+ "license": "MIT"
},
"node_modules/nanoclone": {
"version": "0.2.1",
@@ -27003,21 +30428,51 @@
"dev": true
},
"node_modules/nanoid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
- "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"bin": {
- "nanoid": "bin/nanoid.cjs"
+ "nanoid": "bin/nanoid.js"
},
"engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/native-promise-only": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
- "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+ "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==",
+ "license": "MIT"
},
"node_modules/native-request": {
"version": "1.1.0",
@@ -27123,13 +30578,26 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
"integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/node-addon-api": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
"integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
},
+ "node_modules/node-dir": {
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+ "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.2"
+ },
+ "engines": {
+ "node": ">= 0.10.5"
+ }
+ },
"node_modules/node-domexception": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -27148,6 +30616,13 @@
"node": ">=10.5.0"
}
},
+ "node_modules/node-ensure": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
+ "integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -27167,6 +30642,13 @@
}
}
},
+ "node_modules/node-fetch-native": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
+ "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-fetch/node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -27194,16 +30676,32 @@
"node": ">= 6.13.0"
}
},
+ "node_modules/node-gyp-build-optional-packages": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
+ "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.1"
+ },
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
+ }
+ },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
"integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
},
"node_modules/node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
- "dev": true
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nodemailer": {
"version": "6.9.9",
@@ -27426,6 +30924,27 @@
"integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
"dev": true
},
+ "node_modules/nypm": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz",
+ "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "tinyexec": "^0.3.2",
+ "ufo": "^1.5.4"
+ },
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^14.16.0 || >=16.10.0"
+ }
+ },
"node_modules/oauth": {
"version": "0.9.15",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
@@ -27447,6 +30966,57 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+ "dev": true,
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-copy/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-hash": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
@@ -27456,9 +31026,13 @@
}
},
"node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -27487,15 +31061,29 @@
"node": ">= 0.4"
}
},
+ "node_modules/object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
},
"engines": {
@@ -27506,28 +31094,32 @@
}
},
"node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.fromentries": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
- "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -27552,46 +31144,44 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.getprototypeof": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object.getprototypeof/-/object.getprototypeof-1.0.5.tgz",
- "integrity": "sha512-4G0QiXpoIppBUz5efmxTm/HTbVN2ioGjk/PbsaNvwISFX+saj8muGp6vNuzIdsosFxM4V/kpUVNvy/+9+DVBZQ==",
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "reflect.getprototypeof": "^1.0.4"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.hasown": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
- "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"dev": true,
"dependencies": {
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "isobject": "^3.0.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/object.values": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -27604,13 +31194,15 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
"integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/octonode": {
"version": "0.9.5",
@@ -27669,10 +31261,11 @@
}
},
"node_modules/open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
@@ -27710,47 +31303,17 @@
}
},
"node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "license": "MIT",
"dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/optionator/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/optionator/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/optionator/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dependencies": {
- "prelude-ls": "~1.1.2"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -27796,6 +31359,23 @@
"resolved": "libraries/overleaf-editor-core",
"link": true
},
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/p-event": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
@@ -27875,16 +31455,16 @@
}
},
"node_modules/p-queue": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz",
- "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==",
- "dev": true,
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz",
+ "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==",
+ "license": "MIT",
"dependencies": {
"eventemitter3": "^5.0.1",
- "p-timeout": "^5.0.2"
+ "p-timeout": "^6.1.2"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -27894,33 +31474,36 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
- "dev": true
+ "license": "MIT"
},
"node_modules/p-queue/node_modules/p-timeout": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
- "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
- "dev": true,
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz",
+ "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==",
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
+ "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@types/retry": "^0.12.0",
+ "@types/retry": "0.12.2",
+ "is-network-error": "^1.0.0",
"retry": "^0.13.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-throttle": {
@@ -27964,6 +31547,13 @@
"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
},
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true,
+ "license": "(MIT AND Zlib)"
+ },
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -27996,11 +31586,6 @@
"node": ">=8"
}
},
- "node_modules/parse-duration": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz",
- "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ=="
- },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -28065,6 +31650,15 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/passport": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
@@ -28341,12 +31935,80 @@
}
},
"node_modules/path-loader": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz",
- "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==",
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz",
+ "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==",
+ "license": "MIT",
"dependencies": {
"native-promise-only": "^0.8.1",
- "superagent": "^3.8.3"
+ "superagent": "^7.1.6"
+ }
+ },
+ "node_modules/path-loader/node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/path-loader/node_modules/formidable": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz",
+ "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
+ "dezalgo": "^1.0.4",
+ "once": "^1.4.0",
+ "qs": "^6.11.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/path-loader/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/path-loader/node_modules/superagent": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz",
+ "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==",
+ "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net",
+ "license": "MIT",
+ "dependencies": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.3",
+ "debug": "^4.3.4",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.0",
+ "formidable": "^2.0.1",
+ "methods": "^1.1.2",
+ "mime": "2.6.0",
+ "qs": "^6.10.3",
+ "readable-stream": "^3.6.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": ">=6.4.0 <13 || >=14"
}
},
"node_modules/path-parse": {
@@ -28389,9 +32051,10 @@
}
},
"node_modules/path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w=="
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
@@ -28402,15 +32065,12 @@
"node": ">=8"
}
},
- "node_modules/path2d": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.1.tgz",
- "integrity": "sha512-Fl2z/BHvkTNvkuBzYTpTuirHZg6wW9z8+4SND/3mDTEcYbbNKWAy21dz9D3ePNNwrrK8pqZO5vLPZ1hLF6T7XA==",
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true,
- "optional": true,
- "engines": {
- "node": ">=6"
- }
+ "license": "MIT"
},
"node_modules/pathval": {
"version": "1.1.1",
@@ -28426,6 +32086,43 @@
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
},
+ "node_modules/pdf-parse": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz",
+ "integrity": "sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.1.0",
+ "node-ensure": "^0.0.0"
+ },
+ "engines": {
+ "node": ">=6.8.1"
+ }
+ },
+ "node_modules/pdf-parse/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/pdfjs-dist": {
+ "version": "5.1.91",
+ "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.1.91.tgz",
+ "integrity": "sha512-qSIADdagooJB4wWCBnrBJjRvASevmxL0BwafvOuKJG5uTQdYoFBrhrRYnucKNiSc9qS6JIk0hC5y1yktFljXkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=20"
+ },
+ "optionalDependencies": {
+ "@napi-rs/canvas": "^0.1.67"
+ }
+ },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -28471,6 +32168,14 @@
"resolved": "https://registry.npmjs.org/pg-copy-streams/-/pg-copy-streams-2.2.2.tgz",
"integrity": "sha512-mjSqs6hrsRhBojCuY2hxyg48B+3th5ARBjMxBCEisIqBvdRD0g5ETdbts20TzrOfha8ueJQOmQCJCprtczJtGQ=="
},
+ "node_modules/pg-cursor": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.12.1.tgz",
+ "integrity": "sha512-V13tEaA9Oq1w+V6Q3UBIB/blxJrwbbr35/dY54r/86soBJ7xkP236bXaORUTVXUPt9B6Ql2BQu+uwQiuMfRVgg==",
+ "peerDependencies": {
+ "pg": "^8"
+ }
+ },
"node_modules/pg-int8": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
@@ -28492,6 +32197,17 @@
"resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
"integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
},
+ "node_modules/pg-query-stream": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/pg-query-stream/-/pg-query-stream-4.7.1.tgz",
+ "integrity": "sha512-UMgsgn/pOIYsIifRySp59vwlpTpLADMK9HWJtq5ff0Z3MxBnPMGnCQeaQl5VuL+7ov4F96mSzIRIcz+Duo6OiQ==",
+ "dependencies": {
+ "pg-cursor": "^2.12.1"
+ },
+ "peerDependencies": {
+ "pg": "^8"
+ }
+ },
"node_modules/pg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
@@ -28516,9 +32232,10 @@
}
},
"node_modules/picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -28631,6 +32348,18 @@
"node": ">=8"
}
},
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
"node_modules/pkg-up": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
@@ -28731,16 +32460,17 @@
"node_modules/policyfile": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz",
- "integrity": "sha1-1rgurZiueeviKOLa9ZAzEeyYLk0=",
+ "integrity": "sha512-UfDtlscNialXfmVEwEPm0t/5qtM0xPK025eYWd/ilv89hxLIhVQmt3QIzMHincLO2MBtZyww0386pt13J4aIhQ==",
"engines": {
"node": "*"
}
},
"node_modules/polished": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz",
- "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz",
+ "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.17.8"
},
@@ -28748,15 +32478,13 @@
"node": ">=10"
}
},
- "node_modules/popper.js": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
- "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
- "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
- "peer": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
+ "node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/possible-typed-array-names": {
@@ -28769,9 +32497,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"funding": [
{
"type": "opencollective",
@@ -28786,10 +32514,11 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
@@ -30015,15 +33744,16 @@
"dev": true
},
"node_modules/postcss/node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -30067,45 +33797,49 @@
}
},
"node_modules/pprof": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/pprof/-/pprof-3.2.1.tgz",
- "integrity": "sha512-KnextTM3EHQ2zqN8fUjB0VpE+njcVR7cOfo7DjJSLKzIbKTPelDtokI04ScR/Vd8CLDj+M99tsaKV+K6FHzpzA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pprof/-/pprof-4.0.0.tgz",
+ "integrity": "sha512-Yhfk7Y0G1MYsy97oXxmSG5nvbM1sCz9EALiNhW/isAv5Xf7svzP+1RfGeBlS6mLSgRJvgSLh6Mi5DaisQuPttw==",
"hasInstallScript": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@mapbox/node-pre-gyp": "^1.0.0",
+ "@mapbox/node-pre-gyp": "^1.0.9",
"bindings": "^1.2.1",
"delay": "^5.0.0",
"findit2": "^2.2.3",
- "nan": "^2.14.0",
+ "nan": "^2.17.0",
"p-limit": "^3.0.0",
- "pify": "^5.0.0",
"protobufjs": "~7.2.4",
- "source-map": "^0.7.3",
+ "source-map": "~0.8.0-beta.0",
"split": "^1.0.1"
},
"engines": {
- "node": ">=10.4.1"
- }
- },
- "node_modules/pprof/node_modules/pify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
- "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=14.0.0"
}
},
"node_modules/pprof/node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
"engines": {
"node": ">= 8"
}
},
+ "node_modules/preact": {
+ "version": "10.26.5",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.5.tgz",
+ "integrity": "sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
"node_modules/precond": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
@@ -30123,10 +33857,11 @@
}
},
"node_modules/prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
+ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true,
+ "license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -30211,6 +33946,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -30224,15 +33968,6 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/prom-client": {
"version": "14.1.1",
"resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz",
@@ -30281,6 +34016,30 @@
"read": "^1.0.4"
}
},
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prompts/node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -30295,6 +34054,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
"integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"react-is": "^16.3.2",
"warning": "^4.0.0"
@@ -30306,15 +34067,9 @@
"node_modules/prop-types-extra/node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/prop-types-extra/node_modules/warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/prop-types/node_modules/react-is": {
"version": "16.13.1",
@@ -30342,17 +34097,6 @@
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"dev": true
},
- "node_modules/proto3-json-serializer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz",
- "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==",
- "dependencies": {
- "protobufjs": "^7.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
"node_modules/protobufjs": {
"version": "7.2.5",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz",
@@ -30376,151 +34120,6 @@
"node": ">=12.0.0"
}
},
- "node_modules/protobufjs-cli": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz",
- "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==",
- "dependencies": {
- "chalk": "^4.0.0",
- "escodegen": "^1.13.0",
- "espree": "^9.0.0",
- "estraverse": "^5.1.0",
- "glob": "^8.0.0",
- "jsdoc": "^4.0.0",
- "minimist": "^1.2.0",
- "semver": "^7.1.2",
- "tmp": "^0.2.1",
- "uglify-js": "^3.7.7"
- },
- "bin": {
- "pbjs": "bin/pbjs",
- "pbts": "bin/pbts"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "protobufjs": "^7.0.0"
- }
- },
- "node_modules/protobufjs-cli/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/protobufjs-cli/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/protobufjs-cli/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/protobufjs-cli/node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/protobufjs-cli/node_modules/escodegen/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/protobufjs-cli/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/protobufjs-cli/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/protobufjs-cli/node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/protobufjs-cli/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -30693,29 +34292,10 @@
"pump": "^3.0.0"
}
},
- "node_modules/pumpify/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
"node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/punycode.js": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
- "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"engines": {
"node": ">=6"
}
@@ -30936,12 +34516,6 @@
}
]
},
- "node_modules/queue-tick": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
- "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
- "dev": true
- },
"node_modules/quick-lru": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
@@ -31020,12 +34594,12 @@
}
},
"node_modules/react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
+ "loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
@@ -31036,6 +34610,7 @@
"resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz",
"integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"hoist-non-react-statics": "^3.3.0",
"prop-types": "^15.5.0"
@@ -31045,38 +34620,16 @@
}
},
"node_modules/react-bootstrap": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz",
- "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==",
- "dependencies": {
- "@babel/runtime-corejs2": "^7.0.0",
- "classnames": "^2.2.5",
- "dom-helpers": "^3.2.0",
- "invariant": "^2.2.4",
- "keycode": "^2.2.0",
- "prop-types": "^15.6.1",
- "prop-types-extra": "^1.0.1",
- "react-overlays": "^0.9.0",
- "react-prop-types": "^0.4.0",
- "react-transition-group": "^2.0.0",
- "uncontrollable": "^7.0.2",
- "warning": "^3.0.0"
- },
- "peerDependencies": {
- "react": ">=16.3.0",
- "react-dom": ">=16.3.0"
- }
- },
- "node_modules/react-bootstrap-5": {
- "name": "react-bootstrap",
- "version": "2.10.2",
- "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.2.tgz",
- "integrity": "sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA==",
+ "version": "2.10.10",
+ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz",
+ "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.22.5",
+ "@babel/runtime": "^7.24.7",
"@restart/hooks": "^0.4.9",
- "@restart/ui": "^1.6.8",
+ "@restart/ui": "^1.9.4",
+ "@types/prop-types": "^15.7.12",
"@types/react-transition-group": "^4.4.6",
"classnames": "^2.3.2",
"dom-helpers": "^5.2.1",
@@ -31098,46 +34651,12 @@
}
}
},
- "node_modules/react-bootstrap-5/node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/react-bootstrap-5/node_modules/react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
- "node_modules/react-bootstrap-5/node_modules/warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "dev": true,
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
"node_modules/react-chartjs-2": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.0.1.tgz",
"integrity": "sha512-u38C9OxynlNCBp+79grgXRs7DSJ9w8FuQ5/HO5FbYBbri8HSZW+9SWgjVshLkbXBfXnMGWakbHEtvN0nL2UG7Q==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"chart.js": "^4.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
@@ -31148,6 +34667,7 @@
"resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
"integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@icons/material": "^0.2.4",
"lodash": "^4.17.15",
@@ -31161,14 +34681,18 @@
"react": "*"
}
},
- "node_modules/react-colorful": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
- "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
- "dev": true,
+ "node_modules/react-cookie": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz",
+ "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.5",
+ "hoist-non-react-statics": "^3.3.2",
+ "universal-cookie": "^7.0.0"
+ },
"peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
+ "react": ">= 16.3.0"
}
},
"node_modules/react-deep-force-update": {
@@ -31182,6 +34706,7 @@
"resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz",
"integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@react-dnd/invariant": "^4.0.1",
"@react-dnd/shallowequal": "^4.0.1",
@@ -31212,15 +34737,17 @@
"resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz",
"integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"dnd-core": "^16.0.1"
}
},
"node_modules/react-docgen": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz",
- "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz",
+ "integrity": "sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/core": "^7.18.9",
"@babel/traverse": "^7.18.9",
@@ -31242,70 +34769,32 @@
"resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
"integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"typescript": ">= 4.3.x"
}
},
- "node_modules/react-docgen/node_modules/@types/doctrine": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
- "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
- "dev": true
- },
"node_modules/react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
+ "scheduler": "^0.23.2"
},
"peerDependencies": {
- "react": "17.0.2"
+ "react": "^18.3.1"
}
},
- "node_modules/react-element-to-jsx-string": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
- "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
- "dev": true,
- "dependencies": {
- "@base2/pretty-print-object": "1.0.1",
- "is-plain-object": "5.0.0",
- "react-is": "18.1.0"
- },
- "peerDependencies": {
- "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0",
- "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0"
- }
- },
- "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-element-to-jsx-string/node_modules/react-is": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
- "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
- "dev": true
- },
"node_modules/react-error-boundary": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-2.3.2.tgz",
- "integrity": "sha512-ZMzi7s4pj/6A/6i9RS4tG7g1PdF2Rgr4/7FTQ8sbKHex19uNji0j+xq0OS//c6TUgQRKoL6P51BNNNFmYpRMhw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-5.0.0.tgz",
+ "integrity": "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.11.2"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
+ "@babel/runtime": "^7.12.5"
},
"peerDependencies": {
"react": ">=16.13.1"
@@ -31315,13 +34804,15 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/react-google-recaptcha": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-3.1.0.tgz",
"integrity": "sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"prop-types": "^15.5.0",
"react-async-script": "^1.2.0"
@@ -31335,6 +34826,7 @@
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.3.1.tgz",
"integrity": "sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.22.5",
"html-parse-stringify": "^3.0.1"
@@ -31360,13 +34852,16 @@
"node_modules/react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/react-linkify": {
"version": "1.0.0-alpha",
"resolved": "https://registry.npmjs.org/react-linkify/-/react-linkify-1.0.0-alpha.tgz",
"integrity": "sha512-7gcIUvJkAXXttt1fmBK9cwn+1jTa4hbKLGCZ9J1U6EOkyb2/+LKL1Z28d9rtDLMnpvImlNlLPdTPooorl5cpmg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"linkify-it": "^2.0.3",
"tlds": "^1.199.0"
@@ -31377,38 +34872,11 @@
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
"integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"uc.micro": "^1.0.1"
}
},
- "node_modules/react-overlays": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz",
- "integrity": "sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ==",
- "dependencies": {
- "classnames": "^2.2.5",
- "dom-helpers": "^3.2.1",
- "prop-types": "^15.5.10",
- "prop-types-extra": "^1.0.1",
- "react-transition-group": "^2.2.1",
- "warning": "^3.0.0"
- },
- "peerDependencies": {
- "react": ">=16.3.0",
- "react-dom": ">=16.3.0"
- }
- },
- "node_modules/react-prop-types": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz",
- "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=",
- "dependencies": {
- "warning": "^3.0.0"
- },
- "peerDependencies": {
- "react": ">=0.14.0"
- }
- },
"node_modules/react-proxy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz",
@@ -31423,6 +34891,7 @@
"version": "7.2.9",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz",
"integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.15.4",
"@types/react-redux": "^7.1.20",
@@ -31457,34 +34926,19 @@
"resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.1.tgz",
"integrity": "sha512-+cUV/yZBYfiBj+WJtpWDJ3NtR4zgDZfHt3+xtaETKE+FCvp+RK/NJxacDQKxMHgRUTSkfA6AnGljQ5QZNsCQoA==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"react": "^16.14.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0"
}
},
- "node_modules/react-responsive": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-10.0.0.tgz",
- "integrity": "sha512-N6/UiRLGQyGUqrarhBZmrSmHi2FXSD++N5VbSKsBBvWfG0ZV7asvUBluSv5lSzdMyEVjzZ6Y8DL4OHABiztDOg==",
- "dependencies": {
- "hyphenate-style-name": "^1.0.0",
- "matchmediaquery": "^0.4.2",
- "prop-types": "^15.6.1",
- "shallow-equal": "^3.1.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
"node_modules/react-router": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
- "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
+ "version": "6.30.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz",
+ "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==",
+ "license": "MIT",
"dependencies": {
- "@remix-run/router": "1.19.1"
+ "@remix-run/router": "1.23.0"
},
"engines": {
"node": ">=14.0.0"
@@ -31494,12 +34948,13 @@
}
},
"node_modules/react-router-dom": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
- "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
+ "version": "6.30.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz",
+ "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==",
+ "license": "MIT",
"dependencies": {
- "@remix-run/router": "1.19.1",
- "react-router": "6.26.1"
+ "@remix-run/router": "1.23.0",
+ "react-router": "6.30.0"
},
"engines": {
"node": ">=14.0.0"
@@ -31520,18 +34975,20 @@
}
},
"node_modules/react-transition-group": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
- "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "dom-helpers": "^3.4.0",
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
"loose-envify": "^1.4.0",
- "prop-types": "^15.6.2",
- "react-lifecycles-compat": "^3.0.4"
+ "prop-types": "^15.6.2"
},
"peerDependencies": {
- "react": ">=15.0.0",
- "react-dom": ">=15.0.0"
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
}
},
"node_modules/reactcss": {
@@ -31539,6 +34996,7 @@
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
"integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"lodash": "^4.0.1"
}
@@ -31754,6 +35212,7 @@
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"indent-string": "^4.0.0",
"strip-indent": "^3.0.0"
@@ -31767,6 +35226,7 @@
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"min-indent": "^1.0.0"
},
@@ -31774,6 +35234,15 @@
"node": ">=8"
}
},
+ "node_modules/redis": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz",
+ "integrity": "sha512-0Pgb0jOLfn6eREtEIRn/ifyZJjl2H+wUY4F/Pe7T4UhmoSrZ/1HU5ZqiBpDk8I8Wbyv2N5DpXKzbEtMj3drprg==",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/redis-commands": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
@@ -31869,17 +35338,19 @@
}
},
"node_modules/reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
- "dev": true,
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -31892,13 +35363,15 @@
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/regenerate-unicode-properties": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
- "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"regenerate": "^1.4.2"
},
@@ -31916,10 +35389,24 @@
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
"integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.8.4"
}
},
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/regex-parser": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
@@ -31936,15 +35423,17 @@
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -31953,6 +35442,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/regexparam": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz",
+ "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
@@ -31966,15 +35465,16 @@
}
},
"node_modules/regexpu-core": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
- "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.1.0",
- "regjsparser": "^0.9.1",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
"unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.1.0"
},
@@ -31982,72 +35482,37 @@
"node": ">=4"
}
},
- "node_modules/regjsparser": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
- "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "jsesc": "~0.5.0"
+ "jsesc": "~3.0.2"
},
"bin": {
"regjsparser": "bin/parser"
}
},
"node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
"dev": true,
+ "license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
- }
- },
- "node_modules/rehype-external-links": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
- "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "hast-util-is-element": "^3.0.0",
- "is-absolute-url": "^4.0.0",
- "space-separated-tokens": "^2.0.0",
- "unist-util-visit": "^5.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-external-links/node_modules/is-absolute-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
- "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
- "dev": true,
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/rehype-slug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
- "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0",
- "github-slugger": "^2.0.0",
- "hast-util-heading-rank": "^3.0.0",
- "hast-util-to-string": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "node": ">=6"
}
},
"node_modules/relateurl": {
@@ -32084,6 +35549,24 @@
"strip-ansi": "^6.0.1"
}
},
+ "node_modules/repeat-element": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/replace-ext": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz",
@@ -32098,6 +35581,7 @@
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "license": "Apache-2.0",
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -32155,15 +35639,15 @@
}
},
"node_modules/request/node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
+ "tldts": "^6.1.32"
},
"engines": {
- "node": ">=0.8"
+ "node": ">=16"
}
},
"node_modules/requestretry": {
@@ -32214,14 +35698,6 @@
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
},
- "node_modules/requizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
- "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
- "dependencies": {
- "lodash": "^4.17.21"
- }
- },
"node_modules/reselect": {
"version": "4.1.8",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
@@ -32276,6 +35752,13 @@
"node": ">= 10.13.0"
}
},
+ "node_modules/resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+ "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+ "dev": true
+ },
"node_modules/resolve-url-loader": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
@@ -32305,6 +35788,15 @@
"node": ">=8"
}
},
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
"node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
@@ -32346,11 +35838,19 @@
"dev": true
},
"node_modules/rimraf": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz",
- "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
"bin": {
"rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/rndm": {
@@ -32358,6 +35858,46 @@
"resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
"integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
},
+ "node_modules/rollup": {
+ "version": "4.40.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
+ "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.7"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.40.0",
+ "@rollup/rollup-android-arm64": "4.40.0",
+ "@rollup/rollup-darwin-arm64": "4.40.0",
+ "@rollup/rollup-darwin-x64": "4.40.0",
+ "@rollup/rollup-freebsd-arm64": "4.40.0",
+ "@rollup/rollup-freebsd-x64": "4.40.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.40.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.40.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.40.0",
+ "@rollup/rollup-linux-arm64-musl": "4.40.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.40.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.40.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.40.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.40.0",
+ "@rollup/rollup-linux-x64-gnu": "4.40.0",
+ "@rollup/rollup-linux-x64-musl": "4.40.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.40.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.40.0",
+ "@rollup/rollup-win32-x64-msvc": "4.40.0",
+ "fsevents": "~2.3.2"
+ }
+ },
"node_modules/route-recognizer": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz",
@@ -32369,6 +35909,7 @@
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
"integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -32408,14 +35949,15 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
"isarray": "^2.0.5"
},
"engines": {
@@ -32436,15 +35978,40 @@
"integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
"optional": true
},
- "node_modules/safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
"es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+ "dev": true,
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -32476,6 +36043,28 @@
"node": ">=12"
}
},
+ "node_modules/saml/node_modules/xml-crypto": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.6.tgz",
+ "integrity": "sha512-jjvpO8vHNV8QFhW5bMypP+k4BjBqHe/HrpIwpPcdUnUTIJakSIuN96o3Sdah4tKu2z64kM/JHEH8iEHGCc6Gyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.7.9",
+ "xpath": "0.0.32"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/saml/node_modules/xml-crypto/node_modules/xpath": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
+ "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/saml/node_modules/xml-name-validator": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
@@ -32501,6 +36090,28 @@
"node": ">=12"
}
},
+ "node_modules/samlp/node_modules/xml-crypto": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.6.tgz",
+ "integrity": "sha512-jjvpO8vHNV8QFhW5bMypP+k4BjBqHe/HrpIwpPcdUnUTIJakSIuN96o3Sdah4tKu2z64kM/JHEH8iEHGCc6Gyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.7.9",
+ "xpath": "0.0.32"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/samlp/node_modules/xml-crypto/node_modules/xpath": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
+ "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/samlp/node_modules/xtend": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-1.0.3.tgz",
@@ -32684,12 +36295,12 @@
}
},
"node_modules/scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
+ "loose-envify": "^1.1.0"
}
},
"node_modules/schema-utils": {
@@ -32722,8 +36333,9 @@
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/selfsigned": {
"version": "2.4.1",
@@ -32983,10 +36595,11 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"randombytes": "^2.1.0"
}
@@ -33003,8 +36616,9 @@
"node_modules/serve-index": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"accepts": "~1.3.4",
"batch": "0.6.1",
@@ -33023,6 +36637,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -33030,8 +36645,9 @@
"node_modules/serve-index/node_modules/http-errors": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.3",
@@ -33045,20 +36661,23 @@
"node_modules/serve-index/node_modules/inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/serve-index/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/serve-index/node_modules/setprototypeof": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/serve-static": {
"version": "1.16.2",
@@ -33110,23 +36729,89 @@
}
},
"node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
"dependencies": {
- "define-data-property": "^1.0.1",
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
"functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/set-value/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/set-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "license": "(MIT AND BSD-3-Clause)",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
"node_modules/shallow-clone": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
@@ -33139,11 +36824,6 @@
"node": ">=8"
}
},
- "node_modules/shallow-equal": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz",
- "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg=="
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -33164,10 +36844,14 @@
}
},
"node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -33178,14 +36862,69 @@
"integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
},
"node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -33195,9 +36934,17 @@
}
},
"node_modules/sift": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
- "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
+ "version": "17.1.3",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
+ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
+ "license": "MIT"
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/sigmund": {
"version": "1.0.1",
@@ -33228,8 +36975,7 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "optional": true
+ ]
},
"node_modules/simple-get": {
"version": "3.1.1",
@@ -33237,6 +36983,7 @@
"integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
"dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"decompress-response": "^4.2.0",
"once": "^1.3.1",
@@ -33249,6 +36996,7 @@
"integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
"dev": true,
"optional": true,
+ "peer": true,
"dependencies": {
"mimic-response": "^2.0.0"
},
@@ -33262,6 +37010,7 @@
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
"dev": true,
"optional": true,
+ "peer": true,
"engines": {
"node": ">=8"
},
@@ -33409,6 +37158,13 @@
"node": ">=8"
}
},
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -33462,14 +37218,155 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
}
},
+ "node_modules/snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/snapdragon/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/socket.io": {
- "version": "0.9.19-overleaf-10",
- "resolved": "git+ssh://git@github.com/overleaf/socket.io.git#7ac322c2a5b26a4647834868d78afbb0db1f8849",
+ "version": "0.9.19-overleaf-12",
+ "resolved": "git+ssh://git@github.com/overleaf/socket.io.git#7814a16800a7accb646bd34ed0995cd474fb82f6",
"dependencies": {
"base64id": "0.1.0",
"policyfile": "0.0.4"
@@ -33501,20 +37398,12 @@
"ultron": "1.0.x"
}
},
- "node_modules/socket.io/node_modules/redis": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz",
- "integrity": "sha512-0Pgb0jOLfn6eREtEIRn/ifyZJjl2H+wUY4F/Pe7T4UhmoSrZ/1HU5ZqiBpDk8I8Wbyv2N5DpXKzbEtMj3drprg==",
- "optional": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
"integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"faye-websocket": "^0.11.3",
"uuid": "^8.3.2",
@@ -33526,20 +37415,23 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true,
+ "license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
+ "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "ip": "^2.0.0",
+ "ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
},
"engines": {
- "node": ">= 10.13.0",
+ "node": ">= 10.0.0",
"npm": ">= 3.0.0"
}
},
@@ -33570,13 +37462,28 @@
}
},
"node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+ "dev": true,
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -33586,20 +37493,18 @@
"source-map": "^0.6.0"
}
},
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "dev": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
+ "node_modules/source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+ "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+ "dev": true
},
"node_modules/spark-md5": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz",
- "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
+ "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==",
+ "license": "(WTFPL OR MIT)"
},
"node_modules/sparse-bitfield": {
"version": "3.0.3",
@@ -33646,6 +37551,7 @@
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
"integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"handle-thing": "^2.0.0",
@@ -33662,6 +37568,7 @@
"resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
"integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"detect-node": "^2.0.4",
@@ -33675,6 +37582,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "license": "MIT",
"dependencies": {
"through": "2"
},
@@ -33685,7 +37593,20 @@
"node_modules/split-ca": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
- "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY="
+ "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==",
+ "license": "ISC"
+ },
+ "node_modules/split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
"node_modules/split2": {
"version": "4.1.0",
@@ -33709,28 +37630,20 @@
}
},
"node_modules/ssh2": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.6.0.tgz",
- "integrity": "sha512-lxc+uvXqOxyQ99N2M7k5o4pkYDO5GptOTYduWw7hIM41icxvoBcCNHcj+LTKrjkL0vFcAl+qfZekthoSFRJn2Q==",
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz",
+ "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==",
"hasInstallScript": true,
"dependencies": {
- "asn1": "^0.2.4",
+ "asn1": "^0.2.6",
"bcrypt-pbkdf": "^1.0.2"
},
"engines": {
"node": ">=10.16.0"
},
"optionalDependencies": {
- "cpu-features": "0.0.2",
- "nan": "^2.15.0"
- }
- },
- "node_modules/ssh2/node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dependencies": {
- "safer-buffer": "~2.1.0"
+ "cpu-features": "~0.0.10",
+ "nan": "^2.20.0"
}
},
"node_modules/sshpk": {
@@ -33757,14 +37670,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sshpk/node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
"node_modules/sshpk/node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
@@ -33782,17 +37687,63 @@
"node": "*"
}
},
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/stackframe": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
"integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/standard-as-callback": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
+ "node_modules/static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-descriptor": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
+ "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.1",
+ "is-data-descriptor": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@@ -33801,18 +37752,53 @@
"node": ">= 0.6"
}
},
- "node_modules/stop-iteration-iterator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
- "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "node_modules/std-env": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
+ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "license": "MIT",
"dependencies": {
- "internal-slot": "^1.0.4"
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
}
},
+ "node_modules/storybook": {
+ "version": "8.6.12",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.12.tgz",
+ "integrity": "sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@storybook/core": "8.6.12"
+ },
+ "bin": {
+ "getstorybook": "bin/index.cjs",
+ "sb": "bin/index.cjs",
+ "storybook": "bin/index.cjs"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
+ }
+ },
"node_modules/stream-composer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
@@ -33861,13 +37847,16 @@
}
},
"node_modules/streamx": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz",
- "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==",
- "dev": true,
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
+ "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
+ "license": "MIT",
"dependencies": {
- "fast-fifo": "^1.1.0",
- "queue-tick": "^1.0.1"
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
+ },
+ "optionalDependencies": {
+ "bare-events": "^2.2.0"
}
},
"node_modules/string_decoder": {
@@ -33930,35 +37919,73 @@
"node": ">=8"
}
},
- "node_modules/string.prototype.matchall": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
- "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "regexp.prototype.flags": "^1.4.3",
- "side-channel": "^1.0.4"
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+ "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.6",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.6",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "internal-slot": "^1.1.0",
+ "regexp.prototype.flags": "^1.5.3",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -33968,15 +37995,19 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -34045,6 +38076,7 @@
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
"integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"min-indent": "^1.0.1"
},
@@ -34070,7 +38102,8 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
- "optional": true
+ "optional": true,
+ "peer": true
},
"node_modules/stubs": {
"version": "3.0.0",
@@ -34433,19 +38466,6 @@
"dev": true,
"peer": true
},
- "node_modules/stylelint/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/stylelint/node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -34472,25 +38492,12 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/stylelint/node_modules/write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
"node_modules/superagent": {
"version": "3.8.3",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
"integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
- "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email at .",
+ "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net",
+ "license": "MIT",
"dependencies": {
"component-emitter": "^1.2.0",
"cookiejar": "^2.1.0",
@@ -34511,32 +38518,58 @@
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/superagent/node_modules/form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz",
+ "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==",
+ "license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.35",
+ "safe-buffer": "^5.2.1"
},
"engines": {
"node": ">= 0.12"
}
},
+ "node_modules/superagent/node_modules/form-data/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/superagent/node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
},
"node_modules/superagent/node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -34545,9 +38578,10 @@
}
},
"node_modules/superagent/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -34562,6 +38596,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
@@ -34785,11 +38820,6 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
},
- "node_modules/swagger-client/node_modules/traverse": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
- "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
- },
"node_modules/swagger-client/node_modules/url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
@@ -34802,7 +38832,8 @@
"node_modules/swagger-converter": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/swagger-converter/-/swagger-converter-0.1.7.tgz",
- "integrity": "sha1-oJdRnG8e5N1n4wjZtT3cnCslf5c=",
+ "integrity": "sha512-O2hZbWqq8x6j0uZ4qWj5dw45WPoAxKsJLJZqOgTqRtPNi8IqA+rDkDV/48S8qanS3KGv1QcVoPNLivMbyHHdAQ==",
+ "license": "MIT",
"dependencies": {
"lodash.clonedeep": "^2.4.1"
}
@@ -34853,12 +38884,6 @@
"lodash": "^4.17.14"
}
},
- "node_modules/swagger-tools/node_modules/commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
- "license": "MIT"
- },
"node_modules/swagger-tools/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
@@ -34884,7 +38909,8 @@
"node_modules/swagger-tools/node_modules/path-to-regexp": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
- "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="
+ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
+ "license": "MIT"
},
"node_modules/symbol-tree": {
"version": "3.2.4",
@@ -34897,6 +38923,7 @@
"resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
"integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
"dev": true,
+ "peer": true,
"dependencies": {
"ajv": "^8.0.1",
"lodash.truncate": "^4.4.2",
@@ -34913,6 +38940,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -34928,7 +38956,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
+ "dev": true,
+ "peer": true
},
"node_modules/tapable": {
"version": "2.2.1",
@@ -34956,14 +38985,28 @@
}
},
"node_modules/tar-fs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
- "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz",
+ "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==",
+ "license": "MIT",
"dependencies": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
"pump": "^3.0.0",
- "tar-stream": "^2.0.0"
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/tar-fs/node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
}
},
"node_modules/tar-stream": {
@@ -35061,15 +39104,6 @@
"streamx": "^2.12.5"
}
},
- "node_modules/telejson": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz",
- "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==",
- "dev": true,
- "dependencies": {
- "memoizerific": "^1.11.3"
- }
- },
"node_modules/temp": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
@@ -35111,16 +39145,17 @@
}
},
"node_modules/terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "version": "5.3.12",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.12.tgz",
+ "integrity": "sha512-jDLYqo7oF8tJIttjXO6jBY5Hk8p3A8W4ttih7cCEq64fQFWmgJ4VqAQjKr7WwIDlmXKEc6QeoRb5ecjZ+2afcg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.20",
+ "@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
},
"engines": {
"node": ">= 10.13.0"
@@ -35144,22 +39179,61 @@
}
}
},
- "node_modules/terser-webpack-plugin/node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "node_modules/terser-webpack-plugin/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "^5.1.0"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "randombytes": "^2.1.0"
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
"node_modules/terser/node_modules/acorn": {
@@ -35194,6 +39268,15 @@
"node": ">=8"
}
},
+ "node_modules/text-decoder": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -35210,6 +39293,7 @@
"resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
"integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
"dev": true,
+ "license": "Unlicense",
"engines": {
"node": ">=10.18"
},
@@ -35359,7 +39443,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/tildify": {
"version": "2.0.0",
@@ -35419,52 +39504,179 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
+ "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/tinypool": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+ "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
},
"node_modules/tinyrainbow": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
"integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tlds": {
- "version": "1.228.0",
- "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.228.0.tgz",
- "integrity": "sha512-Q0TU9zh5hDs2CpRFNM7SOW3K7OSgUgJC/cMrq9t44ei4tu+G3KV8BZyIJuYVvryJHH96mKgc9WXdhgKVvGD7jg==",
+ "version": "1.256.0",
+ "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.256.0.tgz",
+ "integrity": "sha512-ZmyVB9DAw+FFTmLElGYJgdZFsKLYd/I59Bg9NHkCGPwAbVZNRilFWDMAdX8UG+bHuv7kfursd5XGqo/9wi26lA==",
"dev": true,
+ "license": "MIT",
"bin": {
"tlds": "bin.js"
}
},
- "node_modules/tmatch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz",
- "integrity": "sha512-OHn/lzGWAsh5MBNTXUiHc595HAbIASCs6M+hDrkMObbSzsXej0SCKrQxr4J6EmRHbdo3qwyetPzuzEktkZiy4g==",
- "dev": true
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^6.1.86"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "license": "MIT"
},
"node_modules/tmp": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
"integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
"engines": {
"node": ">=14.14"
}
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
"node_modules/to-regex-range": {
@@ -35610,21 +39822,21 @@
"node_modules/tr46": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "dev": true,
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/traverse": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz",
- "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==",
+ "version": "0.6.11",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz",
+ "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==",
"license": "MIT",
"dependencies": {
- "gopd": "^1.0.1",
- "typedarray.prototype.slice": "^1.0.3",
- "which-typed-array": "^1.1.15"
+ "gopd": "^1.2.0",
+ "typedarray.prototype.slice": "^1.0.5",
+ "which-typed-array": "^1.1.18"
},
"engines": {
"node": ">= 0.4"
@@ -35638,6 +39850,7 @@
"resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
"integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=10.0"
},
@@ -35666,18 +39879,20 @@
"resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
"integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6.10"
}
},
"node_modules/tsconfig-paths": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
- "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/json5": "^0.0.29",
- "json5": "^1.0.1",
+ "json5": "^1.0.2",
"minimist": "^1.2.6",
"strip-bom": "^3.0.0"
}
@@ -35695,9 +39910,10 @@
}
},
"node_modules/tslib": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
- "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
"node_modules/tsscmp": {
"version": "1.0.6",
@@ -35778,30 +39994,30 @@
}
},
"node_modules/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -35811,17 +40027,18 @@
}
},
"node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
},
"engines": {
"node": ">= 0.4"
@@ -35831,17 +40048,17 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
"node": ">= 0.4"
@@ -35856,17 +40073,19 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"node_modules/typedarray.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz",
+ "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-offset": "^1.0.2"
+ "get-proto": "^1.0.1",
+ "math-intrinsics": "^1.1.0",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -35876,10 +40095,11 @@
}
},
"node_modules/typescript": {
- "version": "5.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
- "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -35897,12 +40117,22 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ufo": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
+ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/uglify-js": {
"version": "3.15.0",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz",
"integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==",
+ "dev": true,
+ "optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
},
@@ -35944,14 +40174,18 @@
}
},
"node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -35961,6 +40195,8 @@
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
"integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.6.3",
"@types/react": ">=16.9.11",
@@ -35982,12 +40218,6 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
"integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
},
- "node_modules/undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "dev": true
- },
"node_modules/uni-global": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
@@ -35997,10 +40227,11 @@
}
},
"node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -36010,6 +40241,7 @@
"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"unicode-canonical-property-names-ecmascript": "^2.0.0",
"unicode-property-aliases-ecmascript": "^2.0.0"
@@ -36019,10 +40251,11 @@
}
},
"node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
- "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -36032,56 +40265,66 @@
"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
"integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
- "node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
"dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "node_modules/union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
"dev": true,
"dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "node_modules/union-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
"dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/universal-user-agent": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
- "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+ "node_modules/universal-cookie": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.2.tgz",
+ "integrity": "sha512-fMiOcS3TmzP2x5QV26pIH3mvhexLIT0HmPa3V7Q7knRfT9HG6kTwq02HZGLPw0sAOXrAmotElGRvTLCMbJsvxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/cookie": "^0.6.0",
+ "cookie": "^0.7.2"
+ }
+ },
+ "node_modules/universal-cookie/node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
"node_modules/universalify": {
"version": "2.0.0",
@@ -36100,25 +40343,25 @@
}
},
"node_modules/unplugin": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz",
- "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==",
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
+ "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "acorn": "^8.11.3",
- "chokidar": "^3.6.0",
- "webpack-sources": "^3.2.3",
- "webpack-virtual-modules": "^0.6.1"
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/unplugin/node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -36126,34 +40369,58 @@
"node": ">=0.4.0"
}
},
- "node_modules/unplugin/node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "node_modules/unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
"dev": true,
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
},
"engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "node": ">=0.10.0"
}
},
- "node_modules/unplugin/node_modules/webpack-virtual-modules": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
- "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
+ "node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+ "dev": true,
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true
},
"node_modules/untildify": {
@@ -36166,9 +40433,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
- "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
"funding": [
{
@@ -36184,9 +40451,10 @@
"url": "https://github.com/sponsors/ai"
}
],
+ "license": "MIT",
"dependencies": {
- "escalade": "^3.1.2",
- "picocolors": "^1.0.1"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
@@ -36203,6 +40471,13 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+ "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+ "dev": true
+ },
"node_modules/url": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
@@ -36258,6 +40533,15 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
},
+ "node_modules/use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/utf-8-validate": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz",
@@ -36349,12 +40633,6 @@
"uuid": "bin/uuid"
}
},
- "node_modules/v8-compile-cache": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
- "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
- "dev": true
- },
"node_modules/v8-to-istanbul": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
@@ -36582,6 +40860,177 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
+ "node_modules/vite-node": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz",
+ "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.4.0",
+ "es-module-lexer": "^1.6.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite-node/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node/node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/vite-node/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vite-node/node_modules/vite": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz",
+ "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.12"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node/node_modules/yaml": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
@@ -36602,7 +41051,8 @@
"node_modules/w3c-keyname": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
- "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
+ "dev": true
},
"node_modules/w3c-xmlserializer": {
"version": "3.0.0",
@@ -36616,6 +41066,13 @@
"node": ">=12"
}
},
+ "node_modules/walk-up-path": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz",
+ "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/walkdir": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
@@ -36625,9 +41082,11 @@
}
},
"node_modules/warning": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
- "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+ "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
}
@@ -36650,6 +41109,7 @@
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
"integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"minimalistic-assert": "^1.0.0"
}
@@ -36671,21 +41131,21 @@
}
},
"node_modules/webpack": {
- "version": "5.93.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
- "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
+ "version": "5.98.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz",
+ "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.5",
- "@webassemblyjs/ast": "^1.12.1",
- "@webassemblyjs/wasm-edit": "^1.12.1",
- "@webassemblyjs/wasm-parser": "^1.12.1",
- "acorn": "^8.7.1",
- "acorn-import-attributes": "^1.9.5",
- "browserslist": "^4.21.10",
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.0",
+ "enhanced-resolve": "^5.17.1",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
@@ -36695,9 +41155,9 @@
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
+ "schema-utils": "^4.3.0",
"tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.10",
+ "terser-webpack-plugin": "^5.3.11",
"watchpack": "^2.4.1",
"webpack-sources": "^3.2.3"
},
@@ -36854,42 +41314,46 @@
}
},
"node_modules/webpack-dev-middleware": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
- "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
+ "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"colorette": "^2.0.10",
- "memfs": "^3.4.3",
+ "memfs": "^4.6.0",
"mime-types": "^2.1.31",
+ "on-finished": "^2.4.1",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ }
}
},
"node_modules/webpack-dev-middleware/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
+ "require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -36901,8 +41365,7 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
@@ -36915,16 +41378,47 @@
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
- "optional": true,
- "peer": true
+ "license": "MIT"
+ },
+ "node_modules/webpack-dev-middleware/node_modules/memfs": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz",
+ "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/json-pack": "^1.0.3",
+ "@jsonjoy.com/util": "^1.3.0",
+ "tree-dump": "^1.0.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
},
"node_modules/webpack-dev-middleware/node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -36932,7 +41426,7 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -36940,56 +41434,53 @@
}
},
"node_modules/webpack-dev-server": {
- "version": "4.15.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
- "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz",
+ "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
+ "@types/bonjour": "^3.5.13",
+ "@types/connect-history-api-fallback": "^1.5.4",
+ "@types/express": "^4.17.21",
+ "@types/express-serve-static-core": "^4.17.21",
+ "@types/serve-index": "^1.9.4",
+ "@types/serve-static": "^1.15.5",
+ "@types/sockjs": "^0.3.36",
+ "@types/ws": "^8.5.10",
"ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
+ "bonjour-service": "^1.2.1",
+ "chokidar": "^3.6.0",
"colorette": "^2.0.10",
"compression": "^1.7.4",
"connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
+ "express": "^4.21.2",
"graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
+ "http-proxy-middleware": "^2.0.7",
+ "ipaddr.js": "^2.1.0",
+ "launch-editor": "^2.6.1",
+ "open": "^10.0.3",
+ "p-retry": "^6.2.0",
+ "schema-utils": "^4.2.0",
+ "selfsigned": "^2.4.1",
"serve-index": "^1.9.1",
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.4",
- "ws": "^8.13.0"
+ "webpack-dev-middleware": "^7.4.2",
+ "ws": "^8.18.0"
},
"bin": {
"webpack-dev-server": "bin/webpack-dev-server.js"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
+ "webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"webpack": {
@@ -37000,18 +41491,30 @@
}
}
},
- "node_modules/webpack-dev-server/node_modules/ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
+ "node_modules/webpack-dev-server/node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
+ "require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -37023,8 +41526,7 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
@@ -37032,57 +41534,85 @@
"ajv": "^8.8.2"
}
},
- "node_modules/webpack-dev-server/node_modules/ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
+ "node_modules/webpack-dev-server/node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 10"
}
},
+ "node_modules/webpack-dev-server/node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
- "optional": true,
- "peer": true
+ "license": "MIT"
},
- "node_modules/webpack-dev-server/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "node_modules/webpack-dev-server/node_modules/open": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.1.tgz",
+ "integrity": "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "glob": "^7.1.3"
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
},
- "bin": {
- "rimraf": "bin.js"
+ "engines": {
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/webpack-dev-server/node_modules/schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
+ "ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
+ "ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -37158,11 +41688,19 @@
"node": ">=10.13.0"
}
},
- "node_modules/webpack/node_modules/acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webpack/node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -37170,13 +41708,34 @@
"node": ">=0.4.0"
}
},
- "node_modules/webpack/node_modules/acorn-import-attributes": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
- "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
"peerDependencies": {
- "acorn": "^8"
+ "ajv": "^8.8.2"
}
},
"node_modules/webpack/node_modules/events": {
@@ -37188,11 +41747,39 @@
"node": ">=0.8.x"
}
},
+ "node_modules/webpack/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
"node_modules/websocket-driver": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
@@ -37207,6 +41794,7 @@
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=0.8.0"
}
@@ -37245,10 +41833,10 @@
}
},
"node_modules/whatwg-url": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
- "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "dev": true,
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "license": "MIT",
"dependencies": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
@@ -37259,7 +41847,7 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
+ "license": "BSD-2-Clause"
},
"node_modules/which": {
"version": "2.0.2",
@@ -37276,38 +41864,43 @@
}
},
"node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
"dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dev": true,
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
"dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
"is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
"is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
+ "is-regex": "^1.2.1",
"is-weakref": "^1.0.2",
"isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -37317,15 +41910,18 @@
}
},
"node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dev": true,
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "license": "MIT",
"dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -37338,15 +41934,17 @@
"dev": true
},
"node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
},
"engines": {
@@ -37356,6 +41954,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
@@ -37406,8 +42021,9 @@
"node_modules/wildcard": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
- "integrity": "sha1-pwIEUwhNjNLv5wup02liY94XEKU=",
- "dev": true
+ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/with": {
"version": "7.0.2",
@@ -37446,9 +42062,10 @@
"dev": true
},
"node_modules/workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw=="
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+ "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "license": "Apache-2.0"
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
@@ -37518,6 +42135,31 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/write-file-atomic/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/ws": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
@@ -37548,15 +42190,25 @@
}
},
"node_modules/xml-crypto": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.3.tgz",
- "integrity": "sha512-MpXZwnn9JK0mNPZ5mnFIbNnQa+8lMGK4NtnX2FlJMfMWR60sJdFO9X72yO6ji068pxixzk53O7x0/iSKh6IhyQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.1.tgz",
+ "integrity": "sha512-0GUNbPtQt+PLMsC5HoZRONX+K6NBJEqpXe/lsvrFj0EqfpGPpVfJKGE7a5jCg8s2+Wkrf/2U1G41kIH+zC9eyQ==",
+ "license": "MIT",
"dependencies": {
- "@xmldom/xmldom": "^0.7.0",
+ "@xmldom/xmldom": "^0.8.8",
"xpath": "0.0.32"
},
"engines": {
- "node": ">=0.4.0"
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xml-crypto/node_modules/@xmldom/xmldom": {
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+ "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
}
},
"node_modules/xml-crypto/node_modules/xpath": {
@@ -37631,11 +42283,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
- "node_modules/xmlcreate": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
- "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
- },
"node_modules/xmlhttprequest": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
@@ -37726,6 +42373,7 @@
"resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
"integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"camelcase": "^6.0.0",
"decamelize": "^4.0.0",
@@ -37741,6 +42389,7 @@
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
"integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -37748,15 +42397,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yargs-unparser/node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/yargs/node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -37820,6 +42460,7 @@
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz",
"integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==",
+ "license": "MIT",
"dependencies": {
"core-js": "^2.5.7",
"lodash.get": "^4.0.0",
@@ -37833,23 +42474,19 @@
"commander": "^2.7.1"
}
},
- "node_modules/z-schema/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "optional": true
- },
"node_modules/z-schema/node_modules/core-js": {
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
- "hasInstallScript": true
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true,
+ "license": "MIT"
},
"node_modules/z-schema/node_modules/validator": {
"version": "10.11.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
"integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==",
+ "license": "MIT",
"engines": {
"node": ">= 0.10"
}
@@ -37867,27 +42504,10 @@
"node": ">= 10"
}
},
- "node_modules/zlib": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz",
- "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==",
- "hasInstallScript": true,
- "engines": {
- "node": ">=0.2.0"
- }
- },
- "node_modules/zone.js": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz",
- "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.0.0"
- }
- },
"services/analytics": {
"name": "@overleaf/analytics",
"dependencies": {
+ "@customerio/cdp-analytics-node": "^0.3.0",
"@google-cloud/bigquery": "^5.9.0",
"@google-cloud/storage": "^6.10.1",
"@overleaf/fetch-utils": "*",
@@ -37905,14 +42525,14 @@
"celebrate": "^15.0.3",
"csv": "^5.4.0",
"east": "^2.0.3",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"joi": "^17.12.0",
"json2csv": "^4.5.4",
"lodash": "^4.17.21",
"minimist": "^1.2.7",
"mixpanel": "^0.13.0",
"moment": "^2.29.4",
- "mongodb": "^6.1.0",
+ "mongodb": "6.12.0",
"p-limit": "^2.3.0",
"pg": "^8.7.1",
"pg-copy-streams": "^2.2.2",
@@ -37928,7 +42548,7 @@
"@pollyjs/persister-fs": "^6.0.6",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sequelize-cli": "^6.6.0",
"sinon": "^9.2.4",
@@ -37936,65 +42556,6 @@
"typescript": "^5.0.4"
}
},
- "services/analytics/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "services/analytics/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
"services/analytics/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -38020,15 +42581,15 @@
"async": "^3.2.5",
"body-parser": "^1.20.3",
"exegesis-express": "^4.0.0",
- "express": "^4.21.0",
- "mongodb": "^6.1.0"
+ "express": "^4.21.2",
+ "mongodb": "6.12.0"
},
"devDependencies": {
"acorn": "^7.1.1",
"ajv": "^6.12.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"request": "^2.88.2",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
@@ -38036,65 +42597,6 @@
"typescript": "^5.0.4"
}
},
- "services/chat/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "services/chat/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
"services/clsi": {
"name": "@overleaf/clsi",
"dependencies": {
@@ -38104,24 +42606,24 @@
"@overleaf/o-error": "*",
"@overleaf/promise-utils": "*",
"@overleaf/settings": "*",
+ "@overleaf/stream-utils": "*",
"archiver": "5.3.2",
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "diskusage": "^1.1.3",
- "dockerode": "^3.1.0",
- "express": "^4.21.0",
+ "dockerode": "^4.0.7",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
"p-limit": "^3.1.0",
"request": "^2.88.2",
"send": "^0.19.0",
+ "tar-fs": "^3.0.9",
"workerpool": "^6.1.5"
},
"devDependencies": {
- "@types/workerpool": "^6.1.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"mock-fs": "^5.1.2",
"node-fetch": "^2.7.0",
"sandboxed-module": "^2.0.4",
@@ -38131,6 +42633,28 @@
"typescript": "^5.0.4"
}
},
+ "services/clsi-cache": {
+ "name": "@overleaf/clsi-cache",
+ "dependencies": {
+ "@overleaf/fetch-utils": "*",
+ "@overleaf/logger": "*",
+ "@overleaf/metrics": "*",
+ "@overleaf/o-error": "*",
+ "@overleaf/promise-utils": "*",
+ "@overleaf/settings": "*",
+ "@overleaf/stream-utils": "*",
+ "body-parser": "^1.20.3",
+ "bunyan": "^1.8.15",
+ "celebrate": "^15.0.3",
+ "express": "^4.21.2",
+ "p-limit": "^3.1.0"
+ },
+ "devDependencies": {
+ "chai": "^4.3.6",
+ "chai-as-promised": "^7.1.1",
+ "mocha": "^11.1.0"
+ }
+ },
"services/clsi-perf": {
"name": "@overleaf/clsi-perf",
"dependencies": {
@@ -38141,14 +42665,14 @@
"@overleaf/settings": "*",
"bunyan": "^1.8.15",
"cookie": "^0.4.1",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"glob": "^7.2.0",
"p-limit": "^3.1.0"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -38209,8 +42733,8 @@
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
- "mongodb": "^6.1.0",
+ "express": "^4.21.2",
+ "mongodb": "6.12.0",
"request": "~2.88.2",
"underscore": "~1.13.1"
},
@@ -38218,7 +42742,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"esmock": "^2.6.3",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sinon": "~9.0.1",
"sinon-chai": "^3.7.0",
"typescript": "^5.0.4"
@@ -38233,65 +42757,6 @@
"node": ">=0.3.1"
}
},
- "services/contacts/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "services/contacts/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
"services/contacts/node_modules/sinon": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz",
@@ -38326,6 +42791,7 @@
"services/docstore": {
"name": "@overleaf/docstore",
"dependencies": {
+ "@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
"@overleaf/o-error": "*",
@@ -38337,9 +42803,9 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"celebrate": "^15.0.3",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"p-map": "^4.0.0",
"request": "^2.88.2"
},
@@ -38347,7 +42813,7 @@
"@google-cloud/storage": "^6.10.1",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "~2.0.4",
"sinon": "~9.0.2",
"sinon-chai": "^3.7.0",
@@ -38409,10 +42875,11 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"diff-match-patch": "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
"minimist": "^1.2.8",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
+ "overleaf-editor-core": "*",
"request": "^2.88.2",
"requestretry": "^7.1.0"
},
@@ -38420,7 +42887,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"cluster-key-slot": "^1.0.5",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
@@ -38439,7 +42906,7 @@
"@overleaf/stream-utils": "^0.1.0",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"glob": "^7.1.6",
"lodash.once": "^4.1.1",
"node-fetch": "^2.7.0",
@@ -38448,17 +42915,14 @@
},
"devDependencies": {
"@google-cloud/storage": "^6.10.1",
- "aws-sdk": "^2.718.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "disrequire": "^1.1.0",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
+ "mocha": "^11.1.0",
+ "mongodb": "6.12.0",
"sandboxed-module": "2.0.4",
"sinon": "9.0.2",
"sinon-chai": "^3.7.0",
"streamifier": "^0.1.1",
- "timekeeper": "^2.2.0",
"typescript": "^5.0.4"
}
},
@@ -38471,67 +42935,6 @@
"node": ">=0.3.1"
}
},
- "services/filestore/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "services/filestore/node_modules/mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dev": true,
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
"services/filestore/node_modules/sinon": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz",
@@ -38571,25 +42974,25 @@
"@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"is-valid-hostname": "^1.0.2",
- "tar-stream": "^2.2.0",
- "zlib": "^1.0.5"
+ "tar-stream": "^2.2.0"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
"services/github-sync": {
"name": "@overleaf/github-sync",
"dependencies": {
- "@octokit/request": "^5.6.3",
+ "@octokit/request": "^9.2.2",
"@overleaf/access-token-encryptor": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
+ "@overleaf/mongo-utils": "*",
"@overleaf/o-error": "*",
"@overleaf/promise-utils": "*",
"@overleaf/settings": "*",
@@ -38597,9 +43000,9 @@
"base64-stream": "^0.1.2",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"octonode": "^0.9.5",
"p-limit": "^2.2.0",
"randomstring": "^1.1.5",
@@ -38609,7 +43012,7 @@
"@overleaf/fetch-utils": "*",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
@@ -38617,6 +43020,62 @@
"typescript": "^5.0.4"
}
},
+ "services/github-sync/node_modules/@octokit/endpoint": {
+ "version": "10.1.3",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz",
+ "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.6.2",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "services/github-sync/node_modules/@octokit/openapi-types": {
+ "version": "23.0.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
+ "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==",
+ "license": "MIT"
+ },
+ "services/github-sync/node_modules/@octokit/request": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz",
+ "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^10.1.3",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2",
+ "fast-content-type-parse": "^2.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "services/github-sync/node_modules/@octokit/request-error": {
+ "version": "6.1.7",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz",
+ "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.6.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "services/github-sync/node_modules/@octokit/types": {
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
+ "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^23.0.1"
+ }
+ },
"services/github-sync/node_modules/p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -38631,15 +43090,25 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "services/github-sync/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "license": "ISC"
+ },
"services/history-v1": {
"name": "overleaf-editor",
"version": "1.0.0",
"license": "Proprietary",
"dependencies": {
+ "@google-cloud/secret-manager": "^5.6.0",
+ "@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
+ "@overleaf/mongo-utils": "*",
"@overleaf/o-error": "*",
"@overleaf/object-persistor": "*",
+ "@overleaf/promise-utils": "*",
"@overleaf/redis-wrapper": "*",
"@overleaf/settings": "*",
"@overleaf/stream-utils": "^0.1.0",
@@ -38647,11 +43116,12 @@
"basic-auth": "^2.0.1",
"bluebird": "^3.7.2",
"body-parser": "^1.20.3",
+ "bull": "^4.16.5",
"bunyan": "^1.8.12",
"check-types": "^11.1.2",
"command-line-args": "^3.0.3",
- "config": "^1.19.0",
- "express": "^4.21.0",
+ "config": "^3.3.12",
+ "express": "^4.21.2",
"fs-extra": "^9.0.1",
"generic-pool": "^2.1.1",
"helmet": "^3.22.0",
@@ -38659,9 +43129,12 @@
"jsonwebtoken": "^9.0.0",
"knex": "^2.4.0",
"lodash": "^4.17.19",
- "mongodb": "^6.2.0",
+ "mongodb": "6.12.0",
"overleaf-editor-core": "*",
+ "p-limit": "^6.2.0",
+ "p-queue": "^8.1.0",
"pg": "^8.7.1",
+ "pg-query-stream": "^4.2.4",
"swagger-tools": "^0.10.4",
"temp": "^0.8.3",
"throng": "^4.0.0",
@@ -38672,7 +43145,8 @@
"benny": "^3.7.1",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "chai-exclude": "^2.1.1",
+ "mocha": "^11.1.0",
"node-fetch": "^2.7.0",
"sinon": "^9.0.2",
"swagger-client": "^3.10.0",
@@ -38691,6 +43165,37 @@
"node": ">=0.12.0"
}
},
+ "services/history-v1/node_modules/bull": {
+ "version": "4.16.5",
+ "resolved": "https://registry.npmjs.org/bull/-/bull-4.16.5.tgz",
+ "integrity": "sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cron-parser": "^4.9.0",
+ "get-port": "^5.1.1",
+ "ioredis": "^5.3.2",
+ "lodash": "^4.17.21",
+ "msgpackr": "^1.11.2",
+ "semver": "^7.5.2",
+ "uuid": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "services/history-v1/node_modules/chai-exclude": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/chai-exclude/-/chai-exclude-2.1.1.tgz",
+ "integrity": "sha512-IHgNmgAFOkyRPnmOtZio9UsOHQ6RnzVr2LOs+5V9urYYqjhV/ERLQapC0Eq2DmID5eDWyngAcBxNUm0ZK0QbrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fclone": "^1.0.11"
+ },
+ "peerDependencies": {
+ "chai": ">= 4.0.0 < 5"
+ }
+ },
"services/history-v1/node_modules/check-types": {
"version": "11.1.2",
"resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz",
@@ -38710,6 +43215,56 @@
"command-line-args": "bin.js"
}
},
+ "services/history-v1/node_modules/config": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/config/-/config-3.3.12.tgz",
+ "integrity": "sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "json5": "^2.2.3"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "services/history-v1/node_modules/cron-parser": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
+ "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "luxon": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "services/history-v1/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "services/history-v1/node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"services/history-v1/node_modules/find-replace": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
@@ -38736,63 +43291,55 @@
"node": ">=10"
}
},
- "services/history-v1/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
+ "services/history-v1/node_modules/ioredis": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz",
+ "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==",
+ "license": "MIT",
"dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
+ "@ioredis/commands": "^1.1.1",
+ "cluster-key-slot": "^1.1.0",
+ "debug": "^4.3.4",
+ "denque": "^2.1.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.isarguments": "^3.1.0",
+ "redis-errors": "^1.2.0",
+ "redis-parser": "^3.0.0",
+ "standard-as-callback": "^2.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ioredis"
}
},
- "services/history-v1/node_modules/mongodb": {
+ "services/history-v1/node_modules/p-limit": {
"version": "6.2.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
- "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz",
+ "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==",
+ "license": "MIT",
"dependencies": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.2.0",
- "mongodb-connection-string-url": "^2.6.0"
+ "yocto-queue": "^1.1.1"
},
"engines": {
- "node": ">=16.20.1"
+ "node": ">=18"
},
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "services/history-v1/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
+ "engines": {
+ "node": ">=10"
}
},
"services/history-v1/node_modules/test-value": {
@@ -38807,17 +43354,38 @@
"node": ">=0.10.0"
}
},
+ "services/history-v1/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "services/history-v1/node_modules/yocto-queue": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"services/idp": {
"name": "@overleaf/idp",
"dependencies": {
"ejs": "^3.1.10",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"samlp": "^7.0.2"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -38829,12 +43397,12 @@
"@overleaf/o-error": "*",
"aws-sdk": "^2.1174.0",
"body-parser": "^1.20.3",
- "bootstrap": "^4.3.1",
+ "bootstrap": "^5.3.3",
"compression": "^1.7.1",
"cookie-parser": "^1.4.6",
- "cross-env": "^4.0.0",
+ "cross-env": "^7.0.3",
"es6-promise": "^4.2.8",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"express-basic-auth": "^1.2.0",
"express-flash": "0.0.2",
"express-rate-limit": "^2.11.0",
@@ -38843,14 +43411,12 @@
"jsonwebtoken": "^9.0.2",
"method-override": "^2.3.10",
"prop-types": "^15.8.1",
- "react": "^17.0.2",
- "react-bootstrap": "^0.33.1",
+ "react": "^18.3.1",
"react-cookie": "^7.2.0",
- "react-dom": "^17.0.2",
+ "react-dom": "^18.3.1",
"react-dropzone": "^14.2.3",
"react-helmet": "^6.1.0",
"react-redux": "^7.2.2",
- "react-responsive": "^10.0.0",
"react-router-dom": "^6.26.1",
"redux": "^4.2.1",
"redux-logger": "^3.0.1",
@@ -38868,23 +43434,21 @@
"@babel/preset-env": "^7.25.3",
"@babel/preset-react": "^7.24.7",
"@babel/register": "^7.24.6",
- "@testing-library/react": "^12.1.5",
+ "@testing-library/react": "^16.3.0",
+ "@vitejs/plugin-react": "^4.3.4",
"babel-loader": "^9.1.3",
"babel-plugin-react-transform": "^2.0.2",
"babel-plugin-transform-react-remove-prop-types": "^0.3.3",
- "chai": "^4.3.10",
- "chai-as-promised": "^7.1.1",
+ "combobo": "^2.0.4",
"css-loader": "^6.8.1",
"cssnano": "^6.0.0",
- "eslint": "^7.21.0",
- "eslint-config-prettier": "^8.5.0",
- "eslint-config-standard": "^16.0.3",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^10.1.5",
+ "eslint-config-standard": "^17.0.0",
"eslint-plugin-react": "^7.32.2",
- "expect": "^1.15.2",
+ "eslint-plugin-unicorn": "^56.0.1",
"file-loader": "^6.2.0",
- "jsdom": "^20.0.0",
"mini-css-extract-plugin": "^2.7.6",
- "mocha": "^10.2.0",
"nodemon": "^3.0.1",
"postcss": "^8.4.31",
"postcss-import": "^15.1.0",
@@ -38894,115 +43458,133 @@
"react-transform-hmr": "^1.0.4",
"redux-mock-store": "1.5.0",
"sandboxed-module": "^2.0.4",
- "sinon": "^19.0.2",
- "sinon-chai": "^3.7.0",
"style-loader": "^3.3.3",
"url-loader": "^4.1.1",
- "webpack": "^5.93.0",
+ "vitest": "^3.1.2",
+ "webpack": "^5.98.0",
"webpack-cli": "^5.1.4",
"webpack-dev-middleware": "^6.1.2",
"webpack-hot-middleware": "^2.25.1",
"webpack-manifest-plugin": "^5.0.0"
},
"engines": {
- "node": "18.x"
+ "node": ">=18"
}
},
- "services/latexqc/node_modules/@babel/code-frame": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
- "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "services/latexqc/node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/highlight": "^7.10.4"
+ "@types/ms": "*"
}
},
- "services/latexqc/node_modules/@eslint/eslintrc": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
- "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "services/latexqc/node_modules/@vitejs/plugin-react": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz",
+ "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
+ "@babel/core": "^7.26.10",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "services/latexqc/node_modules/@humanwhocodes/config-array": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
- "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
- "deprecated": "Use @eslint/config-array instead",
- "dev": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
+ "node": "^14.18.0 || >=16.0.0"
},
- "engines": {
- "node": ">=10.10.0"
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
}
},
- "services/latexqc/node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "services/latexqc/node_modules/@vitest/expect": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz",
+ "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "type-detect": "4.0.8"
+ "@vitest/spy": "3.1.2",
+ "@vitest/utils": "3.1.2",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "services/latexqc/node_modules/@sinonjs/commons/node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "services/latexqc/node_modules/@vitest/mocker": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz",
+ "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==",
"dev": true,
- "engines": {
- "node": ">=4"
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "3.1.2",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
}
},
- "services/latexqc/node_modules/@sinonjs/fake-timers": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz",
- "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==",
+ "services/latexqc/node_modules/@vitest/pretty-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz",
+ "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.1"
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "services/latexqc/node_modules/@sinonjs/samsam": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz",
- "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==",
+ "services/latexqc/node_modules/@vitest/spy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz",
+ "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.1",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.1.0"
+ "tinyspy": "^3.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "services/latexqc/node_modules/@sinonjs/text-encoding": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz",
- "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==",
- "dev": true
- },
- "services/latexqc/node_modules/@types/hoist-non-react-statics": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
- "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
+ "services/latexqc/node_modules/@vitest/utils": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz",
+ "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0"
+ "@vitest/pretty-format": "3.1.2",
+ "loupe": "^3.1.3",
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
"services/latexqc/node_modules/acorn-globals": {
@@ -39010,6 +43592,8 @@
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
"integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"acorn": "^8.1.0",
"acorn-walk": "^8.0.2"
@@ -39020,6 +43604,8 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true,
+ "optional": true,
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -39032,6 +43618,8 @@
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
"integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"acorn": "^8.11.0"
},
@@ -39044,6 +43632,8 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true,
+ "optional": true,
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -39051,28 +43641,14 @@
"node": ">=0.4.0"
}
},
- "services/latexqc/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "services/latexqc/node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "services/latexqc/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": ">=12"
}
},
"services/latexqc/node_modules/attr-accept": {
@@ -39084,9 +43660,9 @@
}
},
"services/latexqc/node_modules/bootstrap": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
- "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
+ "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
"funding": [
{
"type": "github",
@@ -39097,79 +43673,98 @@
"url": "https://opencollective.com/bootstrap"
}
],
+ "license": "MIT",
"peerDependencies": {
- "jquery": "1.9.1 - 3",
- "popper.js": "^1.16.1"
+ "@popperjs/core": "^2.11.8"
}
},
"services/latexqc/node_modules/chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
+ "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
- "services/latexqc/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "services/latexqc/node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 16"
}
},
- "services/latexqc/node_modules/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "services/latexqc/node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
}
},
+ "services/latexqc/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "services/latexqc/node_modules/debug/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
"services/latexqc/node_modules/deep-eql": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
- "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
- "services/latexqc/node_modules/diff": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
- "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
"services/latexqc/node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.12"
},
@@ -39177,138 +43772,35 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "services/latexqc/node_modules/eslint": {
- "version": "7.32.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
- "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "services/latexqc/node_modules/eslint-config-prettier": {
+ "version": "10.1.5",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz",
+ "integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==",
"dev": true,
- "dependencies": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.4.3",
- "@humanwhocodes/config-array": "^0.5.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.1",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.1.2",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^6.0.9",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
+ "license": "MIT",
"bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "eslint-config-prettier": "bin/cli.js"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
}
},
- "services/latexqc/node_modules/eslint-config-standard": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz",
- "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==",
+ "services/latexqc/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
}
- ],
- "peerDependencies": {
- "eslint": "^7.12.1",
- "eslint-plugin-import": "^2.22.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-promise": "^4.2.1 || ^5.0.0"
- }
- },
- "services/latexqc/node_modules/eslint-plugin-promise": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz",
- "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "peerDependencies": {
- "eslint": "^7.0.0"
- }
- },
- "services/latexqc/node_modules/espree": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
- "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
- "dev": true,
- "dependencies": {
- "acorn": "^7.4.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^1.3.0"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "services/latexqc/node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "services/latexqc/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
"services/latexqc/node_modules/helmet": {
@@ -39324,6 +43816,8 @@
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"agent-base": "6",
"debug": "4"
@@ -39332,26 +43826,16 @@
"node": ">= 6"
}
},
- "services/latexqc/node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "services/latexqc/node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
"dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "services/latexqc/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"
- },
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"bin": {
- "js-yaml": "bin/js-yaml.js"
+ "jiti": "lib/jiti-cli.mjs"
}
},
"services/latexqc/node_modules/jsdom": {
@@ -39359,6 +43843,8 @@
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
"integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"abab": "^2.0.6",
"acorn": "^8.8.1",
@@ -39404,6 +43890,8 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true,
+ "optional": true,
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -39417,11 +43905,12 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
- "services/latexqc/node_modules/just-extend": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
- "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
- "dev": true
+ "services/latexqc/node_modules/loupe": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
},
"services/latexqc/node_modules/method-override": {
"version": "2.3.10",
@@ -39450,41 +43939,13 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
- "services/latexqc/node_modules/nise": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz",
- "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==",
- "dev": true,
- "dependencies": {
- "@sinonjs/commons": "^3.0.1",
- "@sinonjs/fake-timers": "^13.0.1",
- "@sinonjs/text-encoding": "^0.7.3",
- "just-extend": "^6.2.0",
- "path-to-regexp": "^8.1.0"
- }
- },
- "services/latexqc/node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"services/latexqc/node_modules/parse5": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
"integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"entities": "^4.4.0"
},
@@ -39492,26 +43953,27 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "services/latexqc/node_modules/path-to-regexp": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
- "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "services/latexqc/node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=16"
+ "node": ">= 14.16"
}
},
- "services/latexqc/node_modules/react-cookie": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz",
- "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==",
- "dependencies": {
- "@types/hoist-non-react-statics": "^3.3.5",
- "hoist-non-react-statics": "^3.3.2",
- "universal-cookie": "^7.0.0"
+ "services/latexqc/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
- "peerDependencies": {
- "react": ">= 16.3.0"
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
"services/latexqc/node_modules/react-dropzone": {
@@ -39557,11 +44019,23 @@
"react": "^16.3.0 || ^17.0.0 || ^18.0.0"
}
},
+ "services/latexqc/node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"services/latexqc/node_modules/saxes": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
"integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"xmlchars": "^2.2.0"
},
@@ -39570,10 +44044,11 @@
}
},
"services/latexqc/node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -39581,7 +44056,7 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -39616,46 +44091,14 @@
"ajv": "^8.8.2"
}
},
- "services/latexqc/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "services/latexqc/node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
- }
- },
- "services/latexqc/node_modules/sinon": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz",
- "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==",
- "dev": true,
- "dependencies": {
- "@sinonjs/commons": "^3.0.1",
- "@sinonjs/fake-timers": "^13.0.2",
- "@sinonjs/samsam": "^8.0.1",
- "diff": "^7.0.0",
- "nise": "^6.1.1",
- "supports-color": "^7.2.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
- }
- },
- "services/latexqc/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
}
},
"services/latexqc/node_modules/tr46": {
@@ -39663,6 +44106,8 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
"integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"punycode": "^2.1.1"
},
@@ -39670,22 +44115,150 @@
"node": ">=12"
}
},
- "services/latexqc/node_modules/type-detect": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
- "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "services/latexqc/node_modules/vite": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.2.tgz",
+ "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.12"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
"engines": {
- "node": ">=4"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
}
},
- "services/latexqc/node_modules/universal-cookie": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.0.tgz",
- "integrity": "sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==",
+ "services/latexqc/node_modules/vitest": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz",
+ "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/cookie": "^0.6.0",
- "cookie": "^0.6.0"
+ "@vitest/expect": "3.1.2",
+ "@vitest/mocker": "3.1.2",
+ "@vitest/pretty-format": "^3.1.2",
+ "@vitest/runner": "3.1.2",
+ "@vitest/snapshot": "3.1.2",
+ "@vitest/spy": "3.1.2",
+ "@vitest/utils": "3.1.2",
+ "chai": "^5.2.0",
+ "debug": "^4.4.0",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.13",
+ "tinypool": "^1.0.2",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
+ "vite-node": "3.1.2",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.1.2",
+ "@vitest/ui": "3.1.2",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
}
},
"services/latexqc/node_modules/w3c-xmlserializer": {
@@ -39693,6 +44266,8 @@
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
"integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"xml-name-validator": "^4.0.0"
},
@@ -39733,6 +44308,8 @@
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
"integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
"dev": true,
+ "optional": true,
+ "peer": true,
"dependencies": {
"tr46": "^3.0.0",
"webidl-conversions": "^7.0.0"
@@ -39741,6 +44318,21 @@
"node": ">=12"
}
},
+ "services/latexqc/node_modules/yaml": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+ "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"services/notifications": {
"name": "@overleaf/notifications",
"license": "ISC",
@@ -39751,15 +44343,15 @@
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"method-override": "^3.0.0",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"request": "^2.88.2"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
@@ -39775,24 +44367,26 @@
"@overleaf/promise-utils": "*",
"@overleaf/redis-wrapper": "*",
"@overleaf/settings": "*",
+ "@overleaf/stream-utils": "*",
"async": "^3.2.5",
"aws-sdk": "^2.650.0",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"celebrate": "^15.0.3",
- "cli": "^1.0.1",
"diff-match-patch": "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688",
"esmock": "^2.6.3",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.20",
- "mongodb-legacy": "^6.0.1",
+ "minimist": "^1.2.8",
+ "mongodb-legacy": "6.1.3",
"overleaf-editor-core": "*",
+ "p-queue": "^8.1.0",
"request": "^2.88.2"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"nock": "^13.5.3",
"sinon": "~9.0.1",
"sinon-chai": "^3.7.0",
@@ -39854,20 +44448,20 @@
"bunyan": "^1.8.15",
"connect-redis": "^6.1.3",
"cookie-parser": "^1.4.6",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"express-session": "^1.17.1",
"joi": "^17.12.0",
"lodash": "^4.17.21",
"proxy-addr": "^2.0.7",
"request": "^2.88.2",
- "socket.io": "github:overleaf/socket.io#0.9.19-overleaf-10",
+ "socket.io": "github:overleaf/socket.io#0.9.19-overleaf-12",
"socket.io-client": "github:overleaf/socket.io-client#0.9.17-overleaf-5"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"cookie-signature": "^1.1.0",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "~0.3.0",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
@@ -39911,148 +44505,34 @@
"@overleaf/redis-wrapper": "*",
"@overleaf/settings": "*",
"async": "^3.2.5",
- "body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"ioredis": "^4.16.1",
"lodash": "^4.17.19"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
- "sandboxed-module": "^2.0.4",
+ "esmock": "^2.6.9",
+ "mocha": "^11.1.0",
+ "mongodb": "6.12.0",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
}
},
- "services/references/node_modules/@mongodb-js/saslprep": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
- "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
- "dev": true,
- "dependencies": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "services/references/node_modules/@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "dev": true,
- "dependencies": {
- "@types/webidl-conversions": "*"
- }
- },
- "services/references/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "services/references/node_modules/mongodb": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz",
- "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==",
- "dev": true,
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
- "services/references/node_modules/mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "dev": true,
- "dependencies": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "services/references/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "services/references/node_modules/esmock": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/esmock/-/esmock-2.6.9.tgz",
+ "integrity": "sha512-SJ5YnoWi8yuGghBrupScARmIcUh2A2a2gIfdVRtQ2MQpQo91wMWHx/fsN0ZDERLAUso1ea4Q/9CKCL88O5MEpg==",
"dev": true,
"engines": {
- "node": ">=6"
- }
- },
- "services/references/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "services/references/node_modules/whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "dev": true,
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=16"
+ "node": ">=14.16.0"
}
},
"services/spelling": {
"name": "@overleaf/spelling",
"version": "0.1.4",
+ "extraneous": true,
"dependencies": {
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
@@ -40075,33 +44555,30 @@
"typescript": "^5.0.4"
}
},
- "services/spelling/node_modules/underscore": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
- "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
- },
"services/templates": {
"name": "@overleaf/templates",
"dependencies": {
+ "@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
+ "@overleaf/promise-utils": "*",
"@overleaf/settings": "*",
"args-js": "0.10.12",
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"install": "^0.13.0",
"lodash": "^4.17.21",
"marked": "^4.1.0",
"method-override": "^3.0.0",
- "mongoose": "^6.12.0",
+ "mongoose": "^8.9.5",
"request": "^2.88.2"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
@@ -40120,19 +44597,19 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"dropbox": "^10.34.0",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
"lru-cache": "^4.1.5",
"minimatch": "^7.4.2",
"minimist": "^1.2.8",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"node-fetch": "^2.7.0",
"p-limit": "^2.3.0"
},
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "9.0.1",
"sinon-chai": "^3.7.0",
@@ -40247,7 +44724,7 @@
"express": "^4.21.0",
"lodash": "^4.17.21",
"lru-cache": "^5.1.1",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"oauth": "0.9.15",
"request": "^2.88.2",
"simple-oauth2": "^5.0.0"
@@ -40257,7 +44734,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"esmock": "^2.6.3",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sinon": "9.0.2",
"sinon-chai": "^3.7.0",
"typescript": "^5.0.4"
@@ -40315,7 +44792,7 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"dtrace-provider": "^0.8.8",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"express-basic-auth": "^1.2.0",
"ioredis": "^4.16.0",
"lodash": "^4.17.15",
@@ -40326,7 +44803,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"chai-http": "^4.4.0",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"typescript": "^5.0.4"
}
},
@@ -40339,23 +44816,25 @@
"@node-oauth/oauth2-server": "^5.1.0",
"@node-saml/passport-saml": "^4.0.4",
"@overleaf/access-token-encryptor": "*",
- "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.3.tar.gz",
"@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
+ "@overleaf/mongo-utils": "*",
"@overleaf/o-error": "*",
"@overleaf/object-persistor": "*",
"@overleaf/promise-utils": "*",
"@overleaf/redis-wrapper": "*",
"@overleaf/settings": "*",
+ "@overleaf/stream-utils": "*",
+ "@phosphor-icons/react": "^2.1.7",
"@slack/webhook": "^7.0.2",
- "@types/dateformat": "^5.0.2",
+ "@stripe/stripe-js": "^7.3.0",
"@xmldom/xmldom": "^0.7.13",
"accepts": "^1.3.7",
"ajv": "^8.12.0",
"archiver": "^5.3.0",
"async": "^3.2.5",
- "base-x": "^4.0.0",
+ "base-x": "^4.0.1",
"basic-auth": "^2.0.1",
"bcrypt": "^5.0.0",
"body-parser": "^1.20.3",
@@ -40369,7 +44848,6 @@
"contentful": "^10.8.5",
"cookie": "^0.2.3",
"cookie-parser": "1.4.6",
- "core-js": "^3.38.1",
"crc-32": "^1.2.2",
"csurf": "^1.11.0",
"csv": "^6.2.5",
@@ -40378,14 +44856,13 @@
"ejs": "^3.1.10",
"email-addresses": "^5.0.0",
"eventsource-parser": "^1.1.2",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"express-bearer-token": "^2.4.0",
"express-http-proxy": "^1.6.0",
"express-session": "^1.17.1",
- "fs-extra": "^4.0.2",
- "fuse.js": "^3.0.0",
"globby": "^5.0.0",
"helmet": "^6.0.1",
+ "https-proxy-agent": "^7.0.6",
"i18next": "^23.10.0",
"i18next-fs-backend": "^2.3.1",
"i18next-http-middleware": "^3.5.0",
@@ -40401,9 +44878,9 @@
"minimist": "^1.2.7",
"mmmagic": "^0.5.3",
"moment": "^2.29.4",
- "mongodb-legacy": "6.1.0",
- "mongoose": "8.5.3",
- "multer": "overleaf/multer#e1df247fbf8e7590520d20ae3601eaef9f3d2e9e",
+ "mongodb-legacy": "6.1.3",
+ "mongoose": "8.9.5",
+ "multer": "overleaf/multer#4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23",
"nocache": "^2.1.0",
"node-fetch": "^2.7.0",
"nodemailer": "^6.7.0",
@@ -40412,6 +44889,7 @@
"otplib": "^12.0.1",
"p-limit": "^2.3.0",
"p-props": "4.0.0",
+ "p-queue": "^8.1.0",
"parse-data-url": "^2.0.0",
"passport": "^0.6.0",
"passport-google-oauth20": "^2.0.0",
@@ -40426,94 +44904,81 @@
"referer-parser": "github:overleaf/nodejs-referer-parser#8b8b103762d05b7be4cfa2f810e1d408be67d7bb",
"request": "^2.88.2",
"requestretry": "^7.1.0",
- "rimraf": "2.2.6",
"sanitize-html": "^2.8.1",
+ "stripe": "^18.1.0",
"tough-cookie": "^4.0.0",
"tsscmp": "^1.0.6",
"uid-safe": "^2.1.5",
"utf-8-validate": "^5.0.2",
- "uuid": "^9.0.1",
"valid-data-url": "^2.0.0",
"valid-url": "^1.0.9",
- "w3c-keyname": "^2.2.8",
- "xml-crypto": "^2.1.2",
+ "xml-crypto": "^2.1.6",
"xml2js": "^0.6.2",
"xregexp": "^4.3.0",
"yauzl": "^2.10.0"
},
"devDependencies": {
- "@babel/cli": "^7.24.8",
- "@babel/core": "^7.25.2",
- "@babel/preset-env": "^7.25.3",
- "@babel/preset-react": "^7.24.7",
- "@babel/preset-typescript": "^7.24.7",
- "@babel/register": "^7.24.6",
- "@codemirror/autocomplete": "github:overleaf/codemirror-autocomplete#v6.18.0-overleaf-1",
- "@codemirror/commands": "^6.6.0",
- "@codemirror/lang-markdown": "^6.2.5",
- "@codemirror/language": "^6.10.2",
- "@codemirror/lint": "^6.8.1",
- "@codemirror/search": "github:overleaf/codemirror-search#29f7a871969ad64b89341bacbe5d46dda02eee12",
- "@codemirror/state": "^6.4.1",
- "@codemirror/view": "^6.32.0",
+ "@babel/cli": "^7.27.0",
+ "@babel/core": "^7.26.10",
+ "@babel/preset-env": "^7.26.9",
+ "@babel/preset-react": "^7.26.3",
+ "@babel/preset-typescript": "^7.27.0",
+ "@babel/register": "^7.25.9",
+ "@codemirror/autocomplete": "github:overleaf/codemirror-autocomplete#6445cd056671c98d12d1c597ba705e11327ec4c5",
+ "@codemirror/commands": "^6.8.1",
+ "@codemirror/lang-markdown": "^6.3.2",
+ "@codemirror/language": "^6.11.0",
+ "@codemirror/lint": "^6.8.5",
+ "@codemirror/search": "github:overleaf/codemirror-search#04380a528c339cd4b78fb10b3ef017f657ec17bd",
+ "@codemirror/state": "^6.5.2",
+ "@codemirror/view": "^6.36.8",
"@juggle/resize-observer": "^3.3.1",
- "@lezer/common": "^1.2.1",
- "@lezer/generator": "^1.7.0",
- "@lezer/highlight": "^1.2.0",
- "@lezer/lr": "^1.4.1",
- "@lezer/markdown": "^1.3.0",
- "@opentelemetry/api": "^1.4.1",
- "@opentelemetry/auto-instrumentations-web": "^0.33.1",
- "@opentelemetry/context-zone": "^1.15.2",
- "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/instrumentation-document-load": "^0.33.1",
- "@opentelemetry/instrumentation-xml-http-request": "^0.41.2",
- "@opentelemetry/resources": "^1.15.2",
- "@opentelemetry/sdk-trace-base": "^1.15.2",
- "@opentelemetry/sdk-trace-web": "^1.15.2",
- "@opentelemetry/semantic-conventions": "^1.15.2",
+ "@lezer/common": "^1.2.3",
+ "@lezer/generator": "^1.7.3",
+ "@lezer/highlight": "^1.2.1",
+ "@lezer/lr": "^1.4.2",
+ "@lezer/markdown": "^1.4.3",
"@overleaf/codemirror-tree-view": "^0.1.3",
+ "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.3.tar.gz",
"@overleaf/ranges-tracker": "*",
"@overleaf/stream-utils": "*",
- "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.16",
"@pollyjs/adapter-node-http": "^6.0.6",
"@pollyjs/core": "^6.0.6",
"@pollyjs/persister-fs": "^6.0.6",
+ "@prettier/plugin-pug": "^3.4.0",
"@replit/codemirror-emacs": "overleaf/codemirror-emacs#4394c03858f27053f8768258e9493866e06e938e",
- "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#1b1f93c0bcd04293aea6986aa2275185b2c56803",
- "@replit/codemirror-vim": "overleaf/codemirror-vim#51ce0933e95705268256467fbbbcce5999ed3624",
+ "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#78264032eb286bc47871569ae87bff5ca1c6c161",
+ "@replit/codemirror-vim": "overleaf/codemirror-vim#1bef138382d948018f3f9b8a4d7a70ab61774e4b",
"@sentry/browser": "7.46.0",
- "@storybook/addon-a11y": "^8.3.5",
- "@storybook/addon-essentials": "^8.3.5",
- "@storybook/addon-interactions": "^8.3.5",
- "@storybook/addon-links": "^8.3.5",
- "@storybook/addon-styling-webpack": "^1.0.0",
- "@storybook/addon-webpack5-compiler-babel": "^3.0.3",
- "@storybook/react": "^8.3.5",
- "@storybook/react-webpack5": "^8.3.5",
- "@storybook/theming": "^8.3.5",
+ "@storybook/addon-a11y": "^8.6.12",
+ "@storybook/addon-essentials": "^8.6.12",
+ "@storybook/addon-interactions": "^8.6.12",
+ "@storybook/addon-links": "^8.6.12",
+ "@storybook/addon-styling-webpack": "^1.0.1",
+ "@storybook/addon-webpack5-compiler-babel": "^3.0.6",
+ "@storybook/cli": "^8.6.12",
+ "@storybook/react": "^8.6.12",
+ "@storybook/react-webpack5": "^8.6.12",
+ "@storybook/theming": "^8.6.12",
"@testing-library/cypress": "^10.0.1",
- "@testing-library/dom": "^9.3.0",
- "@testing-library/react": "^12.1.5",
- "@testing-library/react-hooks": "^8.0.1",
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.4.3",
"@types/bootstrap": "^5.2.10",
"@types/bootstrap-5": "npm:@types/bootstrap@^5.2.10",
"@types/chai": "^4.3.0",
+ "@types/dateformat": "^5.0.2",
"@types/diff": "^5.0.9",
- "@types/dompurify": "^3.0.5",
"@types/events": "^3.0.0",
"@types/express": "^4.17.13",
"@types/mocha": "^9.1.0",
"@types/mocha-each": "^2.0.0",
- "@types/react": "^17.0.40",
- "@types/react-bootstrap": "^0.32.36",
- "@types/react-color": "^3.0.6",
- "@types/react-dom": "^17.0.13",
- "@types/react-google-recaptcha": "^2.1.5",
- "@types/react-linkify": "^1.0.0",
- "@types/react-overlays": "^1.1.3",
+ "@types/react": "^18.3.20",
+ "@types/react-color": "^3.0.13",
+ "@types/react-dom": "^18.3.6",
+ "@types/react-google-recaptcha": "^2.1.9",
+ "@types/react-linkify": "^1.0.4",
"@types/recurly__recurly-js": "^4.22.0",
"@types/sinon-chai": "^3.2.8",
"@types/uuid": "^9.0.8",
@@ -40525,6 +44990,8 @@
"@uppy/react": "^3.2.1",
"@uppy/utils": "^5.7.0",
"@uppy/xhr-upload": "^3.6.0",
+ "@vitest/eslint-plugin": "1.1.44",
+ "5to6-codemod": "^1.8.0",
"abort-controller": "^3.0.0",
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1",
@@ -40535,7 +45002,7 @@
"babel-plugin-module-resolver": "^5.0.2",
"backbone": "^1.6.0",
"bootstrap": "^3.4.1",
- "bootstrap-5": "npm:bootstrap@^5.3.3",
+ "bootstrap-5": "npm:bootstrap@^5.3.6",
"c8": "^7.2.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
@@ -40545,8 +45012,10 @@
"chartjs-plugin-datalabels": "^2.2.0",
"cheerio": "^1.0.0-rc.3",
"classnames": "^2.2.6",
+ "confusing-browser-globals": "^1.0.11",
"cookie-signature": "^1.2.1",
"copy-webpack-plugin": "^11.0.0",
+ "core-js": "^3.41.0",
"css-loader": "^6.8.1",
"css-minimizer-webpack-plugin": "^5.0.1",
"cypress": "13.13.2",
@@ -40554,26 +45023,29 @@
"d3": "^3.5.16",
"daterangepicker": "2.1.27",
"diff": "^5.1.0",
- "dompurify": "^3.1.5",
- "downshift": "^6.1.0",
+ "dompurify": "^3.2.4",
+ "downshift": "^9.0.9",
"es6-promise": "^4.2.8",
"escodegen": "^2.0.0",
"eslint-config-standard-jsx": "^11.0.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-testing-library": "^7.1.1",
"eslint-plugin-unicorn": "^56.0.0",
- "esmock": "^2.6.7",
"events": "^3.3.0",
"fake-indexeddb": "^6.0.0",
- "fetch-mock": "^9.10.2",
+ "fetch-mock": "^12.5.2",
"formik": "^2.2.9",
+ "fuse.js": "^3.0.0",
"glob": "^7.1.6",
+ "globals": "^16.2.0",
"handlebars": "^4.7.8",
"handlebars-loader": "^1.7.3",
"html-webpack-plugin": "^5.5.3",
"i18next-scanner": "^4.4.0",
"jquery": "^3.7.1",
+ "jscodeshift": "^17.0.0",
"jsdom": "^19.0.0",
"jsdom-global": "^3.0.2",
"less": "^3.13.1",
@@ -40583,30 +45055,29 @@
"mensch": "^0.3.4",
"micromark": "^4.0.0",
"mini-css-extract-plugin": "^2.7.6",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"mocha-each": "^2.0.1",
"mock-fs": "^5.1.2",
+ "nock": "^13.5.6",
"nvd3": "^1.8.6",
"overleaf-editor-core": "*",
- "pdfjs-dist": "4.6.82",
+ "pdfjs-dist": "5.1.91",
"pirates": "^4.0.1",
"postcss": "^8.4.31",
"postcss-loader": "^7.3.3",
"prop-types": "^15.7.2",
"qrcode": "^1.4.4",
- "react": "^17.0.2",
- "react-bootstrap": "^0.33.1",
- "react-bootstrap-5": "npm:react-bootstrap@^2.10.2",
+ "react": "^18.3.1",
+ "react-bootstrap": "^2.10.10",
"react-chartjs-2": "^5.0.1",
"react-color": "^2.19.3",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
- "react-dom": "^17.0.2",
- "react-error-boundary": "^2.3.1",
+ "react-dom": "^18.3.1",
+ "react-error-boundary": "^5.0.0",
"react-google-recaptcha": "^3.1.0",
"react-i18next": "^13.3.1",
"react-linkify": "^1.0.0-alpha",
- "react-overlays": "^0.9.3",
"react-refresh": "^0.14.0",
"react-resizable-panels": "^2.1.1",
"resolve-url-loader": "^5.0.0",
@@ -40618,28 +45089,25 @@
"sinon": "^7.5.0",
"sinon-chai": "^3.7.0",
"sinon-mongoose": "^2.3.0",
- "storybook": "^8.3.5",
+ "storybook": "^8.6.12",
"stylelint-config-standard-scss": "^13.1.0",
"terser-webpack-plugin": "^5.3.9",
"thread-loader": "^4.0.2",
"timekeeper": "^2.2.0",
"to-string-loader": "^1.2.0",
"tty-browserify": "^0.0.1",
- "typescript": "^5.0.4",
- "webpack": "^5.93.0",
+ "typescript": "^5.8.3",
+ "uuid": "^9.0.1",
+ "vitest": "^3.1.2",
+ "w3c-keyname": "^2.2.8",
+ "webpack": "^5.98.0",
"webpack-assets-manifest": "^5.2.1",
"webpack-cli": "^5.1.4",
- "webpack-dev-server": "^5.0.4",
+ "webpack-dev-server": "^5.2.1",
"webpack-merge": "^5.10.0",
"yup": "^0.32.11"
}
},
- "services/web/node_modules/@adobe/css-tools": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz",
- "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==",
- "dev": true
- },
"services/web/node_modules/@google-cloud/bigquery": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-6.0.3.tgz",
@@ -40731,84 +45199,11 @@
"node": ">=12"
}
},
- "services/web/node_modules/@opentelemetry/auto-instrumentations-web": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-web/-/auto-instrumentations-web-0.33.1.tgz",
- "integrity": "sha512-0Tz4cnFEa49Opm74TTHpwGuwk9geWoYBEQxOGoUYOe8A3qFaEnW9jl69AnyEPfODhfUHcunwbzOjge4r3j2nHg==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/instrumentation-document-load": "^0.33.1",
- "@opentelemetry/instrumentation-fetch": "^0.41.2",
- "@opentelemetry/instrumentation-user-interaction": "^0.33.1",
- "@opentelemetry/instrumentation-xml-http-request": "^0.41.2"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
- }
- },
- "services/web/node_modules/@opentelemetry/instrumentation-document-load": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-document-load/-/instrumentation-document-load-0.33.1.tgz",
- "integrity": "sha512-FyLe5i85likVEp36ZewtM8jIZ8/7w55yz9tVoBBJHlTRCVZutff2EhVVCnGHx4etnMvuF+Es8CU2tTsnlCtl5g==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/sdk-trace-base": "^1.0.0",
- "@opentelemetry/sdk-trace-web": "^1.15.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
- }
- },
- "services/web/node_modules/@opentelemetry/instrumentation-fetch": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.41.2.tgz",
- "integrity": "sha512-L4jx7kq0R5XWAf5YcekSQ3Zm/6PE/+p/6rZe4NdtC+gp9u1lrQ/Vr0lwexxubS1odghbUSFo6PXKrqc25c+2hA==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/sdk-trace-web": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
- }
- },
- "services/web/node_modules/@opentelemetry/instrumentation-user-interaction": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-user-interaction/-/instrumentation-user-interaction-0.33.1.tgz",
- "integrity": "sha512-2oun4gwWpqtCW+qydC51jqSSUZSOuNCBXOWinTuTmO6w/sd4DJaQ6kEboSx5gENT/56qnCM9jQZlHI+zKbL63w==",
- "dev": true,
- "dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/sdk-trace-web": "^1.8.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0",
- "zone.js": "0.11.4"
- }
- },
"services/web/node_modules/@overleaf/dictionaries": {
"version": "0.0.3",
"resolved": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.3.tar.gz",
- "integrity": "sha512-/VJRrwY62Va2M4K5BE5UMruJHgKPGp0SGQkY/nrrQpBbHhMuTVoRtXkR+hcOfi1Iu6SO0vcwiK+L7xzs+fZmXQ=="
+ "integrity": "sha512-/VJRrwY62Va2M4K5BE5UMruJHgKPGp0SGQkY/nrrQpBbHhMuTVoRtXkR+hcOfi1Iu6SO0vcwiK+L7xzs+fZmXQ==",
+ "dev": true
},
"services/web/node_modules/@sentry/browser": {
"version": "7.46.0",
@@ -40902,875 +45297,27 @@
"lodash": "^4.17.15"
}
},
- "services/web/node_modules/@storybook/addon-a11y": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.3.5.tgz",
- "integrity": "sha512-/19UO8IXbyfcYK5K8ejSYF+hC+EK79c0bBPHMNeYSFOHSqQM3KoMo+TLIcLsuhuRClmlM+4Zs+VSIYDwc+d3ig==",
- "dev": true,
- "dependencies": {
- "@storybook/addon-highlight": "8.3.5",
- "axe-core": "^4.2.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-actions": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.5.tgz",
- "integrity": "sha512-t8D5oo+4XfD+F8091wLa2y/CDd/W2lExCeol5Vm1tp5saO+u6f2/d7iykLhTowWV84Uohi3D073uFeyTAlGebg==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "@types/uuid": "^9.0.1",
- "dequal": "^2.0.2",
- "polished": "^4.2.2",
- "uuid": "^9.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-backgrounds": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.5.tgz",
- "integrity": "sha512-IQGjDujuw8+iSqKREdkL8I5E/5CAHZbfOWd4A75PQK2D6qZ0fu/xRwTOQOH4jP6xn/abvfACOdL6A0d5bU90ag==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "memoizerific": "^1.11.3",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-controls": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.5.tgz",
- "integrity": "sha512-2eCVobUUvY1Rq7sp1U8Mx8t44VXwvi0E+hqyrsqOx5TTSC/FUQ+hNAX6GSYUcFIyQQ1ORpKNlUjAAdjxBv1ZHQ==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-docs": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.5.tgz",
- "integrity": "sha512-MOVfo1bY8kXTzbvmWnx3UuSO4WNykFz7Edvb3mxltNyuW7UDRZGuIuSe32ddT/EtLJfurrC9Ja3yBy4KBUGnMA==",
- "dev": true,
- "dependencies": {
- "@mdx-js/react": "^3.0.0",
- "@storybook/blocks": "8.3.5",
- "@storybook/csf-plugin": "8.3.5",
- "@storybook/global": "^5.0.0",
- "@storybook/react-dom-shim": "8.3.5",
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "fs-extra": "^11.1.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "rehype-external-links": "^3.0.0",
- "rehype-slug": "^6.0.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-docs/node_modules/@storybook/blocks": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.5.tgz",
- "integrity": "sha512-8cHTdTywolTHlgwN8I7YH7saWAIjGzV617AwjhJ95AKlC0VtpO1gAFcAgCqr4DU9eMc+LZuvbnaU/RSvA5eCCQ==",
- "dev": true,
- "dependencies": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "@storybook/icons": "^1.2.10",
- "@types/lodash": "^4.14.167",
- "color-convert": "^2.0.1",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "markdown-to-jsx": "^7.4.5",
- "memoizerific": "^1.11.3",
- "polished": "^4.2.2",
- "react-colorful": "^5.1.2",
- "telejson": "^7.2.0",
- "ts-dedent": "^2.0.0",
- "util-deprecate": "^1.0.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/addon-docs/node_modules/@storybook/icons": {
- "version": "1.2.12",
- "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz",
- "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==",
- "dev": true,
+ "services/web/node_modules/@stripe/stripe-js": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.3.0.tgz",
+ "integrity": "sha512-xnCyFIEI5SQnQrKkCxVj7nS5fWTZap+zuIGzmmxLMdlmgahFJaihK4zogqE8YyKKTLtrp/EldkEijSgtXsRVDg==",
+ "license": "MIT",
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "node": ">=12.16"
}
},
- "services/web/node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.5.tgz",
- "integrity": "sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-docs/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "services/web/node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
+ "@types/ms": "*"
}
},
- "services/web/node_modules/@storybook/addon-docs/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "services/web/node_modules/@storybook/addon-docs/node_modules/markdown-to-jsx": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz",
- "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- },
- "peerDependencies": {
- "react": ">= 0.14.0"
- }
- },
- "services/web/node_modules/@storybook/addon-docs/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "services/web/node_modules/@storybook/addon-essentials": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.5.tgz",
- "integrity": "sha512-hXTtPuN4/IsXjUrkMPAuz1qKAl8DovdXpjQgjQs7jSAVx3kc4BZaGqJ3gaVenKtO8uDchmA92BoQygpkc8eWhw==",
- "dev": true,
- "dependencies": {
- "@storybook/addon-actions": "8.3.5",
- "@storybook/addon-backgrounds": "8.3.5",
- "@storybook/addon-controls": "8.3.5",
- "@storybook/addon-docs": "8.3.5",
- "@storybook/addon-highlight": "8.3.5",
- "@storybook/addon-measure": "8.3.5",
- "@storybook/addon-outline": "8.3.5",
- "@storybook/addon-toolbars": "8.3.5",
- "@storybook/addon-viewport": "8.3.5",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-highlight": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.5.tgz",
- "integrity": "sha512-ku0epul9aReCR3Gv/emwYnsqg3vgux5OmYMjoDcJC7s+LyfweSzLV/f5t9gSHazikJElh5TehtVkWbC4QfbGSw==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-interactions": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.3.5.tgz",
- "integrity": "sha512-GtTy/A+mG7vDOahQr2avT4dpWtCRiFDSYcWyuQOZm10y8VDDw157HQM+FuhxjV9Owrrohy9F24oBUwRG8H3b5A==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.3.5",
- "@storybook/test": "8.3.5",
- "polished": "^4.2.2",
- "ts-dedent": "^2.2.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-links": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.5.tgz",
- "integrity": "sha512-giRCpn6cfJMYPnVJkojoQDO5ae6098fgY9YgAhwaJej/9dufNcioFdbiyfK1vyzbG6TGeTmJ9ncWCXgWRtzxPQ==",
- "dev": true,
- "dependencies": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/addon-measure": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.5.tgz",
- "integrity": "sha512-6GVehgbHhFIFS69xSfRV+12VK0cnuIAtZdp1J3eUCc2ATrcigqVjTM6wzZz6kBuX6O3dcusr7Wg46KtNliqLqg==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "tiny-invariant": "^1.3.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-outline": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.5.tgz",
- "integrity": "sha512-dwmK6GzjEnQP9Yo0VnBUQtJkXZlXdfjWyskZ/IlUVc+IFdeeCtIiMyA92oMfHo8eXt0k1g21ZqMaIn7ZltOuHw==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-toolbars": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.5.tgz",
- "integrity": "sha512-Ml2gc9q8WbteDvmuAZGgBxt5SqWMXzuTkMjlsA8EB53hlkN1w9esX4s8YtBeNqC3HKoUzcdq8uexSBqU8fDbSA==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/addon-viewport": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.5.tgz",
- "integrity": "sha512-FSWydoPiVWFXEittG7O1YgvuaqoU9Vb+qoq9XfP/hvQHHMDcMZvC40JaV8AnJeTXaM7ngIjcn9XDEfGbFfOzXw==",
- "dev": true,
- "dependencies": {
- "memoizerific": "^1.11.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.5.tgz",
- "integrity": "sha512-rhmfdiSlDn3Arki7IMYk11PO29rYuYM4LZ8GlNqREU7VUl/8Vngo/jFIa4pKaIns3ql1RrwzO1wm9JvuL/4ydA==",
- "dev": true,
- "dependencies": {
- "@storybook/core-webpack": "8.3.5",
- "@types/node": "^22.0.0",
- "@types/semver": "^7.3.4",
- "browser-assert": "^1.2.1",
- "case-sensitive-paths-webpack-plugin": "^2.4.0",
- "cjs-module-lexer": "^1.2.3",
- "constants-browserify": "^1.0.0",
- "css-loader": "^6.7.1",
- "es-module-lexer": "^1.5.0",
- "express": "^4.19.2",
- "fork-ts-checker-webpack-plugin": "^8.0.0",
- "fs-extra": "^11.1.0",
- "html-webpack-plugin": "^5.5.0",
- "magic-string": "^0.30.5",
- "path-browserify": "^1.0.1",
- "process": "^0.11.10",
- "semver": "^7.3.7",
- "style-loader": "^3.3.1",
- "terser-webpack-plugin": "^5.3.1",
- "ts-dedent": "^2.0.0",
- "url": "^0.11.0",
- "util": "^0.12.4",
- "util-deprecate": "^1.0.2",
- "webpack": "5",
- "webpack-dev-middleware": "^6.1.2",
- "webpack-hot-middleware": "^2.25.1",
- "webpack-virtual-modules": "^0.6.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5/node_modules/memfs": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
- "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
- "dev": true,
- "dependencies": {
- "fs-monkey": "^1.0.4"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "services/web/node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz",
- "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==",
- "dev": true,
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.12",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/components": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.5.tgz",
- "integrity": "sha512-Rq28YogakD3FO4F8KwAtGpo1g3t4V/gfCLqTQ8B6oQUFoxLqegkWk/DlwCzvoJndXuQJfdSyM6+r1JcA4Nql5A==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/core-webpack": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.5.tgz",
- "integrity": "sha512-mN8BHNc6lSGUf/nKgDr6XoTt1cX+Tap9RnKMUiROCDzfVlJPeJBrG4qrTOok7AwObzeDl9DNFyun6+pVgXJe7A==",
- "dev": true,
- "dependencies": {
- "@types/node": "^22.0.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/csf-plugin": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.5.tgz",
- "integrity": "sha512-ODVqNXwJt90hG7QW8I9w/XUyOGlr0l7XltmIJgXwB/2cYDvaGu3JV5Ybg7O0fxPV8uXk7JlRuUD8ZYv5Low6pA==",
- "dev": true,
- "dependencies": {
- "unplugin": "^1.3.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/instrumenter": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.3.5.tgz",
- "integrity": "sha512-NLDXai5y2t1ITgHVK9chyL0rMFZbICCOGcnTbyWhkLbiEWZKPJ8FuB8+g+Ba6zwtCve1A1Cnb4O2LOWy7TgWQw==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0",
- "@vitest/utils": "^2.0.5",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/manager-api": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.5.tgz",
- "integrity": "sha512-fEQoKKi7h7pzh2z9RfuzatJxubrsfL/CB99fNXQ0wshMSY/7O4ckd18pK4fzG9ErnCtLAO9qsim4N/4eQC+/8Q==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/preview-api": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.5.tgz",
- "integrity": "sha512-VPqpudE8pmjTLvdNJoW/2//nqElDgUOmIn3QxbbCmdZTHDg5tFtxuqwdlNfArF0TxvTSBDIulXt/Q6K56TAfTg==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/react": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.3.5.tgz",
- "integrity": "sha512-kuBPe/wBin10SWr4EWPKxiTRGQ4RD2etGEVWVQLqVpOuJp/J2hVvXQHtCfZXU4TZT5x4PBbPRswbr58+XlF+kQ==",
- "dev": true,
- "dependencies": {
- "@storybook/components": "^8.3.5",
- "@storybook/global": "^5.0.0",
- "@storybook/manager-api": "^8.3.5",
- "@storybook/preview-api": "^8.3.5",
- "@storybook/react-dom-shim": "8.3.5",
- "@storybook/theming": "^8.3.5",
- "@types/escodegen": "^0.0.6",
- "@types/estree": "^0.0.51",
- "@types/node": "^22.0.0",
- "acorn": "^7.4.1",
- "acorn-jsx": "^5.3.1",
- "acorn-walk": "^7.2.0",
- "escodegen": "^2.1.0",
- "html-tags": "^3.1.0",
- "prop-types": "^15.7.2",
- "react-element-to-jsx-string": "^15.0.0",
- "semver": "^7.3.7",
- "ts-dedent": "^2.0.0",
- "type-fest": "~2.19",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "@storybook/test": "8.3.5",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5",
- "typescript": ">= 4.2.x"
- },
- "peerDependenciesMeta": {
- "@storybook/test": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/react-webpack5": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.3.5.tgz",
- "integrity": "sha512-J7jCxjCuWvRJrAtOwe4ij8rjfTGm1Dpsfbz8xar4ItVw7ikiyALr34E3FJzfgq7M40uGXZhvCl2IVRdGeiLmzg==",
- "dev": true,
- "dependencies": {
- "@storybook/builder-webpack5": "8.3.5",
- "@storybook/preset-react-webpack": "8.3.5",
- "@storybook/react": "8.3.5",
- "@types/node": "^22.0.0"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5",
- "typescript": ">= 4.2.x"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/react-webpack5/node_modules/@storybook/preset-react-webpack": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.3.5.tgz",
- "integrity": "sha512-laS9CiZrZ4CSnBTBfkBba3hmlDhzcjIfCvx8/rk3SZ+zh93NpqXixzRt6m0UH2po63dpdu21nXrsW5Cfs88Ypw==",
- "dev": true,
- "dependencies": {
- "@storybook/core-webpack": "8.3.5",
- "@storybook/react": "8.3.5",
- "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
- "@types/node": "^22.0.0",
- "@types/semver": "^7.3.4",
- "find-up": "^5.0.0",
- "fs-extra": "^11.1.0",
- "magic-string": "^0.30.5",
- "react-docgen": "^7.0.0",
- "resolve": "^1.22.8",
- "semver": "^7.3.7",
- "tsconfig-paths": "^4.2.0",
- "webpack": "5"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/@storybook/react-webpack5/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "services/web/node_modules/@storybook/react-webpack5/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "services/web/node_modules/@storybook/react-webpack5/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "services/web/node_modules/@storybook/react/node_modules/@storybook/react-dom-shim": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.5.tgz",
- "integrity": "sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/test": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.3.5.tgz",
- "integrity": "sha512-1BXWsUGWk9FiKKelZZ55FDJdeoL8uRBHbjTYBRM2xJLhdNSvGzI4Tb3bkmxPpGn72Ua6AyldhlTxr2BpUFKOHA==",
- "dev": true,
- "dependencies": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.3.5",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.5.0",
- "@testing-library/user-event": "14.5.2",
- "@vitest/expect": "2.0.5",
- "@vitest/spy": "2.0.5",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@storybook/test/node_modules/@testing-library/dom": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
- "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "services/web/node_modules/@storybook/theming": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.5.tgz",
- "integrity": "sha512-9HmDDyC691oqfg4RziIM9ElsS2HITaxmH7n/yeUPtuirkPdAQzqOzhvH/Sa0qOhifzs8VjR+Gd/a/ZQ+S38r7w==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "storybook": "^8.3.5"
- }
- },
- "services/web/node_modules/@testing-library/dom": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz",
- "integrity": "sha512-Dffe68pGwI6WlLRYR2I0piIkyole9cSBH5jGQKCGMRpHW5RHCqAUaqc2Kv0tUyd4dU4DLPKhJIjyKOnjv4tuUw==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "^5.0.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "services/web/node_modules/@testing-library/jest-dom": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
- "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
- "dev": true,
- "dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "services/web/node_modules/@testing-library/jest-dom/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "services/web/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "dev": true
- },
- "services/web/node_modules/@types/aria-query": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz",
- "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==",
- "dev": true
- },
- "services/web/node_modules/@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
- "dev": true
- },
"services/web/node_modules/@types/express": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
@@ -41789,61 +45336,149 @@
"integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
"dev": true
},
- "services/web/node_modules/@types/node": {
- "version": "22.7.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
- "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
+ "services/web/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz",
+ "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "undici-types": "~6.19.2"
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "services/web/node_modules/@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "dependencies": {
- "@types/webidl-conversions": "*"
- }
- },
- "services/web/node_modules/@uppy/companion-client": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.7.0.tgz",
- "integrity": "sha512-37qJNMkqo01SM9h2gkFbV6e+aXM02s2zAda2dGsRLRsjvl/Tx69NlmxJ3xqG/7HWRnYcbBWtspb7y0tt1i/afg==",
+ "services/web/node_modules/@typescript-eslint/types": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz",
+ "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==",
"dev": true,
- "dependencies": {
- "@uppy/utils": "^5.7.0",
- "namespace-emitter": "^2.0.1",
- "p-retry": "^6.1.0"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "services/web/node_modules/@uppy/core": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.8.0.tgz",
- "integrity": "sha512-C93vVhid929+VLGjaD9CZOLJDg8GkEGMUGveFp3Tyo/wujiG+sB3fOF+c6TzKpzPLfNtVpskU1BnI7tZrq1LWw==",
+ "services/web/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz",
+ "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@transloadit/prettier-bytes": "0.0.9",
- "@uppy/store-default": "^3.2.0",
- "@uppy/utils": "^5.7.0",
- "lodash": "^4.17.21",
- "mime-match": "^1.0.2",
- "namespace-emitter": "^2.0.1",
- "nanoid": "^4.0.0",
- "preact": "^10.5.13"
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/visitor-keys": "8.32.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
}
},
- "services/web/node_modules/@uppy/core/node_modules/@transloadit/prettier-bytes": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz",
- "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==",
- "dev": true
+ "services/web/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "services/web/node_modules/@typescript-eslint/utils": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz",
+ "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.32.1",
+ "@typescript-eslint/types": "8.32.1",
+ "@typescript-eslint/typescript-estree": "8.32.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "services/web/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.32.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz",
+ "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.32.1",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "services/web/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
},
"services/web/node_modules/@uppy/dashboard": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.7.1.tgz",
"integrity": "sha512-qtCMXd2Ymrw0qNGSTlEEMyyDkGUCm+wX5/VrmV9lnfT7JtlSfotUK0K6KvkBeu2v1Chsu27C6Xlq6RddZMR2xQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@transloadit/prettier-bytes": "0.0.7",
"@uppy/informer": "^3.0.4",
@@ -41862,11 +45497,19 @@
"@uppy/core": "^3.7.1"
}
},
+ "services/web/node_modules/@uppy/dashboard/node_modules/@transloadit/prettier-bytes": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+ "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==",
+ "dev": true,
+ "license": "MIT"
+ },
"services/web/node_modules/@uppy/drag-drop": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.0.3.tgz",
"integrity": "sha512-0bCgQKxg+9vkxQipTgrX9yQIuK9a0hZrkipm1+Ynq6jTeig49b7II1bWYnoKdiYhi6nRE4UnDJf4z09yCAU7rA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@uppy/utils": "^5.4.3",
"preact": "^10.5.13"
@@ -41880,19 +45523,7 @@
"resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.0.4.tgz",
"integrity": "sha512-D7Nw9GgpABYTcC8SZluDyxd+ppe7+gJejNbPZqMpQyW1S/ME3me55dkDQaVWn8yrgv7347zO2ciue9Rfmko+rQ==",
"dev": true,
- "dependencies": {
- "@uppy/utils": "^5.5.2",
- "preact": "^10.5.13"
- },
- "peerDependencies": {
- "@uppy/core": "^3.6.0"
- }
- },
- "services/web/node_modules/@uppy/informer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.0.4.tgz",
- "integrity": "sha512-gzocdxn8qAFsW2EryehwjghladaBgv6Isjte53FTBV7o/vjaHPP6huKGbYpljyuQi8i9V+KrmvNGslofssgJ4g==",
- "dev": true,
+ "license": "MIT",
"dependencies": {
"@uppy/utils": "^5.5.2",
"preact": "^10.5.13"
@@ -41906,6 +45537,7 @@
"resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.0.4.tgz",
"integrity": "sha512-sxv/mG7Uc9uyTnRvfcXBhO+TWd+UqjuW5aHXCKWwTkMgDShHR0T46sEk12q+jwgbFwyeFg3p0GU3hgUxqxiEUQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@uppy/utils": "^5.5.2",
"preact": "^10.5.13"
@@ -41914,27 +45546,12 @@
"@uppy/core": "^3.6.0"
}
},
- "services/web/node_modules/@uppy/provider-views": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.8.0.tgz",
- "integrity": "sha512-sTtx5bgsg2WVR+MyF0gnnM3Z7g3CyFx+Stlz//AvB6g27EMqtqO4zwDR3mestMrETkWYov5bhhqUbt2BaeANpA==",
- "dev": true,
- "dependencies": {
- "@uppy/utils": "^5.7.0",
- "classnames": "^2.2.6",
- "nanoid": "^4.0.0",
- "p-queue": "^7.3.4",
- "preact": "^10.5.13"
- },
- "peerDependencies": {
- "@uppy/core": "^3.8.0"
- }
- },
"services/web/node_modules/@uppy/react": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@uppy/react/-/react-3.2.1.tgz",
"integrity": "sha512-PoLplDF6YDI7f06T8ORnJhav6CcKNSYWJETXqItZR3jcXIve6pdcCuskqd+l0yiYWf4J2IdyLQXtzgGfIJl7xQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@uppy/utils": "^5.6.0",
"prop-types": "^15.6.1"
@@ -41966,61 +45583,12 @@
}
}
},
- "services/web/node_modules/@uppy/status-bar": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.2.5.tgz",
- "integrity": "sha512-bRSxBPio5B+Kuf6w8ll+/i9VUwG8f0FnbZ1yQvCr8J9vxhd0Z5hvwhX4NP8uzHC6ZPJHlEQOTsxzGQ6y+Mdm0A==",
- "dev": true,
- "dependencies": {
- "@transloadit/prettier-bytes": "0.0.9",
- "@uppy/utils": "^5.5.2",
- "classnames": "^2.2.6",
- "preact": "^10.5.13"
- },
- "peerDependencies": {
- "@uppy/core": "^3.6.0"
- }
- },
- "services/web/node_modules/@uppy/status-bar/node_modules/@transloadit/prettier-bytes": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz",
- "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==",
- "dev": true
- },
- "services/web/node_modules/@uppy/store-default": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.2.0.tgz",
- "integrity": "sha512-Y7t0peUG89ZKa30vM4qlRIC6uKxIfOANeMT9Nzjwcxvzz8l7es22jG3eAj9WF2F7YSu7xdsH8ODs6SIrJJ8gow==",
- "dev": true
- },
- "services/web/node_modules/@uppy/thumbnail-generator": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.0.6.tgz",
- "integrity": "sha512-gsi/BQBiunHneXCbo8VglFbhEb0CoQXQjCyGNKoEq/deEcbXhBBDxkiGcgv83l5GZJl2jLiKWqXnXAXREkldrQ==",
- "dev": true,
- "dependencies": {
- "@uppy/utils": "^5.5.2",
- "exifr": "^7.0.0"
- },
- "peerDependencies": {
- "@uppy/core": "^3.6.0"
- }
- },
- "services/web/node_modules/@uppy/utils": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.7.0.tgz",
- "integrity": "sha512-AJj7gAx5YfMgyevwOxVdIP2h4Nw/O6h57wKA6gj+Lce6tMORcqzGt4yQiKBsrBI0bPyFWCbzA3vX5t0//1JCBA==",
- "dev": true,
- "dependencies": {
- "lodash": "^4.17.21",
- "preact": "^10.5.13"
- }
- },
"services/web/node_modules/@uppy/xhr-upload": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.6.0.tgz",
"integrity": "sha512-HgWr+CvJzJXAp639AiZatdEWmRdhhN5LrjTZurAkvm9nPQarpi1bo0DChO+1bpkXWOR/1VarBbZOr8lNecEn7Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@uppy/companion-client": "^3.7.0",
"@uppy/utils": "^5.7.0",
@@ -42030,53 +45598,49 @@
"@uppy/core": "^3.8.0"
}
},
+ "services/web/node_modules/@vitest/eslint-plugin": {
+ "version": "1.1.44",
+ "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.44.tgz",
+ "integrity": "sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@typescript-eslint/utils": ">= 8.24.0",
+ "eslint": ">= 8.57.0",
+ "typescript": ">= 5.0.0",
+ "vitest": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ },
+ "vitest": {
+ "optional": true
+ }
+ }
+ },
"services/web/node_modules/@vitest/expect": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
- "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.4.tgz",
+ "integrity": "sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vitest/spy": "2.0.5",
- "@vitest/utils": "2.0.5",
- "chai": "^5.1.1",
- "tinyrainbow": "^1.2.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "services/web/node_modules/@vitest/expect/node_modules/@vitest/pretty-format": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
- "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
- "dev": true,
- "dependencies": {
- "tinyrainbow": "^1.2.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "services/web/node_modules/@vitest/expect/node_modules/@vitest/utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
- "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
- "dev": true,
- "dependencies": {
- "@vitest/pretty-format": "2.0.5",
- "estree-walker": "^3.0.3",
- "loupe": "^3.1.1",
- "tinyrainbow": "^1.2.0"
+ "@vitest/spy": "3.1.4",
+ "@vitest/utils": "3.1.4",
+ "chai": "^5.2.0",
+ "tinyrainbow": "^2.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"services/web/node_modules/@vitest/expect/node_modules/chai": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
- "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
+ "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"assertion-error": "^2.0.1",
"check-error": "^2.1.1",
@@ -42088,32 +45652,85 @@
"node": ">=12"
}
},
- "services/web/node_modules/@vitest/spy": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
- "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
+ "services/web/node_modules/@vitest/pretty-format": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.4.tgz",
+ "integrity": "sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "tinyspy": "^3.0.0"
+ "tinyrainbow": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "services/web/node_modules/@vitest/runner": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.4.tgz",
+ "integrity": "sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "3.1.4",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "services/web/node_modules/@vitest/snapshot": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.4.tgz",
+ "integrity": "sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "3.1.4",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "services/web/node_modules/@vitest/spy": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.4.tgz",
+ "integrity": "sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.2"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"services/web/node_modules/@vitest/utils": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.2.tgz",
- "integrity": "sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.4.tgz",
+ "integrity": "sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "2.1.2",
- "loupe": "^3.1.1",
- "tinyrainbow": "^1.2.0"
+ "@vitest/pretty-format": "3.1.4",
+ "loupe": "^3.1.3",
+ "tinyrainbow": "^2.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
+ "services/web/node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"services/web/node_modules/ajv": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
@@ -42129,51 +45746,22 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "services/web/node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "services/web/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "services/web/node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
"services/web/node_modules/assertion-error": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
"integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
}
},
+ "services/web/node_modules/base-x": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz",
+ "integrity": "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==",
+ "license": "MIT"
+ },
"services/web/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -42205,65 +45793,16 @@
"ieee754": "^1.2.1"
}
},
- "services/web/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
"services/web/node_modules/check-error": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
"integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 16"
}
},
- "services/web/node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "services/web/node_modules/core-js": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
- "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
"services/web/node_modules/csv": {
"version": "6.2.5",
"resolved": "https://registry.npmjs.org/csv/-/csv-6.2.5.tgz",
@@ -42294,11 +45833,12 @@
"integrity": "sha512-4qGjUMwnlaRc00gc2jrIYh2w/h1fo25B0mTuY9K8fBiIgtmCX3LcgUbrEGViL98Ci4Se/F5LFEtu8k+dItJVZQ=="
},
"services/web/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -42309,67 +45849,16 @@
}
}
},
- "services/web/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
"services/web/node_modules/deep-eql": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
"integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
- "services/web/node_modules/define-lazy-prop": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
- "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "services/web/node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "services/web/node_modules/duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "dependencies": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "services/web/node_modules/es-module-lexer": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
- "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
- "dev": true
- },
- "services/web/node_modules/esmock": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/esmock/-/esmock-2.6.7.tgz",
- "integrity": "sha512-4DmjZ0qQIG+NQV1njHvWrua/cZEuJq56A3pSELT2BjNuol1aads7BluofCbLErdO41Ic1XCd2UMepVLpjL64YQ==",
- "dev": true,
- "engines": {
- "node": ">=14.16.0"
- }
- },
"services/web/node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
@@ -42378,54 +45867,48 @@
"node": ">=0.8.x"
}
},
- "services/web/node_modules/exifr": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz",
- "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==",
- "dev": true
- },
- "services/web/node_modules/foreground-child": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
- "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+ "services/web/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
"dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "services/web/node_modules/fetch-mock": {
+ "version": "12.5.2",
+ "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-12.5.2.tgz",
+ "integrity": "sha512-b5KGDFmdmado2MPQjZl6ix3dAG3iwCitb0XQwN72y2s9VnWZ3ObaGNy+bkpm1390foiLDybdJ7yjRGKD36kATw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
+ "@types/glob-to-regexp": "^0.4.4",
+ "dequal": "^2.0.3",
+ "glob-to-regexp": "^0.4.1",
+ "regexparam": "^3.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=18.11.0"
+ }
+ },
+ "services/web/node_modules/globals": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz",
+ "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "services/web/node_modules/fs-extra": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
- "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "services/web/node_modules/fs-monkey": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
- "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
- "dev": true
- },
- "services/web/node_modules/gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dependencies": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- },
- "engines": {
- "node": ">=12"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"services/web/node_modules/google-auth-library": {
@@ -42493,6 +45976,19 @@
"node": ">=14.0.0"
}
},
+ "services/web/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"services/web/node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -42512,49 +46008,22 @@
}
]
},
- "services/web/node_modules/ipaddr.js": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
- "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "services/web/node_modules/is-wsl": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
- "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
- "dev": true,
- "dependencies": {
- "is-inside-container": "^1.0.0"
- },
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"services/web/node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"dev": true
},
- "services/web/node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "services/web/node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
"dev": true,
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
}
},
"services/web/node_modules/json-schema-traverse": {
@@ -42562,22 +46031,6 @@
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
- "services/web/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "services/web/node_modules/kareem": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
- "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
"services/web/node_modules/lolex": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz",
@@ -42585,10 +46038,11 @@
"dev": true
},
"services/web/node_modules/loupe": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
- "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
- "dev": true
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+ "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "dev": true,
+ "license": "MIT"
},
"services/web/node_modules/lru-cache": {
"version": "7.10.1",
@@ -42598,31 +46052,6 @@
"node": ">=12"
}
},
- "services/web/node_modules/memfs": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz",
- "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==",
- "dev": true,
- "dependencies": {
- "@jsonjoy.com/json-pack": "^1.0.3",
- "@jsonjoy.com/util": "^1.3.0",
- "tree-dump": "^1.0.1",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">= 4.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/streamich"
- }
- },
- "services/web/node_modules/memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
- "dev": true
- },
"services/web/node_modules/method-override": {
"version": "2.3.10",
"resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz",
@@ -42664,135 +46093,22 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "services/web/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "services/web/node_modules/mongodb": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz",
- "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "dependencies": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "services/web/node_modules/mongoose": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.3.tgz",
- "integrity": "sha512-OubSDbsAclDFGHjV82MsKyIGQWFc42Ot1l+0dhRS6U9xODM7rm/ES/WpOQd8Ds9j0Mx8QzxZtrSCnBh6o9wUqw==",
- "dependencies": {
- "bson": "^6.7.0",
- "kareem": "2.6.3",
- "mongodb": "6.7.0",
- "mpath": "0.9.0",
- "mquery": "5.0.0",
- "ms": "2.1.3",
- "sift": "17.1.3"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mongoose"
- }
- },
- "services/web/node_modules/mquery": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
- "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
- "dependencies": {
- "debug": "4.x"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
"services/web/node_modules/multer": {
- "version": "1.4.5-lts.1",
- "resolved": "git+ssh://git@github.com/overleaf/multer.git#e1df247fbf8e7590520d20ae3601eaef9f3d2e9e",
- "integrity": "sha512-3fJSnWF3iBZJ6Z9y8AjFVY+O4DUKspxSnzXidb3zCKqBYyEKRrpGp7OXjT9th2gWPd+9u64ZyRWUf+YRYn1GCw==",
+ "version": "2.0.1",
+ "resolved": "git+ssh://git@github.com/overleaf/multer.git#4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23",
+ "integrity": "sha512-kkvPK48OQibR5vIoTQBbZp1uWVCvT9MrW3Y0mqdhFYJP/HVJujb4eSCEU0yj+hyf0Y+H/BKCmPdM4fJnzqAO4w==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
- "busboy": "^1.0.0",
- "concat-stream": "^1.5.2",
- "mkdirp": "^0.5.4",
+ "busboy": "^1.6.0",
+ "concat-stream": "^2.0.0",
+ "mkdirp": "^0.5.6",
"object-assign": "^4.1.1",
- "type-is": "^1.6.4",
- "xtend": "^4.0.0"
+ "type-is": "^1.6.18",
+ "xtend": "^4.0.2"
},
"engines": {
- "node": ">= 6.0.0"
- }
- },
- "services/web/node_modules/nanoid": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
- "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.js"
- },
- "engines": {
- "node": "^14 || ^16 || >=18"
+ "node": ">= 10.16.0"
}
},
"services/web/node_modules/nise": {
@@ -42817,34 +46133,18 @@
"@sinonjs/commons": "^1.7.0"
}
},
- "services/web/node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "services/web/node_modules/nock": {
+ "version": "13.5.6",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz",
+ "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==",
"dev": true,
"dependencies": {
- "ee-first": "1.1.1"
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "propagate": "^2.0.0"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "services/web/node_modules/open": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
- "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
- "dev": true,
- "dependencies": {
- "default-browser": "^5.2.1",
- "define-lazy-prop": "^3.0.0",
- "is-inside-container": "^1.0.0",
- "is-wsl": "^3.1.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 10.13"
}
},
"services/web/node_modules/p-limit": {
@@ -42861,23 +46161,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "services/web/node_modules/p-retry": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz",
- "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==",
- "dev": true,
- "dependencies": {
- "@types/retry": "0.12.2",
- "is-network-error": "^1.0.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=16.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"services/web/node_modules/path-to-regexp": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
@@ -42892,39 +46175,24 @@
"resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
"integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 14.16"
}
},
- "services/web/node_modules/pdfjs-dist": {
- "version": "4.6.82",
- "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.6.82.tgz",
- "integrity": "sha512-BUOryeRFwvbLe0lOU6NhkJNuVQUp06WxlJVVCsxdmJ4y5cU3O3s3/0DunVdK1PMm7v2MUw52qKYaidhDH1Z9+w==",
+ "services/web/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=12"
},
- "optionalDependencies": {
- "canvas": "^2.11.2",
- "path2d": "^0.2.1"
- }
- },
- "services/web/node_modules/preact": {
- "version": "10.19.3",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz",
- "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==",
- "dev": true,
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/preact"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "services/web/node_modules/punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
"services/web/node_modules/retry-request": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
@@ -42948,30 +46216,13 @@
"stack-trace": "0.0.10"
}
},
- "services/web/node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
"services/web/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
+ "license": "ISC",
+ "peer": true,
"bin": {
"semver": "bin/semver.js"
},
@@ -42979,23 +46230,6 @@
"node": ">=10"
}
},
- "services/web/node_modules/sift": {
- "version": "17.1.3",
- "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
- "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ=="
- },
- "services/web/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"services/web/node_modules/sinon": {
"version": "7.5.0",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz",
@@ -43059,39 +46293,29 @@
"node": "*"
}
},
- "services/web/node_modules/storybook": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.5.tgz",
- "integrity": "sha512-hYQVtP2l+3kO8oKDn4fjXXQYxgTRsj/LaV6lUMJH0zt+OhVmDXKJLxmdUP4ieTm0T8wEbSYosFavgPcQZlxRfw==",
- "dev": true,
- "dependencies": {
- "@storybook/core": "8.3.5"
- },
- "bin": {
- "getstorybook": "bin/index.cjs",
- "sb": "bin/index.cjs",
- "storybook": "bin/index.cjs"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
"services/web/node_modules/stream-transform": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.1.tgz",
"integrity": "sha512-ApK+WTJ5bCOf0A2tlec1qhvr8bGEBM/sgXXB7mysdCYgZJO5DZeaV3h3G+g0HnAQ372P5IhiGqnW29zoLOfTzQ=="
},
- "services/web/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
+ "services/web/node_modules/stripe": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.1.0.tgz",
+ "integrity": "sha512-MLDiniPTHqcfIT3anyBPmOEcaiDhYa7/jRaNypQ3Rt2SJnayQZBvVbFghIziUCZdltGAndm/ZxVOSw6uuSCDig==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "qs": "^6.11.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.*"
+ },
+ "peerDependencies": {
+ "@types/node": ">=12.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
"services/web/node_modules/teeny-request": {
@@ -43109,79 +46333,53 @@
"node": ">=12"
}
},
- "services/web/node_modules/tinyspy": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "services/web/node_modules/teeny-request/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "services/web/node_modules/teeny-request/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "services/web/node_modules/tinyrainbow": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz",
+ "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
- "services/web/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "services/web/node_modules/tr46/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "engines": {
- "node": ">=6"
- }
- },
- "services/web/node_modules/tsconfig-paths": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
- "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "services/web/node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"dev": true,
- "dependencies": {
- "json5": "^2.2.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18.12"
},
- "engines": {
- "node": ">=6"
- }
- },
- "services/web/node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "services/web/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "services/web/node_modules/url": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
- "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
- "dev": true,
- "dependencies": {
- "punycode": "^1.4.1",
- "qs": "^6.12.3"
- },
- "engines": {
- "node": ">= 0.4"
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
"services/web/node_modules/uuid": {
@@ -43196,32099 +46394,365 @@
"uuid": "dist/bin/uuid"
}
},
- "services/web/node_modules/webpack-dev-middleware": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz",
- "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==",
+ "services/web/node_modules/vite-node": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.4.tgz",
+ "integrity": "sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^4.6.0",
- "mime-types": "^2.1.31",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 18.12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- }
- }
- },
- "services/web/node_modules/webpack-dev-server": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz",
- "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==",
- "dev": true,
- "dependencies": {
- "@types/bonjour": "^3.5.13",
- "@types/connect-history-api-fallback": "^1.5.4",
- "@types/express": "^4.17.21",
- "@types/serve-index": "^1.9.4",
- "@types/serve-static": "^1.15.5",
- "@types/sockjs": "^0.3.36",
- "@types/ws": "^8.5.10",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.2.1",
- "chokidar": "^3.6.0",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.4.0",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.1.0",
- "launch-editor": "^2.6.1",
- "open": "^10.0.3",
- "p-retry": "^6.2.0",
- "rimraf": "^5.0.5",
- "schema-utils": "^4.2.0",
- "selfsigned": "^2.4.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^7.1.0",
- "ws": "^8.16.0"
+ "cac": "^6.7.14",
+ "debug": "^4.4.0",
+ "es-module-lexer": "^1.7.0",
+ "pathe": "^2.0.3",
+ "vite": "^5.0.0 || ^6.0.0"
},
"bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
+ "vite-node": "vite-node.mjs"
},
"engines": {
- "node": ">= 18.12.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "services/web/node_modules/vite-node/node_modules/vite": {
+ "version": "6.3.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
+ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
},
"peerDependencies": {
- "webpack": "^5.0.0"
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
},
"peerDependenciesMeta": {
- "webpack": {
+ "@types/node": {
"optional": true
},
- "webpack-cli": {
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
"optional": true
}
}
},
- "services/web/node_modules/webpack-dev-server/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "services/web/node_modules/vitest": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.4.tgz",
+ "integrity": "sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
+ "@vitest/expect": "3.1.4",
+ "@vitest/mocker": "3.1.4",
+ "@vitest/pretty-format": "^3.1.4",
+ "@vitest/runner": "3.1.4",
+ "@vitest/snapshot": "3.1.4",
+ "@vitest/spy": "3.1.4",
+ "@vitest/utils": "3.1.4",
+ "chai": "^5.2.0",
+ "debug": "^4.4.0",
+ "expect-type": "^1.2.1",
+ "magic-string": "^0.30.17",
+ "pathe": "^2.0.3",
+ "std-env": "^3.9.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.2",
+ "tinyglobby": "^0.2.13",
+ "tinypool": "^1.0.2",
+ "tinyrainbow": "^2.0.0",
+ "vite": "^5.0.0 || ^6.0.0",
+ "vite-node": "3.1.4",
+ "why-is-node-running": "^2.3.0"
},
"bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "services/web/node_modules/webpack-dev-server/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
+ "vitest": "vitest.mjs"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/debug": "^4.1.12",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "3.1.4",
+ "@vitest/ui": "3.1.4",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/debug": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
}
},
- "services/web/node_modules/webpack-dev-server/node_modules/rimraf": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
- "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
+ "services/web/node_modules/vitest/node_modules/@vitest/mocker": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.4.tgz",
+ "integrity": "sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "glob": "^10.3.7"
+ "@vitest/spy": "3.1.4",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.17"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "services/web/node_modules/vitest/node_modules/chai": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz",
+ "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "services/web/node_modules/vitest/node_modules/vite": {
+ "version": "6.3.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
+ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
},
"bin": {
- "rimraf": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "services/web/node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true
- },
- "services/web/node_modules/whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
+ "vite": "bin/vite.js"
},
"engines": {
- "node": ">=16"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "services/web/node_modules/xml-crypto": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.6.tgz",
+ "integrity": "sha512-jjvpO8vHNV8QFhW5bMypP+k4BjBqHe/HrpIwpPcdUnUTIJakSIuN96o3Sdah4tKu2z64kM/JHEH8iEHGCc6Gyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@xmldom/xmldom": "^0.7.9",
+ "xpath": "0.0.32"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "services/web/node_modules/xpath": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
+ "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0"
}
},
"services/web/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- },
- "dependencies": {
- "@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="
},
- "@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "services/web/node_modules/yaml": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
+ "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
"dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@apidevtools/json-schema-ref-parser": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.0.tgz",
- "integrity": "sha512-teB30tFooE3iQs2HQIKJ02D8UZA1Xy1zaczzhUjJs0CymYxeC0g+y5rCY2p8NHBM6DBUVoR8rSM4kHLj1WE9mQ==",
- "requires": {
- "@jsdevtools/ono": "^7.1.3",
- "@types/json-schema": "^7.0.6",
- "call-me-maybe": "^1.0.1",
- "js-yaml": "^4.1.0"
- }
- },
- "@arrows/array": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz",
- "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==",
- "dev": true,
- "requires": {
- "@arrows/composition": "^1.2.2"
- }
- },
- "@arrows/composition": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz",
- "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==",
- "dev": true
- },
- "@arrows/dispatch": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz",
- "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==",
- "dev": true,
- "requires": {
- "@arrows/composition": "^1.2.2"
- }
- },
- "@arrows/error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz",
- "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==",
- "dev": true
- },
- "@arrows/multimethod": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.4.1.tgz",
- "integrity": "sha512-AZnAay0dgPnCJxn3We5uKiB88VL+1ZIF2SjZohLj6vqY2UyvB/sKdDnFP+LZNVsTC5lcnGPmLlRRkAh4sXkXsQ==",
- "dev": true,
- "requires": {
- "@arrows/array": "^1.4.1",
- "@arrows/composition": "^1.2.2",
- "@arrows/error": "^1.0.2",
- "fast-deep-equal": "^3.1.3"
- }
- },
- "@auth0/thumbprint": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@auth0/thumbprint/-/thumbprint-0.0.6.tgz",
- "integrity": "sha1-yrEGLGwEZizmxZLUgVfsQmiuhRg="
- },
- "@auth0/xmldom": {
- "version": "0.1.21",
- "resolved": "https://registry.npmjs.org/@auth0/xmldom/-/xmldom-0.1.21.tgz",
- "integrity": "sha512-//QqjkvBknF7j0Nf205o5wgUMnq8ioHHxEr61OZQ3J0RXGFvs2rb5GLZ8jdNxMqYz4n/PEsbFIQL5RHBixxq5g=="
- },
- "@aws-crypto/crc32": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
- "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==",
+ "license": "ISC",
"optional": true,
- "requires": {
- "@aws-crypto/util": "^3.0.0",
- "@aws-sdk/types": "^3.222.0",
- "tslib": "^1.11.1"
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
},
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
+ "engines": {
+ "node": ">= 14.6"
}
},
- "@aws-crypto/ie11-detection": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
- "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
- "optional": true,
- "requires": {
- "tslib": "^1.11.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
- }
- },
- "@aws-crypto/sha256-browser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
- "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
- "optional": true,
- "requires": {
- "@aws-crypto/ie11-detection": "^3.0.0",
- "@aws-crypto/sha256-js": "^3.0.0",
- "@aws-crypto/supports-web-crypto": "^3.0.0",
- "@aws-crypto/util": "^3.0.0",
- "@aws-sdk/types": "^3.222.0",
- "@aws-sdk/util-locate-window": "^3.0.0",
- "@aws-sdk/util-utf8-browser": "^3.0.0",
- "tslib": "^1.11.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
- }
- },
- "@aws-crypto/sha256-js": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
- "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
- "optional": true,
- "requires": {
- "@aws-crypto/util": "^3.0.0",
- "@aws-sdk/types": "^3.222.0",
- "tslib": "^1.11.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
- }
- },
- "@aws-crypto/supports-web-crypto": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
- "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
- "optional": true,
- "requires": {
- "tslib": "^1.11.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
- }
- },
- "@aws-crypto/util": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
- "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "^3.222.0",
- "@aws-sdk/util-utf8-browser": "^3.0.0",
- "tslib": "^1.11.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "optional": true
- }
- }
- },
- "@aws-sdk/client-cognito-identity": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.363.0.tgz",
- "integrity": "sha512-tsJzgBSCpna85IVsuS7FBIK9wkSl7fs8TJ/QzapIgu8rKss0ySHVO6TeMVAdw2BvaQl7CxU9c3PosjhLWHu6KQ==",
- "optional": true,
- "requires": {
- "@aws-crypto/sha256-browser": "3.0.0",
- "@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/client-sts": "3.363.0",
- "@aws-sdk/credential-provider-node": "3.363.0",
- "@aws-sdk/middleware-host-header": "3.363.0",
- "@aws-sdk/middleware-logger": "3.363.0",
- "@aws-sdk/middleware-recursion-detection": "3.363.0",
- "@aws-sdk/middleware-signing": "3.363.0",
- "@aws-sdk/middleware-user-agent": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@aws-sdk/util-endpoints": "3.357.0",
- "@aws-sdk/util-user-agent-browser": "3.363.0",
- "@aws-sdk/util-user-agent-node": "3.363.0",
- "@smithy/config-resolver": "^1.0.1",
- "@smithy/fetch-http-handler": "^1.0.1",
- "@smithy/hash-node": "^1.0.1",
- "@smithy/invalid-dependency": "^1.0.1",
- "@smithy/middleware-content-length": "^1.0.1",
- "@smithy/middleware-endpoint": "^1.0.1",
- "@smithy/middleware-retry": "^1.0.2",
- "@smithy/middleware-serde": "^1.0.1",
- "@smithy/middleware-stack": "^1.0.1",
- "@smithy/node-config-provider": "^1.0.1",
- "@smithy/node-http-handler": "^1.0.2",
- "@smithy/protocol-http": "^1.0.1",
- "@smithy/smithy-client": "^1.0.3",
- "@smithy/types": "^1.0.0",
- "@smithy/url-parser": "^1.0.1",
- "@smithy/util-base64": "^1.0.1",
- "@smithy/util-body-length-browser": "^1.0.1",
- "@smithy/util-body-length-node": "^1.0.1",
- "@smithy/util-defaults-mode-browser": "^1.0.1",
- "@smithy/util-defaults-mode-node": "^1.0.1",
- "@smithy/util-retry": "^1.0.2",
- "@smithy/util-utf8": "^1.0.1",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/client-sso": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz",
- "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==",
- "optional": true,
- "requires": {
- "@aws-crypto/sha256-browser": "3.0.0",
- "@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/middleware-host-header": "3.363.0",
- "@aws-sdk/middleware-logger": "3.363.0",
- "@aws-sdk/middleware-recursion-detection": "3.363.0",
- "@aws-sdk/middleware-user-agent": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@aws-sdk/util-endpoints": "3.357.0",
- "@aws-sdk/util-user-agent-browser": "3.363.0",
- "@aws-sdk/util-user-agent-node": "3.363.0",
- "@smithy/config-resolver": "^1.0.1",
- "@smithy/fetch-http-handler": "^1.0.1",
- "@smithy/hash-node": "^1.0.1",
- "@smithy/invalid-dependency": "^1.0.1",
- "@smithy/middleware-content-length": "^1.0.1",
- "@smithy/middleware-endpoint": "^1.0.1",
- "@smithy/middleware-retry": "^1.0.2",
- "@smithy/middleware-serde": "^1.0.1",
- "@smithy/middleware-stack": "^1.0.1",
- "@smithy/node-config-provider": "^1.0.1",
- "@smithy/node-http-handler": "^1.0.2",
- "@smithy/protocol-http": "^1.0.1",
- "@smithy/smithy-client": "^1.0.3",
- "@smithy/types": "^1.0.0",
- "@smithy/url-parser": "^1.0.1",
- "@smithy/util-base64": "^1.0.1",
- "@smithy/util-body-length-browser": "^1.0.1",
- "@smithy/util-body-length-node": "^1.0.1",
- "@smithy/util-defaults-mode-browser": "^1.0.1",
- "@smithy/util-defaults-mode-node": "^1.0.1",
- "@smithy/util-retry": "^1.0.2",
- "@smithy/util-utf8": "^1.0.1",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/client-sso-oidc": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz",
- "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==",
- "optional": true,
- "requires": {
- "@aws-crypto/sha256-browser": "3.0.0",
- "@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/middleware-host-header": "3.363.0",
- "@aws-sdk/middleware-logger": "3.363.0",
- "@aws-sdk/middleware-recursion-detection": "3.363.0",
- "@aws-sdk/middleware-user-agent": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@aws-sdk/util-endpoints": "3.357.0",
- "@aws-sdk/util-user-agent-browser": "3.363.0",
- "@aws-sdk/util-user-agent-node": "3.363.0",
- "@smithy/config-resolver": "^1.0.1",
- "@smithy/fetch-http-handler": "^1.0.1",
- "@smithy/hash-node": "^1.0.1",
- "@smithy/invalid-dependency": "^1.0.1",
- "@smithy/middleware-content-length": "^1.0.1",
- "@smithy/middleware-endpoint": "^1.0.1",
- "@smithy/middleware-retry": "^1.0.2",
- "@smithy/middleware-serde": "^1.0.1",
- "@smithy/middleware-stack": "^1.0.1",
- "@smithy/node-config-provider": "^1.0.1",
- "@smithy/node-http-handler": "^1.0.2",
- "@smithy/protocol-http": "^1.0.1",
- "@smithy/smithy-client": "^1.0.3",
- "@smithy/types": "^1.0.0",
- "@smithy/url-parser": "^1.0.1",
- "@smithy/util-base64": "^1.0.1",
- "@smithy/util-body-length-browser": "^1.0.1",
- "@smithy/util-body-length-node": "^1.0.1",
- "@smithy/util-defaults-mode-browser": "^1.0.1",
- "@smithy/util-defaults-mode-node": "^1.0.1",
- "@smithy/util-retry": "^1.0.2",
- "@smithy/util-utf8": "^1.0.1",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/client-sts": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz",
- "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==",
- "optional": true,
- "requires": {
- "@aws-crypto/sha256-browser": "3.0.0",
- "@aws-crypto/sha256-js": "3.0.0",
- "@aws-sdk/credential-provider-node": "3.363.0",
- "@aws-sdk/middleware-host-header": "3.363.0",
- "@aws-sdk/middleware-logger": "3.363.0",
- "@aws-sdk/middleware-recursion-detection": "3.363.0",
- "@aws-sdk/middleware-sdk-sts": "3.363.0",
- "@aws-sdk/middleware-signing": "3.363.0",
- "@aws-sdk/middleware-user-agent": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@aws-sdk/util-endpoints": "3.357.0",
- "@aws-sdk/util-user-agent-browser": "3.363.0",
- "@aws-sdk/util-user-agent-node": "3.363.0",
- "@smithy/config-resolver": "^1.0.1",
- "@smithy/fetch-http-handler": "^1.0.1",
- "@smithy/hash-node": "^1.0.1",
- "@smithy/invalid-dependency": "^1.0.1",
- "@smithy/middleware-content-length": "^1.0.1",
- "@smithy/middleware-endpoint": "^1.0.1",
- "@smithy/middleware-retry": "^1.0.1",
- "@smithy/middleware-serde": "^1.0.1",
- "@smithy/middleware-stack": "^1.0.1",
- "@smithy/node-config-provider": "^1.0.1",
- "@smithy/node-http-handler": "^1.0.1",
- "@smithy/protocol-http": "^1.1.0",
- "@smithy/smithy-client": "^1.0.2",
- "@smithy/types": "^1.1.0",
- "@smithy/url-parser": "^1.0.1",
- "@smithy/util-base64": "^1.0.1",
- "@smithy/util-body-length-browser": "^1.0.1",
- "@smithy/util-body-length-node": "^1.0.1",
- "@smithy/util-defaults-mode-browser": "^1.0.1",
- "@smithy/util-defaults-mode-node": "^1.0.1",
- "@smithy/util-retry": "^1.0.1",
- "@smithy/util-utf8": "^1.0.1",
- "fast-xml-parser": "4.2.5",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-cognito-identity": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.363.0.tgz",
- "integrity": "sha512-5x42JvqEsBUrm6/qdf0WWe4mlmJjPItxamQhRjuOzeQD/BxsA2W5VS/7n0Ws0e27DNhlnUErcIJd+bBy6j1fqA==",
- "optional": true,
- "requires": {
- "@aws-sdk/client-cognito-identity": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-env": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz",
- "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-ini": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz",
- "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==",
- "optional": true,
- "requires": {
- "@aws-sdk/credential-provider-env": "3.363.0",
- "@aws-sdk/credential-provider-process": "3.363.0",
- "@aws-sdk/credential-provider-sso": "3.363.0",
- "@aws-sdk/credential-provider-web-identity": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/credential-provider-imds": "^1.0.1",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/shared-ini-file-loader": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-node": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz",
- "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==",
- "optional": true,
- "requires": {
- "@aws-sdk/credential-provider-env": "3.363.0",
- "@aws-sdk/credential-provider-ini": "3.363.0",
- "@aws-sdk/credential-provider-process": "3.363.0",
- "@aws-sdk/credential-provider-sso": "3.363.0",
- "@aws-sdk/credential-provider-web-identity": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/credential-provider-imds": "^1.0.1",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/shared-ini-file-loader": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-process": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz",
- "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/shared-ini-file-loader": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-sso": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz",
- "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==",
- "optional": true,
- "requires": {
- "@aws-sdk/client-sso": "3.363.0",
- "@aws-sdk/token-providers": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/shared-ini-file-loader": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-provider-web-identity": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz",
- "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/credential-providers": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.363.0.tgz",
- "integrity": "sha512-hVa1DdYasnLud2EKjDAlDHiV/+H/Zq52chHU00c/R8XwPu1s0kZX3NMmlt0D2HhYqC1mUwtdmE58Jra2POviQQ==",
- "optional": true,
- "requires": {
- "@aws-sdk/client-cognito-identity": "3.363.0",
- "@aws-sdk/client-sso": "3.363.0",
- "@aws-sdk/client-sts": "3.363.0",
- "@aws-sdk/credential-provider-cognito-identity": "3.363.0",
- "@aws-sdk/credential-provider-env": "3.363.0",
- "@aws-sdk/credential-provider-ini": "3.363.0",
- "@aws-sdk/credential-provider-node": "3.363.0",
- "@aws-sdk/credential-provider-process": "3.363.0",
- "@aws-sdk/credential-provider-sso": "3.363.0",
- "@aws-sdk/credential-provider-web-identity": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/credential-provider-imds": "^1.0.1",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-host-header": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz",
- "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/protocol-http": "^1.1.0",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-logger": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz",
- "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-recursion-detection": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz",
- "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/protocol-http": "^1.1.0",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-sdk-sts": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.363.0.tgz",
- "integrity": "sha512-1yy2Ac50FO8BrODaw5bPWvVrRhaVLqXTFH6iHB+dJLPUkwtY5zLM3Mp+9Ilm7kME+r7oIB1wuO6ZB1Lf4ZszIw==",
- "optional": true,
- "requires": {
- "@aws-sdk/middleware-signing": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-signing": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.363.0.tgz",
- "integrity": "sha512-/7qia715pt9JKYIPDGu22WmdZxD8cfF/5xB+1kmILg7ZtjO0pPuTaCNJ7xiIuFd7Dn7JXp5lop08anX/GOhNRQ==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/protocol-http": "^1.1.0",
- "@smithy/signature-v4": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "@smithy/util-middleware": "^1.0.1",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/middleware-user-agent": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz",
- "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@aws-sdk/util-endpoints": "3.357.0",
- "@smithy/protocol-http": "^1.1.0",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/token-providers": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz",
- "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==",
- "optional": true,
- "requires": {
- "@aws-sdk/client-sso-oidc": "3.363.0",
- "@aws-sdk/types": "3.357.0",
- "@smithy/property-provider": "^1.0.1",
- "@smithy/shared-ini-file-loader": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/types": {
- "version": "3.357.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz",
- "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/util-endpoints": {
- "version": "3.357.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz",
- "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/util-locate-window": {
- "version": "3.310.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz",
- "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/util-user-agent-browser": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz",
- "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/types": "^1.1.0",
- "bowser": "^2.11.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/util-user-agent-node": {
- "version": "3.363.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz",
- "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==",
- "optional": true,
- "requires": {
- "@aws-sdk/types": "3.357.0",
- "@smithy/node-config-provider": "^1.0.1",
- "@smithy/types": "^1.1.0",
- "tslib": "^2.5.0"
- }
- },
- "@aws-sdk/util-utf8-browser": {
- "version": "3.259.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
- "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
- "optional": true,
- "requires": {
- "tslib": "^2.3.1"
- }
- },
- "@babel/cli": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.8.tgz",
- "integrity": "sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.25",
- "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
- "chokidar": "^3.4.0",
- "commander": "^6.2.0",
- "convert-source-map": "^2.0.0",
- "fs-readdir-recursive": "^1.1.0",
- "glob": "^7.2.0",
- "make-dir": "^2.1.0",
- "slash": "^2.0.0"
- },
- "dependencies": {
- "commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true
- },
- "convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- }
- }
- },
- "@babel/code-frame": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
- "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.24.7",
- "picocolors": "^1.0.0"
- }
- },
- "@babel/compat-data": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz",
- "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==",
- "dev": true
- },
- "@babel/core": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
- "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
- "dev": true,
- "requires": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-module-transforms": "^7.25.2",
- "@babel/helpers": "^7.25.0",
- "@babel/parser": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.2",
- "@babel/types": "^7.25.2",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "dependencies": {
- "convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- }
- }
- },
- "@babel/generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz",
- "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.25.0",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
- "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
- "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-builder-react-jsx": {
- "version": "7.22.10",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.22.10.tgz",
- "integrity": "sha512-cZr0nzCwrMp7Z8owt+YN8OncOqhG1eZLp/aRT5ftBnkLJTCB3Dnq/t52vSfWc6sGRWdDeawbksuh3pYQGCzVwA==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/types": "^7.22.10"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
- "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.25.2",
- "@babel/helper-validator-option": "^7.24.8",
- "browserslist": "^4.23.1",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- }
- },
- "@babel/helper-create-class-features-plugin": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz",
- "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/traverse": "^7.25.0",
- "semver": "^6.3.1"
- }
- },
- "@babel/helper-create-regexp-features-plugin": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz",
- "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "regexpu-core": "^5.3.1",
- "semver": "^6.3.1"
- }
- },
- "@babel/helper-define-polyfill-provider": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
- "dev": true,
- "requires": {
- "@babel/helper-compilation-targets": "^7.22.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
- "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.24.8",
- "@babel/types": "^7.24.8"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
- "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
- "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-simple-access": "^7.24.7",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.2"
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
- "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
- "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
- "dev": true
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz",
- "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-wrap-function": "^7.25.0",
- "@babel/traverse": "^7.25.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
- "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
- "dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.24.8",
- "@babel/helper-optimise-call-expression": "^7.24.7",
- "@babel/traverse": "^7.25.0"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
- "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
- "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.24.7",
- "@babel/types": "^7.24.7"
- }
- },
- "@babel/helper-string-parser": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
- "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ=="
- },
- "@babel/helper-validator-identifier": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
- "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
- },
- "@babel/helper-validator-option": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
- "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
- "dev": true
- },
- "@babel/helper-wrap-function": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz",
- "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.0",
- "@babel/types": "^7.25.0"
- }
- },
- "@babel/helpers": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz",
- "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.0"
- }
- },
- "@babel/highlight": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
- "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.24.7",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz",
- "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
- "requires": {
- "@babel/types": "^7.25.2"
- }
- },
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz",
- "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.3"
- }
- },
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz",
- "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz",
- "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
- "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.7"
- }
- },
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz",
- "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.0"
- }
- },
- "@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
- "dev": true,
- "requires": {}
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.12.13"
- }
- },
- "@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-import-assertions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
- "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-syntax-import-attributes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
- "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
- "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.14.5"
- }
- },
- "@babel/plugin-syntax-typescript": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz",
- "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-syntax-unicode-sets-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
- "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-async-generator-functions": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz",
- "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-remap-async-to-generator": "^7.25.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/traverse": "^7.25.0"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
- "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-remap-async-to-generator": "^7.24.7"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
- "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz",
- "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-transform-class-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
- "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
- "dev": true,
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-class-static-block": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
- "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
- "dev": true,
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz",
- "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-replace-supers": "^7.25.0",
- "@babel/traverse": "^7.25.0",
- "globals": "^11.1.0"
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
- "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/template": "^7.24.7"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz",
- "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
- "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
- "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz",
- "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-transform-dynamic-import": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
- "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
- "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
- "dev": true,
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-export-namespace-from": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
- "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
- "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.25.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz",
- "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==",
- "dev": true,
- "requires": {
- "@babel/helper-compilation-targets": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/traverse": "^7.25.1"
- }
- },
- "@babel/plugin-transform-json-strings": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
- "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz",
- "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
- "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
- "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
- "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz",
- "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.24.8",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-simple-access": "^7.24.7"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz",
- "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "@babel/traverse": "^7.25.0"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
- "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
- "dev": true,
- "requires": {
- "@babel/helper-module-transforms": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
- "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
- "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
- "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- }
- },
- "@babel/plugin-transform-numeric-separator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
- "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- }
- },
- "@babel/plugin-transform-object-assign": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.23.3.tgz",
- "integrity": "sha512-TPJ6O7gVC2rlQH2hvQGRH273G1xdoloCj9Pc07Q7JbIZYDi+Sv5gaE2fu+r5E7qK4zyt6vj0FbZaZTRU5C3OMA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.22.5"
- }
- },
- "@babel/plugin-transform-object-rest-spread": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
- "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
- "dev": true,
- "requires": {
- "@babel/helper-compilation-targets": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.24.7"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
- "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-replace-supers": "^7.24.7"
- }
- },
- "@babel/plugin-transform-optional-catch-binding": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
- "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- }
- },
- "@babel/plugin-transform-optional-chaining": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz",
- "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
- "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-private-methods": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
- "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
- "dev": true,
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-private-property-in-object": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
- "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-create-class-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
- "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-react-constant-elements": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz",
- "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.22.5"
- }
- },
- "@babel/plugin-transform-react-display-name": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz",
- "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-react-inline-elements": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.23.3.tgz",
- "integrity": "sha512-NM86KpgxSSvk+GG/PiTBCw386OYdcpLRM6jngy84U7dsZKdtRQSud6BRxSzvuoQmP9r7b7V6X4P9PJjsWVr9mA==",
- "dev": true,
- "requires": {
- "@babel/helper-builder-react-jsx": "^7.22.10",
- "@babel/helper-plugin-utils": "^7.22.5"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz",
- "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-module-imports": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/plugin-syntax-jsx": "^7.24.7",
- "@babel/types": "^7.25.2"
- }
- },
- "@babel/plugin-transform-react-jsx-development": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz",
- "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==",
- "dev": true,
- "requires": {
- "@babel/plugin-transform-react-jsx": "^7.24.7"
- }
- },
- "@babel/plugin-transform-react-pure-annotations": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz",
- "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
- "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "regenerator-transform": "^0.15.2"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
- "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
- "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
- "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
- "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
- "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.24.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz",
- "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.8"
- }
- },
- "@babel/plugin-transform-typescript": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz",
- "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==",
- "dev": true,
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.24.7",
- "@babel/helper-create-class-features-plugin": "^7.25.0",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
- "@babel/plugin-syntax-typescript": "^7.24.7"
- }
- },
- "@babel/plugin-transform-unicode-escapes": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
- "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-unicode-property-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
- "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
- "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
- "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
- "dev": true,
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.24.7",
- "@babel/helper-plugin-utils": "^7.24.7"
- }
- },
- "@babel/polyfill": {
- "version": "7.12.1",
- "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz",
- "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==",
- "dev": true,
- "requires": {
- "core-js": "^2.6.5",
- "regenerator-runtime": "^0.13.4"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "dev": true
- }
- }
- },
- "@babel/preset-env": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz",
- "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.25.2",
- "@babel/helper-compilation-targets": "^7.25.2",
- "@babel/helper-plugin-utils": "^7.24.8",
- "@babel/helper-validator-option": "^7.24.8",
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3",
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0",
- "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.24.7",
- "@babel/plugin-syntax-import-attributes": "^7.24.7",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.24.7",
- "@babel/plugin-transform-async-generator-functions": "^7.25.0",
- "@babel/plugin-transform-async-to-generator": "^7.24.7",
- "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
- "@babel/plugin-transform-block-scoping": "^7.25.0",
- "@babel/plugin-transform-class-properties": "^7.24.7",
- "@babel/plugin-transform-class-static-block": "^7.24.7",
- "@babel/plugin-transform-classes": "^7.25.0",
- "@babel/plugin-transform-computed-properties": "^7.24.7",
- "@babel/plugin-transform-destructuring": "^7.24.8",
- "@babel/plugin-transform-dotall-regex": "^7.24.7",
- "@babel/plugin-transform-duplicate-keys": "^7.24.7",
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0",
- "@babel/plugin-transform-dynamic-import": "^7.24.7",
- "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
- "@babel/plugin-transform-export-namespace-from": "^7.24.7",
- "@babel/plugin-transform-for-of": "^7.24.7",
- "@babel/plugin-transform-function-name": "^7.25.1",
- "@babel/plugin-transform-json-strings": "^7.24.7",
- "@babel/plugin-transform-literals": "^7.25.2",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
- "@babel/plugin-transform-member-expression-literals": "^7.24.7",
- "@babel/plugin-transform-modules-amd": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.8",
- "@babel/plugin-transform-modules-systemjs": "^7.25.0",
- "@babel/plugin-transform-modules-umd": "^7.24.7",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
- "@babel/plugin-transform-new-target": "^7.24.7",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
- "@babel/plugin-transform-numeric-separator": "^7.24.7",
- "@babel/plugin-transform-object-rest-spread": "^7.24.7",
- "@babel/plugin-transform-object-super": "^7.24.7",
- "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
- "@babel/plugin-transform-optional-chaining": "^7.24.8",
- "@babel/plugin-transform-parameters": "^7.24.7",
- "@babel/plugin-transform-private-methods": "^7.24.7",
- "@babel/plugin-transform-private-property-in-object": "^7.24.7",
- "@babel/plugin-transform-property-literals": "^7.24.7",
- "@babel/plugin-transform-regenerator": "^7.24.7",
- "@babel/plugin-transform-reserved-words": "^7.24.7",
- "@babel/plugin-transform-shorthand-properties": "^7.24.7",
- "@babel/plugin-transform-spread": "^7.24.7",
- "@babel/plugin-transform-sticky-regex": "^7.24.7",
- "@babel/plugin-transform-template-literals": "^7.24.7",
- "@babel/plugin-transform-typeof-symbol": "^7.24.8",
- "@babel/plugin-transform-unicode-escapes": "^7.24.7",
- "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-regex": "^7.24.7",
- "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.4",
- "babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.37.1",
- "semver": "^6.3.1"
- }
- },
- "@babel/preset-modules": {
- "version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- }
- },
- "@babel/preset-react": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz",
- "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-validator-option": "^7.24.7",
- "@babel/plugin-transform-react-display-name": "^7.24.7",
- "@babel/plugin-transform-react-jsx": "^7.24.7",
- "@babel/plugin-transform-react-jsx-development": "^7.24.7",
- "@babel/plugin-transform-react-pure-annotations": "^7.24.7"
- }
- },
- "@babel/preset-typescript": {
- "version": "7.24.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz",
- "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.24.7",
- "@babel/helper-validator-option": "^7.24.7",
- "@babel/plugin-syntax-jsx": "^7.24.7",
- "@babel/plugin-transform-modules-commonjs": "^7.24.7",
- "@babel/plugin-transform-typescript": "^7.24.7"
- }
- },
- "@babel/register": {
- "version": "7.24.6",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
- "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
- "dev": true,
- "requires": {
- "clone-deep": "^4.0.1",
- "find-cache-dir": "^2.0.0",
- "make-dir": "^2.1.0",
- "pirates": "^4.0.6",
- "source-map-support": "^0.5.16"
- }
- },
- "@babel/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
- "dev": true
- },
- "@babel/runtime": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
- "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
- "requires": {
- "regenerator-runtime": "^0.14.0"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
- }
- }
- },
- "@babel/runtime-corejs2": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.16.7.tgz",
- "integrity": "sha512-ec0BM0J/9M5Cncha++AlgvvDlk+uM+m6f7K0t74ClcYzsE8LgX4RstRreksMSCI82o3LJS//UswmA0pUWkJpqg==",
- "requires": {
- "core-js": "^2.6.5",
- "regenerator-runtime": "^0.13.4"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
- }
- }
- },
- "@babel/runtime-corejs3": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz",
- "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==",
- "requires": {
- "core-js-pure": "^3.20.2",
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.25.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
- "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.24.7",
- "@babel/parser": "^7.25.0",
- "@babel/types": "^7.25.0"
- }
- },
- "@babel/traverse": {
- "version": "7.25.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz",
- "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.24.7",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/template": "^7.25.0",
- "@babel/types": "^7.25.2",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- }
- },
- "@babel/types": {
- "version": "7.25.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz",
- "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
- "requires": {
- "@babel/helper-string-parser": "^7.24.8",
- "@babel/helper-validator-identifier": "^7.24.7",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@base2/pretty-print-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz",
- "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==",
- "dev": true
- },
- "@bcoe/v8-coverage": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
- "dev": true
- },
- "@codemirror/autocomplete": {
- "version": "git+ssh://git@github.com/overleaf/codemirror-autocomplete.git#d69a03afc6e29a58eb267084a1e3b5a99ff72cc2",
- "integrity": "sha512-nks52ChYx6ZrwsJA+0kNK3u2Etylgq9KnxVzT27mzbVprddnv2AHzv9HhX2gpHZbIKE1kalYxMHO9GalyTyrnQ==",
- "dev": true,
- "from": "@codemirror/autocomplete@github:overleaf/codemirror-autocomplete#v6.18.0-overleaf-1",
- "requires": {
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.17.0",
- "@lezer/common": "^1.0.0"
- }
- },
- "@codemirror/commands": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz",
- "integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==",
- "dev": true,
- "requires": {
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.4.0",
- "@codemirror/view": "^6.27.0",
- "@lezer/common": "^1.1.0"
- }
- },
- "@codemirror/lang-css": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.0.0.tgz",
- "integrity": "sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==",
- "dev": true,
- "requires": {
- "@codemirror/autocomplete": "^6.0.0",
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@lezer/css": "^1.0.0"
- }
- },
- "@codemirror/lang-html": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.1.0.tgz",
- "integrity": "sha512-gA7NmJxqvnhwza05CvR7W/39Ap9r/4Vs9uiC0IeFYo1hSlJzc/8N6Evviz6vTW1x8SpHcRYyqKOf6rpl6LfWtg==",
- "dev": true,
- "requires": {
- "@codemirror/autocomplete": "^6.0.0",
- "@codemirror/lang-css": "^6.0.0",
- "@codemirror/lang-javascript": "^6.0.0",
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@lezer/common": "^1.0.0",
- "@lezer/html": "^1.0.0"
- }
- },
- "@codemirror/lang-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.0.1.tgz",
- "integrity": "sha512-kjGbBEosl+ozDU5ruDV48w4v3H6KECTFiDjqMLT0KhVwESPfv3wOvnDrTT0uaMOg3YRGnBWsyiIoKHl/tNWWDg==",
- "dev": true,
- "requires": {
- "@codemirror/autocomplete": "^6.0.0",
- "@codemirror/language": "^6.0.0",
- "@codemirror/lint": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "@lezer/common": "^1.0.0",
- "@lezer/javascript": "^1.0.0"
- }
- },
- "@codemirror/lang-markdown": {
- "version": "6.2.5",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.2.5.tgz",
- "integrity": "sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==",
- "dev": true,
- "requires": {
- "@codemirror/autocomplete": "^6.7.1",
- "@codemirror/lang-html": "^6.0.0",
- "@codemirror/language": "^6.3.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "@lezer/common": "^1.2.1",
- "@lezer/markdown": "^1.0.0"
- }
- },
- "@codemirror/language": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
- "integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
- "dev": true,
- "requires": {
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.23.0",
- "@lezer/common": "^1.1.0",
- "@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0",
- "style-mod": "^4.0.0"
- }
- },
- "@codemirror/lint": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz",
- "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==",
- "dev": true,
- "requires": {
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "crelt": "^1.0.5"
- }
- },
- "@codemirror/search": {
- "version": "git+ssh://git@github.com/overleaf/codemirror-search.git#29f7a871969ad64b89341bacbe5d46dda02eee12",
- "integrity": "sha512-aMLQYaC/xv/kNkhp49jx24APK4fvxjypcgS7GfFUoLdhx39fDMw3Z4EGl56NDMFCdEJhG8yXk+hyvU+pxEQSfA==",
- "dev": true,
- "from": "@codemirror/search@github:overleaf/codemirror-search#29f7a871969ad64b89341bacbe5d46dda02eee12",
- "requires": {
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0",
- "crelt": "^1.0.5"
- }
- },
- "@codemirror/state": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
- "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==",
- "dev": true
- },
- "@codemirror/view": {
- "version": "6.32.0",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.32.0.tgz",
- "integrity": "sha512-AgVNvED2QTsZp5e3syoHLsrWtwJFYWdx1Vr/m3f4h1ATQz0ax60CfXF3Htdmk69k2MlYZw8gXesnQdHtzyVmAw==",
- "dev": true,
- "requires": {
- "@codemirror/state": "^6.4.0",
- "style-mod": "^4.1.0",
- "w3c-keyname": "^2.2.4"
- }
- },
- "@contentful/rich-text-html-renderer": {
- "version": "16.0.2",
- "resolved": "https://registry.npmjs.org/@contentful/rich-text-html-renderer/-/rich-text-html-renderer-16.0.2.tgz",
- "integrity": "sha512-0flmxVixlNk5PMiHXAlABUJ2uURsWxOjbC6ZHhqpEVHU03kHMoIKfDdo6CRZc0S0rMWMO3c14Ei91E97T06T8w==",
- "requires": {
- "@contentful/rich-text-types": "^16.0.2",
- "escape-html": "^1.0.3"
- }
- },
- "@contentful/rich-text-types": {
- "version": "16.0.2",
- "resolved": "https://registry.npmjs.org/@contentful/rich-text-types/-/rich-text-types-16.0.2.tgz",
- "integrity": "sha512-ovbmCKQjlyGek4NuABoqDesC3FBV3e5jPMMdtT2mpOy9ia31MKO0NSFMRGZu7Q+veZzmDMja8S1i/XeFCUT9Pw=="
- },
- "@csstools/cascade-layer-name-parser": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.5.tgz",
- "integrity": "sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==",
- "dev": true,
- "requires": {}
- },
- "@csstools/color-helpers": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-3.0.2.tgz",
- "integrity": "sha512-NMVs/l7Y9eIKL5XjbCHEgGcG8LOUT2qVcRjX6EzkCdlvftHVKr2tHIPzHavfrULRZ5Q2gxrJ9f44dAlj6fX97Q==",
- "dev": true
- },
- "@csstools/css-calc": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.4.tgz",
- "integrity": "sha512-ZV1TSmToiNcQL1P3hfzlzZzA02mmVkVmXGaUDUqpYUG84PmLhVSZpKX+KfxAuOcK7de04UXSQPBrAvaya6iiGg==",
- "dev": true,
- "requires": {}
- },
- "@csstools/css-color-parser": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.4.0.tgz",
- "integrity": "sha512-SlGd8E6ron24JYQPQAIzu5tvmWi1H4sDKTdA7UDnwF45oJv7AVESbOlOO1YjfBhrQFuvLWUgKiOY9DwGoAxwTA==",
- "dev": true,
- "requires": {
- "@csstools/color-helpers": "^3.0.2",
- "@csstools/css-calc": "^1.1.4"
- }
- },
- "@csstools/css-parser-algorithms": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz",
- "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==",
- "dev": true,
- "requires": {}
- },
- "@csstools/css-tokenizer": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz",
- "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==",
- "dev": true
- },
- "@csstools/media-query-list-parser": {
- "version": "2.1.9",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz",
- "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==",
- "dev": true,
- "requires": {}
- },
- "@csstools/postcss-cascade-layers": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-3.0.1.tgz",
- "integrity": "sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA==",
- "dev": true,
- "requires": {
- "@csstools/selector-specificity": "^2.0.2",
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "@csstools/postcss-color-function": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-2.2.3.tgz",
- "integrity": "sha512-b1ptNkr1UWP96EEHqKBWWaV5m/0hgYGctgA/RVZhONeP1L3T/8hwoqDm9bB23yVCfOgE9U93KI9j06+pEkJTvw==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "@csstools/postcss-color-mix-function": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-1.0.3.tgz",
- "integrity": "sha512-QGXjGugTluqFZWzVf+S3wCiRiI0ukXlYqCi7OnpDotP/zaVTyl/aqZujLFzTOXy24BoWnu89frGMc79ohY5eog==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "@csstools/postcss-font-format-keywords": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-2.0.2.tgz",
- "integrity": "sha512-iKYZlIs6JsNT7NKyRjyIyezTCHLh4L4BBB3F5Nx7Dc4Z/QmBgX+YJFuUSar8IM6KclGiAUFGomXFdYxAwJydlA==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-gradients-interpolation-method": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-3.0.6.tgz",
- "integrity": "sha512-rBOBTat/YMmB0G8VHwKqDEx+RZ4KCU9j42K8LwS0IpZnyThalZZF7BCSsZ6TFlZhcRZKlZy3LLFI2pLqjNVGGA==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "@csstools/postcss-hwb-function": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-2.2.2.tgz",
- "integrity": "sha512-W5Y5oaJ382HSlbdGfPf60d7dAK6Hqf10+Be1yZbd/TNNrQ/3dDdV1c07YwOXPQ3PZ6dvFMhxbIbn8EC3ki3nEg==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1"
- }
- },
- "@csstools/postcss-ic-unit": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-2.0.4.tgz",
- "integrity": "sha512-9W2ZbV7whWnr1Gt4qYgxMWzbevZMOvclUczT5vk4yR6vS53W/njiiUhtm/jh/BKYwQ1W3PECZjgAd2dH4ebJig==",
- "dev": true,
- "requires": {
- "@csstools/postcss-progressive-custom-properties": "^2.3.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-is-pseudo-class": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-3.2.1.tgz",
- "integrity": "sha512-AtANdV34kJl04Al62is3eQRk/BfOfyAvEmRJvbt+nx5REqImLC+2XhuE6skgkcPli1l8ONS67wS+l1sBzySc3Q==",
- "dev": true,
- "requires": {
- "@csstools/selector-specificity": "^2.0.0",
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "@csstools/postcss-logical-float-and-clear": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-1.0.1.tgz",
- "integrity": "sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw==",
- "dev": true,
- "requires": {}
- },
- "@csstools/postcss-logical-resize": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-1.0.1.tgz",
- "integrity": "sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-logical-viewport-units": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-1.0.3.tgz",
- "integrity": "sha512-6zqcyRg9HSqIHIPMYdt6THWhRmE5/tyHKJQLysn2TeDf/ftq7Em9qwMTx98t2C/7UxIsYS8lOiHHxAVjWn2WUg==",
- "dev": true,
- "requires": {
- "@csstools/css-tokenizer": "^2.1.1"
- }
- },
- "@csstools/postcss-media-minmax": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.0.tgz",
- "integrity": "sha512-t5Li/DPC5QmW/6VFLfUvsw/4dNYYseWR0tOXDeJg/9EKUodBgNawz5tuk5vYKtNvoj+Q08odMuXcpS5YJj0AFA==",
- "dev": true,
- "requires": {
- "@csstools/css-calc": "^1.1.4",
- "@csstools/css-parser-algorithms": "^2.3.2",
- "@csstools/css-tokenizer": "^2.2.1",
- "@csstools/media-query-list-parser": "^2.1.5"
- }
- },
- "@csstools/postcss-media-queries-aspect-ratio-number-values": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-1.0.4.tgz",
- "integrity": "sha512-IwyTbyR8E2y3kh6Fhrs251KjKBJeUPV5GlnUKnpU70PRFEN2DolWbf2V4+o/B9+Oj77P/DullLTulWEQ8uFtAA==",
- "dev": true,
- "requires": {
- "@csstools/css-parser-algorithms": "^2.2.0",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/media-query-list-parser": "^2.1.1"
- }
- },
- "@csstools/postcss-nested-calc": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-2.0.2.tgz",
- "integrity": "sha512-jbwrP8rN4e7LNaRcpx3xpMUjhtt34I9OV+zgbcsYAAk6k1+3kODXJBf95/JMYWhu9g1oif7r06QVUgfWsKxCFw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-normalize-display-values": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-2.0.1.tgz",
- "integrity": "sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-oklab-function": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-2.2.3.tgz",
- "integrity": "sha512-AgJ2rWMnLCDcbSMTHSqBYn66DNLBym6JpBpCaqmwZ9huGdljjDRuH3DzOYzkgQ7Pm2K92IYIq54IvFHloUOdvA==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "@csstools/postcss-progressive-custom-properties": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-2.3.0.tgz",
- "integrity": "sha512-Zd8ojyMlsL919TBExQ1I0CTpBDdyCpH/yOdqatZpuC3sd22K4SwC7+Yez3Q/vmXMWSAl+shjNeFZ7JMyxMjK+Q==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "@csstools/postcss-relative-color-syntax": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-1.0.2.tgz",
- "integrity": "sha512-juCoVInkgH2TZPfOhyx6tIal7jW37L/0Tt+Vcl1LoxqQA9sxcg3JWYZ98pl1BonDnki6s/M7nXzFQHWsWMeHgw==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "@csstools/postcss-scope-pseudo-class": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-2.0.2.tgz",
- "integrity": "sha512-6Pvo4uexUCXt+Hz5iUtemQAcIuCYnL+ePs1khFR6/xPgC92aQLJ0zGHonWoewiBE+I++4gXK3pr+R1rlOFHe5w==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "@csstools/postcss-stepped-value-functions": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-2.1.1.tgz",
- "integrity": "sha512-YCvdF0GCZK35nhLgs7ippcxDlRVe5QsSht3+EghqTjnYnyl3BbWIN6fYQ1dKWYTJ+7Bgi41TgqQFfJDcp9Xy/w==",
- "dev": true,
- "requires": {
- "@csstools/css-calc": "^1.1.1",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1"
- }
- },
- "@csstools/postcss-text-decoration-shorthand": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-2.2.4.tgz",
- "integrity": "sha512-zPN56sQkS/7YTCVZhOBVCWf7AiNge8fXDl7JVaHLz2RyT4pnyK2gFjckWRLpO0A2xkm1lCgZ0bepYZTwAVd/5A==",
- "dev": true,
- "requires": {
- "@csstools/color-helpers": "^2.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "dependencies": {
- "@csstools/color-helpers": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-2.1.0.tgz",
- "integrity": "sha512-OWkqBa7PDzZuJ3Ha7T5bxdSVfSCfTq6K1mbAhbO1MD+GSULGjrp45i5RudyJOedstSarN/3mdwu9upJE7gDXfw==",
- "dev": true
- }
- }
- },
- "@csstools/postcss-trigonometric-functions": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-2.1.1.tgz",
- "integrity": "sha512-XcXmHEFfHXhvYz40FtDlA4Fp4NQln2bWTsCwthd2c+MCnYArUYU3YaMqzR5CrKP3pMoGYTBnp5fMqf1HxItNyw==",
- "dev": true,
- "requires": {
- "@csstools/css-calc": "^1.1.1",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1"
- }
- },
- "@csstools/postcss-unset-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-2.0.1.tgz",
- "integrity": "sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew==",
- "dev": true,
- "requires": {}
- },
- "@csstools/selector-specificity": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
- "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
- "dev": true,
- "requires": {}
- },
- "@cypress/request": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz",
- "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "performance-now": "^2.1.0",
- "qs": "6.10.4",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "^4.1.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^8.3.2"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
- }
- },
- "jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- },
- "qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "requires": {
- "side-channel": "^1.0.4"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true
- }
- }
- },
- "@cypress/xvfb": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
- "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "lodash.once": "^4.1.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true
- },
- "@dual-bundle/import-meta-resolve": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz",
- "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==",
- "dev": true,
- "peer": true
- },
- "@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "dev": true,
- "optional": true
- },
- "@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "requires": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
- "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA=="
- }
- }
- },
- "@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="
- },
- "@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "dependencies": {
- "globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "requires": {
- "type-fest": "^0.20.2"
- }
- }
- }
- },
- "@eslint/js": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
- "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g=="
- },
- "@google-cloud/bigquery": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-5.10.0.tgz",
- "integrity": "sha512-kHwPT3O5pihjlhZ4wpNElovv/RY2hyz5MdgON1UlwFM9bVA8kXqdUWS09owjVhHKaHqBxliUpG0DAwjrKHqY7Q==",
- "requires": {
- "@google-cloud/common": "^3.1.0",
- "@google-cloud/paginator": "^3.0.0",
- "@google-cloud/promisify": "^2.0.0",
- "arrify": "^2.0.1",
- "big.js": "^6.0.0",
- "duplexify": "^4.0.0",
- "extend": "^3.0.2",
- "is": "^3.3.0",
- "p-event": "^4.1.0",
- "stream-events": "^1.0.5",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- }
- }
- },
- "@google-cloud/common": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.9.0.tgz",
- "integrity": "sha512-R9PfmCKbpOizvcLY+fz/TS4HdOQhvmf4EY4xEXvWnotGbGXujuTLJTJ2URy8BGT8TDxlh6gjjfEwjJ8McnNPIg==",
- "requires": {
- "@google-cloud/projectify": "^2.0.0",
- "@google-cloud/promisify": "^2.0.0",
- "arrify": "^2.0.1",
- "duplexify": "^4.1.1",
- "ent": "^2.2.0",
- "extend": "^3.0.2",
- "google-auth-library": "^7.9.2",
- "retry-request": "^4.2.2",
- "teeny-request": "^7.0.0"
- },
- "dependencies": {
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- }
- }
- },
- "@google-cloud/logging": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.1.0.tgz",
- "integrity": "sha512-S3Zsd+HZxIdZgDZByJ+2GaSQ8rA5OLfdZoZ9Ys1iSZ4HRIhO9ZxlXbmGZgGK9JJ2GaXp7Rux4K4LpkqoYPKnEg==",
- "requires": {
- "@google-cloud/common": "^5.0.0",
- "@google-cloud/paginator": "^5.0.0",
- "@google-cloud/projectify": "^4.0.0",
- "@google-cloud/promisify": "^4.0.0",
- "arrify": "^2.0.1",
- "dot-prop": "^6.0.0",
- "eventid": "^2.0.0",
- "extend": "^3.0.2",
- "gcp-metadata": "^6.0.0",
- "google-auth-library": "^9.0.0",
- "google-gax": "^4.0.3",
- "on-finished": "^2.3.0",
- "pumpify": "^2.0.1",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- },
- "dependencies": {
- "@google-cloud/common": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
- "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==",
- "requires": {
- "@google-cloud/projectify": "^4.0.0",
- "@google-cloud/promisify": "^4.0.0",
- "arrify": "^2.0.1",
- "duplexify": "^4.1.1",
- "extend": "^3.0.2",
- "google-auth-library": "^9.0.0",
- "html-entities": "^2.5.2",
- "retry-request": "^7.0.0",
- "teeny-request": "^9.0.0"
- }
- },
- "@google-cloud/paginator": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
- "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
- "requires": {
- "arrify": "^2.0.0",
- "extend": "^3.0.2"
- }
- },
- "@google-cloud/projectify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
- "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="
- },
- "@google-cloud/promisify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
- "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="
- },
- "agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
- "requires": {
- "debug": "^4.3.4"
- }
- },
- "debug": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "duplexify": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
- "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.2"
- }
- },
- "gaxios": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
- "integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
- "requires": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9",
- "uuid": "^9.0.1"
- },
- "dependencies": {
- "https-proxy-agent": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
- "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
- "requires": {
- "agent-base": "^7.0.2",
- "debug": "4"
- }
- }
- }
- },
- "gcp-metadata": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
- "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
- "requires": {
- "gaxios": "^6.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "9.10.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
- "integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
- "requires": {
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "gaxios": "^6.1.1",
- "gcp-metadata": "^6.1.0",
- "gtoken": "^7.0.0",
- "jws": "^4.0.0"
- }
- },
- "gtoken": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
- "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
- "requires": {
- "gaxios": "^6.0.0",
- "jws": "^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "retry-request": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
- "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
- "requires": {
- "@types/request": "^2.48.8",
- "extend": "^3.0.2",
- "teeny-request": "^9.0.0"
- }
- },
- "teeny-request": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
- "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.9",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- }
- },
- "uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
- }
- }
- },
- "@google-cloud/logging-bunyan": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/logging-bunyan/-/logging-bunyan-5.1.0.tgz",
- "integrity": "sha512-D2Rg5nb+onjWre4eEowWyNmVF1RN7WThWdu1cCOcTMVOoVEGJphMxrBo9VQKQmkqdlAUG4NaM6i2sqieISQDsg==",
- "requires": {
- "@google-cloud/logging": "^11.0.0",
- "google-auth-library": "^9.0.0"
- },
- "dependencies": {
- "agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
- "requires": {
- "debug": "^4.3.4"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "gaxios": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.0.tgz",
- "integrity": "sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w==",
- "requires": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9"
- }
- },
- "gcp-metadata": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz",
- "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==",
- "requires": {
- "gaxios": "^6.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.0.0.tgz",
- "integrity": "sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==",
- "requires": {
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "gaxios": "^6.0.0",
- "gcp-metadata": "^6.0.0",
- "gtoken": "^7.0.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- }
- },
- "gtoken": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz",
- "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==",
- "requires": {
- "gaxios": "^6.0.0",
- "jws": "^4.0.0"
- }
- },
- "https-proxy-agent": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
- "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
- "requires": {
- "agent-base": "^7.0.2",
- "debug": "4"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@google-cloud/logging-min": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/logging-min/-/logging-min-10.4.0.tgz",
- "integrity": "sha512-TcblDYAATO9hHcDcWYFh+vqt3pAV7Qddaih1JK3cpkzLa+BWjD5gAVAWww8W9Wr5yxOX+8CkssanH/xSS4n76Q==",
- "requires": {
- "@google-cloud/common": "^4.0.0",
- "@google-cloud/paginator": "^4.0.0",
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
- "arrify": "^2.0.1",
- "dot-prop": "^6.0.0",
- "eventid": "^2.0.0",
- "extend": "^3.0.2",
- "gcp-metadata": "^4.0.0",
- "google-auth-library": "^8.0.2",
- "google-gax": "^3.5.2",
- "on-finished": "^2.3.0",
- "pumpify": "^2.0.1",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- },
- "dependencies": {
- "@google-cloud/common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
- "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
- "requires": {
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
- "arrify": "^2.0.1",
- "duplexify": "^4.1.1",
- "ent": "^2.2.0",
- "extend": "^3.0.2",
- "google-auth-library": "^8.0.2",
- "retry-request": "^5.0.0",
- "teeny-request": "^8.0.0"
- }
- },
- "@google-cloud/paginator": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz",
- "integrity": "sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==",
- "requires": {
- "arrify": "^2.0.0",
- "extend": "^3.0.2"
- }
- },
- "@google-cloud/projectify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
- "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA=="
- },
- "@google-cloud/promisify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
- "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA=="
- },
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "8.9.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz",
- "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.3.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- }
- }
- },
- "google-gax": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz",
- "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==",
- "requires": {
- "@grpc/grpc-js": "~1.8.0",
- "@grpc/proto-loader": "^0.7.0",
- "@types/long": "^4.0.0",
- "@types/rimraf": "^3.0.2",
- "abort-controller": "^3.0.0",
- "duplexify": "^4.0.0",
- "fast-text-encoding": "^1.0.3",
- "google-auth-library": "^8.0.2",
- "is-stream-ended": "^0.1.4",
- "node-fetch": "^2.6.1",
- "object-hash": "^3.0.0",
- "proto3-json-serializer": "^1.0.0",
- "protobufjs": "^7.2.5",
- "protobufjs-cli": "1.1.1",
- "retry-request": "^5.0.0"
- }
- },
- "google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "requires": {
- "node-forge": "^1.3.1"
- }
- },
- "gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "requires": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
- "jws": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="
- },
- "retry-request": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
- "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
- "requires": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
- }
- },
- "teeny-request": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz",
- "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.1",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- }
- },
- "uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@google-cloud/opentelemetry-cloud-trace-exporter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-2.1.0.tgz",
- "integrity": "sha512-6IPFnWG4edDgNfgLxXJjTjNYGAW8ZQ7Oz7eGZJMgQsIiEALNIAk4e/MgccglL3yh5ReONY3YePcGRWQKPbxmUg==",
- "requires": {
- "@google-cloud/opentelemetry-resource-util": "^2.1.0",
- "@grpc/grpc-js": "^1.1.8",
- "@grpc/proto-loader": "^0.7.0",
- "google-auth-library": "^7.0.0",
- "google-proto-files": "^3.0.0"
- }
- },
- "@google-cloud/opentelemetry-resource-util": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-2.1.0.tgz",
- "integrity": "sha512-/Qqnm6f10e89Txt39qpIhD+LCOF80artYOVwNF1ZAzgJFxBldEniNkf19SR+q9LAp75ZZWKyhRlumM1V7fT8gw==",
- "requires": {
- "gcp-metadata": "^5.0.1"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- }
- }
- },
- "@google-cloud/paginator": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz",
- "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==",
- "requires": {
- "arrify": "^2.0.0",
- "extend": "^3.0.2"
- }
- },
- "@google-cloud/profiler": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-6.0.0.tgz",
- "integrity": "sha512-EAxPbDiNRidAKOEnlUK3M+CcOlqG+REkUEZKirLtxFwzI/m7LmGqDzQvrVWTOSFSEYJ9qQRRnO+Q1osNGk3NUg==",
- "requires": {
- "@google-cloud/common": "^5.0.0",
- "@google-cloud/logging-min": "^10.0.0",
- "@types/console-log-level": "^1.4.0",
- "@types/semver": "^7.0.0",
- "console-log-level": "^1.4.0",
- "delay": "^5.0.0",
- "extend": "^3.0.2",
- "gcp-metadata": "^6.0.0",
- "parse-duration": "^1.0.0",
- "pprof": "3.2.1",
- "pretty-ms": "^7.0.0",
- "protobufjs": "~7.2.4",
- "semver": "^7.0.0",
- "teeny-request": "^9.0.0"
- },
- "dependencies": {
- "@google-cloud/common": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.0.tgz",
- "integrity": "sha512-IsbTVr7Ag+04GMT87X738vDs85QU1rMvaesm2wEQrtTbZAR92tGmUQ8/D/kdnYgAi98Q4zmfhF+T8Xs/Lw4zAA==",
- "requires": {
- "@google-cloud/projectify": "^4.0.0",
- "@google-cloud/promisify": "^4.0.0",
- "arrify": "^2.0.1",
- "duplexify": "^4.1.1",
- "ent": "^2.2.0",
- "extend": "^3.0.2",
- "google-auth-library": "^9.0.0",
- "retry-request": "^6.0.0",
- "teeny-request": "^9.0.0"
- }
- },
- "@google-cloud/projectify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
- "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="
- },
- "@google-cloud/promisify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
- "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="
- },
- "agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
- "requires": {
- "debug": "^4.3.4"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "gaxios": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
- "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==",
- "requires": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9"
- },
- "dependencies": {
- "https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
- "requires": {
- "agent-base": "^7.0.2",
- "debug": "4"
- }
- }
- }
- },
- "gcp-metadata": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz",
- "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==",
- "requires": {
- "gaxios": "^6.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz",
- "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==",
- "requires": {
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "gaxios": "^6.0.0",
- "gcp-metadata": "^6.0.0",
- "gtoken": "^7.0.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- }
- },
- "gtoken": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz",
- "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==",
- "requires": {
- "gaxios": "^6.0.0",
- "jws": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "retry-request": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-6.0.0.tgz",
- "integrity": "sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==",
- "requires": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "teeny-request": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
- "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.9",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- }
- },
- "uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@google-cloud/projectify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz",
- "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ=="
- },
- "@google-cloud/promisify": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz",
- "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA=="
- },
- "@google-cloud/storage": {
- "version": "6.10.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.10.1.tgz",
- "integrity": "sha512-EtLlT0YbXtrbUxaNbEfTyTytrjELtl4i42flf8COg+Hu5+apdNjsFO9XEY39wshxAuVjLf4fCSm7GTSW+BD3gQ==",
- "requires": {
- "@google-cloud/paginator": "^3.0.7",
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
- "abort-controller": "^3.0.0",
- "async-retry": "^1.3.3",
- "compressible": "^2.0.12",
- "duplexify": "^4.0.0",
- "ent": "^2.2.0",
- "extend": "^3.0.2",
- "gaxios": "^5.0.0",
- "google-auth-library": "^8.0.1",
- "mime": "^3.0.0",
- "mime-types": "^2.0.8",
- "p-limit": "^3.0.1",
- "retry-request": "^5.0.0",
- "teeny-request": "^8.0.0",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "@google-cloud/projectify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
- "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA=="
- },
- "@google-cloud/promisify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
- "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA=="
- },
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz",
- "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.0.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- }
- },
- "google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "requires": {
- "node-forge": "^1.3.1"
- }
- },
- "gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "requires": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
- "jws": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "mime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
- "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="
- },
- "retry-request": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
- "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
- "requires": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
- }
- },
- "teeny-request": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.2.tgz",
- "integrity": "sha512-34pe0a4zASseXZCKdeTiIZqSKA8ETHb1EwItZr01PAR3CLPojeAKgSjzeNS4373gi59hNulyDrPKEbh2zO9sCg==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.1",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- },
- "dependencies": {
- "uuid": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
- }
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@grpc/grpc-js": {
- "version": "1.8.22",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.22.tgz",
- "integrity": "sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==",
- "requires": {
- "@grpc/proto-loader": "^0.7.0",
- "@types/node": ">=12.12.47"
- }
- },
- "@grpc/proto-loader": {
- "version": "0.7.13",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
- "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
- "requires": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.5",
- "yargs": "^17.7.2"
- }
- },
- "@gulpjs/to-absolute-glob": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz",
- "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==",
- "dev": true,
- "requires": {
- "is-negated-glob": "^1.0.0"
- }
- },
- "@hapi/b64": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz",
- "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==",
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/boom": {
- "version": "9.1.4",
- "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz",
- "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==",
- "requires": {
- "@hapi/hoek": "9.x.x"
- }
- },
- "@hapi/cryptiles": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-5.1.0.tgz",
- "integrity": "sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA==",
- "requires": {
- "@hapi/boom": "9.x.x"
- }
- },
- "@hapi/hoek": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
- "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
- },
- "@hapi/iron": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-6.0.0.tgz",
- "integrity": "sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw==",
- "requires": {
- "@hapi/b64": "5.x.x",
- "@hapi/boom": "9.x.x",
- "@hapi/bourne": "2.x.x",
- "@hapi/cryptiles": "5.x.x",
- "@hapi/hoek": "9.x.x"
- },
- "dependencies": {
- "@hapi/bourne": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz",
- "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q=="
- }
- }
- },
- "@hapi/podium": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-4.1.3.tgz",
- "integrity": "sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g==",
- "requires": {
- "@hapi/hoek": "9.x.x",
- "@hapi/teamwork": "5.x.x",
- "@hapi/validate": "1.x.x"
- }
- },
- "@hapi/teamwork": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-5.1.1.tgz",
- "integrity": "sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg=="
- },
- "@hapi/topo": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
- "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
- "requires": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "@hapi/validate": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@hapi/validate/-/validate-1.1.3.tgz",
- "integrity": "sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA==",
- "requires": {
- "@hapi/hoek": "^9.0.0",
- "@hapi/topo": "^5.0.0"
- }
- },
- "@hapi/wreck": {
- "version": "18.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.0.1.tgz",
- "integrity": "sha512-OLHER70+rZxvDl75xq3xXOfd3e8XIvz8fWY0dqg92UvhZ29zo24vQgfqgHSYhB5ZiuFpSLeriOisAlxAo/1jWg==",
- "requires": {
- "@hapi/boom": "^10.0.1",
- "@hapi/bourne": "^3.0.0",
- "@hapi/hoek": "^11.0.2"
- },
- "dependencies": {
- "@hapi/boom": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz",
- "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==",
- "requires": {
- "@hapi/hoek": "^11.0.2"
- }
- },
- "@hapi/bourne": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz",
- "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w=="
- },
- "@hapi/hoek": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz",
- "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw=="
- }
- }
- },
- "@humanwhocodes/config-array": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
- "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
- "requires": {
- "@humanwhocodes/object-schema": "^2.0.2",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
- },
- "dependencies": {
- "@humanwhocodes/object-schema": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
- "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
- }
- }
- },
- "@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
- },
- "@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "@icons/material": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
- "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
- "dev": true,
- "requires": {}
- },
- "@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "requires": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true
- },
- "ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true
- },
- "emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "requires": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- }
- },
- "strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
- "wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- }
- }
- }
- },
- "@istanbuljs/schema": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
- "dev": true
- },
- "@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dev": true,
- "requires": {
- "@sinclair/typebox": "^0.27.8"
- }
- },
- "@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dev": true,
- "requires": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true
- },
- "@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true
- },
- "@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "@js-sdsl/ordered-map": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
- "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="
- },
- "@jsdevtools/ono": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
- "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="
- },
- "@jsdoc/salty": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
- "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
- "requires": {
- "lodash": "^4.17.21"
- }
- },
- "@jsonjoy.com/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
- "dev": true,
- "requires": {}
- },
- "@jsonjoy.com/json-pack": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz",
- "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==",
- "dev": true,
- "requires": {
- "@jsonjoy.com/base64": "^1.1.1",
- "@jsonjoy.com/util": "^1.1.2",
- "hyperdyperid": "^1.2.0",
- "thingies": "^1.20.0"
- }
- },
- "@jsonjoy.com/util": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz",
- "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==",
- "dev": true,
- "requires": {}
- },
- "@juggle/resize-observer": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz",
- "integrity": "sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==",
- "dev": true
- },
- "@leichtgewicht/ip-codec": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
- "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
- "dev": true
- },
- "@lezer/common": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
- "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==",
- "dev": true
- },
- "@lezer/css": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.0.0.tgz",
- "integrity": "sha512-616VqgDKumHmYIuxs3tnX1irEQmoDHgF/TlP4O5ICWwyHwLMErq+8iKVuzTkOdBqvYAVmObqThcDEAaaMJjAdg==",
- "dev": true,
- "requires": {
- "@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0"
- }
- },
- "@lezer/generator": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.0.tgz",
- "integrity": "sha512-IJ16tx3biLKlCXUzcK4v8S10AVa2BSM2rB12rtAL6f1hL2TS/HQQlGCoWRvanlL2J4mCYEEIv9uG7n4kVMkVDA==",
- "dev": true,
- "requires": {
- "@lezer/common": "^1.1.0",
- "@lezer/lr": "^1.3.0"
- }
- },
- "@lezer/highlight": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
- "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
- "dev": true,
- "requires": {
- "@lezer/common": "^1.0.0"
- }
- },
- "@lezer/html": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.0.0.tgz",
- "integrity": "sha512-wZHBcieArLTxEi198hqRBBHMySzDKo5suWaESdUw0t44IXp01vkSRwX2brG1qBbKdwJ+C6U0iMl00vWNiyAROg==",
- "dev": true,
- "requires": {
- "@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0"
- }
- },
- "@lezer/javascript": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.0.1.tgz",
- "integrity": "sha512-t7fpf3+gi/jiAtW+Gv734TbKdpPg6b8qATH01/jprW9H2oR++Tb688IHwJvZbk9F4GjpCEv86beuHMpUyC1b5g==",
- "dev": true,
- "requires": {
- "@lezer/highlight": "^1.0.0",
- "@lezer/lr": "^1.0.0"
- }
- },
- "@lezer/lr": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz",
- "integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==",
- "dev": true,
- "requires": {
- "@lezer/common": "^1.0.0"
- }
- },
- "@lezer/markdown": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.3.0.tgz",
- "integrity": "sha512-ErbEQ15eowmJUyT095e9NJc3BI9yZ894fjSDtHftD0InkfUBGgnKSU6dvan9jqsZuNHg2+ag/1oyDRxNsENupQ==",
- "dev": true,
- "requires": {
- "@lezer/common": "^1.0.0",
- "@lezer/highlight": "^1.0.0"
- }
- },
- "@mapbox/node-pre-gyp": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz",
- "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==",
- "requires": {
- "detect-libc": "^1.0.3",
- "https-proxy-agent": "^5.0.0",
- "make-dir": "^3.1.0",
- "node-fetch": "^2.6.5",
- "nopt": "^5.0.0",
- "npmlog": "^5.0.1",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.11"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "requires": {
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
- }
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@maxmind/geoip2-node": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-5.0.0.tgz",
- "integrity": "sha512-ki+q5//oU4tZ3BAhegZJcB5czoZyic5JSTEKbrUAQB/BzAoAiGyLW0immEmQvVVyy2SMlvBTJ3zqyRj8K9BbwQ==",
- "requires": {
- "ip6addr": "^0.2.5",
- "maxmind": "^4.2.0"
- }
- },
- "@mdx-js/react": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz",
- "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==",
- "dev": true,
- "requires": {
- "@types/mdx": "^2.0.0"
- }
- },
- "@mongodb-js/saslprep": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
- "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
- "requires": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "@nicolo-ribaudo/chokidar-2": {
- "version": "2.1.8-no-fsevents.3",
- "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
- "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
- "dev": true,
- "optional": true
- },
- "@node-oauth/formats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@node-oauth/formats/-/formats-1.0.0.tgz",
- "integrity": "sha512-DwSbLtdC8zC5B5gTJkFzJj5s9vr9SGzOgQvV9nH7tUVuMSScg0EswAczhjIapOmH3Y8AyP7C4Jv7b8+QJObWZA=="
- },
- "@node-oauth/oauth2-server": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@node-oauth/oauth2-server/-/oauth2-server-5.1.0.tgz",
- "integrity": "sha512-sYvqL1GeZLRSwgl++/oOzxJj/ZBe2yXnp6E5LGNQ5qjpn0+t/dwquXILUe3Sk2Y8/wU7XeRxToOtBVeSVkuJag==",
- "requires": {
- "@node-oauth/formats": "1.0.0",
- "basic-auth": "2.0.1",
- "type-is": "1.6.18"
- }
- },
- "@node-rs/crc32": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-0.1.8.tgz",
- "integrity": "sha512-gnQhWJDieK9gg+b4g1IR7T3CvBQw15hmPPNc9oTtDCRKITStG1QtfGwLXnGtusxGCLoeDJAKlVHTVDNoeJ29LQ==",
- "optional": true,
- "requires": {
- "@node-rs/helper": "^0.1.4"
- }
- },
- "@node-rs/helper": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-0.1.4.tgz",
- "integrity": "sha512-f63wMA9m32dkX40XWCbDysoFLFGf+6WB/Vn90mW3CQVQe2hqgQPHLBMgriuI9eW9gnqdLnuHQGArg1WALeXCYA==",
- "optional": true,
- "requires": {
- "tslib": "^2.0.0"
- }
- },
- "@node-saml/node-saml": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@node-saml/node-saml/-/node-saml-4.0.5.tgz",
- "integrity": "sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==",
- "requires": {
- "@types/debug": "^4.1.7",
- "@types/passport": "^1.0.11",
- "@types/xml-crypto": "^1.4.2",
- "@types/xml-encryption": "^1.2.1",
- "@types/xml2js": "^0.4.11",
- "@xmldom/xmldom": "^0.8.6",
- "debug": "^4.3.4",
- "xml-crypto": "^3.0.1",
- "xml-encryption": "^3.0.2",
- "xml2js": "^0.5.0",
- "xmlbuilder": "^15.1.1"
- },
- "dependencies": {
- "@xmldom/xmldom": {
- "version": "0.8.10",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
- "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "xml-crypto": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-3.2.0.tgz",
- "integrity": "sha512-qVurBUOQrmvlgmZqIVBqmb06TD2a/PpEUfFPgD7BuBfjmoH4zgkqaWSIJrnymlCvM2GGt9x+XtJFA+ttoAufqg==",
- "requires": {
- "@xmldom/xmldom": "^0.8.8",
- "xpath": "0.0.32"
- }
- },
- "xml-encryption": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.0.2.tgz",
- "integrity": "sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg==",
- "requires": {
- "@xmldom/xmldom": "^0.8.5",
- "escape-html": "^1.0.3",
- "xpath": "0.0.32"
- }
- },
- "xml2js": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
- "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- },
- "dependencies": {
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- }
- }
- },
- "xpath": {
- "version": "0.0.32",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
- "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
- }
- }
- },
- "@node-saml/passport-saml": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@node-saml/passport-saml/-/passport-saml-4.0.4.tgz",
- "integrity": "sha512-xFw3gw0yo+K1mzlkW15NeBF7cVpRHN/4vpjmBKzov5YFImCWh/G0LcTZ8krH3yk2/eRPc3Or8LRPudVJBjmYaw==",
- "requires": {
- "@node-saml/node-saml": "^4.0.4",
- "@types/express": "^4.17.14",
- "@types/passport": "^1.0.11",
- "@types/passport-strategy": "^0.2.35",
- "passport": "^0.6.0",
- "passport-strategy": "^1.0.0"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@octokit/endpoint": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
- "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
- "requires": {
- "@octokit/types": "^6.0.3",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
- },
- "dependencies": {
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
- }
- }
- },
- "@octokit/openapi-types": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
- "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA=="
- },
- "@octokit/request": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
- "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
- "requires": {
- "@octokit/endpoint": "^6.0.1",
- "@octokit/request-error": "^2.1.0",
- "@octokit/types": "^6.16.1",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
- },
- "dependencies": {
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
- }
- }
- },
- "@octokit/request-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
- "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
- "requires": {
- "@octokit/types": "^6.0.3",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
- }
- },
- "@octokit/types": {
- "version": "6.34.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
- "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
- "requires": {
- "@octokit/openapi-types": "^11.2.0"
- }
- },
- "@opentelemetry/api": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
- "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA=="
- },
- "@opentelemetry/api-logs": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.41.2.tgz",
- "integrity": "sha512-JEV2RAqijAFdWeT6HddYymfnkiRu2ASxoTBr4WsnGJhOjWZkEy6vp+Sx9ozr1NaIODOa2HUyckExIqQjn6qywQ==",
- "requires": {
- "@opentelemetry/api": "^1.0.0"
- }
- },
- "@opentelemetry/auto-instrumentations-node": {
- "version": "0.39.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.39.2.tgz",
- "integrity": "sha512-rC8r7rx8U0XT/0F3TyMCyP+lkFeWyenkfeVR2OPvo685TQRA5byTEu4+C3ZHNSbGNcvGUamcSsa0DQ6AvKlINQ==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/instrumentation-amqplib": "^0.33.1",
- "@opentelemetry/instrumentation-aws-lambda": "^0.37.0",
- "@opentelemetry/instrumentation-aws-sdk": "^0.36.0",
- "@opentelemetry/instrumentation-bunyan": "^0.32.1",
- "@opentelemetry/instrumentation-cassandra-driver": "^0.33.1",
- "@opentelemetry/instrumentation-connect": "^0.32.1",
- "@opentelemetry/instrumentation-cucumber": "^0.1.0",
- "@opentelemetry/instrumentation-dataloader": "^0.5.1",
- "@opentelemetry/instrumentation-dns": "^0.32.2",
- "@opentelemetry/instrumentation-express": "^0.33.1",
- "@opentelemetry/instrumentation-fastify": "^0.32.2",
- "@opentelemetry/instrumentation-fs": "^0.8.1",
- "@opentelemetry/instrumentation-generic-pool": "^0.32.2",
- "@opentelemetry/instrumentation-graphql": "^0.35.1",
- "@opentelemetry/instrumentation-grpc": "^0.41.2",
- "@opentelemetry/instrumentation-hapi": "^0.33.0",
- "@opentelemetry/instrumentation-http": "^0.41.2",
- "@opentelemetry/instrumentation-ioredis": "^0.35.1",
- "@opentelemetry/instrumentation-knex": "^0.32.1",
- "@opentelemetry/instrumentation-koa": "^0.36.0",
- "@opentelemetry/instrumentation-lru-memoizer": "^0.33.1",
- "@opentelemetry/instrumentation-memcached": "^0.32.1",
- "@opentelemetry/instrumentation-mongodb": "^0.37.0",
- "@opentelemetry/instrumentation-mongoose": "^0.33.1",
- "@opentelemetry/instrumentation-mysql": "^0.34.1",
- "@opentelemetry/instrumentation-mysql2": "^0.34.1",
- "@opentelemetry/instrumentation-nestjs-core": "^0.33.1",
- "@opentelemetry/instrumentation-net": "^0.32.1",
- "@opentelemetry/instrumentation-pg": "^0.36.1",
- "@opentelemetry/instrumentation-pino": "^0.34.1",
- "@opentelemetry/instrumentation-redis": "^0.35.1",
- "@opentelemetry/instrumentation-redis-4": "^0.35.1",
- "@opentelemetry/instrumentation-restify": "^0.34.0",
- "@opentelemetry/instrumentation-router": "^0.33.1",
- "@opentelemetry/instrumentation-socket.io": "^0.34.1",
- "@opentelemetry/instrumentation-tedious": "^0.6.1",
- "@opentelemetry/instrumentation-winston": "^0.32.1",
- "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.1",
- "@opentelemetry/resource-detector-aws": "^1.3.1",
- "@opentelemetry/resource-detector-container": "^0.3.1",
- "@opentelemetry/resource-detector-gcp": "^0.29.1",
- "@opentelemetry/resources": "^1.12.0",
- "@opentelemetry/sdk-node": "^0.41.2"
- }
- },
- "@opentelemetry/context-async-hooks": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.15.2.tgz",
- "integrity": "sha512-VAMHG67srGFQDG/N2ns5AyUT9vUcoKpZ/NpJ5fDQIPfJd7t3ju+aHwvDsMcrYBWuCh03U3Ky6o16+872CZchBg==",
- "requires": {}
- },
- "@opentelemetry/context-zone": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-zone/-/context-zone-1.15.2.tgz",
- "integrity": "sha512-VdzdaETT7Tm7OXRGLe+I01L0MERR+eMcKK7KLbIyLQFA4ThVWK5TUW+A28jQQ1P0UfHRPw/kub7162yUui5YKw==",
- "dev": true,
- "requires": {
- "@opentelemetry/context-zone-peer-dep": "1.15.2",
- "zone.js": "^0.11.0"
- }
- },
- "@opentelemetry/context-zone-peer-dep": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-1.15.2.tgz",
- "integrity": "sha512-AEi2rTyLCL6y8jjD33lSQ6tEUMOT4QJH6Ep1RpT56UdkrPQbf60uUSuSx5Ufpms0DNZt2AnFZYShzfYUZmvOJQ==",
- "dev": true,
- "requires": {}
- },
- "@opentelemetry/core": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz",
- "integrity": "sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw==",
- "requires": {
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/exporter-jaeger": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.15.2.tgz",
- "integrity": "sha512-BwYd5836GYvuiQcF4l5X0ca09jGJr/F37MMGyz94VH0b1dp0uYBwRJw2CQh56RlVZEdpKv29JyDRVZ/4UrRgLQ==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2",
- "jaeger-client": "^3.15.0"
- }
- },
- "@opentelemetry/exporter-trace-otlp-grpc": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.41.2.tgz",
- "integrity": "sha512-tRM/mq7PFj7mXCws5ICMVp/rmgU93JvZdoLE0uLj4tugNz231u2ZgeRYXulBjdeHM88ZQSsWTJMu2mvr/3JV1A==",
- "requires": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/otlp-grpc-exporter-base": "0.41.2",
- "@opentelemetry/otlp-transformer": "0.41.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- },
- "dependencies": {
- "@opentelemetry/otlp-transformer": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz",
- "integrity": "sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA==",
- "requires": {
- "@opentelemetry/api-logs": "0.41.2",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-logs": "0.41.2",
- "@opentelemetry/sdk-metrics": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- }
- }
- }
- },
- "@opentelemetry/exporter-trace-otlp-http": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.2.tgz",
- "integrity": "sha512-Y0fGLipjZXLMelWtlS1/MDtrPxf25oM408KukRdkN31a1MEFo4h/ZkNwS7ZfmqHGUa+4rWRt2bi6JBiqy7Ytgw==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/otlp-exporter-base": "0.41.2",
- "@opentelemetry/otlp-transformer": "0.41.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- },
- "dependencies": {
- "@opentelemetry/otlp-transformer": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz",
- "integrity": "sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA==",
- "requires": {
- "@opentelemetry/api-logs": "0.41.2",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-logs": "0.41.2",
- "@opentelemetry/sdk-metrics": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- }
- }
- }
- },
- "@opentelemetry/exporter-trace-otlp-proto": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.41.2.tgz",
- "integrity": "sha512-IGZga9IIckqYE3IpRE9FO9G5umabObIrChlXUHYpMJtDgx797dsb3qXCvLeuAwB+HoB8NsEZstlzmLnoa6/HmA==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/otlp-exporter-base": "0.41.2",
- "@opentelemetry/otlp-proto-exporter-base": "0.41.2",
- "@opentelemetry/otlp-transformer": "0.41.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- },
- "dependencies": {
- "@opentelemetry/otlp-transformer": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz",
- "integrity": "sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA==",
- "requires": {
- "@opentelemetry/api-logs": "0.41.2",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-logs": "0.41.2",
- "@opentelemetry/sdk-metrics": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2"
- }
- }
- }
- },
- "@opentelemetry/exporter-zipkin": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.15.2.tgz",
- "integrity": "sha512-j9dPe8tyx4KqIqJAfZ/LCYfkF9+ggsT0V1+bVg9ZKTBNcLf5dTsTMdcxUxc/9s599kgcn6UERnti/tozbzwa6Q==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/instrumentation": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz",
- "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==",
- "requires": {
- "@types/shimmer": "^1.0.2",
- "import-in-the-middle": "1.4.2",
- "require-in-the-middle": "^7.1.1",
- "semver": "^7.5.1",
- "shimmer": "^1.2.1"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "require-in-the-middle": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz",
- "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==",
- "requires": {
- "debug": "^4.1.1",
- "module-details-from-path": "^1.0.3",
- "resolve": "^1.22.1"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@opentelemetry/instrumentation-amqplib": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.33.1.tgz",
- "integrity": "sha512-Eg797WDHVDcRr6+5tihh7ab+ZjS5yCOoW4PkUYCcJHVT31AGfi+PlkLgHknW+uT1oKijMC4D1p6jDa/2rzRv/g==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-aws-lambda": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.37.0.tgz",
- "integrity": "sha512-jGXW3iQhs/g9ckq2zbk16o3+LKBhZv96Ghhh2IomxLMm4aNTZgoVMgw6mdwtXxmjcpJoG0K1HK4amxSMLV/mUA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/propagator-aws-xray": "^1.3.1",
- "@opentelemetry/resources": "^1.8.0",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/aws-lambda": "8.10.119"
- }
- },
- "@opentelemetry/instrumentation-aws-sdk": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.36.0.tgz",
- "integrity": "sha512-I7lOeAxjH9GZbmsqf5YnxwD9btliHHQztySgq2gO2P3zF0Wzd75rBEexbHcIyo/YoQiKpfcWfiNGw9NWgJPleQ==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/propagation-utils": "^0.30.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-bunyan": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.32.1.tgz",
- "integrity": "sha512-TjH357ldA5DpK09XUDWffqV9Km++N9H0dwmxHrElM2TSe4Usgkgw6mlodbuh45hoVDD+cCPi+GO6Dq1QLVEdZg==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@types/bunyan": "1.8.8"
- }
- },
- "@opentelemetry/instrumentation-cassandra-driver": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.33.1.tgz",
- "integrity": "sha512-nn8XtLB1XmViEAnNnZ43jHojYxgNJ1W+QF2B3yBmfVqXJnE0IbzhIiPmU+Zx3ZSzIoWS0EQQM3ljcgDC03FZ7A==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-connect": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.32.1.tgz",
- "integrity": "sha512-QHi0hTXtqZj3wSyvKwFmkGYHRnGdl8w76MHZj3Rekxe4ILpcn78fZGJSbA+0eYdOWHnGP0c483uMOeGH08XYmA==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/connect": "3.4.35"
- }
- },
- "@opentelemetry/instrumentation-cucumber": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.1.0.tgz",
- "integrity": "sha512-xSJBLKSjdBWzT8mYgsEt0RW9i0gBPRDh/lL9WXjTv7E1SMWyVAxMLURV+KfVmRjRltwlgXi+/j70dY+k88Q5ZA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-dataloader": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.5.1.tgz",
- "integrity": "sha512-dqYITnlCo7FSZ8mhyxh9TtogwcebGcuMaXTjYDyIKGshDcjCxhvhNjFDe4y3RD/g/EFKINkYVkVXB1lDqZdxTA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-dns": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.32.2.tgz",
- "integrity": "sha512-6KNN35ot/qyOQN0jh/+9mGCFeWM40fhcJWgg82D0syuxQq2YaUvyGLw6FAi7f0xxaeOPLCQxSK5wL9jTn3KF2g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "semver": "^7.5.4"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@opentelemetry/instrumentation-express": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.33.1.tgz",
- "integrity": "sha512-awrpiTZWnLOCJ4TeDMTrs6/gH/oXbNipoPx3WUKQlA1yfMlpNynqokTyCYv1n10Zu9Y2P/nIhoNnUw0ywp61nA==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/express": "4.17.17"
- }
- },
- "@opentelemetry/instrumentation-fastify": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.32.2.tgz",
- "integrity": "sha512-DKa7SgxTtZ0O1ngGtAdwr/g8XguYw6KvLNME+J8rt6QpWQM+xytS0bg4atZAyt6aeYr/kO1sMrGXSlHEEYWIhg==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-fs": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.8.1.tgz",
- "integrity": "sha512-a5U6ydfqVeT4Zp6GL5lZDZNJAmic3CCtgg/f2yqvnpq2fE0cyD/XlW9JWzGhAJaq29E1bxtb9FJ0n6ee3c9dYQ==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-generic-pool": {
- "version": "0.32.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.32.2.tgz",
- "integrity": "sha512-HMAkKOfSZMKy4YfDLwSByR2q74pk3TMpSxgwWYLeezNpscnNAc4mtZtbWdUL62v8IaCXIc/qizwQYkcKqvGnZQ==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-graphql": {
- "version": "0.35.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.35.1.tgz",
- "integrity": "sha512-bAM4W5wU0lZ1UIKK/5b4p8LEU8N6W+VgpcnUIK7GTTDxdhcWTd3Q6oyS6nauhZSzEnAEmmJVXaLQAGIU4sEkyA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-grpc": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.41.2.tgz",
- "integrity": "sha512-+fh9GUFv97p25CMreUv4OdP5L21hPgfX3d4fuQ0KIgIZIaX2M6/8cr5Ik+8zWsyhYzfFX3CKq6BXm3UBg7cswQ==",
- "requires": {
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/instrumentation-hapi": {
- "version": "0.33.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.33.0.tgz",
- "integrity": "sha512-c+I/25OrovuSdeb/OQIZIVTSiatTcH+KE8Nna0xAnwaG4H7Q7eoGet7IBPzNTbunXY9Xt77oFVsN1TMeXeDktg==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/hapi__hapi": "20.0.13"
- }
- },
- "@opentelemetry/instrumentation-http": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.41.2.tgz",
- "integrity": "sha512-dzOC6xkfK0LM6Dzo91aInLdSbdIzKA0IgSDnyLi6YZ0Z7c1bfrFncFx/3gZs8vi+KXLALgfMlpzE7IYDW/cM3A==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/semantic-conventions": "1.15.2",
- "semver": "^7.5.1"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@opentelemetry/instrumentation-ioredis": {
- "version": "0.35.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.35.1.tgz",
- "integrity": "sha512-lixraoS9rs81783QRjQ56/S5KzVBllC+zs7UJuTGODi5Egn/YMGp5lNnlbkUxeJl9LMyADMiP7ZGpQtfKwdc3g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/ioredis4": "npm:@types/ioredis@^4.28.10"
- }
- },
- "@opentelemetry/instrumentation-knex": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.32.1.tgz",
- "integrity": "sha512-s+5BtsYUendDTrWAxkr50X3+kb+sVffFzp4z5DC+aZt52P/kF85wm6GyC1mREvvhhK2UKrCq2yMVKD90z0FKsA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-koa": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.36.0.tgz",
- "integrity": "sha512-4VRvaFeLAnxG+BQr7pZyWyjsM6RdPWkrwsgZTLFYdI1yTpePoyParfz04vJKPMW55ZJ749g15K2dUy6gVUV41Q==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/koa": "2.13.8",
- "@types/koa__router": "8.0.11"
- }
- },
- "@opentelemetry/instrumentation-lru-memoizer": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.33.1.tgz",
- "integrity": "sha512-1FFOlGTEigMWppEkv7o+IyeyWTXXpFAfmcFjJRph5m88RsotgzPLCnxaSeS0GMU7E8UJplusNmmsnu7jPJ2YqA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-memcached": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.32.1.tgz",
- "integrity": "sha512-laolY41/k6KHYnBQrWpnMlEK49/g8/OQBtvSiPdHiF46wW3eWpXmaTGMRksrRGUtyE+VMRhf7WIDRUYLZULP1g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/memcached": "^2.2.6"
- }
- },
- "@opentelemetry/instrumentation-mongodb": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.37.0.tgz",
- "integrity": "sha512-Fwuwf7Fsx/F3QXtU6hbxU4D6DtT33YkAr0+fjtR7qTEcAU0YOxCZfy4tlX2jxjxR1ze8tKfaAWhXBxXwLMWT3g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/sdk-metrics": "^1.9.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-mongoose": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.33.1.tgz",
- "integrity": "sha512-IzYcEZSmlaOlkyACt8gTl0z3eEQafxzEAt/+W+FdNBiUdm81qpVx/1bpzJwSgIsgcLf27Dl5WsPmrSAi4+Bcng==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-mysql": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.34.1.tgz",
- "integrity": "sha512-zQq7hN3ILm1vIJCGeKHRc4pTK8LOmkTt8oKWf0v+whFs7axieIhXZMoCqIBm6BigLy3Trg5iaKyuSrx7kO6q2g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/mysql": "2.15.21"
- }
- },
- "@opentelemetry/instrumentation-mysql2": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.34.1.tgz",
- "integrity": "sha512-SPwgLI2H+gH+GP7b5cWQlFqO/7UeHvw6ZzFKxwLr4vy8wmxYF4aBMLc8qVO8bdXFHd114v0IzOIAvpG6sl/zYQ==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@opentelemetry/sql-common": "^0.40.0"
- }
- },
- "@opentelemetry/instrumentation-nestjs-core": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.33.1.tgz",
- "integrity": "sha512-Y5Khvp8ODA6TuDcZKAc63cYDeeZAA/n0ceF0pcVCJwA2NBeD0hmTrCJXES2cvt7wVbHV/SYCu7OpYDQkNjbBWw==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-net": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.32.1.tgz",
- "integrity": "sha512-r9YC8fFDi+B/JiNfMn+vJaOpgdA83bQM3u4mW9mJi2hAI/LcvjJYPx4aTRLWAPSd/HRG/Olzdvx5LdWvzL8LHg==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-pg": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.36.1.tgz",
- "integrity": "sha512-k8L7RSRTQ6e+DbHEXZB8Tmf/efkQnWKeClpZb3TEdb34Pvme4PmcpG2zb6JtM99nNrshNlVDLCZ90U3xDneTbw==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@opentelemetry/sql-common": "^0.40.0",
- "@types/pg": "8.6.1",
- "@types/pg-pool": "2.0.3"
- }
- },
- "@opentelemetry/instrumentation-pino": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.34.1.tgz",
- "integrity": "sha512-/FW/wxTshwwmiSE8KgVoWvfjxz5omKBdDbP0McKZk84V02lwwJk0m7+kc2cSOed5rk7iprpZolwO8a8AFVanNA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-redis": {
- "version": "0.35.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.35.1.tgz",
- "integrity": "sha512-zY7eTzGyJCMX/0o04Q9yLy7gllf7Zh4s+g7Kv1d2cMLtTt9zGSlncqj49uNCnneywnpMNRUIwcmd+Ch1bQeh+g==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-redis-4": {
- "version": "0.35.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.35.1.tgz",
- "integrity": "sha512-tQ07wvtjUbHSvvhPPvWyZjYTSzVBTpC746ro5szLnniodvxtKkmP/N+R9KyFXfyH7wwaLIR1Scgq3XSGSppt+Q==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/redis-common": "^0.36.1",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-restify": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.34.0.tgz",
- "integrity": "sha512-KQZxg6aTaeDXk0NSjdY1Zd1N4BPnefFqOaTk/QuXElASwUGVwJESRvOVXfhtM+3sILbMccwSwPYwqSowYQn0LA==",
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-router": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.33.1.tgz",
- "integrity": "sha512-nz8PvjYMQWFgR17Yc5Sj624CamhXP021mWaWfHx6RhI6o67sPt+DT5468yZJZV1gMnaOSQfiBkjWZ7AGQkRutw==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-socket.io": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.34.1.tgz",
- "integrity": "sha512-v9US0hXJaY7dkKOC2/CMLB526wn9F3CQrkeVUidvSm+AxFBoYXKdAUJijdBPWT4PKY98/VjFHuZ3HSe4QD8zPA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-tedious": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.6.1.tgz",
- "integrity": "sha512-zwgLKmWtAn0XsMb98aMaI7gCawzPqpy+LOgGTlYmUdqSVYnzMAn4QKrx24Rrd5pgmzOEIbAWHlpN7pOc1eIqxA==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "@types/tedious": "^4.0.6"
- }
- },
- "@opentelemetry/instrumentation-winston": {
- "version": "0.32.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.32.1.tgz",
- "integrity": "sha512-wgXb2W2cbNdRQfXTH0jcnfbhlVPapmu13Wqhedj2pMpXS2aBnWAdvNFlArS6q84MEhzv3A4fVevjbwXa4uCzwQ==",
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-xml-http-request": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-xml-http-request/-/instrumentation-xml-http-request-0.41.2.tgz",
- "integrity": "sha512-lRj9JPSVoE/lReUQ8afekoCyEAGdIWNrzF42Kv63cf5CCMqB/aoHH+NdnSXZ5ANsOvNQ9H65qTsqCbwkzn1x6g==",
- "dev": true,
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/sdk-trace-web": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/otlp-exporter-base": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz",
- "integrity": "sha512-pfwa6d+Dax3itZcGWiA0AoXeVaCuZbbqUTsCtOysd2re8C2PWXNxDONUfBWsn+KgxAdi+ljwTjJGiaVLDaIEvQ==",
- "requires": {
- "@opentelemetry/core": "1.15.2"
- }
- },
- "@opentelemetry/otlp-grpc-exporter-base": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.41.2.tgz",
- "integrity": "sha512-OErK8dYjXG01XIMIpmOV2SzL9ctkZ0Nyhf2UumICOAKtgLvR5dG1JMlsNVp8Jn0RzpsKc6Urv7JpP69wzRXN+A==",
- "requires": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/otlp-exporter-base": "0.41.2",
- "protobufjs": "^7.2.3"
- }
- },
- "@opentelemetry/otlp-proto-exporter-base": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.41.2.tgz",
- "integrity": "sha512-BxmEMiP6tHiFroe5/dTt9BsxCci7BTLtF7A6d4DKHLiLweWWZxQ9l7hON7qt/IhpKrQcAFD1OzZ1Gq2ZkNzhCw==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/otlp-exporter-base": "0.41.2",
- "protobufjs": "^7.2.3"
- }
- },
- "@opentelemetry/propagation-utils": {
- "version": "0.30.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.1.tgz",
- "integrity": "sha512-GCZg19gBSOTCeHvSCVy08WUyKAp2LyIRcRQPZk8MMAbmz8JWha3huBS9tNXjB4hYwRqW2SJOZzoYjt2P/BxvEw==",
- "requires": {}
- },
- "@opentelemetry/propagator-aws-xray": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz",
- "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==",
- "requires": {
- "@opentelemetry/core": "^1.0.0"
- }
- },
- "@opentelemetry/propagator-b3": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.15.2.tgz",
- "integrity": "sha512-ZSrL3DpMEDsjD8dPt9Ze3ue53nEXJt512KyxXlLgLWnSNbe1mrWaXWkh7OLDoVJh9LqFw+tlvAhDVt/x3DaFGg==",
- "requires": {
- "@opentelemetry/core": "1.15.2"
- }
- },
- "@opentelemetry/propagator-jaeger": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.15.2.tgz",
- "integrity": "sha512-6m1yu7PVDIRz6BwA36lacfBZJCfAEHKgu+kSyukNwVdVjsTNeyD9xNPQnkl0WN7Rvhk8/yWJ83tLPEyGhk1wCQ==",
- "requires": {
- "@opentelemetry/core": "1.15.2"
- }
- },
- "@opentelemetry/redis-common": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.1.tgz",
- "integrity": "sha512-YjfNEr7DK1Ymc5H0bzhmqVvMcCs+PUEUerzrpTFdHfZxj3HpnnjZTIFKx/gxiL/sajQ8dxycjlreoYTVYKBXlw=="
- },
- "@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.28.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.1.tgz",
- "integrity": "sha512-0ucRgwid6bSAgYL5fiTkLh7aS9cPyz+Ijyv961SZbpMeIgVBvU931676xrdGNqlmuxavt24BrNUUWZ4XKq8ViA==",
- "requires": {
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/resource-detector-aws": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.3.1.tgz",
- "integrity": "sha512-1n3U0ns0xlA8EIOMY1oEP5+5rZE/nfhIld6nw8T8PK4PkS3kAQb1ZCj3RXajs3qA+qWWIaEvCNREx3A0Ifyt3Q==",
- "requires": {
- "@opentelemetry/core": "^1.0.0",
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/resource-detector-container": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.1.tgz",
- "integrity": "sha512-7zQASISRLmsaCKurvaoi7kTa0ab4iQEvPVfRo4k5RLSVi4puaCcC+2qOd6Fk4jEqNueevhyn2upGUeH+0EJ6yQ==",
- "requires": {
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/resource-detector-gcp": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.1.tgz",
- "integrity": "sha512-u5mB53I49m0cXQ97dgZlgEnNin9xqwl9au2sXmblHG9XS6PocGoAgAiXGYYvITWhR3ID5Ei2GyGoJDFdAtCrVA==",
- "requires": {
- "@opentelemetry/core": "^1.0.0",
- "@opentelemetry/resources": "^1.0.0",
- "@opentelemetry/semantic-conventions": "^1.0.0",
- "gcp-metadata": "^5.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- }
- }
- },
- "@opentelemetry/resources": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz",
- "integrity": "sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/sdk-logs": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz",
- "integrity": "sha512-smqKIw0tTW15waj7BAPHFomii5c3aHnSE4LQYTszGoK5P9nZs8tEAIpu15UBxi3aG31ZfsLmm4EUQkjckdlFrw==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2"
- }
- },
- "@opentelemetry/sdk-metrics": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz",
- "integrity": "sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "lodash.merge": "^4.6.2"
- }
- },
- "@opentelemetry/sdk-node": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.41.2.tgz",
- "integrity": "sha512-t3vaB5ajoXLtVFoL8TSoSgaVATmOyUfkIfBE4nvykm0dM2vQjMS/SUUelzR06eiPTbMPsr2UkevWhy2/oXy2vg==",
- "requires": {
- "@opentelemetry/api-logs": "0.41.2",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/exporter-jaeger": "1.15.2",
- "@opentelemetry/exporter-trace-otlp-grpc": "0.41.2",
- "@opentelemetry/exporter-trace-otlp-http": "0.41.2",
- "@opentelemetry/exporter-trace-otlp-proto": "0.41.2",
- "@opentelemetry/exporter-zipkin": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/sdk-logs": "0.41.2",
- "@opentelemetry/sdk-metrics": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "@opentelemetry/sdk-trace-node": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/sdk-trace-base": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz",
- "integrity": "sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ==",
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/resources": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/sdk-trace-node": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.15.2.tgz",
- "integrity": "sha512-5deakfKLCbPpKJRCE2GPI8LBE2LezyvR17y3t37ZI3sbaeogtyxmBaFV+slmG9fN8OaIT+EUsm1QAT1+z59gbQ==",
- "requires": {
- "@opentelemetry/context-async-hooks": "1.15.2",
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/propagator-b3": "1.15.2",
- "@opentelemetry/propagator-jaeger": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "semver": "^7.5.1"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@opentelemetry/sdk-trace-web": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.15.2.tgz",
- "integrity": "sha512-OjCrwtu4b+cAt540wyIr7d0lCA/cY9y42lmYDFUfJ8Ixj2bByIUJ4yyd9M7mXHpQHdiR/Kq2vzsgS14Uj+RU0Q==",
- "dev": true,
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/sdk-trace-base": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/semantic-conventions": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz",
- "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw=="
- },
- "@opentelemetry/sql-common": {
- "version": "0.40.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.0.tgz",
- "integrity": "sha512-vSqRJYUPJVjMFQpYkQS3ruexCPSZJ8esne3LazLwtCPaPRvzZ7WG3tX44RouAn7w4wMp8orKguBqtt+ng2UTnw==",
- "requires": {
- "@opentelemetry/core": "^1.1.0"
- }
- },
- "@otplib/core": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz",
- "integrity": "sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA=="
- },
- "@otplib/plugin-crypto": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz",
- "integrity": "sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g==",
- "requires": {
- "@otplib/core": "^12.0.1"
- }
- },
- "@otplib/plugin-thirty-two": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz",
- "integrity": "sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA==",
- "requires": {
- "@otplib/core": "^12.0.1",
- "thirty-two": "^1.0.2"
- }
- },
- "@otplib/preset-default": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz",
- "integrity": "sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ==",
- "requires": {
- "@otplib/core": "^12.0.1",
- "@otplib/plugin-crypto": "^12.0.1",
- "@otplib/plugin-thirty-two": "^12.0.1"
- }
- },
- "@otplib/preset-v11": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz",
- "integrity": "sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg==",
- "requires": {
- "@otplib/core": "^12.0.1",
- "@otplib/plugin-crypto": "^12.0.1",
- "@otplib/plugin-thirty-two": "^12.0.1"
- }
- },
- "@overleaf/access-token-encryptor": {
- "version": "file:libraries/access-token-encryptor",
- "requires": {
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "sandboxed-module": "^2.0.4",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/analytics": {
- "version": "file:services/analytics",
- "requires": {
- "@google-cloud/bigquery": "^5.9.0",
- "@google-cloud/storage": "^6.10.1",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "@overleaf/stream-utils": "^0.1.0",
- "@pollyjs/adapter-node-http": "^6.0.6",
- "@pollyjs/core": "^6.0.6",
- "@pollyjs/persister-fs": "^6.0.6",
- "bluebird": "^3.7.2",
- "body-parser": "^1.20.3",
- "bull": "^3.18.0",
- "camelcase-keys": "^4.2.0",
- "celebrate": "^15.0.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "csv": "^5.4.0",
- "east": "^2.0.3",
- "express": "^4.21.0",
- "joi": "^17.12.0",
- "json2csv": "^4.5.4",
- "lodash": "^4.17.21",
- "minimist": "^1.2.7",
- "mixpanel": "^0.13.0",
- "mocha": "^10.2.0",
- "moment": "^2.29.4",
- "mongodb": "^6.1.0",
- "p-limit": "^2.3.0",
- "pg": "^8.7.1",
- "pg-copy-streams": "^2.2.2",
- "promptly": "^3.0.3",
- "recurly": "^4.0.1",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "sequelize": "^6.31.0",
- "sequelize-cli": "^6.6.0",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "typescript": "^5.0.4",
- "yargs": "^17.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- }
- }
- },
- "@overleaf/chat": {
- "version": "file:services/chat",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/settings": "*",
- "acorn": "^7.1.1",
- "ajv": "^6.12.0",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "exegesis-express": "^4.0.0",
- "express": "^4.21.0",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "timekeeper": "^2.2.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- }
- }
- },
- "@overleaf/clsi": {
- "version": "file:services/clsi",
- "requires": {
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/settings": "*",
- "@types/workerpool": "^6.1.0",
- "archiver": "5.3.2",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "diskusage": "^1.1.3",
- "dockerode": "^3.1.0",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "mock-fs": "^5.1.2",
- "node-fetch": "^2.7.0",
- "p-limit": "^3.1.0",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "send": "^0.19.0",
- "sinon": "~9.0.1",
- "sinon-chai": "^3.7.0",
- "timekeeper": "2.2.0",
- "typescript": "^5.0.4",
- "workerpool": "^6.1.5"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "sinon": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz",
- "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.1.0",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/clsi-perf": {
- "version": "file:services/clsi-perf",
- "requires": {
- "@google-cloud/bigquery": "^5.6.0",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/o-error": "*",
- "@overleaf/settings": "*",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "cookie": "^0.4.1",
- "express": "^4.21.0",
- "glob": "^7.2.0",
- "mocha": "^10.2.0",
- "p-limit": "^3.1.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
- }
- }
- },
- "@overleaf/codemirror-tree-view": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@overleaf/codemirror-tree-view/-/codemirror-tree-view-0.1.3.tgz",
- "integrity": "sha512-/ysOnX+ovObqj0uR78tumQtK/y0qFwbawcCGxT9JDeyJPgfPrK3PYTIvoZ1SgmSxaXpOPkds7aL+4Hv6VWZqSw==",
- "dev": true,
- "requires": {}
- },
- "@overleaf/contacts": {
- "version": "file:services/contacts",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "esmock": "^2.6.3",
- "express": "^4.21.0",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
- "request": "~2.88.2",
- "sinon": "~9.0.1",
- "sinon-chai": "^3.7.0",
- "typescript": "^5.0.4",
- "underscore": "~1.13.1"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- },
- "sinon": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz",
- "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.1.0",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/docstore": {
- "version": "file:services/docstore",
- "requires": {
- "@google-cloud/storage": "^6.10.1",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/object-persistor": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/settings": "*",
- "@overleaf/stream-utils": "^0.1.0",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "celebrate": "^15.0.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "p-map": "^4.0.0",
- "request": "^2.88.2",
- "sandboxed-module": "~2.0.4",
- "sinon": "~9.0.2",
- "sinon-chai": "^3.7.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "sinon": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz",
- "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.1.0",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/document-updater": {
- "version": "file:services/document-updater",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/ranges-tracker": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "@types/chai-as-promised": "^7.1.8",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "cluster-key-slot": "^1.0.5",
- "diff-match-patch": "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "minimist": "^1.2.8",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "request": "^2.88.2",
- "requestretry": "^7.1.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "timekeeper": "^2.0.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/eslint-plugin": {
- "version": "file:libraries/eslint-plugin",
- "requires": {
- "@typescript-eslint/parser": "^6.7.5",
- "eslint": "^8.51.0",
- "lodash": "^4.17.21"
- },
- "dependencies": {
- "@typescript-eslint/parser": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
- "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "6.21.0",
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/typescript-estree": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0",
- "debug": "^4.3.4"
- }
- },
- "debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "@overleaf/fetch-utils": {
- "version": "file:libraries/fetch-utils",
- "requires": {
- "@overleaf/o-error": "*",
- "@types/node-fetch": "^2.6.11",
- "body-parser": "^1.20.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "node-fetch": "^2.7.0",
- "selfsigned": "^2.4.1",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/filestore": {
- "version": "file:services/filestore",
- "requires": {
- "@google-cloud/storage": "^6.10.1",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/object-persistor": "*",
- "@overleaf/settings": "*",
- "@overleaf/stream-utils": "^0.1.0",
- "aws-sdk": "^2.718.0",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "disrequire": "^1.1.0",
- "express": "^4.21.0",
- "glob": "^7.1.6",
- "lodash.once": "^4.1.1",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
- "node-fetch": "^2.7.0",
- "range-parser": "^1.2.1",
- "sandboxed-module": "2.0.4",
- "sinon": "9.0.2",
- "sinon-chai": "^3.7.0",
- "streamifier": "^0.1.1",
- "timekeeper": "^2.2.0",
- "tiny-async-pool": "^1.1.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dev": true,
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- },
- "sinon": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz",
- "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.0.3",
- "diff": "^4.0.2",
- "nise": "^4.0.1",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/github-sync": {
- "version": "file:services/github-sync",
- "requires": {
- "@octokit/request": "^5.6.3",
- "@overleaf/access-token-encryptor": "*",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "base64-stream": "^0.1.2",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "octonode": "^0.9.5",
- "p-limit": "^2.2.0",
- "randomstring": "^1.1.5",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "timekeeper": "2.2.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- }
- }
- },
- "@overleaf/idp": {
- "version": "file:services/idp",
- "requires": {
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "ejs": "^3.1.10",
- "express": "^4.21.0",
- "mocha": "^10.2.0",
- "samlp": "^7.0.2",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/logger": {
- "version": "file:libraries/logger",
- "requires": {
- "@google-cloud/logging-bunyan": "^5.1.0",
- "@overleaf/fetch-utils": "*",
- "@overleaf/o-error": "*",
- "@sentry/node": "^6.13.2",
- "bunyan": "^1.8.14",
- "chai": "^4.3.6",
- "mocha": "^10.2.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/metrics": {
- "version": "file:libraries/metrics",
- "requires": {
- "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.1.0",
- "@google-cloud/profiler": "^6.0.0",
- "@opentelemetry/api": "^1.4.1",
- "@opentelemetry/auto-instrumentations-node": "^0.39.1",
- "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
- "@opentelemetry/resources": "^1.15.2",
- "@opentelemetry/sdk-node": "^0.41.2",
- "@opentelemetry/semantic-conventions": "^1.15.2",
- "bunyan": "^1.0.0",
- "chai": "^4.3.6",
- "compression": "^1.7.4",
- "mocha": "^10.2.0",
- "prom-client": "^14.1.1",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4",
- "yn": "^3.1.1"
- },
- "dependencies": {
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
- }
- }
- },
- "@overleaf/notifications": {
- "version": "file:services/notifications",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "method-override": "^3.0.0",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/o-error": {
- "version": "file:libraries/o-error",
- "requires": {
- "@types/chai": "^4.3.0",
- "@types/node": "^18.17.4",
- "chai": "^4.3.6",
- "mocha": "^10.2.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/object-persistor": {
- "version": "file:libraries/object-persistor",
- "requires": {
- "@google-cloud/storage": "^6.10.1",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "aws-sdk": "^2.718.0",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "fast-crc32c": "overleaf/node-fast-crc32c#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51",
- "glob": "^7.1.6",
- "mocha": "^10.2.0",
- "mock-fs": "^5.2.0",
- "mongodb": "^6.1.0",
- "range-parser": "^1.2.1",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "tiny-async-pool": "^1.1.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "dev": true,
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- }
- }
- },
- "@overleaf/piece-table": {
- "version": "file:libraries/piece-table",
- "requires": {
- "chai": "^4.3.6",
- "mocha": "^10.2.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/project-history": {
- "version": "file:services/project-history",
- "requires": {
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "aws-sdk": "^2.650.0",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "celebrate": "^15.0.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "cli": "^1.0.1",
- "diff-match-patch": "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688",
- "esmock": "^2.6.3",
- "express": "^4.21.0",
- "lodash": "^4.17.20",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "nock": "^13.5.3",
- "overleaf-editor-core": "*",
- "request": "^2.88.2",
- "sinon": "~9.0.1",
- "sinon-chai": "^3.7.0",
- "timekeeper": "2.2.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "sinon": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz",
- "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.1.0",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/promise-utils": {
- "version": "file:libraries/promise-utils",
- "requires": {
- "chai": "^4.3.10",
- "chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
- "p-limit": "^2.3.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "chai": {
- "version": "4.3.10",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz",
- "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
- }
- },
- "deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- }
- }
- },
- "@overleaf/ranges-tracker": {
- "version": "file:libraries/ranges-tracker",
- "requires": {
- "chai": "^4.3.6",
- "mocha": "^10.2.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/real-time": {
- "version": "file:services/real-time",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "base64id": "0.1.0",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "connect-redis": "^6.1.3",
- "cookie-parser": "^1.4.6",
- "cookie-signature": "^1.1.0",
- "express": "^4.21.0",
- "express-session": "^1.17.1",
- "joi": "^17.12.0",
- "lodash": "^4.17.21",
- "mocha": "^10.2.0",
- "proxy-addr": "^2.0.7",
- "request": "^2.88.2",
- "sandboxed-module": "~0.3.0",
- "sinon": "^9.2.4",
- "sinon-chai": "^3.7.0",
- "socket.io": "github:overleaf/socket.io#0.9.19-overleaf-10",
- "socket.io-client": "github:overleaf/socket.io-client#0.9.17-overleaf-5",
- "timekeeper": "0.0.4",
- "typescript": "^5.0.4",
- "uid-safe": "^2.1.5"
- },
- "dependencies": {
- "sandboxed-module": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-0.3.0.tgz",
- "integrity": "sha1-8fvvvYCaT2kHO9B8rm/H2y6vX2o=",
- "dev": true,
- "requires": {
- "require-like": "0.1.2",
- "stack-trace": "0.0.6"
- }
- },
- "stack-trace": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz",
- "integrity": "sha1-HnGb1qJin/CcGJ4Xqe+QKpT8XbA=",
- "dev": true
- },
- "timekeeper": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-0.0.4.tgz",
- "integrity": "sha1-kNt58X2Ni1NiFUOJSSuXJ2LP0nY=",
- "dev": true
- }
- }
- },
- "@overleaf/redis-wrapper": {
- "version": "file:libraries/redis-wrapper",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/o-error": "*",
- "async": "^3.2.5",
- "chai": "^4.3.6",
- "ioredis": "~4.27.1",
- "mocha": "^10.2.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/references": {
- "version": "file:services/references",
- "requires": {
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "ioredis": "^4.16.1",
- "lodash": "^4.17.19",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "@mongodb-js/saslprep": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
- "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
- "dev": true,
- "requires": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "dev": true,
- "requires": {
- "@types/webidl-conversions": "*"
- }
- },
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz",
- "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==",
- "dev": true,
- "requires": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- }
- },
- "mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "dev": true,
- "requires": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true
- },
- "tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "requires": {
- "punycode": "^2.3.0"
- }
- },
- "whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "dev": true,
- "requires": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "@overleaf/settings": {
- "version": "file:libraries/settings",
- "requires": {
- "mocha": "^10.2.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/spelling": {
- "version": "file:services/spelling",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "esmock": "^2.6.3",
- "express": "^4.21.0",
- "lru-cache": "^5.1.1",
- "mocha": "^10.2.0",
- "request": "^2.88.2",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4",
- "underscore": "1.13.1"
- },
- "dependencies": {
- "underscore": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
- "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
- }
- }
- },
- "@overleaf/stream-utils": {
- "version": "file:libraries/stream-utils",
- "requires": {
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/templates": {
- "version": "file:services/templates",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/settings": "*",
- "args-js": "0.10.12",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "install": "^0.13.0",
- "lodash": "^4.17.21",
- "marked": "^4.1.0",
- "method-override": "^3.0.0",
- "mocha": "^10.2.0",
- "mongoose": "^6.12.0",
- "request": "^2.88.2",
- "sandboxed-module": "^2.0.4",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/third-party-datastore": {
- "version": "file:services/third-party-datastore",
- "requires": {
- "@overleaf/access-token-encryptor": "*",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/settings": "*",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "dropbox": "^10.34.0",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "lru-cache": "^4.1.5",
- "minimatch": "^7.4.2",
- "minimist": "^1.2.8",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "node-fetch": "^2.7.0",
- "p-limit": "^2.3.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "9.0.1",
- "sinon-chai": "^3.7.0",
- "sinon-stub-promise": "^4.0.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "minimatch": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz",
- "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "sinon": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.1.tgz",
- "integrity": "sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0",
- "@sinonjs/fake-timers": "^6.0.0",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.0.3",
- "diff": "^4.0.2",
- "nise": "^4.0.1",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- }
- }
- },
- "@overleaf/thirdparty-references": {
- "version": "file:services/third-party-references",
- "requires": {
- "@overleaf/access-token-encryptor": "*",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/settings": "*",
- "@types/simple-oauth2": "^5.0.7",
- "async": "^3.2.5",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "esmock": "^2.6.3",
- "express": "^4.21.0",
- "lodash": "^4.17.21",
- "lru-cache": "^5.1.1",
- "mocha": "^10.2.0",
- "mongodb-legacy": "^6.0.1",
- "oauth": "0.9.15",
- "request": "^2.88.2",
- "simple-oauth2": "^5.0.0",
- "sinon": "9.0.2",
- "sinon-chai": "^3.7.0",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "sinon": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.2.tgz",
- "integrity": "sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.2",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/formatio": "^5.0.1",
- "@sinonjs/samsam": "^5.0.3",
- "diff": "^4.0.2",
- "nise": "^4.0.1",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@overleaf/tpdsworker": {
- "version": "file:services/tpdsworker",
- "requires": {
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.15",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "chai-http": "^4.4.0",
- "dtrace-provider": "^0.8.8",
- "express": "^4.21.0",
- "express-basic-auth": "^1.2.0",
- "ioredis": "^4.16.0",
- "lodash": "^4.17.15",
- "mocha": "^10.2.0",
- "redlock": "^4.1.0",
- "request": "^2.88.2",
- "typescript": "^5.0.4"
- }
- },
- "@overleaf/web": {
- "version": "file:services/web",
- "requires": {
- "@babel/cli": "^7.24.8",
- "@babel/core": "^7.25.2",
- "@babel/preset-env": "^7.25.3",
- "@babel/preset-react": "^7.24.7",
- "@babel/preset-typescript": "^7.24.7",
- "@babel/register": "^7.24.6",
- "@codemirror/autocomplete": "github:overleaf/codemirror-autocomplete#v6.18.0-overleaf-1",
- "@codemirror/commands": "^6.6.0",
- "@codemirror/lang-markdown": "^6.2.5",
- "@codemirror/language": "^6.10.2",
- "@codemirror/lint": "^6.8.1",
- "@codemirror/search": "github:overleaf/codemirror-search#29f7a871969ad64b89341bacbe5d46dda02eee12",
- "@codemirror/state": "^6.4.1",
- "@codemirror/view": "^6.32.0",
- "@contentful/rich-text-html-renderer": "^16.0.2",
- "@contentful/rich-text-types": "^16.0.2",
- "@google-cloud/bigquery": "^6.0.1",
- "@juggle/resize-observer": "^3.3.1",
- "@lezer/common": "^1.2.1",
- "@lezer/generator": "^1.7.0",
- "@lezer/highlight": "^1.2.0",
- "@lezer/lr": "^1.4.1",
- "@lezer/markdown": "^1.3.0",
- "@node-oauth/oauth2-server": "^5.1.0",
- "@node-saml/passport-saml": "^4.0.4",
- "@opentelemetry/api": "^1.4.1",
- "@opentelemetry/auto-instrumentations-web": "^0.33.1",
- "@opentelemetry/context-zone": "^1.15.2",
- "@opentelemetry/exporter-trace-otlp-http": "^0.41.2",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/instrumentation-document-load": "^0.33.1",
- "@opentelemetry/instrumentation-xml-http-request": "^0.41.2",
- "@opentelemetry/resources": "^1.15.2",
- "@opentelemetry/sdk-trace-base": "^1.15.2",
- "@opentelemetry/sdk-trace-web": "^1.15.2",
- "@opentelemetry/semantic-conventions": "^1.15.2",
- "@overleaf/access-token-encryptor": "*",
- "@overleaf/codemirror-tree-view": "^0.1.3",
- "@overleaf/dictionaries": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.3.tar.gz",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/object-persistor": "*",
- "@overleaf/promise-utils": "*",
- "@overleaf/ranges-tracker": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "@overleaf/stream-utils": "*",
- "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
- "@pollyjs/adapter-node-http": "^6.0.6",
- "@pollyjs/core": "^6.0.6",
- "@pollyjs/persister-fs": "^6.0.6",
- "@replit/codemirror-emacs": "overleaf/codemirror-emacs#4394c03858f27053f8768258e9493866e06e938e",
- "@replit/codemirror-indentation-markers": "overleaf/codemirror-indentation-markers#1b1f93c0bcd04293aea6986aa2275185b2c56803",
- "@replit/codemirror-vim": "overleaf/codemirror-vim#51ce0933e95705268256467fbbbcce5999ed3624",
- "@sentry/browser": "7.46.0",
- "@slack/webhook": "^7.0.2",
- "@storybook/addon-a11y": "^8.3.5",
- "@storybook/addon-essentials": "^8.3.5",
- "@storybook/addon-interactions": "^8.3.5",
- "@storybook/addon-links": "^8.3.5",
- "@storybook/addon-styling-webpack": "^1.0.0",
- "@storybook/addon-webpack5-compiler-babel": "^3.0.3",
- "@storybook/react": "^8.3.5",
- "@storybook/react-webpack5": "^8.3.5",
- "@storybook/theming": "^8.3.5",
+ "tools/saas-e2e": {
+ "name": "@overleaf/saas-e2e",
+ "devDependencies": {
+ "@isomorphic-git/lightning-fs": "^4.6.0",
"@testing-library/cypress": "^10.0.1",
- "@testing-library/dom": "^9.3.0",
- "@testing-library/react": "^12.1.5",
- "@testing-library/react-hooks": "^8.0.1",
- "@testing-library/user-event": "^14.4.3",
- "@types/bootstrap": "^5.2.10",
- "@types/bootstrap-5": "npm:@types/bootstrap@^5.2.10",
- "@types/chai": "^4.3.0",
- "@types/dateformat": "^5.0.2",
- "@types/diff": "^5.0.9",
- "@types/dompurify": "^3.0.5",
- "@types/events": "^3.0.0",
- "@types/express": "^4.17.13",
- "@types/mocha": "^9.1.0",
- "@types/mocha-each": "^2.0.0",
- "@types/react": "^17.0.40",
- "@types/react-bootstrap": "^0.32.36",
- "@types/react-color": "^3.0.6",
- "@types/react-dom": "^17.0.13",
- "@types/react-google-recaptcha": "^2.1.5",
- "@types/react-linkify": "^1.0.0",
- "@types/react-overlays": "^1.1.3",
- "@types/recurly__recurly-js": "^4.22.0",
- "@types/sinon-chai": "^3.2.8",
+ "@types/adm-zip": "^0.5.5",
+ "@types/pdf-parse": "^1.1.4",
"@types/uuid": "^9.0.8",
- "@uppy/core": "^3.8.0",
- "@uppy/dashboard": "^3.7.1",
- "@uppy/drag-drop": "^3.0.3",
- "@uppy/file-input": "^3.0.4",
- "@uppy/progress-bar": "^3.0.4",
- "@uppy/react": "^3.2.1",
- "@uppy/utils": "^5.7.0",
- "@uppy/xhr-upload": "^3.6.0",
- "@xmldom/xmldom": "^0.7.13",
- "abort-controller": "^3.0.0",
- "accepts": "^1.3.7",
- "acorn": "^7.1.1",
- "acorn-walk": "^7.1.1",
- "ajv": "^8.12.0",
- "algoliasearch": "^3.35.1",
- "archiver": "^5.3.0",
- "async": "^3.2.5",
- "autoprefixer": "^10.4.16",
- "babel-loader": "^9.1.3",
- "babel-plugin-macros": "^3.1.0",
- "babel-plugin-module-resolver": "^5.0.2",
- "backbone": "^1.6.0",
- "base-x": "^4.0.0",
- "basic-auth": "^2.0.1",
- "bcrypt": "^5.0.0",
- "body-parser": "^1.20.3",
- "bootstrap": "^3.4.1",
- "bootstrap-5": "npm:bootstrap@^5.3.3",
- "bowser": "^2.11.0",
- "bull": "^3.18.0",
- "bunyan": "^1.8.15",
- "c8": "^7.2.0",
- "cache-flow": "^1.9.0",
- "celebrate": "^15.0.3",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "chai-exclude": "^2.0.3",
- "chart.js": "^4.0.1",
- "chartjs-adapter-moment": "^1.0.1",
- "chartjs-plugin-datalabels": "^2.2.0",
- "cheerio": "^1.0.0-rc.3",
- "classnames": "^2.2.6",
- "connect-redis": "^6.1.3",
- "content-disposition": "^0.5.0",
- "contentful": "^10.8.5",
- "cookie": "^0.2.3",
- "cookie-parser": "1.4.6",
- "cookie-signature": "^1.2.1",
- "copy-webpack-plugin": "^11.0.0",
- "core-js": "^3.38.1",
- "crc-32": "^1.2.2",
- "css-loader": "^6.8.1",
- "css-minimizer-webpack-plugin": "^5.0.1",
- "csurf": "^1.11.0",
- "csv": "^6.2.5",
+ "adm-zip": "^0.5.12",
"cypress": "13.13.2",
- "cypress-plugin-tab": "^1.0.5",
- "d3": "^3.5.16",
- "dateformat": "1.0.4-1.2.3",
- "daterangepicker": "2.1.27",
- "diff": "^5.1.0",
- "dompurify": "^3.1.5",
- "downshift": "^6.1.0",
- "east": "^2.0.2",
- "ejs": "^3.1.10",
- "email-addresses": "^5.0.0",
- "es6-promise": "^4.2.8",
- "escodegen": "^2.0.0",
- "eslint-config-standard-jsx": "^11.0.0",
- "eslint-plugin-jsx-a11y": "^6.7.1",
- "eslint-plugin-react": "^7.32.2",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-unicorn": "^56.0.0",
- "esmock": "^2.6.7",
- "events": "^3.3.0",
- "eventsource-parser": "^1.1.2",
- "express": "^4.21.0",
- "express-bearer-token": "^2.4.0",
- "express-http-proxy": "^1.6.0",
- "express-session": "^1.17.1",
- "fake-indexeddb": "^6.0.0",
- "fetch-mock": "^9.10.2",
- "formik": "^2.2.9",
- "fs-extra": "^4.0.2",
- "fuse.js": "^3.0.0",
- "glob": "^7.1.6",
- "globby": "^5.0.0",
- "handlebars": "^4.7.8",
- "handlebars-loader": "^1.7.3",
- "helmet": "^6.0.1",
- "html-webpack-plugin": "^5.5.3",
- "i18next": "^23.10.0",
- "i18next-fs-backend": "^2.3.1",
- "i18next-http-middleware": "^3.5.0",
- "i18next-scanner": "^4.4.0",
- "joi": "^17.12.0",
- "jose": "^4.3.8",
- "jquery": "^3.7.1",
- "jsdom": "^19.0.0",
- "jsdom-global": "^3.0.2",
- "json2csv": "^4.3.3",
- "jsonwebtoken": "^9.0.0",
- "less": "^3.13.1",
- "less-loader": "^11.1.3",
- "lodash": "^4.17.19",
- "lru-cache": "^7.10.1",
- "marked": "^4.1.0",
- "match-sorter": "^6.2.0",
- "mathjax": "^3.2.2",
- "mensch": "^0.3.4",
- "method-override": "^2.3.3",
- "micromark": "^4.0.0",
- "mini-css-extract-plugin": "^2.7.6",
- "minimatch": "^7.4.2",
- "minimist": "^1.2.7",
- "mmmagic": "^0.5.3",
- "mocha": "^10.2.0",
- "mocha-each": "^2.0.1",
- "mock-fs": "^5.1.2",
- "moment": "^2.29.4",
- "mongodb-legacy": "6.1.0",
- "mongoose": "8.5.3",
- "multer": "overleaf/multer#e1df247fbf8e7590520d20ae3601eaef9f3d2e9e",
- "nocache": "^2.1.0",
- "node-fetch": "^2.7.0",
- "nodemailer": "^6.7.0",
- "nodemailer-ses-transport": "^1.5.1",
- "nvd3": "^1.8.6",
- "on-headers": "^1.0.2",
- "otplib": "^12.0.1",
- "overleaf-editor-core": "*",
- "p-limit": "^2.3.0",
- "p-props": "4.0.0",
- "parse-data-url": "^2.0.0",
- "passport": "^0.6.0",
- "passport-google-oauth20": "^2.0.0",
- "passport-ldapauth": "^2.1.4",
- "passport-local": "^1.0.0",
- "passport-oauth2": "^1.5.0",
- "passport-orcid": "0.0.4",
- "pdfjs-dist": "4.6.82",
- "pirates": "^4.0.1",
- "postcss": "^8.4.31",
- "postcss-loader": "^7.3.3",
- "prop-types": "^15.7.2",
- "pug": "^3.0.3",
- "pug-runtime": "^3.0.1",
- "qrcode": "^1.4.4",
- "rate-limiter-flexible": "^2.4.1",
- "react": "^17.0.2",
- "react-bootstrap": "^0.33.1",
- "react-bootstrap-5": "npm:react-bootstrap@^2.10.2",
- "react-chartjs-2": "^5.0.1",
- "react-color": "^2.19.3",
- "react-dnd": "^16.0.1",
- "react-dnd-html5-backend": "^16.0.1",
- "react-dom": "^17.0.2",
- "react-error-boundary": "^2.3.1",
- "react-google-recaptcha": "^3.1.0",
- "react-i18next": "^13.3.1",
- "react-linkify": "^1.0.0-alpha",
- "react-overlays": "^0.9.3",
- "react-refresh": "^0.14.0",
- "react-resizable-panels": "^2.1.1",
- "recurly": "^4.0.0",
- "referer-parser": "github:overleaf/nodejs-referer-parser#8b8b103762d05b7be4cfa2f810e1d408be67d7bb",
- "request": "^2.88.2",
- "requestretry": "^7.1.0",
- "resolve-url-loader": "^5.0.0",
- "rimraf": "2.2.6",
- "samlp": "^7.0.2",
- "sandboxed-module": "overleaf/node-sandboxed-module#cafa2d60f17ce75cc023e6f296eb8de79d92d35d",
- "sanitize-html": "^2.8.1",
- "sass": "^1.77.1",
- "sass-loader": "^14.2.1",
- "scroll-into-view-if-needed": "^2.2.25",
- "sinon": "^7.5.0",
- "sinon-chai": "^3.7.0",
- "sinon-mongoose": "^2.3.0",
- "storybook": "^8.3.5",
- "stylelint-config-standard-scss": "^13.1.0",
- "terser-webpack-plugin": "^5.3.9",
- "thread-loader": "^4.0.2",
- "timekeeper": "^2.2.0",
- "to-string-loader": "^1.2.0",
- "tough-cookie": "^4.0.0",
- "tsscmp": "^1.0.6",
- "tty-browserify": "^0.0.1",
+ "isomorphic-git": "^1.25.10",
+ "mailtrap": "^3.4.0",
+ "pdf-parse": "^1.1.1",
"typescript": "^5.0.4",
- "uid-safe": "^2.1.5",
- "utf-8-validate": "^5.0.2",
- "uuid": "^9.0.1",
- "valid-data-url": "^2.0.0",
- "valid-url": "^1.0.9",
- "w3c-keyname": "^2.2.8",
- "webpack": "^5.93.0",
- "webpack-assets-manifest": "^5.2.1",
- "webpack-cli": "^5.1.4",
- "webpack-dev-server": "^5.0.4",
- "webpack-merge": "^5.10.0",
- "xml-crypto": "^2.1.2",
- "xml2js": "^0.6.2",
- "xregexp": "^4.3.0",
- "yauzl": "^2.10.0",
- "yup": "^0.32.11"
- },
- "dependencies": {
- "@adobe/css-tools": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz",
- "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==",
- "dev": true
- },
- "@google-cloud/bigquery": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-6.0.3.tgz",
- "integrity": "sha512-BP464228S9dqDCb4dR99h9D8+N498YZi/AZvoOJUaieg2H6qbiYBE1xlYuaMvyV1WEQT/2/yZTCJnCo5WiaY0Q==",
- "requires": {
- "@google-cloud/common": "^4.0.0",
- "@google-cloud/paginator": "^4.0.0",
- "@google-cloud/promisify": "^3.0.0",
- "arrify": "^2.0.1",
- "big.js": "^6.0.0",
- "duplexify": "^4.0.0",
- "extend": "^3.0.2",
- "is": "^3.3.0",
- "p-event": "^4.1.0",
- "readable-stream": "^4.0.0",
- "stream-events": "^1.0.5",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz",
- "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==",
- "requires": {
- "abort-controller": "^3.0.0",
- "buffer": "^6.0.3",
- "events": "^3.3.0",
- "process": "^0.11.10"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- }
- }
- },
- "@google-cloud/common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
- "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
- "requires": {
- "@google-cloud/projectify": "^3.0.0",
- "@google-cloud/promisify": "^3.0.0",
- "arrify": "^2.0.1",
- "duplexify": "^4.1.1",
- "ent": "^2.2.0",
- "extend": "^3.0.2",
- "google-auth-library": "^8.0.2",
- "retry-request": "^5.0.0",
- "teeny-request": "^8.0.0"
- }
- },
- "@google-cloud/paginator": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz",
- "integrity": "sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==",
- "requires": {
- "arrify": "^2.0.0",
- "extend": "^3.0.2"
- }
- },
- "@google-cloud/projectify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
- "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA=="
- },
- "@google-cloud/promisify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
- "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA=="
- },
- "@opentelemetry/auto-instrumentations-web": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-web/-/auto-instrumentations-web-0.33.1.tgz",
- "integrity": "sha512-0Tz4cnFEa49Opm74TTHpwGuwk9geWoYBEQxOGoUYOe8A3qFaEnW9jl69AnyEPfODhfUHcunwbzOjge4r3j2nHg==",
- "dev": true,
- "requires": {
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/instrumentation-document-load": "^0.33.1",
- "@opentelemetry/instrumentation-fetch": "^0.41.2",
- "@opentelemetry/instrumentation-user-interaction": "^0.33.1",
- "@opentelemetry/instrumentation-xml-http-request": "^0.41.2"
- }
- },
- "@opentelemetry/instrumentation-document-load": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-document-load/-/instrumentation-document-load-0.33.1.tgz",
- "integrity": "sha512-FyLe5i85likVEp36ZewtM8jIZ8/7w55yz9tVoBBJHlTRCVZutff2EhVVCnGHx4etnMvuF+Es8CU2tTsnlCtl5g==",
- "dev": true,
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/sdk-trace-base": "^1.0.0",
- "@opentelemetry/sdk-trace-web": "^1.15.0",
- "@opentelemetry/semantic-conventions": "^1.0.0"
- }
- },
- "@opentelemetry/instrumentation-fetch": {
- "version": "0.41.2",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fetch/-/instrumentation-fetch-0.41.2.tgz",
- "integrity": "sha512-L4jx7kq0R5XWAf5YcekSQ3Zm/6PE/+p/6rZe4NdtC+gp9u1lrQ/Vr0lwexxubS1odghbUSFo6PXKrqc25c+2hA==",
- "dev": true,
- "requires": {
- "@opentelemetry/core": "1.15.2",
- "@opentelemetry/instrumentation": "0.41.2",
- "@opentelemetry/sdk-trace-web": "1.15.2",
- "@opentelemetry/semantic-conventions": "1.15.2"
- }
- },
- "@opentelemetry/instrumentation-user-interaction": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-user-interaction/-/instrumentation-user-interaction-0.33.1.tgz",
- "integrity": "sha512-2oun4gwWpqtCW+qydC51jqSSUZSOuNCBXOWinTuTmO6w/sd4DJaQ6kEboSx5gENT/56qnCM9jQZlHI+zKbL63w==",
- "dev": true,
- "requires": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.41.2",
- "@opentelemetry/sdk-trace-web": "^1.8.0"
- }
- },
- "@overleaf/dictionaries": {
- "version": "https://github.com/overleaf/dictionaries/archive/refs/tags/v0.0.3.tar.gz",
- "integrity": "sha512-/VJRrwY62Va2M4K5BE5UMruJHgKPGp0SGQkY/nrrQpBbHhMuTVoRtXkR+hcOfi1Iu6SO0vcwiK+L7xzs+fZmXQ=="
- },
- "@sentry/browser": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.46.0.tgz",
- "integrity": "sha512-4rX9hKPjxzfH5LhZzO5DlS5NXQ8qZg2ibepaqEgcDHrpYh5813mjjnE4OQA8wiZ6WuG3xKFgHBrGeliD5jXz9w==",
- "dev": true,
- "requires": {
- "@sentry-internal/tracing": "7.46.0",
- "@sentry/core": "7.46.0",
- "@sentry/replay": "7.46.0",
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "@sentry/core": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.46.0.tgz",
- "integrity": "sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "@sentry/types": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.46.0.tgz",
- "integrity": "sha512-2FMEMgt2h6u7AoELhNhu9L54GAh67KKfK2pJ1kEXJHmWxM9FSCkizjLs/t+49xtY7jEXr8qYq8bV967VfDPQ9g==",
- "dev": true
- },
- "@sentry/utils": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.46.0.tgz",
- "integrity": "sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "@sinonjs/formatio": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz",
- "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1",
- "@sinonjs/samsam": "^3.1.0"
- }
- },
- "@sinonjs/samsam": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz",
- "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.3.0",
- "array-from": "^2.1.1",
- "lodash": "^4.17.15"
- }
- },
- "@storybook/addon-a11y": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.3.5.tgz",
- "integrity": "sha512-/19UO8IXbyfcYK5K8ejSYF+hC+EK79c0bBPHMNeYSFOHSqQM3KoMo+TLIcLsuhuRClmlM+4Zs+VSIYDwc+d3ig==",
- "dev": true,
- "requires": {
- "@storybook/addon-highlight": "8.3.5",
- "axe-core": "^4.2.0"
- }
- },
- "@storybook/addon-actions": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.5.tgz",
- "integrity": "sha512-t8D5oo+4XfD+F8091wLa2y/CDd/W2lExCeol5Vm1tp5saO+u6f2/d7iykLhTowWV84Uohi3D073uFeyTAlGebg==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "@types/uuid": "^9.0.1",
- "dequal": "^2.0.2",
- "polished": "^4.2.2",
- "uuid": "^9.0.0"
- }
- },
- "@storybook/addon-backgrounds": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.5.tgz",
- "integrity": "sha512-IQGjDujuw8+iSqKREdkL8I5E/5CAHZbfOWd4A75PQK2D6qZ0fu/xRwTOQOH4jP6xn/abvfACOdL6A0d5bU90ag==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "memoizerific": "^1.11.3",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/addon-controls": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.5.tgz",
- "integrity": "sha512-2eCVobUUvY1Rq7sp1U8Mx8t44VXwvi0E+hqyrsqOx5TTSC/FUQ+hNAX6GSYUcFIyQQ1ORpKNlUjAAdjxBv1ZHQ==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/addon-docs": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.5.tgz",
- "integrity": "sha512-MOVfo1bY8kXTzbvmWnx3UuSO4WNykFz7Edvb3mxltNyuW7UDRZGuIuSe32ddT/EtLJfurrC9Ja3yBy4KBUGnMA==",
- "dev": true,
- "requires": {
- "@mdx-js/react": "^3.0.0",
- "@storybook/blocks": "8.3.5",
- "@storybook/csf-plugin": "8.3.5",
- "@storybook/global": "^5.0.0",
- "@storybook/react-dom-shim": "8.3.5",
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "fs-extra": "^11.1.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "rehype-external-links": "^3.0.0",
- "rehype-slug": "^6.0.0",
- "ts-dedent": "^2.0.0"
- },
- "dependencies": {
- "@storybook/blocks": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.5.tgz",
- "integrity": "sha512-8cHTdTywolTHlgwN8I7YH7saWAIjGzV617AwjhJ95AKlC0VtpO1gAFcAgCqr4DU9eMc+LZuvbnaU/RSvA5eCCQ==",
- "dev": true,
- "requires": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "@storybook/icons": "^1.2.10",
- "@types/lodash": "^4.14.167",
- "color-convert": "^2.0.1",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "markdown-to-jsx": "^7.4.5",
- "memoizerific": "^1.11.3",
- "polished": "^4.2.2",
- "react-colorful": "^5.1.2",
- "telejson": "^7.2.0",
- "ts-dedent": "^2.0.0",
- "util-deprecate": "^1.0.2"
- }
- },
- "@storybook/icons": {
- "version": "1.2.12",
- "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.12.tgz",
- "integrity": "sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==",
- "dev": true,
- "requires": {}
- },
- "@storybook/react-dom-shim": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.5.tgz",
- "integrity": "sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==",
- "dev": true,
- "requires": {}
- },
- "fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "markdown-to-jsx": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz",
- "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==",
- "dev": true,
- "requires": {}
- },
- "universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true
- }
- }
- },
- "@storybook/addon-essentials": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.5.tgz",
- "integrity": "sha512-hXTtPuN4/IsXjUrkMPAuz1qKAl8DovdXpjQgjQs7jSAVx3kc4BZaGqJ3gaVenKtO8uDchmA92BoQygpkc8eWhw==",
- "dev": true,
- "requires": {
- "@storybook/addon-actions": "8.3.5",
- "@storybook/addon-backgrounds": "8.3.5",
- "@storybook/addon-controls": "8.3.5",
- "@storybook/addon-docs": "8.3.5",
- "@storybook/addon-highlight": "8.3.5",
- "@storybook/addon-measure": "8.3.5",
- "@storybook/addon-outline": "8.3.5",
- "@storybook/addon-toolbars": "8.3.5",
- "@storybook/addon-viewport": "8.3.5",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/addon-highlight": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.5.tgz",
- "integrity": "sha512-ku0epul9aReCR3Gv/emwYnsqg3vgux5OmYMjoDcJC7s+LyfweSzLV/f5t9gSHazikJElh5TehtVkWbC4QfbGSw==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0"
- }
- },
- "@storybook/addon-interactions": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.3.5.tgz",
- "integrity": "sha512-GtTy/A+mG7vDOahQr2avT4dpWtCRiFDSYcWyuQOZm10y8VDDw157HQM+FuhxjV9Owrrohy9F24oBUwRG8H3b5A==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.3.5",
- "@storybook/test": "8.3.5",
- "polished": "^4.2.2",
- "ts-dedent": "^2.2.0"
- }
- },
- "@storybook/addon-links": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.5.tgz",
- "integrity": "sha512-giRCpn6cfJMYPnVJkojoQDO5ae6098fgY9YgAhwaJej/9dufNcioFdbiyfK1vyzbG6TGeTmJ9ncWCXgWRtzxPQ==",
- "dev": true,
- "requires": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/addon-measure": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.5.tgz",
- "integrity": "sha512-6GVehgbHhFIFS69xSfRV+12VK0cnuIAtZdp1J3eUCc2ATrcigqVjTM6wzZz6kBuX6O3dcusr7Wg46KtNliqLqg==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "tiny-invariant": "^1.3.1"
- }
- },
- "@storybook/addon-outline": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.5.tgz",
- "integrity": "sha512-dwmK6GzjEnQP9Yo0VnBUQtJkXZlXdfjWyskZ/IlUVc+IFdeeCtIiMyA92oMfHo8eXt0k1g21ZqMaIn7ZltOuHw==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/addon-toolbars": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.5.tgz",
- "integrity": "sha512-Ml2gc9q8WbteDvmuAZGgBxt5SqWMXzuTkMjlsA8EB53hlkN1w9esX4s8YtBeNqC3HKoUzcdq8uexSBqU8fDbSA==",
- "dev": true,
- "requires": {}
- },
- "@storybook/addon-viewport": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.5.tgz",
- "integrity": "sha512-FSWydoPiVWFXEittG7O1YgvuaqoU9Vb+qoq9XfP/hvQHHMDcMZvC40JaV8AnJeTXaM7ngIjcn9XDEfGbFfOzXw==",
- "dev": true,
- "requires": {
- "memoizerific": "^1.11.3"
- }
- },
- "@storybook/builder-webpack5": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.5.tgz",
- "integrity": "sha512-rhmfdiSlDn3Arki7IMYk11PO29rYuYM4LZ8GlNqREU7VUl/8Vngo/jFIa4pKaIns3ql1RrwzO1wm9JvuL/4ydA==",
- "dev": true,
- "requires": {
- "@storybook/core-webpack": "8.3.5",
- "@types/node": "^22.0.0",
- "@types/semver": "^7.3.4",
- "browser-assert": "^1.2.1",
- "case-sensitive-paths-webpack-plugin": "^2.4.0",
- "cjs-module-lexer": "^1.2.3",
- "constants-browserify": "^1.0.0",
- "css-loader": "^6.7.1",
- "es-module-lexer": "^1.5.0",
- "express": "^4.19.2",
- "fork-ts-checker-webpack-plugin": "^8.0.0",
- "fs-extra": "^11.1.0",
- "html-webpack-plugin": "^5.5.0",
- "magic-string": "^0.30.5",
- "path-browserify": "^1.0.1",
- "process": "^0.11.10",
- "semver": "^7.3.7",
- "style-loader": "^3.3.1",
- "terser-webpack-plugin": "^5.3.1",
- "ts-dedent": "^2.0.0",
- "url": "^0.11.0",
- "util": "^0.12.4",
- "util-deprecate": "^1.0.2",
- "webpack": "5",
- "webpack-dev-middleware": "^6.1.2",
- "webpack-hot-middleware": "^2.25.1",
- "webpack-virtual-modules": "^0.6.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "memfs": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
- "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
- "dev": true,
- "requires": {
- "fs-monkey": "^1.0.4"
- }
- },
- "universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true
- },
- "webpack-dev-middleware": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz",
- "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==",
- "dev": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.12",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- }
- }
- }
- },
- "@storybook/components": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.5.tgz",
- "integrity": "sha512-Rq28YogakD3FO4F8KwAtGpo1g3t4V/gfCLqTQ8B6oQUFoxLqegkWk/DlwCzvoJndXuQJfdSyM6+r1JcA4Nql5A==",
- "dev": true,
- "requires": {}
- },
- "@storybook/core-webpack": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.5.tgz",
- "integrity": "sha512-mN8BHNc6lSGUf/nKgDr6XoTt1cX+Tap9RnKMUiROCDzfVlJPeJBrG4qrTOok7AwObzeDl9DNFyun6+pVgXJe7A==",
- "dev": true,
- "requires": {
- "@types/node": "^22.0.0",
- "ts-dedent": "^2.0.0"
- }
- },
- "@storybook/csf-plugin": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.5.tgz",
- "integrity": "sha512-ODVqNXwJt90hG7QW8I9w/XUyOGlr0l7XltmIJgXwB/2cYDvaGu3JV5Ybg7O0fxPV8uXk7JlRuUD8ZYv5Low6pA==",
- "dev": true,
- "requires": {
- "unplugin": "^1.3.1"
- }
- },
- "@storybook/instrumenter": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.3.5.tgz",
- "integrity": "sha512-NLDXai5y2t1ITgHVK9chyL0rMFZbICCOGcnTbyWhkLbiEWZKPJ8FuB8+g+Ba6zwtCve1A1Cnb4O2LOWy7TgWQw==",
- "dev": true,
- "requires": {
- "@storybook/global": "^5.0.0",
- "@vitest/utils": "^2.0.5",
- "util": "^0.12.4"
- }
- },
- "@storybook/manager-api": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.5.tgz",
- "integrity": "sha512-fEQoKKi7h7pzh2z9RfuzatJxubrsfL/CB99fNXQ0wshMSY/7O4ckd18pK4fzG9ErnCtLAO9qsim4N/4eQC+/8Q==",
- "dev": true,
- "requires": {}
- },
- "@storybook/preview-api": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.5.tgz",
- "integrity": "sha512-VPqpudE8pmjTLvdNJoW/2//nqElDgUOmIn3QxbbCmdZTHDg5tFtxuqwdlNfArF0TxvTSBDIulXt/Q6K56TAfTg==",
- "dev": true,
- "requires": {}
- },
- "@storybook/react": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.3.5.tgz",
- "integrity": "sha512-kuBPe/wBin10SWr4EWPKxiTRGQ4RD2etGEVWVQLqVpOuJp/J2hVvXQHtCfZXU4TZT5x4PBbPRswbr58+XlF+kQ==",
- "dev": true,
- "requires": {
- "@storybook/components": "^8.3.5",
- "@storybook/global": "^5.0.0",
- "@storybook/manager-api": "^8.3.5",
- "@storybook/preview-api": "^8.3.5",
- "@storybook/react-dom-shim": "8.3.5",
- "@storybook/theming": "^8.3.5",
- "@types/escodegen": "^0.0.6",
- "@types/estree": "^0.0.51",
- "@types/node": "^22.0.0",
- "acorn": "^7.4.1",
- "acorn-jsx": "^5.3.1",
- "acorn-walk": "^7.2.0",
- "escodegen": "^2.1.0",
- "html-tags": "^3.1.0",
- "prop-types": "^15.7.2",
- "react-element-to-jsx-string": "^15.0.0",
- "semver": "^7.3.7",
- "ts-dedent": "^2.0.0",
- "type-fest": "~2.19",
- "util-deprecate": "^1.0.2"
- },
- "dependencies": {
- "@storybook/react-dom-shim": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.5.tgz",
- "integrity": "sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==",
- "dev": true,
- "requires": {}
- }
- }
- },
- "@storybook/react-webpack5": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.3.5.tgz",
- "integrity": "sha512-J7jCxjCuWvRJrAtOwe4ij8rjfTGm1Dpsfbz8xar4ItVw7ikiyALr34E3FJzfgq7M40uGXZhvCl2IVRdGeiLmzg==",
- "dev": true,
- "requires": {
- "@storybook/builder-webpack5": "8.3.5",
- "@storybook/preset-react-webpack": "8.3.5",
- "@storybook/react": "8.3.5",
- "@types/node": "^22.0.0"
- },
- "dependencies": {
- "@storybook/preset-react-webpack": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.3.5.tgz",
- "integrity": "sha512-laS9CiZrZ4CSnBTBfkBba3hmlDhzcjIfCvx8/rk3SZ+zh93NpqXixzRt6m0UH2po63dpdu21nXrsW5Cfs88Ypw==",
- "dev": true,
- "requires": {
- "@storybook/core-webpack": "8.3.5",
- "@storybook/react": "8.3.5",
- "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
- "@types/node": "^22.0.0",
- "@types/semver": "^7.3.4",
- "find-up": "^5.0.0",
- "fs-extra": "^11.1.0",
- "magic-string": "^0.30.5",
- "react-docgen": "^7.0.0",
- "resolve": "^1.22.8",
- "semver": "^7.3.7",
- "tsconfig-paths": "^4.2.0",
- "webpack": "5"
- }
- },
- "fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true
- }
- }
- },
- "@storybook/test": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.3.5.tgz",
- "integrity": "sha512-1BXWsUGWk9FiKKelZZ55FDJdeoL8uRBHbjTYBRM2xJLhdNSvGzI4Tb3bkmxPpGn72Ua6AyldhlTxr2BpUFKOHA==",
- "dev": true,
- "requires": {
- "@storybook/csf": "^0.1.11",
- "@storybook/global": "^5.0.0",
- "@storybook/instrumenter": "8.3.5",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.5.0",
- "@testing-library/user-event": "14.5.2",
- "@vitest/expect": "2.0.5",
- "@vitest/spy": "2.0.5",
- "util": "^0.12.4"
- },
- "dependencies": {
- "@testing-library/dom": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
- "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- }
- }
- }
- },
- "@storybook/theming": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.5.tgz",
- "integrity": "sha512-9HmDDyC691oqfg4RziIM9ElsS2HITaxmH7n/yeUPtuirkPdAQzqOzhvH/Sa0qOhifzs8VjR+Gd/a/ZQ+S38r7w==",
- "dev": true,
- "requires": {}
- },
- "@testing-library/dom": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz",
- "integrity": "sha512-Dffe68pGwI6WlLRYR2I0piIkyole9cSBH5jGQKCGMRpHW5RHCqAUaqc2Kv0tUyd4dU4DLPKhJIjyKOnjv4tuUw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "^5.0.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- }
- },
- "@testing-library/jest-dom": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
- "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
- "dev": true,
- "requires": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
- },
- "dependencies": {
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "dev": true
- }
- }
- },
- "@types/aria-query": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz",
- "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==",
- "dev": true
- },
- "@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
- "dev": true
- },
- "@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
- "dev": true,
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/mocha": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
- "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
- "dev": true
- },
- "@types/node": {
- "version": "22.7.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
- "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
- "dev": true,
- "requires": {
- "undici-types": "~6.19.2"
- }
- },
- "@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "requires": {
- "@types/webidl-conversions": "*"
- }
- },
- "@uppy/companion-client": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.7.0.tgz",
- "integrity": "sha512-37qJNMkqo01SM9h2gkFbV6e+aXM02s2zAda2dGsRLRsjvl/Tx69NlmxJ3xqG/7HWRnYcbBWtspb7y0tt1i/afg==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.7.0",
- "namespace-emitter": "^2.0.1",
- "p-retry": "^6.1.0"
- }
- },
- "@uppy/core": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.8.0.tgz",
- "integrity": "sha512-C93vVhid929+VLGjaD9CZOLJDg8GkEGMUGveFp3Tyo/wujiG+sB3fOF+c6TzKpzPLfNtVpskU1BnI7tZrq1LWw==",
- "dev": true,
- "requires": {
- "@transloadit/prettier-bytes": "0.0.9",
- "@uppy/store-default": "^3.2.0",
- "@uppy/utils": "^5.7.0",
- "lodash": "^4.17.21",
- "mime-match": "^1.0.2",
- "namespace-emitter": "^2.0.1",
- "nanoid": "^4.0.0",
- "preact": "^10.5.13"
- },
- "dependencies": {
- "@transloadit/prettier-bytes": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz",
- "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==",
- "dev": true
- }
- }
- },
- "@uppy/dashboard": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.7.1.tgz",
- "integrity": "sha512-qtCMXd2Ymrw0qNGSTlEEMyyDkGUCm+wX5/VrmV9lnfT7JtlSfotUK0K6KvkBeu2v1Chsu27C6Xlq6RddZMR2xQ==",
- "dev": true,
- "requires": {
- "@transloadit/prettier-bytes": "0.0.7",
- "@uppy/informer": "^3.0.4",
- "@uppy/provider-views": "^3.7.0",
- "@uppy/status-bar": "^3.2.5",
- "@uppy/thumbnail-generator": "^3.0.6",
- "@uppy/utils": "^5.6.0",
- "classnames": "^2.2.6",
- "is-shallow-equal": "^1.0.1",
- "lodash": "^4.17.21",
- "memoize-one": "^6.0.0",
- "nanoid": "^4.0.0",
- "preact": "^10.5.13"
- }
- },
- "@uppy/drag-drop": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.0.3.tgz",
- "integrity": "sha512-0bCgQKxg+9vkxQipTgrX9yQIuK9a0hZrkipm1+Ynq6jTeig49b7II1bWYnoKdiYhi6nRE4UnDJf4z09yCAU7rA==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.4.3",
- "preact": "^10.5.13"
- }
- },
- "@uppy/file-input": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.0.4.tgz",
- "integrity": "sha512-D7Nw9GgpABYTcC8SZluDyxd+ppe7+gJejNbPZqMpQyW1S/ME3me55dkDQaVWn8yrgv7347zO2ciue9Rfmko+rQ==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.5.2",
- "preact": "^10.5.13"
- }
- },
- "@uppy/informer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.0.4.tgz",
- "integrity": "sha512-gzocdxn8qAFsW2EryehwjghladaBgv6Isjte53FTBV7o/vjaHPP6huKGbYpljyuQi8i9V+KrmvNGslofssgJ4g==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.5.2",
- "preact": "^10.5.13"
- }
- },
- "@uppy/progress-bar": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.0.4.tgz",
- "integrity": "sha512-sxv/mG7Uc9uyTnRvfcXBhO+TWd+UqjuW5aHXCKWwTkMgDShHR0T46sEk12q+jwgbFwyeFg3p0GU3hgUxqxiEUQ==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.5.2",
- "preact": "^10.5.13"
- }
- },
- "@uppy/provider-views": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.8.0.tgz",
- "integrity": "sha512-sTtx5bgsg2WVR+MyF0gnnM3Z7g3CyFx+Stlz//AvB6g27EMqtqO4zwDR3mestMrETkWYov5bhhqUbt2BaeANpA==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.7.0",
- "classnames": "^2.2.6",
- "nanoid": "^4.0.0",
- "p-queue": "^7.3.4",
- "preact": "^10.5.13"
- }
- },
- "@uppy/react": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@uppy/react/-/react-3.2.1.tgz",
- "integrity": "sha512-PoLplDF6YDI7f06T8ORnJhav6CcKNSYWJETXqItZR3jcXIve6pdcCuskqd+l0yiYWf4J2IdyLQXtzgGfIJl7xQ==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.6.0",
- "prop-types": "^15.6.1"
- }
- },
- "@uppy/status-bar": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.2.5.tgz",
- "integrity": "sha512-bRSxBPio5B+Kuf6w8ll+/i9VUwG8f0FnbZ1yQvCr8J9vxhd0Z5hvwhX4NP8uzHC6ZPJHlEQOTsxzGQ6y+Mdm0A==",
- "dev": true,
- "requires": {
- "@transloadit/prettier-bytes": "0.0.9",
- "@uppy/utils": "^5.5.2",
- "classnames": "^2.2.6",
- "preact": "^10.5.13"
- },
- "dependencies": {
- "@transloadit/prettier-bytes": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz",
- "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==",
- "dev": true
- }
- }
- },
- "@uppy/store-default": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.2.0.tgz",
- "integrity": "sha512-Y7t0peUG89ZKa30vM4qlRIC6uKxIfOANeMT9Nzjwcxvzz8l7es22jG3eAj9WF2F7YSu7xdsH8ODs6SIrJJ8gow==",
- "dev": true
- },
- "@uppy/thumbnail-generator": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.0.6.tgz",
- "integrity": "sha512-gsi/BQBiunHneXCbo8VglFbhEb0CoQXQjCyGNKoEq/deEcbXhBBDxkiGcgv83l5GZJl2jLiKWqXnXAXREkldrQ==",
- "dev": true,
- "requires": {
- "@uppy/utils": "^5.5.2",
- "exifr": "^7.0.0"
- }
- },
- "@uppy/utils": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.7.0.tgz",
- "integrity": "sha512-AJj7gAx5YfMgyevwOxVdIP2h4Nw/O6h57wKA6gj+Lce6tMORcqzGt4yQiKBsrBI0bPyFWCbzA3vX5t0//1JCBA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.21",
- "preact": "^10.5.13"
- }
- },
- "@uppy/xhr-upload": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.6.0.tgz",
- "integrity": "sha512-HgWr+CvJzJXAp639AiZatdEWmRdhhN5LrjTZurAkvm9nPQarpi1bo0DChO+1bpkXWOR/1VarBbZOr8lNecEn7Q==",
- "dev": true,
- "requires": {
- "@uppy/companion-client": "^3.7.0",
- "@uppy/utils": "^5.7.0",
- "nanoid": "^4.0.0"
- }
- },
- "@vitest/expect": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
- "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
- "dev": true,
- "requires": {
- "@vitest/spy": "2.0.5",
- "@vitest/utils": "2.0.5",
- "chai": "^5.1.1",
- "tinyrainbow": "^1.2.0"
- },
- "dependencies": {
- "@vitest/pretty-format": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
- "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
- "dev": true,
- "requires": {
- "tinyrainbow": "^1.2.0"
- }
- },
- "@vitest/utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
- "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
- "dev": true,
- "requires": {
- "@vitest/pretty-format": "2.0.5",
- "estree-walker": "^3.0.3",
- "loupe": "^3.1.1",
- "tinyrainbow": "^1.2.0"
- }
- },
- "chai": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz",
- "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==",
- "dev": true,
- "requires": {
- "assertion-error": "^2.0.1",
- "check-error": "^2.1.1",
- "deep-eql": "^5.0.1",
- "loupe": "^3.1.0",
- "pathval": "^2.0.0"
- }
- }
- }
- },
- "@vitest/spy": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
- "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
- "dev": true,
- "requires": {
- "tinyspy": "^3.0.0"
- }
- },
- "@vitest/utils": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.2.tgz",
- "integrity": "sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==",
- "dev": true,
- "requires": {
- "@vitest/pretty-format": "2.1.2",
- "loupe": "^3.1.1",
- "tinyrainbow": "^1.2.0"
- }
- },
- "ajv": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
- "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
- "requires": {
- "fast-deep-equal": "^3.1.3",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.4.1"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "requires": {
- "dequal": "^2.0.3"
- }
- },
- "assertion-error": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
- "dev": true
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "check-error": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
- "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
- "dev": true
- },
- "chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "core-js": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
- "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw=="
- },
- "csv": {
- "version": "6.2.5",
- "resolved": "https://registry.npmjs.org/csv/-/csv-6.2.5.tgz",
- "integrity": "sha512-T+K0H7MIrlrnP6KxYKo3lK+uLl6OC2Gmwdd81TG/VdkhKvpatl35sR7tyRSpDLGl22y2T+q9KvNHnVtn4OAscQ==",
- "requires": {
- "csv-generate": "^4.2.1",
- "csv-parse": "^5.3.3",
- "csv-stringify": "^6.2.3",
- "stream-transform": "^3.2.1"
- }
- },
- "csv-generate": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-4.2.1.tgz",
- "integrity": "sha512-w6GFHjvApv6bcJ2xdi9JGsH6ZvUBfC+vUdfefnEzurXG6hMRwzkBLnhztU2H7v7+zfCk1I/knnQ+tGbgpxWrBw=="
- },
- "csv-parse": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.3.3.tgz",
- "integrity": "sha512-kEWkAPleNEdhFNkHQpFHu9RYPogsFj3dx6bCxL847fsiLgidzWg0z/O0B1kVWMJUc5ky64zGp18LX2T3DQrOfw=="
- },
- "csv-stringify": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.2.3.tgz",
- "integrity": "sha512-4qGjUMwnlaRc00gc2jrIYh2w/h1fo25B0mTuY9K8fBiIgtmCX3LcgUbrEGViL98Ci4Se/F5LFEtu8k+dItJVZQ=="
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "deep-eql": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
- "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
- "dev": true
- },
- "define-lazy-prop": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
- "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
- "dev": true
- },
- "diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "dev": true
- },
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "es-module-lexer": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
- "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
- "dev": true
- },
- "esmock": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/esmock/-/esmock-2.6.7.tgz",
- "integrity": "sha512-4DmjZ0qQIG+NQV1njHvWrua/cZEuJq56A3pSELT2BjNuol1aads7BluofCbLErdO41Ic1XCd2UMepVLpjL64YQ==",
- "dev": true
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
- },
- "exifr": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz",
- "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==",
- "dev": true
- },
- "foreground-child": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
- "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- }
- },
- "fs-extra": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
- "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-monkey": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
- "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
- "dev": true
- },
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.7.0.tgz",
- "integrity": "sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.0.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- }
- }
- },
- "google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "requires": {
- "node-forge": "^1.3.1"
- }
- },
- "gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "requires": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
- "jws": "^4.0.0"
- }
- },
- "helmet": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.0.1.tgz",
- "integrity": "sha512-8wo+VdQhTMVBMCITYZaGTbE4lvlthelPYSvoyNvk4RECTmrVjMerp9RfUOQXZWLvCcAn1pKj7ZRxK4lI9Alrcw=="
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
- },
- "ipaddr.js": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
- "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
- "dev": true
- },
- "is-wsl": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
- "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
- "dev": true,
- "requires": {
- "is-inside-container": "^1.0.0"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- },
- "jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "dev": true,
- "requires": {
- "@isaacs/cliui": "^8.0.2",
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "kareem": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
- "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q=="
- },
- "lolex": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz",
- "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==",
- "dev": true
- },
- "loupe": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
- "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
- "dev": true
- },
- "lru-cache": {
- "version": "7.10.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.10.1.tgz",
- "integrity": "sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A=="
- },
- "memfs": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz",
- "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==",
- "dev": true,
- "requires": {
- "@jsonjoy.com/json-pack": "^1.0.3",
- "@jsonjoy.com/util": "^1.3.0",
- "tree-dump": "^1.0.1",
- "tslib": "^2.0.0"
- }
- },
- "memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
- "dev": true
- },
- "method-override": {
- "version": "2.3.10",
- "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz",
- "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=",
- "requires": {
- "debug": "2.6.9",
- "methods": "~1.1.2",
- "parseurl": "~1.3.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "minimatch": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz",
- "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true
- },
- "mongodb": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz",
- "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- }
- },
- "mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "requires": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "mongoose": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.3.tgz",
- "integrity": "sha512-OubSDbsAclDFGHjV82MsKyIGQWFc42Ot1l+0dhRS6U9xODM7rm/ES/WpOQd8Ds9j0Mx8QzxZtrSCnBh6o9wUqw==",
- "requires": {
- "bson": "^6.7.0",
- "kareem": "2.6.3",
- "mongodb": "6.7.0",
- "mpath": "0.9.0",
- "mquery": "5.0.0",
- "ms": "2.1.3",
- "sift": "17.1.3"
- }
- },
- "mquery": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
- "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
- "requires": {
- "debug": "4.x"
- }
- },
- "multer": {
- "version": "git+ssh://git@github.com/overleaf/multer.git#e1df247fbf8e7590520d20ae3601eaef9f3d2e9e",
- "integrity": "sha512-3fJSnWF3iBZJ6Z9y8AjFVY+O4DUKspxSnzXidb3zCKqBYyEKRrpGp7OXjT9th2gWPd+9u64ZyRWUf+YRYn1GCw==",
- "from": "multer@overleaf/multer#e1df247fbf8e7590520d20ae3601eaef9f3d2e9e",
- "requires": {
- "append-field": "^1.0.0",
- "busboy": "^1.0.0",
- "concat-stream": "^1.5.2",
- "mkdirp": "^0.5.4",
- "object-assign": "^4.1.1",
- "type-is": "^1.6.4",
- "xtend": "^4.0.0"
- }
- },
- "nanoid": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
- "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
- "dev": true
- },
- "nise": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz",
- "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==",
- "dev": true,
- "requires": {
- "@sinonjs/formatio": "^3.2.1",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "lolex": "^5.0.1",
- "path-to-regexp": "^1.7.0"
- },
- "dependencies": {
- "lolex": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz",
- "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0"
- }
- }
- }
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "open": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
- "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
- "dev": true,
- "requires": {
- "default-browser": "^5.2.1",
- "define-lazy-prop": "^3.0.0",
- "is-inside-container": "^1.0.0",
- "is-wsl": "^3.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-retry": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz",
- "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==",
- "dev": true,
- "requires": {
- "@types/retry": "0.12.2",
- "is-network-error": "^1.0.0",
- "retry": "^0.13.1"
- }
- },
- "path-to-regexp": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
- "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
- "dev": true,
- "requires": {
- "isarray": "0.0.1"
- }
- },
- "pathval": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
- "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
- "dev": true
- },
- "pdfjs-dist": {
- "version": "4.6.82",
- "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.6.82.tgz",
- "integrity": "sha512-BUOryeRFwvbLe0lOU6NhkJNuVQUp06WxlJVVCsxdmJ4y5cU3O3s3/0DunVdK1PMm7v2MUw52qKYaidhDH1Z9+w==",
- "dev": true,
- "requires": {
- "canvas": "^2.11.2",
- "path2d": "^0.2.1"
- }
- },
- "preact": {
- "version": "10.19.3",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz",
- "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==",
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
- "retry-request": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
- "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
- "requires": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
- }
- },
- "sandboxed-module": {
- "version": "git+ssh://git@github.com/overleaf/node-sandboxed-module.git#cafa2d60f17ce75cc023e6f296eb8de79d92d35d",
- "integrity": "sha512-ZNZDUOzXHKWBvxoRKm1ETmOBxEMrxn6iEgF3G8Ws7pgdNY18t3MIfnMmMGdDcF3//bp6VGgSXa+Gnpcovf/K3w==",
- "dev": true,
- "from": "sandboxed-module@overleaf/node-sandboxed-module#cafa2d60f17ce75cc023e6f296eb8de79d92d35d",
- "requires": {
- "require-like": "0.1.2",
- "stack-trace": "0.0.10"
- }
- },
- "schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "sift": {
- "version": "17.1.3",
- "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
- "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ=="
- },
- "signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true
- },
- "sinon": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz",
- "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.4.0",
- "@sinonjs/formatio": "^3.2.1",
- "@sinonjs/samsam": "^3.3.3",
- "diff": "^3.5.0",
- "lolex": "^4.2.0",
- "nise": "^1.5.2",
- "supports-color": "^5.5.0"
- },
- "dependencies": {
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "sinon-mongoose": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/sinon-mongoose/-/sinon-mongoose-2.3.0.tgz",
- "integrity": "sha512-d0rrL53wuDDs91GMCFAvQam64IpdVfkaxA4cGLTZfw1d5tTg6+F/D7F080d1n3d1gSHJBZLUf9pGpijC/x7xKQ==",
- "dev": true,
- "requires": {}
- },
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
- "dev": true
- },
- "storybook": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.5.tgz",
- "integrity": "sha512-hYQVtP2l+3kO8oKDn4fjXXQYxgTRsj/LaV6lUMJH0zt+OhVmDXKJLxmdUP4ieTm0T8wEbSYosFavgPcQZlxRfw==",
- "dev": true,
- "requires": {
- "@storybook/core": "8.3.5"
- }
- },
- "stream-transform": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-3.2.1.tgz",
- "integrity": "sha512-ApK+WTJ5bCOf0A2tlec1qhvr8bGEBM/sgXXB7mysdCYgZJO5DZeaV3h3G+g0HnAQ372P5IhiGqnW29zoLOfTzQ=="
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "teeny-request": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.2.tgz",
- "integrity": "sha512-34pe0a4zASseXZCKdeTiIZqSKA8ETHb1EwItZr01PAR3CLPojeAKgSjzeNS4373gi59hNulyDrPKEbh2zO9sCg==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.1",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- }
- },
- "tinyspy": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
- "dev": true
- },
- "tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "requires": {
- "punycode": "^2.3.0"
- },
- "dependencies": {
- "punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
- }
- }
- },
- "tsconfig-paths": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
- "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
- "dev": true,
- "requires": {
- "json5": "^2.2.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
- },
- "url": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
- "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
- "dev": true,
- "requires": {
- "punycode": "^1.4.1",
- "qs": "^6.12.3"
- }
- },
- "uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
- },
- "webpack-dev-middleware": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.3.0.tgz",
- "integrity": "sha512-xD2qnNew+F6KwOGZR7kWdbIou/ud7cVqLEXeK1q0nHcNsX/u7ul/fSdlOTX4ntSL5FNFy7ZJJXbf0piF591JYw==",
- "dev": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^4.6.0",
- "mime-types": "^2.1.31",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- }
- },
- "webpack-dev-server": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz",
- "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==",
- "dev": true,
- "requires": {
- "@types/bonjour": "^3.5.13",
- "@types/connect-history-api-fallback": "^1.5.4",
- "@types/express": "^4.17.21",
- "@types/serve-index": "^1.9.4",
- "@types/serve-static": "^1.15.5",
- "@types/sockjs": "^0.3.36",
- "@types/ws": "^8.5.10",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.2.1",
- "chokidar": "^3.6.0",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.4.0",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.1.0",
- "launch-editor": "^2.6.1",
- "open": "^10.0.3",
- "p-retry": "^6.2.0",
- "rimraf": "^5.0.5",
- "schema-utils": "^4.2.0",
- "selfsigned": "^2.4.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^7.1.0",
- "ws": "^8.16.0"
- },
- "dependencies": {
- "glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "dev": true,
- "requires": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- }
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "rimraf": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
- "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
- "dev": true,
- "requires": {
- "glob": "^10.3.7"
- }
- }
- }
- },
- "webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true
- },
- "whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "requires": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true
- },
- "@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz",
- "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==",
- "dev": true,
- "requires": {
- "ansi-html-community": "^0.0.8",
- "common-path-prefix": "^3.0.0",
- "core-js-pure": "^3.23.3",
- "error-stack-parser": "^2.0.6",
- "find-up": "^5.0.0",
- "html-entities": "^2.1.0",
- "loader-utils": "^2.0.4",
- "schema-utils": "^3.0.0",
- "source-map": "^0.7.3"
- },
- "dependencies": {
- "source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "dev": true
- }
- }
- },
- "@pollyjs/adapter": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/adapter/-/adapter-6.0.6.tgz",
- "integrity": "sha512-szhys0NiFQqCJDMC0kpDyjhLqSI7aWc6m6iATCRKgcMcN/7QN85pb3GmRzvnNV8+/Bi2AUSCwxZljcsKhbYVWQ==",
- "dev": true,
- "requires": {
- "@pollyjs/utils": "^6.0.6"
- }
- },
- "@pollyjs/adapter-node-http": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/adapter-node-http/-/adapter-node-http-6.0.6.tgz",
- "integrity": "sha512-jdJG7oncmSHZAtVMmRgOxh5A56b7G8H9ULlk/ZaVJ+jNrlFXhLmPpx8OQoSF4Cuq2ugdiWmwmAjFXHStcpY3Mw==",
- "dev": true,
- "requires": {
- "@pollyjs/adapter": "^6.0.6",
- "@pollyjs/utils": "^6.0.6",
- "lodash-es": "^4.17.21",
- "nock": "^13.2.1"
- }
- },
- "@pollyjs/core": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/core/-/core-6.0.6.tgz",
- "integrity": "sha512-1ZZcmojW8iSFmvHGeLlvuudM3WiDV842FsVvtPAo3HoAYE6jCNveLHJ+X4qvonL4enj1SyTF3hXA107UkQFQrA==",
- "dev": true,
- "requires": {
- "@pollyjs/utils": "^6.0.6",
- "@sindresorhus/fnv1a": "^2.0.1",
- "blueimp-md5": "^2.19.0",
- "fast-json-stable-stringify": "^2.1.0",
- "is-absolute-url": "^3.0.3",
- "lodash-es": "^4.17.21",
- "loglevel": "^1.8.0",
- "route-recognizer": "^0.3.4",
- "slugify": "^1.6.3"
- }
- },
- "@pollyjs/node-server": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/node-server/-/node-server-6.0.6.tgz",
- "integrity": "sha512-nkP1+hdNoVOlrRz9R84haXVsaSmo8Xmq7uYK9GeUMSLQy4Fs55ZZ9o2KI6vRA8F6ZqJSbC31xxwwIoTkjyP7Vg==",
- "dev": true,
- "requires": {
- "@pollyjs/utils": "^6.0.6",
- "body-parser": "^1.19.0",
- "cors": "^2.8.5",
- "express": "^4.17.1",
- "fs-extra": "^10.0.0",
- "http-graceful-shutdown": "^3.1.5",
- "morgan": "^1.10.0",
- "nocache": "^3.0.1"
- },
- "dependencies": {
- "nocache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
- "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
- "dev": true
- }
- }
- },
- "@pollyjs/persister": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/persister/-/persister-6.0.6.tgz",
- "integrity": "sha512-9KB1p+frvYvFGur4ifzLnFKFLXAMXrhAhCnVhTnkG2WIqqQPT7y+mKBV/DKCmYFx8GPA9FiNGqt2pB53uJpIdw==",
- "dev": true,
- "requires": {
- "@pollyjs/utils": "^6.0.6",
- "@types/set-cookie-parser": "^2.4.1",
- "bowser": "^2.4.0",
- "fast-json-stable-stringify": "^2.1.0",
- "lodash-es": "^4.17.21",
- "set-cookie-parser": "^2.4.8",
- "utf8-byte-length": "^1.0.4"
- }
- },
- "@pollyjs/persister-fs": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/persister-fs/-/persister-fs-6.0.6.tgz",
- "integrity": "sha512-/ALVgZiH2zGqwLkW0Mntc0Oq1v7tR8LS8JD2SAyIsHpnSXeBUnfPWwjAuYw0vqORHFVEbwned6MBRFfvU/3qng==",
- "dev": true,
- "requires": {
- "@pollyjs/node-server": "^6.0.6",
- "@pollyjs/persister": "^6.0.6"
- }
- },
- "@pollyjs/utils": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@pollyjs/utils/-/utils-6.0.6.tgz",
- "integrity": "sha512-nhVJoI3nRgRimE0V2DVSvsXXNROUH6iyJbroDu4IdsOIOFC1Ds0w+ANMB4NMwFaqE+AisWOmXFzwAGdAfyiQVg==",
- "dev": true,
- "requires": {
- "qs": "^6.10.1",
- "url-parse": "^1.5.3"
- }
- },
- "@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "dev": true
- },
- "@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
- },
- "@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
- },
- "@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
- },
- "@protobufjs/eventemitter": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
- },
- "@protobufjs/fetch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
- "requires": {
- "@protobufjs/aspromise": "^1.1.1",
- "@protobufjs/inquire": "^1.1.0"
- }
- },
- "@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
- },
- "@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
- },
- "@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
- },
- "@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
- },
- "@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
- },
- "@react-aria/ssr": {
- "version": "3.9.4",
- "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.4.tgz",
- "integrity": "sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==",
- "dev": true,
- "requires": {
- "@swc/helpers": "^0.5.0"
- }
- },
- "@react-dnd/asap": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz",
- "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==",
- "dev": true
- },
- "@react-dnd/invariant": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz",
- "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==",
- "dev": true
- },
- "@react-dnd/shallowequal": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz",
- "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==",
- "dev": true
- },
- "@remix-run/router": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
- "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg=="
- },
- "@replit/codemirror-emacs": {
- "version": "git+ssh://git@github.com/overleaf/codemirror-emacs.git#4394c03858f27053f8768258e9493866e06e938e",
- "integrity": "sha512-5rEKNeFfYPi3ytelXa5IIXnRu5Wvpzz80W1xa9k7gorC2wHlFRveIiIeXdwcQQw92pe5cT5vtpldLLZW5xcAIg==",
- "dev": true,
- "from": "@replit/codemirror-emacs@overleaf/codemirror-emacs#4394c03858f27053f8768258e9493866e06e938e",
- "requires": {}
- },
- "@replit/codemirror-indentation-markers": {
- "version": "git+ssh://git@github.com/overleaf/codemirror-indentation-markers.git#1b1f93c0bcd04293aea6986aa2275185b2c56803",
- "integrity": "sha512-33syzlJuFicLpTzJR0Z8d5jqGFmKae5UxiwDdvHzLzQUKvVxc+9Pu7v1Yigf+wWqufPmt0DE2ub/amBB8HcmIw==",
- "dev": true,
- "from": "@replit/codemirror-indentation-markers@overleaf/codemirror-indentation-markers#1b1f93c0bcd04293aea6986aa2275185b2c56803",
- "requires": {}
- },
- "@replit/codemirror-vim": {
- "version": "git+ssh://git@github.com/overleaf/codemirror-vim.git#51ce0933e95705268256467fbbbcce5999ed3624",
- "integrity": "sha512-cdp9t2IY1gHPwW3khJAxb9ffay6af9BLE0ZNCsq/SK6dj5TTwqoxT4N6aXJC+05spYlqcLRIlsqIJ1QrU5KUKw==",
- "dev": true,
- "from": "@replit/codemirror-vim@overleaf/codemirror-vim#51ce0933e95705268256467fbbbcce5999ed3624",
- "requires": {}
- },
- "@restart/hooks": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz",
- "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==",
- "dev": true,
- "requires": {
- "dequal": "^2.0.3"
- }
- },
- "@restart/ui": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.9.tgz",
- "integrity": "sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.21.0",
- "@popperjs/core": "^2.11.6",
- "@react-aria/ssr": "^3.5.0",
- "@restart/hooks": "^0.4.9",
- "@types/warning": "^3.0.0",
- "dequal": "^2.0.3",
- "dom-helpers": "^5.2.0",
- "uncontrollable": "^8.0.1",
- "warning": "^4.0.3"
- },
- "dependencies": {
- "dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "uncontrollable": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz",
- "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==",
- "dev": true,
- "requires": {}
- },
- "warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- }
- }
- },
- "@sentry-internal/tracing": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.46.0.tgz",
- "integrity": "sha512-KYoppa7PPL8Er7bdPoxTNUfIY804JL7hhOEomQHYD22rLynwQ4AaLm3YEY75QWwcGb0B7ZDMV+tSumW7Rxuwuw==",
- "dev": true,
- "requires": {
- "@sentry/core": "7.46.0",
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "@sentry/core": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.46.0.tgz",
- "integrity": "sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/types": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.46.0.tgz",
- "integrity": "sha512-2FMEMgt2h6u7AoELhNhu9L54GAh67KKfK2pJ1kEXJHmWxM9FSCkizjLs/t+49xtY7jEXr8qYq8bV967VfDPQ9g==",
- "dev": true
- },
- "@sentry/utils": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.46.0.tgz",
- "integrity": "sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "tslib": "^1.9.3"
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "@sentry/core": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.3.tgz",
- "integrity": "sha512-h7WgrNL0RVlr8Dceh97ZiXNdmEumDutpoqFijjiX4x72IiC6zSaVD4IsqrdGln+v8iJ3l3lX44HHqzubDub1OQ==",
- "requires": {
- "@sentry/hub": "6.17.3",
- "@sentry/minimal": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sentry/hub": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.3.tgz",
- "integrity": "sha512-TDxv8nRvk45xvfQg6zs8GYzQzgo0EMhI3wjQZLiNfW2rzybKmIwVp2x3O4PAc3WPzwg4bYNgSAkYKVlHmYjRCg==",
- "requires": {
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sentry/minimal": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.3.tgz",
- "integrity": "sha512-zvGGfHNNA92Lqx6P8ZwOUkmRmAiQl0AQFRXl9So1Ayq9bJRnFLJZv4YFVnp2wE4HXYIlfBYb51+GlGB5LIuPmw==",
- "requires": {
- "@sentry/hub": "6.17.3",
- "@sentry/types": "6.17.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sentry/node": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.17.3.tgz",
- "integrity": "sha512-LvpB6bCQTytoOlrcQgR80aeEEBi2Sm1hNf+VvoPT6CW7tKI1/6pMWXaNnRu2dpyWS/j6tooz8rd/3dl1SZoGvg==",
- "requires": {
- "@sentry/core": "6.17.3",
- "@sentry/hub": "6.17.3",
- "@sentry/tracing": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "cookie": "^0.4.1",
- "https-proxy-agent": "^5.0.0",
- "lru_map": "^0.3.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sentry/replay": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.46.0.tgz",
- "integrity": "sha512-rHsAFdeEu47JRy6mEwwN+M+zTTWlOFWw9sR/eDCvik2lxAXBN2mXvf/N/MN9zQB3+QnS13ke+SvwVW7CshLOXg==",
- "dev": true,
- "requires": {
- "@sentry/core": "7.46.0",
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0"
- },
- "dependencies": {
- "@sentry/core": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.46.0.tgz",
- "integrity": "sha512-BnNHGh/ZTztqQedFko7vb2u6yLs/kWesOQNivav32ZbsEpVCjcmG1gOJXh2YmGIvj3jXOC9a4xfIuh+lYFcA6A==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "@sentry/utils": "7.46.0",
- "tslib": "^1.9.3"
- }
- },
- "@sentry/types": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.46.0.tgz",
- "integrity": "sha512-2FMEMgt2h6u7AoELhNhu9L54GAh67KKfK2pJ1kEXJHmWxM9FSCkizjLs/t+49xtY7jEXr8qYq8bV967VfDPQ9g==",
- "dev": true
- },
- "@sentry/utils": {
- "version": "7.46.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.46.0.tgz",
- "integrity": "sha512-elRezDAF84guMG0OVIIZEWm6wUpgbda4HGks98CFnPsrnMm3N1bdBI9XdlxYLtf+ir5KsGR5YlEIf/a0kRUwAQ==",
- "dev": true,
- "requires": {
- "@sentry/types": "7.46.0",
- "tslib": "^1.9.3"
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "@sentry/tracing": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.17.3.tgz",
- "integrity": "sha512-GnHugxw5qkWwYmeQbbrswuWpb0bpYqyJr/dO25QQOCwp+cckQrvBYTMC8zGJG10u94O4el0lQaQnNFz9WF3r6g==",
- "requires": {
- "@sentry/hub": "6.17.3",
- "@sentry/minimal": "6.17.3",
- "@sentry/types": "6.17.3",
- "@sentry/utils": "6.17.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sentry/types": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.3.tgz",
- "integrity": "sha512-0AXCjYcfl8Vx26GfyLY4rBQ78Lyt1oND3UozTTMaVXlcKYIjzV+f7TOo5IZx+Kbr6EGUNDLdpA4xfbkWdW/1NA=="
- },
- "@sentry/utils": {
- "version": "6.17.3",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.3.tgz",
- "integrity": "sha512-6/2awDIeHSj0JgiC7DDdV1lxvLmf+/BisWhw09dKvmhVQB3ADvQZbohjUgM+Qam5zE0xmZAfQhvuDwC41W8Wnw==",
- "requires": {
- "@sentry/types": "6.17.3",
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "@sideway/address": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
- "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
- "requires": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "@sideway/formula": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
- "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="
- },
- "@sideway/pinpoint": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
- "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
- },
- "@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
- "dev": true
- },
- "@sindresorhus/fnv1a": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-2.0.1.tgz",
- "integrity": "sha512-suq9tRQ6bkpMukTG5K5z0sPWB7t0zExMzZCdmYm6xTSSIm/yCKNm7VCL36wVeyTsFr597/UhU1OAYdHGMDiHrw==",
- "dev": true
- },
- "@sinonjs/commons": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
- "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
- "dev": true,
- "requires": {
- "type-detect": "4.0.8"
- }
- },
- "@sinonjs/fake-timers": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
- "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0"
- }
- },
- "@sinonjs/formatio": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz",
- "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1",
- "@sinonjs/samsam": "^5.0.2"
- }
- },
- "@sinonjs/samsam": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz",
- "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.6.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
- }
- },
- "@sinonjs/text-encoding": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
- "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
- "dev": true
- },
- "@slack/types": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.10.0.tgz",
- "integrity": "sha512-JXY9l49rf7dDgvfMZi0maFyugzGkvq0s5u+kDlD68WaRUhjZNLBDKZcsrycMsVVDFfyOK0R1UKkYGmy9Ph069Q=="
- },
- "@slack/webhook": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-7.0.2.tgz",
- "integrity": "sha512-dsrO/ow6a6+xkLm/lZKbUNTsFJlBc679tD+qwlVTztsQkDxPLH6odM7FKALz1IHa+KpLX8HKUIPV13a7y7z29w==",
- "requires": {
- "@slack/types": "^2.9.0",
- "@types/node": ">=18.0.0",
- "axios": "^1.6.3"
- }
- },
- "@smithy/abort-controller": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz",
- "integrity": "sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/config-resolver": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.2.tgz",
- "integrity": "sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "@smithy/util-config-provider": "^1.0.2",
- "@smithy/util-middleware": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/credential-provider-imds": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz",
- "integrity": "sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w==",
- "optional": true,
- "requires": {
- "@smithy/node-config-provider": "^1.0.2",
- "@smithy/property-provider": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "@smithy/url-parser": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/eventstream-codec": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz",
- "integrity": "sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg==",
- "optional": true,
- "requires": {
- "@aws-crypto/crc32": "3.0.0",
- "@smithy/types": "^1.1.1",
- "@smithy/util-hex-encoding": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/fetch-http-handler": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz",
- "integrity": "sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA==",
- "optional": true,
- "requires": {
- "@smithy/protocol-http": "^1.1.1",
- "@smithy/querystring-builder": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "@smithy/util-base64": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/hash-node": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.2.tgz",
- "integrity": "sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "@smithy/util-buffer-from": "^1.0.2",
- "@smithy/util-utf8": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/invalid-dependency": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz",
- "integrity": "sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/is-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz",
- "integrity": "sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/middleware-content-length": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz",
- "integrity": "sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw==",
- "optional": true,
- "requires": {
- "@smithy/protocol-http": "^1.1.1",
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/middleware-endpoint": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz",
- "integrity": "sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw==",
- "optional": true,
- "requires": {
- "@smithy/middleware-serde": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "@smithy/url-parser": "^1.0.2",
- "@smithy/util-middleware": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/middleware-retry": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz",
- "integrity": "sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg==",
- "optional": true,
- "requires": {
- "@smithy/protocol-http": "^1.1.1",
- "@smithy/service-error-classification": "^1.0.3",
- "@smithy/types": "^1.1.1",
- "@smithy/util-middleware": "^1.0.2",
- "@smithy/util-retry": "^1.0.4",
- "tslib": "^2.5.0",
- "uuid": "^8.3.2"
- },
- "dependencies": {
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "optional": true
- }
- }
- },
- "@smithy/middleware-serde": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz",
- "integrity": "sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/middleware-stack": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz",
- "integrity": "sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/node-config-provider": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz",
- "integrity": "sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg==",
- "optional": true,
- "requires": {
- "@smithy/property-provider": "^1.0.2",
- "@smithy/shared-ini-file-loader": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/node-http-handler": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz",
- "integrity": "sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g==",
- "optional": true,
- "requires": {
- "@smithy/abort-controller": "^1.0.2",
- "@smithy/protocol-http": "^1.1.1",
- "@smithy/querystring-builder": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/property-provider": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.2.tgz",
- "integrity": "sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/protocol-http": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.1.tgz",
- "integrity": "sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/querystring-builder": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz",
- "integrity": "sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "@smithy/util-uri-escape": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/querystring-parser": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz",
- "integrity": "sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/service-error-classification": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz",
- "integrity": "sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA==",
- "optional": true
- },
- "@smithy/shared-ini-file-loader": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz",
- "integrity": "sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw==",
- "optional": true,
- "requires": {
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/signature-v4": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.2.tgz",
- "integrity": "sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig==",
- "optional": true,
- "requires": {
- "@smithy/eventstream-codec": "^1.0.2",
- "@smithy/is-array-buffer": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "@smithy/util-hex-encoding": "^1.0.2",
- "@smithy/util-middleware": "^1.0.2",
- "@smithy/util-uri-escape": "^1.0.2",
- "@smithy/util-utf8": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/smithy-client": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.4.tgz",
- "integrity": "sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg==",
- "optional": true,
- "requires": {
- "@smithy/middleware-stack": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "@smithy/util-stream": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/types": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz",
- "integrity": "sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/url-parser": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.2.tgz",
- "integrity": "sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA==",
- "optional": true,
- "requires": {
- "@smithy/querystring-parser": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-base64": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.2.tgz",
- "integrity": "sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA==",
- "optional": true,
- "requires": {
- "@smithy/util-buffer-from": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-body-length-browser": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz",
- "integrity": "sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-body-length-node": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz",
- "integrity": "sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-buffer-from": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz",
- "integrity": "sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw==",
- "optional": true,
- "requires": {
- "@smithy/is-array-buffer": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-config-provider": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz",
- "integrity": "sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-defaults-mode-browser": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz",
- "integrity": "sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg==",
- "optional": true,
- "requires": {
- "@smithy/property-provider": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "bowser": "^2.11.0",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-defaults-mode-node": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz",
- "integrity": "sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg==",
- "optional": true,
- "requires": {
- "@smithy/config-resolver": "^1.0.2",
- "@smithy/credential-provider-imds": "^1.0.2",
- "@smithy/node-config-provider": "^1.0.2",
- "@smithy/property-provider": "^1.0.2",
- "@smithy/types": "^1.1.1",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-hex-encoding": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz",
- "integrity": "sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-middleware": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.2.tgz",
- "integrity": "sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-retry": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.4.tgz",
- "integrity": "sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw==",
- "optional": true,
- "requires": {
- "@smithy/service-error-classification": "^1.0.3",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-stream": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.2.tgz",
- "integrity": "sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A==",
- "optional": true,
- "requires": {
- "@smithy/fetch-http-handler": "^1.0.2",
- "@smithy/node-http-handler": "^1.0.3",
- "@smithy/types": "^1.1.1",
- "@smithy/util-base64": "^1.0.2",
- "@smithy/util-buffer-from": "^1.0.2",
- "@smithy/util-hex-encoding": "^1.0.2",
- "@smithy/util-utf8": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-uri-escape": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz",
- "integrity": "sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg==",
- "optional": true,
- "requires": {
- "tslib": "^2.5.0"
- }
- },
- "@smithy/util-utf8": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.2.tgz",
- "integrity": "sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw==",
- "optional": true,
- "requires": {
- "@smithy/util-buffer-from": "^1.0.2",
- "tslib": "^2.5.0"
- }
- },
- "@storybook/addon-styling-webpack": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/addon-styling-webpack/-/addon-styling-webpack-1.0.0.tgz",
- "integrity": "sha512-jo1kzn7pi+NA+LZxrWoRvW6w7dXIKY/BjTG80XX2uU92lIKT+X1k/9vYk/0KPVK3Bsf4tO6ToAuqIRyOk7MHtg==",
- "dev": true,
- "requires": {
- "@storybook/node-logger": "^8.0.0-alpha.10"
- }
- },
- "@storybook/addon-webpack5-compiler-babel": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz",
- "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.23.7",
- "babel-loader": "^9.1.3"
- }
- },
- "@storybook/core": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.5.tgz",
- "integrity": "sha512-GOGfTvdioNa/n+Huwg4u/dsyYyBcM+gEcdxi3B7i5x4yJ3I912KoVshumQAOF2myKSRdI8h8aGWdx7nnjd0+5Q==",
- "dev": true,
- "requires": {
- "@storybook/csf": "^0.1.11",
- "@types/express": "^4.17.21",
- "better-opn": "^3.0.2",
- "browser-assert": "^1.2.1",
- "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0",
- "esbuild-register": "^3.5.0",
- "express": "^4.19.2",
- "jsdoc-type-pratt-parser": "^4.0.0",
- "process": "^0.11.10",
- "recast": "^0.23.5",
- "semver": "^7.6.2",
- "util": "^0.12.5",
- "ws": "^8.2.3"
- },
- "dependencies": {
- "@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
- "dev": true,
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- }
- }
- },
- "@storybook/csf": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz",
- "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==",
- "dev": true,
- "requires": {
- "type-fest": "^2.19.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true
- }
- }
- },
- "@storybook/global": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
- "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
- "dev": true
- },
- "@storybook/node-logger": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.4.tgz",
- "integrity": "sha512-cALLHuX53vLQsoJamGRlquh2pfhPq9copXou2JTmFT6mrCcipo77SzhBDfeeuhaGv6vUWPfmGjPBEHXWGPe4+g==",
- "dev": true
- },
- "@storybook/react-docgen-typescript-plugin": {
- "version": "1.0.6--canary.9.0c3f3b7.0",
- "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz",
- "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "endent": "^2.0.1",
- "find-cache-dir": "^3.3.1",
- "flat-cache": "^3.0.4",
- "micromatch": "^4.0.2",
- "react-docgen-typescript": "^2.2.2",
- "tslib": "^2.0.0"
- },
- "dependencies": {
- "find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- }
- }
- }
- },
- "@swc/helpers": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz",
- "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==",
- "dev": true,
- "requires": {
- "tslib": "^2.4.0"
- }
- },
- "@testing-library/cypress": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.1.tgz",
- "integrity": "sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.14.6",
- "@testing-library/dom": "^9.0.0"
- },
- "dependencies": {
- "@testing-library/dom": {
- "version": "9.3.3",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz",
- "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.1.3",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- }
- },
- "@types/aria-query": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.2.tgz",
- "integrity": "sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@testing-library/dom": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.13.0.tgz",
- "integrity": "sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^4.2.0",
- "aria-query": "^5.0.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.4.4",
- "pretty-format": "^27.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@testing-library/react": {
- "version": "12.1.5",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz",
- "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.12.5",
- "@testing-library/dom": "^8.0.0",
- "@types/react-dom": "<18.0.0"
- }
- },
- "@testing-library/react-hooks": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz",
- "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.12.5",
- "react-error-boundary": "^3.1.0"
- },
- "dependencies": {
- "react-error-boundary": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz",
- "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.12.5"
- }
- }
- }
- },
- "@testing-library/user-event": {
- "version": "14.5.2",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
- "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==",
- "dev": true,
- "requires": {}
- },
- "@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
- },
- "@transloadit/prettier-bytes": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
- "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==",
- "dev": true
- },
- "@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
- "dev": true
- },
- "@types/accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/aria-query": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
- "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==",
- "dev": true
- },
- "@types/aws-lambda": {
- "version": "8.10.119",
- "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.119.tgz",
- "integrity": "sha512-Vqm22aZrCvCd6I5g1SvpW151jfqwTzEZ7XJ3yZ6xaZG31nUEOEyzzVImjRcsN8Wi/QyPxId/x8GTtgIbsy8kEw=="
- },
- "@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "@types/babel__generator": {
- "version": "7.6.8",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
- "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
- "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.20.7"
- }
- },
- "@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/bonjour": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
- "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/bootstrap": {
- "version": "5.2.10",
- "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz",
- "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==",
- "dev": true,
- "requires": {
- "@popperjs/core": "^2.9.2"
- }
- },
- "@types/bootstrap-5": {
- "version": "npm:@types/bootstrap@5.2.10",
- "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz",
- "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==",
- "dev": true,
- "requires": {
- "@popperjs/core": "^2.9.2"
- }
- },
- "@types/bunyan": {
- "version": "1.8.8",
- "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.8.tgz",
- "integrity": "sha512-Cblq+Yydg3u+sGiz2mjHjC5MPmdjY+No4qvHrF+BUhblsmSfMvsHLbOG62tPbonsqBj6sbWv1LHcsoe5Jw+/Ow==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/caseless": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
- "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="
- },
- "@types/chai": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz",
- "integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw=="
- },
- "@types/chai-as-promised": {
- "version": "7.1.8",
- "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz",
- "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==",
- "requires": {
- "@types/chai": "*"
- }
- },
- "@types/check-types": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/@types/check-types/-/check-types-7.3.7.tgz",
- "integrity": "sha512-ZNAGaVc/joAV3lAuRwPdsQY/caU1RvKoa+U7i/TkYIlOStdYq4vyArFnA1zItfEDkHpXNWApWIqqbp5fsHAiRg==",
- "dev": true
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/connect-history-api-fallback": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
- "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
- "dev": true,
- "requires": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "@types/console-log-level": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.3.tgz",
- "integrity": "sha512-B6Mzad6H4RugduMX84ehFVvGM/JRAd9lZQk4a6dztB4+zcIUehIjKrbWH/nHO2+0wwx05rgyqjXBvOjAv0uL6A=="
- },
- "@types/content-disposition": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz",
- "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA=="
- },
- "@types/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
- },
- "@types/cookiejar": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz",
- "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==",
- "dev": true
- },
- "@types/cookies": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
- "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
- "requires": {
- "@types/connect": "*",
- "@types/express": "*",
- "@types/keygrip": "*",
- "@types/node": "*"
- }
- },
- "@types/dateformat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/dateformat/-/dateformat-5.0.2.tgz",
- "integrity": "sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw=="
- },
- "@types/debug": {
- "version": "4.1.7",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz",
- "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==",
- "requires": {
- "@types/ms": "*"
- }
- },
- "@types/diff": {
- "version": "5.0.9",
- "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.0.9.tgz",
- "integrity": "sha512-RWVEhh/zGXpAVF/ZChwNnv7r4rvqzJ7lYNSmZSVTxjV0PBLf6Qu7RNg+SUtkpzxmiNkjCx0Xn2tPp7FIkshJwQ==",
- "dev": true
- },
- "@types/dompurify": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
- "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
- "dev": true,
- "requires": {
- "@types/trusted-types": "*"
- }
- },
- "@types/escodegen": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz",
- "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==",
- "dev": true
- },
- "@types/eslint": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
- "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
- "dev": true,
- "requires": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
- "dev": true,
- "requires": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
- "dev": true
- },
- "@types/express": {
- "version": "4.17.17",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
- "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.36",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz",
- "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==",
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "@types/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
- "requires": {
- "@types/minimatch": "^5.1.2",
- "@types/node": "*"
- }
- },
- "@types/hapi__catbox": {
- "version": "10.2.4",
- "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.4.tgz",
- "integrity": "sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg=="
- },
- "@types/hapi__hapi": {
- "version": "20.0.13",
- "resolved": "https://registry.npmjs.org/@types/hapi__hapi/-/hapi__hapi-20.0.13.tgz",
- "integrity": "sha512-LP4IPfhIO5ZPVOrJo7H8c8Slc0WYTFAUNQX1U0LBPKyXioXhH5H2TawIgxKujIyOhbwoBbpvOsBf6o5+ToJIrQ==",
- "requires": {
- "@hapi/boom": "^9.0.0",
- "@hapi/iron": "^6.0.0",
- "@hapi/podium": "^4.1.3",
- "@types/hapi__catbox": "*",
- "@types/hapi__mimos": "*",
- "@types/hapi__shot": "*",
- "@types/node": "*",
- "joi": "^17.3.0"
- }
- },
- "@types/hapi__mimos": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@types/hapi__mimos/-/hapi__mimos-4.1.4.tgz",
- "integrity": "sha512-i9hvJpFYTT/qzB5xKWvDYaSXrIiNqi4ephi+5Lo6+DoQdwqPXQgmVVOZR+s3MBiHoFqsCZCX9TmVWG3HczmTEQ==",
- "requires": {
- "@types/mime-db": "*"
- }
- },
- "@types/hapi__shot": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.2.tgz",
- "integrity": "sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
- "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
- "dev": true,
- "requires": {
- "@types/unist": "*"
- }
- },
- "@types/hoist-non-react-statics": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
- "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
- "requires": {
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0"
- }
- },
- "@types/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
- "dev": true
- },
- "@types/http-assert": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
- "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
- },
- "@types/http-errors": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
- "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
- },
- "@types/http-proxy": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
- "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/ioredis4": {
- "version": "npm:@types/ioredis@4.28.10",
- "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz",
- "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/istanbul-lib-coverage": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
- "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
- "dev": true
- },
- "@types/istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "@types/istanbul-reports": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
- "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.13",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
- "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ=="
- },
- "@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true
- },
- "@types/keygrip": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
- "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
- },
- "@types/koa": {
- "version": "2.13.8",
- "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.8.tgz",
- "integrity": "sha512-Ugmxmgk/yPRW3ptBTh9VjOLwsKWJuGbymo1uGX0qdaqqL18uJiiG1ZoV0rxCOYSaDGhvEp5Ece02Amx0iwaxQQ==",
- "requires": {
- "@types/accepts": "*",
- "@types/content-disposition": "*",
- "@types/cookies": "*",
- "@types/http-assert": "*",
- "@types/http-errors": "*",
- "@types/keygrip": "*",
- "@types/koa-compose": "*",
- "@types/node": "*"
- }
- },
- "@types/koa__router": {
- "version": "8.0.11",
- "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-8.0.11.tgz",
- "integrity": "sha512-WXgKWpBsbS14kzmzD9LeFapOIa678h7zvUHxDwXwSx4ETKXhXLVUAToX6jZ/U7EihM7qwyD9W/BZvB0MRu7MTQ==",
- "requires": {
- "@types/koa": "*"
- }
- },
- "@types/koa-compose": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
- "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
- "requires": {
- "@types/koa": "*"
- }
- },
- "@types/ldapjs": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.11.tgz",
- "integrity": "sha512-O4D1frY6xy2mQr5WouNPeltMe5EHdmU4FxbLDC6TMDX5HXOuafusGu+7Y9WAoqBaYHZ5hcFa7jfkpggyexfeXQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
- },
- "@types/lodash": {
- "version": "4.14.178",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz",
- "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==",
- "dev": true
- },
- "@types/long": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
- "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
- },
- "@types/markdown-it": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz",
- "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==",
- "requires": {
- "@types/linkify-it": "^5",
- "@types/mdurl": "^2"
- }
- },
- "@types/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
- },
- "@types/mdx": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.12.tgz",
- "integrity": "sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==",
- "dev": true
- },
- "@types/memcached": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz",
- "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- },
- "@types/mime-db": {
- "version": "1.43.1",
- "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.1.tgz",
- "integrity": "sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ=="
- },
- "@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
- },
- "@types/mocha": {
- "version": "10.0.6",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
- "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==",
- "dev": true
- },
- "@types/mocha-each": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/mocha-each/-/mocha-each-2.0.0.tgz",
- "integrity": "sha512-wZWPqB+pnH9SL7qzORZha1dBt5ypYgPYDSma9wwtQVGmu36QonRWnc8hbJwgMaCPYHTHzrAGMnwp+we/SGI2YQ==",
- "dev": true,
- "requires": {
- "@types/mocha": "*"
- }
- },
- "@types/ms": {
- "version": "0.7.31",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
- "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
- },
- "@types/mysql": {
- "version": "2.15.21",
- "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz",
- "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "18.18.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.3.tgz",
- "integrity": "sha512-0OVfGupTl3NBFr8+iXpfZ8NR7jfFO+P1Q+IO/q0wbo02wYkP5gy36phojeYWpLQ6WAMjl+VfmqUk2YbUfp0irA=="
- },
- "@types/node-fetch": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
- "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
- "requires": {
- "@types/node": "*",
- "form-data": "^4.0.0"
- }
- },
- "@types/node-forge": {
- "version": "1.3.11",
- "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
- "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "@types/passport": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz",
- "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==",
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/passport-strategy": {
- "version": "0.2.38",
- "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz",
- "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==",
- "requires": {
- "@types/express": "*",
- "@types/passport": "*"
- }
- },
- "@types/path-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/path-browserify/-/path-browserify-1.0.2.tgz",
- "integrity": "sha512-ZkC5IUqqIFPXx3ASTTybTzmQdwHwe2C0u3eL75ldQ6T9E9IWFJodn6hIfbZGab73DfyiHN4Xw15gNxUq2FbvBA==",
- "dev": true
- },
- "@types/pg": {
- "version": "8.6.1",
- "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz",
- "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==",
- "requires": {
- "@types/node": "*",
- "pg-protocol": "*",
- "pg-types": "^2.2.0"
- }
- },
- "@types/pg-pool": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.3.tgz",
- "integrity": "sha512-fwK5WtG42Yb5RxAwxm3Cc2dJ39FlgcaNiXKvtTLAwtCn642X7dgel+w1+cLWwpSOFImR3YjsZtbkfjxbHtFAeg==",
- "requires": {
- "@types/pg": "*"
- }
- },
- "@types/prop-types": {
- "version": "15.7.4",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
- "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- },
- "@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- },
- "@types/react": {
- "version": "17.0.40",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.40.tgz",
- "integrity": "sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==",
- "requires": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "@types/react-bootstrap": {
- "version": "0.32.36",
- "resolved": "https://registry.npmjs.org/@types/react-bootstrap/-/react-bootstrap-0.32.36.tgz",
- "integrity": "sha512-xldfs2zixagAFEafy/XzRvZH1NtjRnLfbgL0cZ2a0Eykz+iILE/Xa46tnUFcLln6ZBq1Qp9uArhIbkkuhBU30g==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-color": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz",
- "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==",
- "dev": true,
- "requires": {
- "@types/react": "*",
- "@types/reactcss": "*"
- }
- },
- "@types/react-dom": {
- "version": "17.0.13",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.13.tgz",
- "integrity": "sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-google-recaptcha": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@types/react-google-recaptcha/-/react-google-recaptcha-2.1.5.tgz",
- "integrity": "sha512-iWTjmVttlNgp0teyh7eBXqNOQzVq2RWNiFROWjraOptRnb1OcHJehQnji0sjqIRAk9K0z8stjyhU+OLpPb0N6w==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-linkify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/react-linkify/-/react-linkify-1.0.0.tgz",
- "integrity": "sha512-2NKXPQGaHNfh/dCqkVC55k1tAhQyNoNZa31J50nIneMVwHqUI00FAP+Lyp8e0BarPf84kn4GRVAhtWX9XJBzSQ==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/react-overlays": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@types/react-overlays/-/react-overlays-1.1.3.tgz",
- "integrity": "sha512-oOq5NWbyfNz2w2sKvjkHdvGQSMA+VDVfI5UOfGPR0wkik2welad1RDVnVgH15jKf58jrZNBa1Ee4SVBgCGFxCg==",
- "dev": true,
- "requires": {
- "@types/react": "*",
- "@types/react-transition-group": "*"
- }
- },
- "@types/react-redux": {
- "version": "7.1.33",
- "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
- "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
- "requires": {
- "@types/hoist-non-react-statics": "^3.3.0",
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0",
- "redux": "^4.0.0"
- }
- },
- "@types/react-transition-group": {
- "version": "4.4.10",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
- "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/reactcss": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz",
- "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==",
- "dev": true,
- "requires": {
- "@types/react": "*"
- }
- },
- "@types/recurly__recurly-js": {
- "version": "4.22.0",
- "resolved": "https://registry.npmjs.org/@types/recurly__recurly-js/-/recurly__recurly-js-4.22.0.tgz",
- "integrity": "sha512-2dJ1QnwcyCmxeIAzOaBx/r1JqMIqZ7rohxJMY0UynSQidEDfb9X2x3OHMthBXDtTzSFJ1usY934wakxgm7d+Wg==",
- "dev": true
- },
- "@types/request": {
- "version": "2.48.12",
- "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz",
- "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==",
- "requires": {
- "@types/caseless": "*",
- "@types/node": "*",
- "@types/tough-cookie": "*",
- "form-data": "^2.5.0"
- },
- "dependencies": {
- "form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- }
- }
- },
- "@types/resolve": {
- "version": "1.20.6",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
- "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==",
- "dev": true
- },
- "@types/retry": {
- "version": "0.12.2",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
- "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
- "dev": true
- },
- "@types/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==",
- "requires": {
- "@types/glob": "*",
- "@types/node": "*"
- }
- },
- "@types/scheduler": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
- "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- },
- "@types/semver": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
- "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw=="
- },
- "@types/send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz",
- "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==",
- "requires": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "@types/serve-index": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
- "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
- "dev": true,
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/serve-static": {
- "version": "1.15.7",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
- "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
- "requires": {
- "@types/http-errors": "*",
- "@types/node": "*",
- "@types/send": "*"
- }
- },
- "@types/set-cookie-parser": {
- "version": "2.4.7",
- "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz",
- "integrity": "sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/shimmer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz",
- "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg=="
- },
- "@types/simple-oauth2": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.7.tgz",
- "integrity": "sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==",
- "dev": true
- },
- "@types/sinon": {
- "version": "10.0.11",
- "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz",
- "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==",
- "dev": true,
- "requires": {
- "@types/sinonjs__fake-timers": "*"
- }
- },
- "@types/sinon-chai": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.8.tgz",
- "integrity": "sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g==",
- "dev": true,
- "requires": {
- "@types/chai": "*",
- "@types/sinon": "*"
- }
- },
- "@types/sinonjs__fake-timers": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
- "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
- "dev": true
- },
- "@types/sizzle": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
- "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
- "dev": true
- },
- "@types/sockjs": {
- "version": "0.3.36",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
- "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/superagent": {
- "version": "4.1.13",
- "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.13.tgz",
- "integrity": "sha512-YIGelp3ZyMiH0/A09PMAORO0EBGlF5xIKfDpK74wdYvWUs2o96b5CItJcWPdH409b7SAXIIG6p8NdU/4U2Maww==",
- "dev": true,
- "requires": {
- "@types/cookiejar": "*",
- "@types/node": "*"
- }
- },
- "@types/tedious": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.10.tgz",
- "integrity": "sha512-lxm0D01yaVGsX5MvcM3/gFzQi7/ETSrQVs5XTiKbm6im/z+M+/Z2qFODOi93PcHh/OLouWkvpUxKShP8H4DICQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/tough-cookie": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
- "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
- },
- "@types/trusted-types": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "dev": true
- },
- "@types/unist": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
- "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==",
- "dev": true
- },
- "@types/uuid": {
- "version": "9.0.8",
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
- "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
- "dev": true
- },
- "@types/validator": {
- "version": "13.7.15",
- "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.15.tgz",
- "integrity": "sha512-yeinDVQunb03AEP8luErFcyf/7Lf7AzKCD0NXfgVoGCCQDNpZET8Jgq74oBgqKld3hafLbfzt/3inUdQvaFeXQ=="
- },
- "@types/warning": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz",
- "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==",
- "dev": true
- },
- "@types/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
- },
- "@types/whatwg-url": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
- "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
- "requires": {
- "@types/node": "*",
- "@types/webidl-conversions": "*"
- }
- },
- "@types/workerpool": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.7.tgz",
- "integrity": "sha512-DI2U4obcMzFViyNjLw0xXspim++qkAJ4BWRdYPVMMFtOpTvMr6PAk3UTZEoSqnZnvgUkJ3ck97Ybk+iIfuJHMg==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/ws": {
- "version": "8.5.12",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz",
- "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/xml-crypto": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@types/xml-crypto/-/xml-crypto-1.4.5.tgz",
- "integrity": "sha512-rHc0tlw/ixu7PCqqlpmP9KDIA79IsoV+HFnhJDsdS4MkVAEhBNaazXjv92Xf9oYjWp9e4His4Qzo8fOzoTjT+Q==",
- "requires": {
- "@types/node": "*",
- "xpath": "0.0.27"
- },
- "dependencies": {
- "xpath": {
- "version": "0.0.27",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz",
- "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ=="
- }
- }
- },
- "@types/xml-encryption": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/xml-encryption/-/xml-encryption-1.2.4.tgz",
- "integrity": "sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/xml2js": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz",
- "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/yargs": {
- "version": "17.0.24",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
- "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "@types/yargs-parser": {
- "version": "21.0.0",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
- "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
- "dev": true
- },
- "@types/yauzl": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
- "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
- "dev": true,
- "optional": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz",
- "integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==",
- "dev": true,
- "requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/type-utils": "8.0.1",
- "@typescript-eslint/utils": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
- },
- "dependencies": {
- "@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
- }
- },
- "@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
- "dev": true
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true
- }
- }
- },
- "@typescript-eslint/parser": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz",
- "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/typescript-estree": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
- "debug": "^4.3.4"
- },
- "dependencies": {
- "@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
- }
- },
- "@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
- }
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
- "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0"
- }
- },
- "@typescript-eslint/type-utils": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz",
- "integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==",
- "dev": true,
- "requires": {
- "@typescript-eslint/typescript-estree": "8.0.1",
- "@typescript-eslint/utils": "8.0.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "dependencies": {
- "@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
- }
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
- }
- },
- "@typescript-eslint/types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
- "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
- "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "6.21.0",
- "@typescript-eslint/visitor-keys": "6.21.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "9.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "dependencies": {
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
- }
- },
- "@typescript-eslint/utils": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz",
- "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==",
- "dev": true,
- "requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.0.1",
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/typescript-estree": "8.0.1"
- },
- "dependencies": {
- "@typescript-eslint/scope-manager": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz",
- "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1"
- }
- },
- "@typescript-eslint/types": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz",
- "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz",
- "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "@typescript-eslint/visitor-keys": "8.0.1",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz",
- "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "8.0.1",
- "eslint-visitor-keys": "^3.4.3"
- }
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
- "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- }
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
- "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "6.21.0",
- "eslint-visitor-keys": "^3.4.1"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true
- }
- }
- },
- "@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
- },
- "@vitest/pretty-format": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.2.tgz",
- "integrity": "sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==",
- "dev": true,
- "requires": {
- "tinyrainbow": "^1.2.0"
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
- "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "dev": true
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "dev": true
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
- "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
- "dev": true
- },
- "@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
- "dev": true,
- "requires": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
- "dev": true
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
- "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.12.1"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
- "dev": true,
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
- "dev": true,
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
- "dev": true
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
- "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-opt": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1",
- "@webassemblyjs/wast-printer": "1.12.1"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
- "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
- "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
- "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
- "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
- "dev": true,
- "requires": {
- "@webassemblyjs/ast": "1.12.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webpack-cli/configtest": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
- "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
- "dev": true,
- "requires": {}
- },
- "@webpack-cli/info": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
- "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
- "dev": true,
- "requires": {}
- },
- "@webpack-cli/serve": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
- "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
- "dev": true,
- "requires": {}
- },
- "@xmldom/xmldom": {
- "version": "0.7.13",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz",
- "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g=="
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true
- },
- "@yarnpkg/lockfile": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
- "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="
- },
- "abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "dev": true
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
- },
- "abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "requires": {
- "event-target-shim": "^5.0.0"
- }
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
- },
- "acorn-class-fields": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.3.7.tgz",
- "integrity": "sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==",
- "dev": true,
- "requires": {
- "acorn-private-class-elements": "^0.2.7"
- }
- },
- "acorn-globals": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
- "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
- "dev": true,
- "requires": {
- "acorn": "^7.1.1",
- "acorn-walk": "^7.1.1"
- }
- },
- "acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "requires": {}
- },
- "acorn-private-class-elements": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz",
- "integrity": "sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==",
- "dev": true,
- "requires": {}
- },
- "acorn-private-methods": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/acorn-private-methods/-/acorn-private-methods-0.3.3.tgz",
- "integrity": "sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==",
- "dev": true,
- "requires": {
- "acorn-private-class-elements": "^0.2.7"
- }
- },
- "acorn-stage3": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/acorn-stage3/-/acorn-stage3-4.0.0.tgz",
- "integrity": "sha512-BR+LaADtA6GTB5prkNqWmlmCLYmkyW0whvSxdHhbupTaro2qBJ95fJDEiRLPUmiACGHPaYyeH9xmNJWdGfXRQw==",
- "dev": true,
- "requires": {
- "acorn-class-fields": "^0.3.7",
- "acorn-private-methods": "^0.3.3",
- "acorn-static-class-features": "^0.2.4"
- }
- },
- "acorn-static-class-features": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/acorn-static-class-features/-/acorn-static-class-features-0.2.4.tgz",
- "integrity": "sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==",
- "dev": true,
- "requires": {
- "acorn-private-class-elements": "^0.2.7"
- }
- },
- "acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "dev": true
- },
- "adjust-sourcemap-loader": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
- "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
- "dev": true,
- "requires": {
- "loader-utils": "^2.0.0",
- "regex-parser": "^2.2.11"
- }
- },
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "requires": {
- "debug": "4"
- }
- },
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "requires": {
- "ajv": "^8.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- }
- }
- },
- "ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
- },
- "algoliasearch": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz",
- "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==",
- "dev": true,
- "requires": {
- "agentkeepalive": "^2.2.0",
- "debug": "^2.6.9",
- "envify": "^4.0.0",
- "es6-promise": "^4.1.0",
- "events": "^1.1.0",
- "foreach": "^2.0.5",
- "global": "^4.3.2",
- "inherits": "^2.0.1",
- "isarray": "^2.0.1",
- "load-script": "^1.0.0",
- "object-keys": "^1.0.11",
- "querystring-es3": "^0.2.1",
- "reduce": "^1.0.1",
- "semver": "^5.1.0",
- "tunnel-agent": "^0.6.0"
- },
- "dependencies": {
- "agentkeepalive": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz",
- "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=",
- "dev": true
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true
- }
- }
- },
- "ally.js": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/ally.js/-/ally.js-1.4.1.tgz",
- "integrity": "sha512-ZewdfuwP6VewtMN36QY0gmiyvBfMnmEaNwbVu2nTS6zRt069viTgkYgaDiqu6vRJ1VJCriNqV0jGMu44R8zNbA==",
- "dev": true,
- "requires": {
- "css.escape": "^1.5.0",
- "platform": "1.3.3"
- },
- "dependencies": {
- "platform": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz",
- "integrity": "sha512-VJK1SRmXBpjwsB4YOHYSturx48rLKMzHgCqDH2ZDa6ZbMS/N5huoNqyQdK5Fj/xayu3fqbXckn5SeCS1EbMDZg==",
- "dev": true
- }
- }
- },
- "ansi-color": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz",
- "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ=="
- },
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
- },
- "ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.21.3"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true
- }
- }
- },
- "ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- },
- "dependencies": {
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- }
- }
- },
- "anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "append-field": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
- "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "arch": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
- "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
- "dev": true
- },
- "archiver": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz",
- "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
- "requires": {
- "archiver-utils": "^2.1.0",
- "async": "^3.2.4",
- "buffer-crc32": "^0.2.1",
- "readable-stream": "^3.6.0",
- "readdir-glob": "^1.1.2",
- "tar-stream": "^2.2.0",
- "zip-stream": "^4.1.0"
- }
- },
- "archiver-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
- "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
- "requires": {
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.0.0"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "are-we-there-yet": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
- "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- }
- },
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "args-js": {
- "version": "0.10.12",
- "resolved": "https://registry.npmjs.org/args-js/-/args-js-0.10.12.tgz",
- "integrity": "sha1-oyeuqA5BByo9hfnCdNtlEeuV5Jw="
- },
- "aria-query": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
- "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
- "dev": true,
- "requires": {
- "deep-equal": "^2.0.5"
- }
- },
- "array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "requires": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
- }
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "array-from": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
- "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
- "dev": true
- },
- "array-includes": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "is-string": "^1.0.7"
- }
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array.prototype.flat": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
- "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0"
- }
- },
- "array.prototype.flatmap": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
- }
- },
- "array.prototype.tosorted": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
- "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.1.3"
- }
- },
- "arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
- "requires": {
- "array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
- }
- },
- "arrify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
- "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "assert-never": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz",
- "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw=="
- },
- "assert-plus": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
- "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA="
- },
- "assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true
- },
- "ast-types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz",
- "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==",
- "dev": true,
- "requires": {
- "tslib": "^2.0.1"
- }
- },
- "ast-types-flow": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
- "dev": true
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
- },
- "async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
- },
- "async-retry": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
- "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
- "requires": {
- "retry": "0.13.1"
- }
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
- },
- "auth0-id-generator": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/auth0-id-generator/-/auth0-id-generator-0.2.0.tgz",
- "integrity": "sha512-sJVZrGls/XB7TEsAovv6GsGwsjDBhBy014w+9x/DNZH8OTV8F/uioMmT68ADWtfbvfkJaNCYNjRs1dOVFyNqbQ=="
- },
- "autoprefixer": {
- "version": "10.4.16",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
- "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001538",
- "fraction.js": "^4.3.6",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "available-typed-arrays": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
- "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
- "requires": {
- "possible-typed-array-names": "^1.0.0"
- }
- },
- "aws-sdk": {
- "version": "2.1358.0",
- "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1358.0.tgz",
- "integrity": "sha512-ZolqFlnm0mDNgub7FGrVi7r5A1rw+58zZziKhlis3IxOtIpHdx4BQU5pH4htAMuD0Ct557p/dC/wmnZH/1Rc9Q==",
- "requires": {
- "buffer": "4.9.2",
- "events": "1.1.1",
- "ieee754": "1.1.13",
- "jmespath": "0.16.0",
- "querystring": "0.2.0",
- "sax": "1.2.1",
- "url": "0.10.3",
- "util": "^0.12.4",
- "uuid": "8.0.0",
- "xml2js": "0.5.0"
- },
- "dependencies": {
- "uuid": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz",
- "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="
- },
- "xml2js": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
- "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- }
- }
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
- "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
- },
- "axe-core": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz",
- "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==",
- "dev": true
- },
- "axios": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
- "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
- "requires": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- },
- "dependencies": {
- "proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- }
- }
- },
- "axobject-query": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
- "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
- "dev": true,
- "requires": {
- "deep-equal": "^2.0.5"
- }
- },
- "babel-loader": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
- "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==",
- "dev": true,
- "requires": {
- "find-cache-dir": "^4.0.0",
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "find-cache-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
- "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
- "dev": true,
- "requires": {
- "common-path-prefix": "^3.0.0",
- "pkg-dir": "^7.0.0"
- }
- },
- "find-up": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
- "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
- "dev": true,
- "requires": {
- "locate-path": "^7.1.0",
- "path-exists": "^5.0.0"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "locate-path": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
- "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
- "dev": true,
- "requires": {
- "p-locate": "^6.0.0"
- }
- },
- "p-limit": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
- "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
- "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
- "dev": true,
- "requires": {
- "p-limit": "^4.0.0"
- }
- },
- "path-exists": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
- "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
- "dev": true
- },
- "pkg-dir": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
- "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
- "dev": true,
- "requires": {
- "find-up": "^6.3.0"
- }
- },
- "schema-utils": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
- "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- },
- "yocto-queue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
- "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
- "dev": true
- }
- }
- },
- "babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- }
- },
- "babel-plugin-module-resolver": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz",
- "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==",
- "dev": true,
- "requires": {
- "find-babel-config": "^2.1.1",
- "glob": "^9.3.3",
- "pkg-up": "^3.1.0",
- "reselect": "^4.1.7",
- "resolve": "^1.22.8"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "glob": {
- "version": "9.3.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz",
- "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
- }
- },
- "minimatch": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz",
- "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "minipass": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
- "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
- "dev": true
- }
- }
- },
- "babel-plugin-polyfill-corejs2": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
- "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "semver": "^6.3.1"
- }
- },
- "babel-plugin-polyfill-corejs3": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
- "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
- "dev": true,
- "requires": {
- "@babel/helper-define-polyfill-provider": "^0.6.1",
- "core-js-compat": "^3.36.1"
- }
- },
- "babel-plugin-polyfill-regenerator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
- "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
- "dev": true,
- "requires": {
- "@babel/helper-define-polyfill-provider": "^0.6.2"
- }
- },
- "babel-plugin-react-transform": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-2.0.2.tgz",
- "integrity": "sha512-y/e6c6xTp5vNAOWJ628872w0ntFbiM4baNSvubOE4xWIEeI8J3npUz0I1DVbzcjijtyket2WRXSqCFYoI3ENZQ==",
- "dev": true,
- "requires": {
- "lodash": "^4.6.1"
- }
- },
- "babel-plugin-transform-react-remove-prop-types": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.3.3.tgz",
- "integrity": "sha512-JTASijWmnc92y7uqEH17cb092qois29MkLzaRU3fYAhV88aANm7R+SEkdcXt1kxMaX7x1Lh1OWbyexKtHNi3OQ==",
- "dev": true
- },
- "babel-walk": {
- "version": "3.0.0-canary-5",
- "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
- "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==",
- "requires": {
- "@babel/types": "^7.9.6"
- }
- },
- "backbone": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.6.0.tgz",
- "integrity": "sha512-13PUjmsgw/49EowNcQvfG4gmczz1ximTMhUktj0Jfrjth0MVaTxehpU+qYYX4MxnuIuhmvBLC6/ayxuAGnOhbA==",
- "dev": true,
- "requires": {
- "underscore": ">=1.8.3"
- }
- },
- "backoff": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
- "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=",
- "requires": {
- "precond": "0.2"
- }
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "base-x": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz",
- "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw=="
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
- "base64-stream": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-0.1.5.tgz",
- "integrity": "sha512-j3OFbLDb8Wy0SM7HrP1zj8ADVHqaKoL8VNrDnd7wedkoz5onf9le2DgOsCdmg8QQPnUPXd7LLCjGnYAk/YDBFg==",
- "requires": {
- "readable-stream": "^2.0.2"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "base64id": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz",
- "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8="
- },
- "base64url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
- "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="
- },
- "basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
- "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
- },
- "bcrypt": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz",
- "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==",
- "requires": {
- "@mapbox/node-pre-gyp": "^1.0.0",
- "node-addon-api": "^3.1.0"
- }
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
- },
- "benchmark": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
- "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.4",
- "platform": "^1.3.3"
- }
- },
- "benny": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.1.tgz",
- "integrity": "sha512-USzYxODdVfOS7JuQq/L0naxB788dWCiUgUTxvN+WLPt/JfcDURNNj8kN/N+uK6PDvuR67/9/55cVKGPleFQINA==",
- "dev": true,
- "requires": {
- "@arrows/composition": "^1.0.0",
- "@arrows/dispatch": "^1.0.2",
- "@arrows/multimethod": "^1.1.6",
- "benchmark": "^2.1.4",
- "common-tags": "^1.8.0",
- "fs-extra": "^10.0.0",
- "json2csv": "^5.0.6",
- "kleur": "^4.1.4",
- "log-update": "^4.0.0"
- },
- "dependencies": {
- "commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true
- },
- "json2csv": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz",
- "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==",
- "dev": true,
- "requires": {
- "commander": "^6.1.0",
- "jsonparse": "^1.3.1",
- "lodash.get": "^4.4.2"
- }
- }
- }
- },
- "better-opn": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz",
- "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==",
- "dev": true,
- "requires": {
- "open": "^8.0.4"
- }
- },
- "big.js": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz",
- "integrity": "sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg=="
- },
- "bignumber.js": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
- "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw=="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "bintrees": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz",
- "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ="
- },
- "bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- },
- "dependencies": {
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- }
- }
- },
- "blob-util": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
- "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
- "dev": true
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
- },
- "blueimp-md5": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
- "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
- "dev": true
- },
- "body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- }
- }
- },
- "bonjour-service": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
- "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.5"
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
- "dev": true
- },
- "bootstrap": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
- "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
- "dev": true
- },
- "bootstrap-5": {
- "version": "npm:bootstrap@5.3.3",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz",
- "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==",
- "dev": true,
- "requires": {}
- },
- "bowser": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
- "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "requires": {
- "fill-range": "^7.1.1"
- }
- },
- "browser-assert": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
- "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==",
- "dev": true
- },
- "browser-process-hrtime": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
- "dev": true
- },
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "browserslist": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
- "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001663",
- "electron-to-chromium": "^1.5.28",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.0"
- }
- },
- "bson": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
- "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ=="
- },
- "btoa": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
- "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="
- },
- "buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- }
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "buffer-writer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
- "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
- },
- "bufrw": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.3.0.tgz",
- "integrity": "sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==",
- "requires": {
- "ansi-color": "^0.2.1",
- "error": "^7.0.0",
- "hexer": "^1.5.0",
- "xtend": "^4.0.0"
- }
- },
- "builtin-modules": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
- "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
- "dev": true
- },
- "builtins": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/builtins/-/builtins-4.1.0.tgz",
- "integrity": "sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w==",
- "dev": true,
- "peer": true,
- "requires": {
- "semver": "^7.0.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "peer": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "peer": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- }
- }
- },
- "bull": {
- "version": "3.29.3",
- "resolved": "https://registry.npmjs.org/bull/-/bull-3.29.3.tgz",
- "integrity": "sha512-MOqV1dKLy1YQgP9m3lFolyMxaU+1+o4afzYYf0H4wNM+x/S0I1QPQfkgGlLiH00EyFrvSmeubeCYFP47rTfpjg==",
- "requires": {
- "cron-parser": "^2.13.0",
- "debuglog": "^1.0.0",
- "get-port": "^5.1.1",
- "ioredis": "^4.27.0",
- "lodash": "^4.17.21",
- "p-timeout": "^3.2.0",
- "promise.prototype.finally": "^3.1.2",
- "semver": "^7.3.2",
- "util.promisify": "^1.0.1",
- "uuid": "^8.3.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "bundle-name": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
- "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
- "dev": true,
- "requires": {
- "run-applescript": "^7.0.0"
- }
- },
- "bunyan": {
- "version": "1.8.15",
- "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz",
- "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==",
- "requires": {
- "dtrace-provider": "~0.8",
- "moment": "^2.19.3",
- "mv": "~2",
- "safe-json-stringify": "~1"
- }
- },
- "busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "requires": {
- "streamsearch": "^1.1.0"
- }
- },
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- },
- "c8": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz",
- "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==",
- "dev": true,
- "requires": {
- "@bcoe/v8-coverage": "^0.2.3",
- "@istanbuljs/schema": "^0.1.3",
- "find-up": "^5.0.0",
- "foreground-child": "^2.0.0",
- "istanbul-lib-coverage": "^3.2.0",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-reports": "^3.1.4",
- "rimraf": "^3.0.2",
- "test-exclude": "^6.0.0",
- "v8-to-istanbul": "^9.0.0",
- "yargs": "^16.2.0",
- "yargs-parser": "^20.2.9"
- },
- "dependencies": {
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
- }
- }
- },
- "cache-flow": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/cache-flow/-/cache-flow-1.9.0.tgz",
- "integrity": "sha512-oGRBf4bCZbzyKAbZrfSqtfv9+rrDCtSiHihjjc1okmmvIYT0WqPHNq/yh/sDAUBT46RkpxZ4FqaGVrLBagnzgQ==",
- "requires": {
- "cluster": "^0.7.7",
- "date-fns": "^2.23.0",
- "ioredis": "^4.27.6",
- "lru-cache-for-clusters-as-promised": "^1.7.1",
- "object-hash": "^2.2.0"
- }
- },
- "cachedir": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
- "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
- "dev": true
- },
- "call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "requires": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- }
- },
- "call-me-maybe": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
- "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dev": true,
- "requires": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
- "requires": {
- "camelcase": "^4.1.0",
- "map-obj": "^2.0.0",
- "quick-lru": "^1.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- }
- }
- },
- "camelize": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
- "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
- },
- "caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001667",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
- "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
- "dev": true
- },
- "canvas": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
- "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
- "dev": true,
- "optional": true,
- "requires": {
- "@mapbox/node-pre-gyp": "^1.0.0",
- "nan": "^2.17.0",
- "simple-get": "^3.0.3"
- }
- },
- "case-sensitive-paths-webpack-plugin": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
- "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "catharsis": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
- "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
- "requires": {
- "lodash": "^4.17.15"
- }
- },
- "celebrate": {
- "version": "15.0.3",
- "resolved": "https://registry.npmjs.org/celebrate/-/celebrate-15.0.3.tgz",
- "integrity": "sha512-ToF8ILq/F0KhQ0CPtexP7Cu9GkqKJ91VKy3ZOCV24aaNWdm3QCHqnXAKfKHrtcM2B2zmPFe11p8WWsQkmq8k4g==",
- "requires": {
- "escape-html": "1.0.3",
- "joi": "17.x.x",
- "lodash": "4.17.x"
- }
- },
- "chai": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz",
- "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "loupe": "^2.3.1",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
- }
- },
- "chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "requires": {
- "check-error": "^1.0.2"
- }
- },
- "chai-exclude": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/chai-exclude/-/chai-exclude-2.1.0.tgz",
- "integrity": "sha512-IBnm50Mvl3O1YhPpTgbU8MK0Gw7NHcb18WT2TxGdPKOMtdtZVKLHmQwdvOF7mTlHVQStbXuZKFwkevFtbHjpVg==",
- "dev": true,
- "requires": {
- "fclone": "^1.0.11"
- }
- },
- "chai-http": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.4.0.tgz",
- "integrity": "sha512-uswN3rZpawlRaa5NiDUHcDZ3v2dw5QgLyAwnQ2tnVNuP7CwIsOFuYJ0xR1WiR7ymD4roBnJIzOUep7w9jQMFJA==",
- "dev": true,
- "requires": {
- "@types/chai": "4",
- "@types/superagent": "4.1.13",
- "charset": "^1.0.1",
- "cookiejar": "^2.1.4",
- "is-ip": "^2.0.0",
- "methods": "^1.1.2",
- "qs": "^6.11.2",
- "superagent": "^8.0.9"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "formidable": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
- "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
- "dev": true,
- "requires": {
- "dezalgo": "^1.0.4",
- "hexoid": "^1.0.0",
- "once": "^1.4.0",
- "qs": "^6.11.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "superagent": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz",
- "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==",
- "dev": true,
- "requires": {
- "component-emitter": "^1.3.0",
- "cookiejar": "^2.1.4",
- "debug": "^4.3.4",
- "fast-safe-stringify": "^2.1.1",
- "form-data": "^4.0.0",
- "formidable": "^2.1.2",
- "methods": "^1.1.2",
- "mime": "2.6.0",
- "qs": "^6.11.0",
- "semver": "^7.3.8"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "dev": true
- },
- "character-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
- "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
- "requires": {
- "is-regex": "^1.0.3"
- }
- },
- "charset": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz",
- "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==",
- "dev": true
- },
- "chart.js": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.0.1.tgz",
- "integrity": "sha512-5/8/9eBivwBZK81mKvmIwTb2Pmw4D/5h1RK9fBWZLLZ8mCJ+kfYNmV9rMrGoa5Hgy2/wVDBMLSUDudul2/9ihA==",
- "dev": true
- },
- "chartjs-adapter-moment": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.1.tgz",
- "integrity": "sha512-Uz+nTX/GxocuqXpGylxK19YG4R3OSVf8326D+HwSTsNw1LgzyIGRo+Qujwro1wy6X+soNSnfj5t2vZ+r6EaDmA==",
- "dev": true,
- "requires": {}
- },
- "chartjs-plugin-datalabels": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz",
- "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==",
- "dev": true,
- "requires": {}
- },
- "check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dev": true,
- "requires": {
- "get-func-name": "^2.0.2"
- }
- },
- "check-more-types": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
- "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=",
- "dev": true
- },
- "check-types": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-5.1.0.tgz",
- "integrity": "sha1-NzlN07YEKlEVXpJsOpF1PUmeXcg="
- },
- "cheerio": {
- "version": "1.0.0-rc.10",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
- "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
- "dev": true,
- "requires": {
- "cheerio-select": "^1.5.0",
- "dom-serializer": "^1.3.2",
- "domhandler": "^4.2.0",
- "htmlparser2": "^6.1.0",
- "parse5": "^6.0.1",
- "parse5-htmlparser2-tree-adapter": "^6.0.1",
- "tslib": "^2.2.0"
- }
- },
- "cheerio-select": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
- "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
- "dev": true,
- "requires": {
- "css-select": "^4.1.3",
- "css-what": "^5.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0",
- "domutils": "^2.7.0"
- }
- },
- "chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true
- },
- "ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="
- },
- "cjs-module-lexer": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
- "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="
- },
- "classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
- },
- "clean-css": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz",
- "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==",
- "dev": true,
- "requires": {
- "source-map": "~0.6.0"
- }
- },
- "clean-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
- "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- }
- }
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
- },
- "cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "requires": {
- "exit": "0.1.2",
- "glob": "^7.1.1"
- }
- },
- "cli-color": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz",
- "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==",
- "dev": true,
- "requires": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.61",
- "es6-iterator": "^2.0.3",
- "memoizee": "^0.4.15",
- "timers-ext": "^0.1.7"
- }
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "cli-table3": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
- "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
- "dev": true,
- "requires": {
- "colors": "1.4.0",
- "string-width": "^4.2.0"
- }
- },
- "cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "requires": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- }
- }
- }
- },
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
- "dev": true
- },
- "clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- }
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
- "dev": true
- },
- "cluster": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
- "integrity": "sha1-5JfiZ8yVa9CwUTrbSqOTNX0Ahe8=",
- "requires": {
- "log": ">= 1.2.0",
- "mkdirp": ">= 0.0.1"
- }
- },
- "cluster-key-slot": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
- "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
- },
- "colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "dev": true
- },
- "colorette": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
- "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "optional": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
- },
- "common-path-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
- "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
- "dev": true
- },
- "common-tags": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
- "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
- "dev": true
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "compress-commons": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
- "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
- "requires": {
- "buffer-crc32": "^0.2.13",
- "crc32-stream": "^4.0.2",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
- "dependencies": {
- "crc32-stream": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
- "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
- "requires": {
- "crc-32": "^1.2.0",
- "readable-stream": "^3.4.0"
- }
- }
- }
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "compute-scroll-into-view": {
- "version": "1.0.17",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz",
- "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "config": {
- "version": "1.31.0",
- "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz",
- "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==",
- "requires": {
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "dev": true,
- "requires": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "connect-flash": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz",
- "integrity": "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA=="
- },
- "connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "dev": true
- },
- "connect-redis": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz",
- "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw=="
- },
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
- },
- "console-log-level": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.1.tgz",
- "integrity": "sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ=="
- },
- "constantinople": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz",
- "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==",
- "requires": {
- "@babel/parser": "^7.6.0",
- "@babel/types": "^7.6.1"
- }
- },
- "constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
- "dev": true
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "requires": {
- "safe-buffer": "5.2.1"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "content-security-policy-builder": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz",
- "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ=="
- },
- "content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
- },
- "contentful": {
- "version": "10.8.5",
- "resolved": "https://registry.npmjs.org/contentful/-/contentful-10.8.5.tgz",
- "integrity": "sha512-aol2LmjRAmuOKQPITZtNasIkRFIECnrcQf2UiXGBZ2ldUpCAjyr533553fuGst2SeHZoKleLyYqFNgHcznDBUw==",
- "requires": {
- "@contentful/rich-text-types": "^16.0.2",
- "axios": "^1.6.7",
- "contentful-resolve-response": "^1.8.1",
- "contentful-sdk-core": "^8.1.0",
- "json-stringify-safe": "^5.0.1",
- "type-fest": "^4.0.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "4.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.13.1.tgz",
- "integrity": "sha512-ASMgM+Vf2cLwDMt1KXSkMUDSYCxtckDJs8zsaVF/mYteIsiARKCVtyXtcK38mIKbLTctZP8v6GMqdNaeI3fo7g=="
- }
- }
- },
- "contentful-resolve-response": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/contentful-resolve-response/-/contentful-resolve-response-1.8.1.tgz",
- "integrity": "sha512-VXGK2c8dBIGcRCknqudKmkDr2PzsUYfjLN6hhx71T09UzoXOdA/c0kfDhsf/BBCBWPWcLaUgaJEFU0lCo45TSg==",
- "requires": {
- "fast-copy": "^2.1.7"
- }
- },
- "contentful-sdk-core": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-8.1.2.tgz",
- "integrity": "sha512-XZvX2JMJF4YiICXLrHFv59KBHaQJ6ElqAP8gSNgnCu4x+pPG7Y1bC2JMNOiyAgJuGQGVUOcNZ5PmK+tsNEayYw==",
- "requires": {
- "fast-copy": "^2.1.7",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "p-throttle": "^4.1.1",
- "qs": "^6.11.2"
- }
- },
- "convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cookie": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.2.4.tgz",
- "integrity": "sha1-qMFVqnubLPLE0y68e5oKoojMxr0="
- },
- "cookie-parser": {
- "version": "1.4.6",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
- "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
- "requires": {
- "cookie": "0.4.1",
- "cookie-signature": "1.0.6"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- }
- }
- },
- "cookie-signature": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz",
- "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==",
- "dev": true
- },
- "cookiejar": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
- "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
- },
- "copy-anything": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
- "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
- "dev": true,
- "requires": {
- "is-what": "^3.14.1"
- }
- },
- "copy-webpack-plugin": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
- "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
- "dev": true,
- "requires": {
- "fast-glob": "^3.2.11",
- "glob-parent": "^6.0.1",
- "globby": "^13.1.1",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "globby": {
- "version": "13.1.4",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz",
- "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==",
- "dev": true,
- "requires": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
- "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- },
- "slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true
- }
- }
- },
- "core-js": {
- "version": "3.30.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz",
- "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==",
- "dev": true
- },
- "core-js-compat": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
- "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.23.3"
- }
- },
- "core-js-pure": {
- "version": "3.30.2",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz",
- "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg=="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dev": true,
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
- "dev": true,
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- }
- },
- "cpu-features": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz",
- "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==",
- "optional": true,
- "requires": {
- "nan": "^2.14.1"
- }
- },
- "crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
- },
- "crelt": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
- "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==",
- "dev": true
- },
- "cron": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz",
- "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==",
- "requires": {
- "moment-timezone": "^0.5.x"
- }
- },
- "cron-parser": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz",
- "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==",
- "requires": {
- "is-nan": "^1.3.0",
- "moment-timezone": "^0.5.31"
- }
- },
- "cross-env": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-4.0.0.tgz",
- "integrity": "sha512-dofkcyPqOy/AR14nbYSpk+TZ4IJZqg2as+/mQNkzh+7Xba2I1I1eyg/1G2dtSpD2LHjcEWwnGquiH2OP5LoeOw==",
- "requires": {
- "cross-spawn": "^5.1.0",
- "is-windows": "^1.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
- }
- }
- },
- "cross-fetch": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
- "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
- "requires": {
- "node-fetch": "^2.6.12"
- }
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "csrf": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz",
- "integrity": "sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==",
- "requires": {
- "rndm": "1.2.0",
- "tsscmp": "1.0.6",
- "uid-safe": "2.1.5"
- }
- },
- "css-blank-pseudo": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-5.0.2.tgz",
- "integrity": "sha512-aCU4AZ7uEcVSUzagTlA9pHciz7aWPKA/YzrEkpdSopJ2pvhIxiQ5sYeMz1/KByxlIo4XBdvMNJAVKMg/GRnhfw==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "css-declaration-sorter": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
- "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
- "dev": true,
- "requires": {}
- },
- "css-functions-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
- "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
- "dev": true,
- "peer": true
- },
- "css-has-pseudo": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-5.0.2.tgz",
- "integrity": "sha512-q+U+4QdwwB7T9VEW/LyO6CFrLAeLqOykC5mDqJXc7aKZAhDbq7BvGT13VGJe+IwBfdN2o3Xdw2kJ5IxwV1Sc9Q==",
- "dev": true,
- "requires": {
- "@csstools/selector-specificity": "^2.0.1",
- "postcss-selector-parser": "^6.0.10",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "css-loader": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz",
- "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
- "dev": true,
- "requires": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.4.21",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.3",
- "postcss-modules-scope": "^3.0.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.2.0",
- "semver": "^7.3.8"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "postcss-modules-extract-imports": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "dev": true,
- "requires": {}
- },
- "postcss-modules-scope": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
- "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.4"
- }
- },
- "postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "dev": true,
- "requires": {
- "icss-utils": "^5.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "css-mediaquery": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz",
- "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q=="
- },
- "css-minimizer-webpack-plugin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
- "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "cssnano": "^6.0.1",
- "jest-worker": "^29.4.3",
- "postcss": "^8.4.24",
- "schema-utils": "^4.0.1",
- "serialize-javascript": "^6.0.1"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "jest-worker": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
- "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "jest-util": "^29.5.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "schema-utils": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
- "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- },
- "serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- }
- }
- },
- "css-prefers-color-scheme": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-8.0.2.tgz",
- "integrity": "sha512-OvFghizHJ45x7nsJJUSYLyQNTzsCU8yWjxAc/nhPQg1pbs18LMoET8N3kOweFDPy0JV0OSXN2iqRFhPBHYOeMA==",
- "dev": true,
- "requires": {}
- },
- "css-select": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
- "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^5.1.0",
- "domhandler": "^4.3.0",
- "domutils": "^2.8.0",
- "nth-check": "^2.0.1"
- }
- },
- "css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- }
- },
- "css-what": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
- "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
- "dev": true
- },
- "css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
- "dev": true
- },
- "cssdb": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.9.0.tgz",
- "integrity": "sha512-WPMT9seTQq6fPAa1yN4zjgZZeoTriSN2LqW9C+otjar12DQIWA4LuSfFrvFJiKp4oD0xIk1vumDLw8K9ur4NBw==",
- "dev": true
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true
- },
- "cssnano": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz",
- "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==",
- "dev": true,
- "requires": {
- "cssnano-preset-default": "^6.0.1",
- "lilconfig": "^2.1.0"
- }
- },
- "cssnano-preset-default": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz",
- "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==",
- "dev": true,
- "requires": {
- "css-declaration-sorter": "^6.3.1",
- "cssnano-utils": "^4.0.0",
- "postcss-calc": "^9.0.0",
- "postcss-colormin": "^6.0.0",
- "postcss-convert-values": "^6.0.0",
- "postcss-discard-comments": "^6.0.0",
- "postcss-discard-duplicates": "^6.0.0",
- "postcss-discard-empty": "^6.0.0",
- "postcss-discard-overridden": "^6.0.0",
- "postcss-merge-longhand": "^6.0.0",
- "postcss-merge-rules": "^6.0.1",
- "postcss-minify-font-values": "^6.0.0",
- "postcss-minify-gradients": "^6.0.0",
- "postcss-minify-params": "^6.0.0",
- "postcss-minify-selectors": "^6.0.0",
- "postcss-normalize-charset": "^6.0.0",
- "postcss-normalize-display-values": "^6.0.0",
- "postcss-normalize-positions": "^6.0.0",
- "postcss-normalize-repeat-style": "^6.0.0",
- "postcss-normalize-string": "^6.0.0",
- "postcss-normalize-timing-functions": "^6.0.0",
- "postcss-normalize-unicode": "^6.0.0",
- "postcss-normalize-url": "^6.0.0",
- "postcss-normalize-whitespace": "^6.0.0",
- "postcss-ordered-values": "^6.0.0",
- "postcss-reduce-initial": "^6.0.0",
- "postcss-reduce-transforms": "^6.0.0",
- "postcss-svgo": "^6.0.0",
- "postcss-unique-selectors": "^6.0.0"
- }
- },
- "cssnano-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz",
- "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==",
- "dev": true,
- "requires": {}
- },
- "csso": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
- "dev": true,
- "requires": {
- "css-tree": "~2.2.0"
- },
- "dependencies": {
- "css-tree": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
- "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.28",
- "source-map-js": "^1.0.1"
- }
- },
- "mdn-data": {
- "version": "2.0.28",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
- "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
- "dev": true
- }
- }
- },
- "cssom": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
- "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
- "dev": true
- },
- "cssstyle": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
- "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
- "dev": true,
- "requires": {
- "cssom": "~0.3.6"
- },
- "dependencies": {
- "cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true
- }
- }
- },
- "csstype": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
- },
- "csurf": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.11.0.tgz",
- "integrity": "sha512-UCtehyEExKTxgiu8UHdGvHj4tnpE/Qctue03Giq5gPgMQ9cg/ciod5blZQ5a4uCEenNQjxyGuzygLdKUmee/bQ==",
- "requires": {
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "csrf": "3.1.0",
- "http-errors": "~1.7.3"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- }
- }
- },
- "csv": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz",
- "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==",
- "requires": {
- "csv-generate": "^3.4.3",
- "csv-parse": "^4.16.3",
- "csv-stringify": "^5.6.5",
- "stream-transform": "^2.1.3"
- }
- },
- "csv-generate": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz",
- "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw=="
- },
- "csv-parse": {
- "version": "4.16.3",
- "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz",
- "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg=="
- },
- "csv-stringify": {
- "version": "5.6.5",
- "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz",
- "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A=="
- },
- "cypress": {
- "version": "13.13.2",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.2.tgz",
- "integrity": "sha512-PvJQU33933NvS1StfzEb8/mu2kMy4dABwCF+yd5Bi7Qly1HOVf+Bufrygee/tlmty/6j5lX+KIi8j9Q3JUMbhA==",
- "dev": true,
- "requires": {
- "@cypress/request": "^3.0.1",
- "@cypress/xvfb": "^1.2.4",
- "@types/sinonjs__fake-timers": "8.1.1",
- "@types/sizzle": "^2.3.2",
- "arch": "^2.2.0",
- "blob-util": "^2.0.2",
- "bluebird": "^3.7.2",
- "buffer": "^5.7.1",
- "cachedir": "^2.3.0",
- "chalk": "^4.1.0",
- "check-more-types": "^2.24.0",
- "cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^6.2.1",
- "common-tags": "^1.8.0",
- "dayjs": "^1.10.4",
- "debug": "^4.3.4",
- "enquirer": "^2.3.6",
- "eventemitter2": "6.4.7",
- "execa": "4.1.0",
- "executable": "^4.1.1",
- "extract-zip": "2.0.1",
- "figures": "^3.2.0",
- "fs-extra": "^9.1.0",
- "getos": "^3.2.1",
- "is-ci": "^3.0.1",
- "is-installed-globally": "~0.4.0",
- "lazy-ass": "^1.6.0",
- "listr2": "^3.8.3",
- "lodash": "^4.17.21",
- "log-symbols": "^4.0.0",
- "minimist": "^1.2.8",
- "ospath": "^1.2.2",
- "pretty-bytes": "^5.6.0",
- "process": "^0.11.10",
- "proxy-from-env": "1.0.0",
- "request-progress": "^3.0.0",
- "semver": "^7.5.3",
- "supports-color": "^8.1.1",
- "tmp": "~0.2.3",
- "untildify": "^4.0.0",
- "yauzl": "^2.10.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "execa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
- "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- }
- },
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "requires": {
- "ci-info": "^3.2.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "cypress-plugin-tab": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/cypress-plugin-tab/-/cypress-plugin-tab-1.0.5.tgz",
- "integrity": "sha512-QtTJcifOVwwbeMP3hsOzQOKf3EqKsLyjtg9ZAGlYDntrCRXrsQhe4ZQGIthRMRLKpnP6/tTk6G0gJ2sZUfRliQ==",
- "dev": true,
- "requires": {
- "ally.js": "^1.4.1"
- }
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "requires": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- },
- "dependencies": {
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- }
- }
- },
- "d3": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
- "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=",
- "dev": true
- },
- "damerau-levenshtein": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
- "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
- "dev": true
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "dasherize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz",
- "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg="
- },
- "data-urls": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
- "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
- "dev": true,
- "requires": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.1"
- }
- },
- "whatwg-url": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
- "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
- "dev": true,
- "requires": {
- "tr46": "^3.0.0",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
- "requires": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- }
- },
- "data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
- "requires": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- }
- },
- "data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
- "requires": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
- }
- },
- "date-fns": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
- "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
- },
- "dateformat": {
- "version": "1.0.4-1.2.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.4-1.2.3.tgz",
- "integrity": "sha1-TBKxAb3buIgMI1babkVEWaXri3U="
- },
- "daterangepicker": {
- "version": "2.1.27",
- "resolved": "https://registry.npmjs.org/daterangepicker/-/daterangepicker-2.1.27.tgz",
- "integrity": "sha512-D12idm34JQYLbhQn9oaZQGuSoLC7C4RQypx4yThqiPO+56ejrWMKN+89/KWf1RwYENwUdWOSSqzF5ZF2EkiE5g==",
- "dev": true,
- "requires": {
- "jquery": ">=1.10",
- "moment": "^2.9.0"
- }
- },
- "dayjs": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.0.tgz",
- "integrity": "sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug==",
- "dev": true
- },
- "debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "requires": {
- "ms": "2.1.2"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "debuglog": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
- "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decimal.js": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
- "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
- "dev": true
- },
- "decode-named-character-reference": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
- "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
- "dev": true,
- "requires": {
- "character-entities": "^2.0.0"
- }
- },
- "dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
- },
- "deep-diff": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
- "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug=="
- },
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "deep-equal": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz",
- "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==",
- "dev": true,
- "requires": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.0",
- "is-arguments": "^1.1.1",
- "is-array-buffer": "^3.0.2",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "isarray": "^2.0.5",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.0",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- },
- "deep-freeze": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
- "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg=="
- },
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
- },
- "default-browser": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
- "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
- "dev": true,
- "requires": {
- "bundle-name": "^4.1.0",
- "default-browser-id": "^5.0.0"
- },
- "dependencies": {
- "default-browser-id": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
- "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
- "dev": true
- }
- }
- },
- "default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dev": true,
- "requires": {
- "execa": "^5.0.0"
- }
- },
- "defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "requires": {
- "clone": "^1.0.2"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
- }
- }
- },
- "define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "requires": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- }
- },
- "define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "dev": true
- },
- "define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "requires": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- }
- },
- "delay": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz",
- "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
- },
- "denque": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
- "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw=="
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "deprecation": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
- "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
- },
- "dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true
- },
- "destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
- },
- "detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "dev": true
- },
- "devlop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
- "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
- "dev": true,
- "requires": {
- "dequal": "^2.0.0"
- }
- },
- "dezalgo": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
- "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
- "dev": true,
- "requires": {
- "asap": "^2.0.0",
- "wrappy": "1"
- }
- },
- "diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true
- },
- "diff-match-patch": {
- "version": "git+ssh://git@github.com/overleaf/diff-match-patch.git#89805f9c671a77a263fc53461acd62aa7498f688",
- "integrity": "sha512-UfwfKGxT/Wm2KaxFSZsp7/+YOnAgIzxQXs86zu1IFMLU/+3ouxnEvXqPDn3yxSxlsO4r1B+I2GGQHsIthp6/7Q==",
- "from": "diff-match-patch@overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688"
- },
- "dijkstrajs": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
- "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "diskusage": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz",
- "integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==",
- "requires": {
- "es6-promise": "^4.2.5",
- "nan": "^2.14.0"
- }
- },
- "disrequire": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/disrequire/-/disrequire-1.1.2.tgz",
- "integrity": "sha512-UaachK0eL7neLyL2emXptVGyggGJKowJd24rqCZi9N2CDxuCQTk7wdePTgS7py4HMh+qxUI6zzTVinVwCDTbIA==",
- "dev": true
- },
- "dnd-core": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz",
- "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==",
- "dev": true,
- "requires": {
- "@react-dnd/asap": "^5.0.1",
- "@react-dnd/invariant": "^4.0.1",
- "redux": "^4.2.0"
- }
- },
- "dns-packet": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz",
- "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==",
- "dev": true,
- "requires": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- }
- },
- "docker-modem": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz",
- "integrity": "sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw==",
- "requires": {
- "debug": "^4.1.1",
- "readable-stream": "^3.5.0",
- "split-ca": "^1.0.1",
- "ssh2": "^1.4.0"
- }
- },
- "dockerode": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz",
- "integrity": "sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==",
- "requires": {
- "docker-modem": "^3.0.0",
- "tar-fs": "~2.0.1"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "doctypes": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
- "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ=="
- },
- "dom-accessibility-api": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz",
- "integrity": "sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw==",
- "dev": true
- },
- "dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "dev": true,
- "requires": {
- "utila": "~0.4"
- }
- },
- "dom-helpers": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
- "requires": {
- "@babel/runtime": "^7.1.2"
- }
- },
- "dom-serializer": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
- "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- }
- },
- "dom-walk": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
- "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==",
- "dev": true
- },
- "domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
- },
- "domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "dev": true,
- "requires": {
- "webidl-conversions": "^7.0.0"
- }
- },
- "domhandler": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
- "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.2.0"
- }
- },
- "dompurify": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz",
- "integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==",
- "dev": true
- },
- "domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dev": true,
- "requires": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- }
- },
- "dont-sniff-mimetype": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz",
- "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug=="
- },
- "dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dev": true,
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "dot-prop": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
- "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "dottie": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
- "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
- },
- "downshift": {
- "version": "6.1.7",
- "resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz",
- "integrity": "sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.14.8",
- "compute-scroll-into-view": "^1.0.17",
- "prop-types": "^15.7.2",
- "react-is": "^17.0.2",
- "tslib": "^2.3.0"
- }
- },
- "dropbox": {
- "version": "10.34.0",
- "resolved": "https://registry.npmjs.org/dropbox/-/dropbox-10.34.0.tgz",
- "integrity": "sha512-5jb5/XzU0fSnq36/hEpwT5/QIep7MgqKuxghEG44xCu7HruOAjPdOb3x0geXv5O/hd0nHpQpWO+r5MjYTpMvJg==",
- "requires": {
- "node-fetch": "^2.6.1"
- }
- },
- "dtrace-provider": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz",
- "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==",
- "requires": {
- "nan": "^2.14.0"
- }
- },
- "duration": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
- "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==",
- "requires": {
- "d": "1",
- "es5-ext": "~0.10.46"
- }
- },
- "east": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/east/-/east-2.0.3.tgz",
- "integrity": "sha512-ZY0gVpOxMPs99TXSK1v+KIzR2G4yP5Sru6XNbun2ebjZCWxcTQWnYdTlzHGMd7KDmiCOuZtbh8TvelakV3BWMw==",
- "requires": {
- "commander": "5.1.0",
- "expressionify": "0.9.3",
- "mhook": "1.0.1",
- "p-map": "4.0.0",
- "p-props": "4.0.0",
- "p-timeout": "3.2.0",
- "path-exists": "4.0.0",
- "underscore": "1.12.1"
- },
- "dependencies": {
- "commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
- },
- "underscore": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
- "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
- }
- }
- },
- "eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "editorconfig": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
- "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
- "dev": true,
- "requires": {
- "commander": "^2.19.0",
- "lru-cache": "^4.1.5",
- "semver": "^5.6.0",
- "sigmund": "^1.0.1"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
- "dev": true
- }
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
- "requires": {
- "jake": "^10.8.5"
- }
- },
- "electron-to-chromium": {
- "version": "1.5.34",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.34.tgz",
- "integrity": "sha512-/TZAiChbAflBNjCg+VvstbcwAtIL/VdMFO3NgRFIzBjpvPzWOTIbbO8kNb6RwU4bt9TP7K+3KqBKw/lOU+Y+GA==",
- "dev": true
- },
- "email-addresses": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
- "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw=="
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true
- },
- "encode-utf8": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
- "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "endent": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz",
- "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==",
- "dev": true,
- "requires": {
- "dedent": "^0.7.0",
- "fast-json-parse": "^1.0.3",
- "objectorarray": "^1.0.5"
- }
- },
- "enhanced-resolve": {
- "version": "5.17.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
- "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- }
- },
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
- "ensure-type": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/ensure-type/-/ensure-type-1.5.1.tgz",
- "integrity": "sha512-Dxe+mVF4MupV6eueWiFa6hUd9OL9lIM2/LqR40k1P+dwG+G2il2UigXTU9aQlaw+Y/N0BKSaTofNw73htTbC5g==",
- "dev": true
- },
- "ent": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
- "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
- },
- "entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
- },
- "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,
- "peer": true
- },
- "envify": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz",
- "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==",
- "dev": true,
- "requires": {
- "esprima": "^4.0.0",
- "through": "~2.3.4"
- }
- },
- "envinfo": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
- "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true
- },
- "eol": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz",
- "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==",
- "dev": true
- },
- "errno": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
- "dev": true,
- "optional": true,
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
- "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==",
- "requires": {
- "string-template": "~0.2.1",
- "xtend": "~4.0.0"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "error-stack-parser": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
- "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
- "dev": true,
- "requires": {
- "stackframe": "^1.3.4"
- }
- },
- "es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
- "requires": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
- "is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
- "is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
- "string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
- }
- },
- "es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "requires": {
- "get-intrinsic": "^1.2.4"
- }
- },
- "es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
- },
- "es-get-iterator": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
- "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "is-arguments": "^1.1.1",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.7",
- "isarray": "^2.0.5",
- "stop-iteration-iterator": "^1.0.0"
- }
- },
- "es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
- "dev": true
- },
- "es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
- "requires": {
- "es-errors": "^1.3.0"
- }
- },
- "es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
- "requires": {
- "get-intrinsic": "^1.2.4",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
- }
- },
- "es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es5-ext": {
- "version": "0.10.64",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
- "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
- "requires": {
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.3",
- "esniff": "^2.0.1",
- "next-tick": "^1.1.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "es6-weak-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
- "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
- "dev": true,
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
- }
- },
- "esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
- "dev": true,
- "requires": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
- }
- },
- "esbuild-register": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz",
- "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==",
- "dev": true,
- "requires": {
- "debug": "^4.3.4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- },
- "escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "dev": true,
- "requires": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2",
- "source-map": "~0.6.1"
- }
- },
- "eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
- "requires": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
- },
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "requires": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "eslint-config-prettier": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
- "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
- "dev": true,
- "requires": {}
- },
- "eslint-config-standard": {
- "version": "17.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
- "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
- "dev": true,
- "requires": {}
- },
- "eslint-config-standard-jsx": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz",
- "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==",
- "dev": true,
- "requires": {}
- },
- "eslint-import-resolver-node": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
- "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
- "dev": true,
- "requires": {
- "debug": "^3.2.7",
- "resolve": "^1.20.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "eslint-module-utils": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
- "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
- "dev": true,
- "requires": {
- "debug": "^3.2.7",
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
- }
- },
- "eslint-plugin-chai-expect": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-chai-expect/-/eslint-plugin-chai-expect-3.0.0.tgz",
- "integrity": "sha512-NS0YBcToJl+BRKBSMCwRs/oHJIX67fG5Gvb4tGked+9Wnd1/PzKijd82B2QVKcSSOwRe+pp4RAJ2AULeck4eQw==",
- "dev": true,
- "requires": {}
- },
- "eslint-plugin-chai-friendly": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz",
- "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==",
- "dev": true,
- "requires": {}
- },
- "eslint-plugin-cypress": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz",
- "integrity": "sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==",
- "dev": true,
- "requires": {
- "globals": "^13.20.0"
- },
- "dependencies": {
- "globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- }
- }
- },
- "eslint-plugin-es": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
- "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "eslint-utils": "^2.0.0",
- "regexpp": "^3.0.0"
- }
- },
- "eslint-plugin-import": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
- "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
- "dev": true,
- "requires": {
- "array-includes": "^3.1.4",
- "array.prototype.flat": "^1.2.5",
- "debug": "^2.6.9",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.6",
- "eslint-module-utils": "^2.7.3",
- "has": "^1.0.3",
- "is-core-module": "^2.8.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.values": "^1.1.5",
- "resolve": "^1.22.0",
- "tsconfig-paths": "^3.14.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "eslint-plugin-jsx-a11y": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
- "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.20.7",
- "aria-query": "^5.1.3",
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "ast-types-flow": "^0.0.7",
- "axe-core": "^4.6.2",
- "axobject-query": "^3.1.1",
- "damerau-levenshtein": "^1.0.8",
- "emoji-regex": "^9.2.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^3.3.3",
- "language-tags": "=1.0.5",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- }
- }
- },
- "eslint-plugin-mocha": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.1.0.tgz",
- "integrity": "sha512-xLqqWUF17llsogVOC+8C6/jvQ+4IoOREbN7ZCHuOHuD6cT5cDD4h7f2LgsZuzMAiwswWE21tO7ExaknHVDrSkw==",
- "dev": true,
- "requires": {
- "eslint-utils": "^3.0.0",
- "rambda": "^7.1.0"
- },
- "dependencies": {
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- }
- }
- }
- },
- "eslint-plugin-n": {
- "version": "15.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.0.tgz",
- "integrity": "sha512-lWLg++jGwC88GDGGBX3CMkk0GIWq0y41aH51lavWApOKcMQcYoL3Ayd0lEdtD3SnQtR+3qBvWQS3qGbR2BxRWg==",
- "dev": true,
- "peer": true,
- "requires": {
- "builtins": "^4.0.0",
- "eslint-plugin-es": "^4.1.0",
- "eslint-utils": "^3.0.0",
- "ignore": "^5.1.1",
- "is-core-module": "^2.3.0",
- "minimatch": "^3.0.4",
- "resolve": "^1.10.1",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "peer": true,
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- }
- }
- }
- },
- "eslint-plugin-node": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
- "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
- "dev": true,
- "requires": {
- "eslint-plugin-es": "^3.0.0",
- "eslint-utils": "^2.0.0",
- "ignore": "^5.1.1",
- "minimatch": "^3.0.4",
- "resolve": "^1.10.1",
- "semver": "^6.1.0"
- },
- "dependencies": {
- "eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
- "dev": true,
- "requires": {
- "eslint-utils": "^2.0.0",
- "regexpp": "^3.0.0"
- }
- }
- }
- },
- "eslint-plugin-prettier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
- "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
- "dev": true,
- "requires": {
- "prettier-linter-helpers": "^1.0.0"
- }
- },
- "eslint-plugin-promise": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz",
- "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==",
- "dev": true,
- "requires": {}
- },
- "eslint-plugin-react": {
- "version": "7.32.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
- "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
- "dev": true,
- "requires": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
- "doctrine": "^2.1.0",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
- "semver": "^6.3.0",
- "string.prototype.matchall": "^4.0.8"
- },
- "dependencies": {
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "resolve": {
- "version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- }
- }
- },
- "eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
- "dev": true,
- "requires": {}
- },
- "eslint-plugin-unicorn": {
- "version": "56.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.0.tgz",
- "integrity": "sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.24.7",
- "@eslint-community/eslint-utils": "^4.4.0",
- "ci-info": "^4.0.0",
- "clean-regexp": "^1.0.0",
- "core-js-compat": "^3.38.1",
- "esquery": "^1.6.0",
- "globals": "^15.9.0",
- "indent-string": "^4.0.0",
- "is-builtin-module": "^3.2.1",
- "jsesc": "^3.0.2",
- "pluralize": "^8.0.0",
- "read-pkg-up": "^7.0.1",
- "regexp-tree": "^0.1.27",
- "regjsparser": "^0.10.0",
- "semver": "^7.6.3",
- "strip-indent": "^3.0.0"
- },
- "dependencies": {
- "ci-info": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
- "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
- "dev": true
- },
- "globals": {
- "version": "15.11.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz",
- "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==",
- "dev": true
- },
- "jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "dev": true
- },
- "regjsparser": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz",
- "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
- "dev": true
- }
- }
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- }
- }
- },
- "eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "dependencies": {
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- }
- }
- },
- "eslint-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
- "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
- }
- },
- "eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true
- },
- "esm": {
- "version": "3.2.25",
- "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
- "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="
- },
- "esmock": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/esmock/-/esmock-2.6.3.tgz",
- "integrity": "sha512-1gtVLLHyB742JNWkIFfiKwB8rXgJZO/X717ua4yzT0hIqsDFjtnrpAKHO+HlIMSIhMExCWJzpk9lDsh2XuKAKw=="
- },
- "esniff": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
- "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
- "requires": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.62",
- "event-emitter": "^0.3.5",
- "type": "^2.7.2"
- }
- },
- "espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "requires": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "dependencies": {
- "acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
- },
- "eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
- }
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- },
- "esprima-next": {
- "version": "5.8.1",
- "resolved": "https://registry.npmjs.org/esprima-next/-/esprima-next-5.8.1.tgz",
- "integrity": "sha512-jPuleZ9j065A9xGKreFh9YSgPlbL9/miG/l4KslkwEb7Ilwl5Ct7BmDkSTHA0rW0qnqLx+hsZWIB66s1XaMAyA==",
- "dev": true
- },
- "esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
- "requires": {
- "estraverse": "^5.1.0"
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "requires": {
- "estraverse": "^5.2.0"
- }
- },
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
- },
- "estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "requires": {
- "@types/estree": "^1.0.0"
- }
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
- "requires": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
- "event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
- },
- "eventemitter2": {
- "version": "6.4.7",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
- "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
- "eventid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz",
- "integrity": "sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==",
- "requires": {
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- }
- }
- },
- "events": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
- "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
- },
- "events-listener": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/events-listener/-/events-listener-1.1.0.tgz",
- "integrity": "sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g=="
- },
- "eventsource-parser": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-1.1.2.tgz",
- "integrity": "sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA=="
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "dependencies": {
- "get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true
- },
- "human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true
- }
- }
- },
- "executable": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
- "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
- "dev": true,
- "requires": {
- "pify": "^2.2.0"
- }
- },
- "exegesis": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/exegesis/-/exegesis-4.1.1.tgz",
- "integrity": "sha512-PvSqaMOw2absLBgsthtJyVOeCHN4lxQ1dM7ibXb6TfZZJaoXtGELoEAGJRFvdN16+u9kg8oy1okZXRk8VpimWA==",
- "requires": {
- "@apidevtools/json-schema-ref-parser": "^9.0.3",
- "ajv": "^8.3.0",
- "ajv-formats": "^2.1.0",
- "body-parser": "^1.18.3",
- "content-type": "^1.0.4",
- "deep-freeze": "0.0.1",
- "events-listener": "^1.1.0",
- "glob": "^7.1.3",
- "json-ptr": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "lodash": "^4.17.11",
- "openapi3-ts": "^3.1.1",
- "promise-breaker": "^6.0.0",
- "pump": "^3.0.0",
- "qs": "^6.6.0",
- "raw-body": "^2.3.3",
- "semver": "^7.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "exegesis-express": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/exegesis-express/-/exegesis-express-4.0.0.tgz",
- "integrity": "sha512-V2hqwTtYRj0bj43K4MCtm0caD97YWkqOUHFMRCBW5L1x9IjyqOEc7Xa4oQjjiFbeFOSQzzwPV+BzXsQjSz08fw==",
- "requires": {
- "exegesis": "^4.1.0"
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
- },
- "expect": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/expect/-/expect-1.20.2.tgz",
- "integrity": "sha512-vUOB6rNLhhRgchrNzJZH72FXDgiHmmEqX07Nlb1363HyZm/GFzkNMq0X0eIygMtdc4f2okltziddtVM4D5q0Jw==",
- "dev": true,
- "requires": {
- "define-properties": "~1.1.2",
- "has": "^1.0.1",
- "is-equal": "^1.5.1",
- "is-regex": "^1.0.3",
- "object-inspect": "^1.1.0",
- "object-keys": "^1.0.9",
- "tmatch": "^2.0.1"
- },
- "dependencies": {
- "define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
- "dev": true,
- "requires": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- }
- }
- }
- },
- "express": {
- "version": "4.21.0",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
- "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.6.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "express-basic-auth": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.1.tgz",
- "integrity": "sha512-L6YQ1wQ/mNjVLAmK3AG1RK6VkokA1BIY6wmiH304Xtt/cLTps40EusZsU1Uop+v9lTDPxdtzbFmdXfFO3KEnwA==",
- "requires": {
- "basic-auth": "^2.0.1"
- }
- },
- "express-bearer-token": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/express-bearer-token/-/express-bearer-token-2.4.0.tgz",
- "integrity": "sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw==",
- "requires": {
- "cookie": "^0.3.1",
- "cookie-parser": "^1.4.4"
- },
- "dependencies": {
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
- }
- }
- },
- "express-flash": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/express-flash/-/express-flash-0.0.2.tgz",
- "integrity": "sha512-QVUR0ZZRCaa8+iPHoUQaQJrQWcQuK/Q+19M7IUIdIEtvwhrA/ifHT7y1CVJI41YfGiOQnbGtn3uvd2vOdgu58A==",
- "requires": {
- "connect-flash": "0.1.x"
- }
- },
- "express-http-proxy": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz",
- "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==",
- "requires": {
- "debug": "^3.0.1",
- "es6-promise": "^4.1.1",
- "raw-body": "^2.3.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "express-rate-limit": {
- "version": "2.14.2",
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-2.14.2.tgz",
- "integrity": "sha512-aVYzfYU2Bv+v6ry/fBpTrX8MorM0p/TeDnx4CqiLevg9ftG8eW+pyuZ6JEreGdG2t1vXyTGHuSNRKLeYixuqZg==",
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "express-session": {
- "version": "1.17.2",
- "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz",
- "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==",
- "requires": {
- "cookie": "0.4.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~2.0.0",
- "on-headers": "~1.0.2",
- "parseurl": "~1.3.3",
- "safe-buffer": "5.2.1",
- "uid-safe": "~2.1.5"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "expressionify": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/expressionify/-/expressionify-0.9.3.tgz",
- "integrity": "sha1-/iJnx+hpRXfxP02oML/DyNgXf5I="
- },
- "ext": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
- "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
- "requires": {
- "type": "^2.5.0"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "requires": {
- "@types/yauzl": "^2.9.1",
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fake-indexeddb": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-6.0.0.tgz",
- "integrity": "sha512-YEboHE5VfopUclOck7LncgIqskAqnv4q0EWbYCaxKKjAvO93c+TJIaBuGy8CBFdbg9nKdpN3AuPRwVBJ4k7NrQ==",
- "dev": true
- },
- "fast-copy": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-2.1.7.tgz",
- "integrity": "sha512-ozrGwyuCTAy7YgFCua8rmqmytECYk/JYAMXcswOcm0qvGoE3tPb7ivBeIHTOK2DiapBhDZgacIhzhQIKU5TCfA=="
- },
- "fast-crc32c": {
- "version": "git+ssh://git@github.com/overleaf/node-fast-crc32c.git#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51",
- "integrity": "sha512-tv+vSqnHnz1MnUZvtJuTXPH2MjrO91lNUiMmafe6zflExluR8D16jhwtubb/lWk+fTOCv7S7pURWLulsC/sMrg==",
- "from": "fast-crc32c@overleaf/node-fast-crc32c#aae6b2a4c7a7a159395df9cc6c38dfde702d6f51",
- "requires": {
- "@node-rs/crc32": "^0.1.7"
- }
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
- "fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- }
- },
- "fast-json-parse": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz",
- "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==",
- "dev": true
- },
- "fast-json-patch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
- "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "fast-safe-stringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
- },
- "fast-text-encoding": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
- "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
- },
- "fast-uri": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz",
- "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==",
- "dev": true
- },
- "fast-xml-parser": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
- "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
- "optional": true,
- "requires": {
- "strnum": "^1.0.5"
- }
- },
- "fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
- "dev": true
- },
- "fastparse": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
- "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
- "dev": true
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fclone": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz",
- "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=",
- "dev": true
- },
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
- "requires": {
- "pend": "~1.2.0"
- }
- },
- "feature-detect-es6": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz",
- "integrity": "sha512-DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==",
- "requires": {
- "array-back": "^1.0.4"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "^2.6.0"
- }
- }
- }
- },
- "feature-policy": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz",
- "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ=="
- },
- "fetch-mock": {
- "version": "9.11.0",
- "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-9.11.0.tgz",
- "integrity": "sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.0.0",
- "@babel/runtime": "^7.0.0",
- "core-js": "^3.0.0",
- "debug": "^4.1.1",
- "glob-to-regexp": "^0.4.0",
- "is-subset": "^0.1.1",
- "lodash.isequal": "^4.5.0",
- "path-to-regexp": "3.3.0",
- "querystring": "^0.2.0",
- "whatwg-url": "^6.5.0"
- },
- "dependencies": {
- "path-to-regexp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
- "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==",
- "dev": true
- }
- }
- },
- "figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- }
- }
- },
- "file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "requires": {
- "flat-cache": "^3.0.4"
- }
- },
- "file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "dev": true,
- "requires": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- }
- },
- "file-selector": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz",
- "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==",
- "requires": {
- "tslib": "^2.4.0"
- }
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
- },
- "filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "requires": {
- "minimatch": "^5.0.1"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- }
- }
- },
- "fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "find-babel-config": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.1.tgz",
- "integrity": "sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==",
- "dev": true,
- "requires": {
- "json5": "^2.2.3",
- "path-exists": "^4.0.0"
- }
- },
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- }
- }
- }
- },
- "find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "find-yarn-workspace-root": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
- "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
- "requires": {
- "micromatch": "^4.0.2"
- }
- },
- "findit2": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz",
- "integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog=="
- },
- "flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true
- },
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- },
- "dependencies": {
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="
- },
- "flowstate": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/flowstate/-/flowstate-0.4.1.tgz",
- "integrity": "sha1-tfu4t/wte9xbVL5GyYMJ73NvTsA=",
- "requires": {
- "clone": "^1.0.2",
- "uid-safe": "^2.1.0",
- "utils-flatten": "^1.0.0"
- },
- "dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
- }
- }
- },
- "follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
- },
- "for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "requires": {
- "is-callable": "^1.1.3"
- }
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
- "dev": true
- },
- "foreground-child": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz",
- "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "fork-ts-checker-webpack-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
- "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.16.7",
- "chalk": "^4.1.2",
- "chokidar": "^3.5.3",
- "cosmiconfig": "^7.0.1",
- "deepmerge": "^4.2.2",
- "fs-extra": "^10.0.0",
- "memfs": "^3.4.1",
- "minimatch": "^3.0.4",
- "node-abort-controller": "^3.0.1",
- "schema-utils": "^3.1.1",
- "semver": "^7.3.5",
- "tapable": "^2.2.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- },
- "form-data-encoder": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
- "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
- },
- "formdata-node": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.3.2.tgz",
- "integrity": "sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg==",
- "requires": {
- "node-domexception": "1.0.0",
- "web-streams-polyfill": "4.0.0-beta.1"
- }
- },
- "formidable": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz",
- "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ=="
- },
- "formik": {
- "version": "2.2.9",
- "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
- "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
- "dev": true,
- "requires": {
- "deepmerge": "^2.1.1",
- "hoist-non-react-statics": "^3.3.0",
- "lodash": "^4.17.21",
- "lodash-es": "^4.17.21",
- "react-fast-compare": "^2.0.1",
- "tiny-warning": "^1.0.2",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "deepmerge": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
- "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
- "dev": true
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fraction.js": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
- "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==",
- "dev": true
- },
- "freegeoip": {
- "version": "file:services/freegeoip",
- "requires": {
- "@maxmind/geoip2-node": "^5.0.0",
- "@overleaf/fetch-utils": "*",
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "express": "^4.21.0",
- "is-valid-hostname": "^1.0.2",
- "mocha": "^10.2.0",
- "tar-stream": "^2.2.0",
- "typescript": "^5.0.4",
- "zlib": "^1.0.5"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
- },
- "fs-extra": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
- "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "requires": {
- "minipass": "^3.0.0"
- }
- },
- "fs-mkdirp-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz",
- "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.8",
- "streamx": "^2.12.0"
- }
- },
- "fs-monkey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
- "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==",
- "dev": true
- },
- "fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
- },
- "function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- }
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true
- },
- "functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
- },
- "fuse.js": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz",
- "integrity": "sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw=="
- },
- "gauge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
- "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
- "requires": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.2",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.1",
- "object-assign": "^4.1.1",
- "signal-exit": "^3.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.2"
- }
- },
- "gaxios": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.2.tgz",
- "integrity": "sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og==",
- "requires": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.7"
- }
- },
- "gcp-metadata": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
- "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
- "requires": {
- "gaxios": "^4.0.0",
- "json-bigint": "^1.0.0"
- },
- "dependencies": {
- "gaxios": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
- "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
- "requires": {
- "abort-controller": "^3.0.0",
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.1"
- }
- }
- }
- },
- "generic-pool": {
- "version": "2.5.4",
- "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.5.4.tgz",
- "integrity": "sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs="
- },
- "gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
- },
- "get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
- "dev": true
- },
- "get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "requires": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- }
- },
- "get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="
- },
- "get-port": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
- "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ=="
- },
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
- "requires": {
- "call-bind": "^1.0.5",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
- }
- },
- "getopts": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz",
- "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="
- },
- "getos": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
- "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
- "dev": true,
- "requires": {
- "async": "^3.2.0"
- }
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "github-slugger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
- "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
- "dev": true
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "glob-stream": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.0.tgz",
- "integrity": "sha512-CdIUuwOkYNv9ZadR3jJvap8CMooKziQZ/QCSPhEb7zqfsEI5YnPmvca7IvbaVE3z58ZdUYD2JsU6AUWjL8WZJA==",
- "dev": true,
- "requires": {
- "@gulpjs/to-absolute-glob": "^4.0.0",
- "anymatch": "^3.1.3",
- "fastq": "^1.13.0",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "is-negated-glob": "^1.0.0",
- "normalize-path": "^3.0.0",
- "streamx": "^2.12.5"
- },
- "dependencies": {
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.3"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true
- },
- "global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
- "dev": true,
- "requires": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "global-dirs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
- "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
- "dev": true,
- "requires": {
- "ini": "2.0.0"
- },
- "dependencies": {
- "ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true
- }
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "peer": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "peer": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "dependencies": {
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "requires": {
- "define-properties": "^1.1.3"
- }
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- }
- }
- },
- "globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
- "dev": true,
- "peer": true
- },
- "google-auth-library": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.14.1.tgz",
- "integrity": "sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^4.0.0",
- "gcp-metadata": "^4.2.0",
- "gtoken": "^5.0.4",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- },
- "dependencies": {
- "gaxios": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
- "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
- "requires": {
- "abort-controller": "^3.0.0",
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.1"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "google-gax": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.5.tgz",
- "integrity": "sha512-zXRSGgHp33ottCQMdYlKEFX/MhWkzKVX5P3Vpmx+DW6rtseLILzp3V0YV5Rh4oQzzkM0BH9+nJIyX01EUgmd3g==",
- "requires": {
- "@grpc/grpc-js": "~1.10.3",
- "@grpc/proto-loader": "^0.7.0",
- "@types/long": "^4.0.0",
- "abort-controller": "^3.0.0",
- "duplexify": "^4.0.0",
- "google-auth-library": "^9.3.0",
- "node-fetch": "^2.6.1",
- "object-hash": "^3.0.0",
- "proto3-json-serializer": "^2.0.0",
- "protobufjs": "^7.2.5",
- "retry-request": "^7.0.0",
"uuid": "^9.0.1"
- },
- "dependencies": {
- "@grpc/grpc-js": {
- "version": "1.10.11",
- "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.11.tgz",
- "integrity": "sha512-3RaoxOqkHHN2c05bwtBNVJmOf/UwMam0rZYtdl7dsRpsvDwcNpv6LkGgzltQ7xVf822LzBoKEPRvf4D7+xeIDw==",
- "requires": {
- "@grpc/proto-loader": "^0.7.13",
- "@js-sdsl/ordered-map": "^4.4.2"
- }
- },
- "agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
- "requires": {
- "debug": "^4.3.4"
- }
- },
- "debug": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- },
- "gaxios": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
- "integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
- "requires": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9",
- "uuid": "^9.0.1"
- }
- },
- "gcp-metadata": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
- "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
- "requires": {
- "gaxios": "^6.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "9.10.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
- "integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
- "requires": {
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "gaxios": "^6.1.1",
- "gcp-metadata": "^6.1.0",
- "gtoken": "^7.0.0",
- "jws": "^4.0.0"
- }
- },
- "gtoken": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
- "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
- "requires": {
- "gaxios": "^6.0.0",
- "jws": "^4.0.0"
- }
- },
- "https-proxy-agent": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
- "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
- "requires": {
- "agent-base": "^7.0.2",
- "debug": "4"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="
- },
- "proto3-json-serializer": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz",
- "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==",
- "requires": {
- "protobufjs": "^7.2.5"
- }
- },
- "protobufjs": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
- "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
- "requires": {
- "@protobufjs/aspromise": "^1.1.2",
- "@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
- "@protobufjs/eventemitter": "^1.1.0",
- "@protobufjs/fetch": "^1.1.0",
- "@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
- "@protobufjs/path": "^1.1.2",
- "@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
- "@types/node": ">=13.7.0",
- "long": "^5.0.0"
- }
- },
- "retry-request": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
- "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
- "requires": {
- "@types/request": "^2.48.8",
- "extend": "^3.0.2",
- "teeny-request": "^9.0.0"
- }
- },
- "teeny-request": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
- "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.9",
- "stream-events": "^1.0.5",
- "uuid": "^9.0.0"
- },
- "dependencies": {
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "requires": {
- "debug": "4"
- }
- },
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "requires": {
- "agent-base": "6",
- "debug": "4"
- }
- }
- }
- },
- "uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
- }
}
},
- "google-p12-pem": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
- "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==",
- "requires": {
- "node-forge": "^1.0.0"
- }
- },
- "google-proto-files": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-3.0.3.tgz",
- "integrity": "sha512-7JaU/smPA/FpNsCaXyVjitwiQyn5zYC/ETA+xag3ziovBojIWvzevyrbVqhxgnQdgMJ0p1RVSvpzQL6hkg6yGw==",
- "requires": {
- "protobufjs": "^7.0.0",
- "walkdir": "^0.4.0"
- }
- },
- "googleapis": {
- "version": "118.0.0",
- "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-118.0.0.tgz",
- "integrity": "sha512-Ny6zJOGn5P/YDT6GQbJU6K0lSzEu4Yuxnsn45ZgBIeSQ1RM0FolEjUToLXquZd89DU9wUfqA5XYHPEctk1TFWg==",
- "requires": {
- "google-auth-library": "^8.0.2",
- "googleapis-common": "^6.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.8.0.tgz",
- "integrity": "sha512-0iJn7IDqObDG5Tu9Tn2WemmJ31ksEa96IyK0J0OZCpTh6CrC6FrattwKX87h3qKVuprCJpdOGKc1Xi8V0kMh8Q==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.2.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- }
- },
- "google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "requires": {
- "node-forge": "^1.3.1"
- }
- },
- "gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "requires": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
- "jws": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "googleapis-common": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.4.tgz",
- "integrity": "sha512-m4ErxGE8unR1z0VajT6AYk3s6a9gIMM6EkDZfkPnES8joeOlEtFEJeF8IyZkb0tjPXkktUfYrE4b3Li1DNyOwA==",
- "requires": {
- "extend": "^3.0.2",
- "gaxios": "^5.0.1",
- "google-auth-library": "^8.0.2",
- "qs": "^6.7.0",
- "url-template": "^2.0.8",
- "uuid": "^9.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.2.0.tgz",
- "integrity": "sha512-aFhhvvNycky2QyhG+dcfEdHBF0FRbYcf39s6WNHUDysKSrbJ5vuFbjydxBcmewtXeV248GP8dWT3ByPNxsyHCw==",
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "google-auth-library": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.8.0.tgz",
- "integrity": "sha512-0iJn7IDqObDG5Tu9Tn2WemmJ31ksEa96IyK0J0OZCpTh6CrC6FrattwKX87h3qKVuprCJpdOGKc1Xi8V0kMh8Q==",
- "requires": {
- "arrify": "^2.0.0",
- "base64-js": "^1.3.0",
- "ecdsa-sig-formatter": "^1.0.11",
- "fast-text-encoding": "^1.0.0",
- "gaxios": "^5.0.0",
- "gcp-metadata": "^5.2.0",
- "gtoken": "^6.1.0",
- "jws": "^4.0.0",
- "lru-cache": "^6.0.0"
- }
- },
- "google-p12-pem": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
- "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
- "requires": {
- "node-forge": "^1.3.1"
- }
- },
- "gtoken": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
- "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
- "requires": {
- "gaxios": "^5.0.1",
- "google-p12-pem": "^4.0.0",
- "jws": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "uuid": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
- "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "requires": {
- "get-intrinsic": "^1.1.3"
- }
- },
- "graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
- },
- "graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
- },
- "graphlib": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
- "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
- "requires": {
- "lodash": "^4.17.15"
- }
- },
- "gtoken": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz",
- "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==",
- "requires": {
- "gaxios": "^4.0.0",
- "google-p12-pem": "^3.0.3",
- "jws": "^4.0.0"
- },
- "dependencies": {
- "gaxios": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz",
- "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==",
- "requires": {
- "abort-controller": "^3.0.0",
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.1"
- }
- }
- }
- },
- "gulp-sort": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz",
- "integrity": "sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=",
- "dev": true,
- "requires": {
- "through2": "^2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- }
- }
- },
- "handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true
- },
- "handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4",
- "wordwrap": "^1.0.0"
- }
- },
- "handlebars-loader": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/handlebars-loader/-/handlebars-loader-1.7.3.tgz",
- "integrity": "sha512-dDb+8D51vE3OTSE2wuGPWRAegtsEuw8Mk8hCjtRu/pNcBfN5q+M8ZG3kVJxBuOeBrVElpFStipGmaxSBTRR1mQ==",
- "dev": true,
- "requires": {
- "async": "^3.2.2",
- "fastparse": "^1.0.0",
- "loader-utils": "1.4.x",
- "object-assign": "^4.1.0"
- },
- "dependencies": {
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
- },
- "json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- }
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "requires": {
- "es-define-property": "^1.0.0"
- }
- },
- "has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
- },
- "has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "requires": {
- "has-symbols": "^1.0.3"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
- },
- "hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "requires": {
- "function-bind": "^1.1.2"
- }
- },
- "hast-util-heading-rank": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
- "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==",
- "dev": true,
- "requires": {
- "@types/hast": "^3.0.0"
- }
- },
- "hast-util-is-element": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
- "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
- "dev": true,
- "requires": {
- "@types/hast": "^3.0.0"
- }
- },
- "hast-util-to-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz",
- "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==",
- "dev": true,
- "requires": {
- "@types/hast": "^3.0.0"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
- },
- "helmet": {
- "version": "3.23.3",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz",
- "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==",
- "requires": {
- "depd": "2.0.0",
- "dont-sniff-mimetype": "1.1.0",
- "feature-policy": "0.3.0",
- "helmet-crossdomain": "0.4.0",
- "helmet-csp": "2.10.0",
- "hide-powered-by": "1.1.0",
- "hpkp": "2.0.0",
- "hsts": "2.2.0",
- "nocache": "2.1.0",
- "referrer-policy": "1.2.0",
- "x-xss-protection": "1.3.0"
- },
- "dependencies": {
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- }
- }
- },
- "helmet-crossdomain": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz",
- "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA=="
- },
- "helmet-csp": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz",
- "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==",
- "requires": {
- "bowser": "2.9.0",
- "camelize": "1.0.0",
- "content-security-policy-builder": "2.1.0",
- "dasherize": "2.0.0"
- },
- "dependencies": {
- "bowser": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz",
- "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA=="
- }
- }
- },
- "hexer": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz",
- "integrity": "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==",
- "requires": {
- "ansi-color": "^0.2.1",
- "minimist": "^1.1.0",
- "process": "^0.10.0",
- "xtend": "^4.0.0"
- },
- "dependencies": {
- "process": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz",
- "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA=="
- }
- }
- },
- "hexoid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
- "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
- "dev": true
- },
- "hide-powered-by": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz",
- "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg=="
- },
- "hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "requires": {
- "react-is": "^16.7.0"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- }
- }
- },
- "hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "hpkp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz",
- "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI="
- },
- "hsts": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz",
- "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==",
- "requires": {
- "depd": "2.0.0"
- },
- "dependencies": {
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- }
- }
- },
- "html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
- "dev": true,
- "requires": {
- "whatwg-encoding": "^2.0.0"
- }
- },
- "html-entities": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
- "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA=="
- },
- "html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
- },
- "html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
- "dev": true,
- "requires": {
- "camel-case": "^4.1.2",
- "clean-css": "^5.2.2",
- "commander": "^8.3.0",
- "he": "^1.2.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.10.0"
- },
- "dependencies": {
- "commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "dev": true
- }
- }
- },
- "html-parse-stringify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
- "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
- "dev": true,
- "requires": {
- "void-elements": "3.1.0"
- }
- },
- "html-tags": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
- "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
- "dev": true
- },
- "html-webpack-plugin": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz",
- "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==",
- "dev": true,
- "requires": {
- "@types/html-minifier-terser": "^6.0.0",
- "html-minifier-terser": "^6.0.2",
- "lodash": "^4.17.21",
- "pretty-error": "^4.0.0",
- "tapable": "^2.0.0"
- }
- },
- "htmlparser2": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
- "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.0.0",
- "domutils": "^2.5.2",
- "entities": "^2.0.0"
- }
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
- "dev": true
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "dependencies": {
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "http-graceful-shutdown": {
- "version": "3.1.13",
- "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.13.tgz",
- "integrity": "sha512-Ci5LRufQ8AtrQ1U26AevS8QoMXDOhnAHCJI3eZu1com7mZGHxREmw3dNj85ftpQokQCvak8nI2pnFS8zyM1M+Q==",
- "dev": true,
- "requires": {
- "debug": "^4.3.4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "http-parser-js": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz",
- "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==",
- "dev": true
- },
- "http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
- "requires": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- }
- },
- "http-proxy-middleware": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
- "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
- "dev": true,
- "requires": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "dependencies": {
- "is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true
- }
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "http-status": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.5.0.tgz",
- "integrity": "sha512-wcGvY31MpFNHIkUcXHHnvrE4IKYlpvitJw5P/1u892gMBAM46muQ+RH7UN1d+Ntnfx5apnOnVY6vcLmrWHOLwg=="
- },
- "https-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
- "requires": {
- "agent-base": "6",
- "debug": "4"
- }
- },
- "human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
- "dev": true
- },
- "hyperdyperid": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
- "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
- "dev": true
- },
- "hyphenate-style-name": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
- "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
- },
- "i18next": {
- "version": "23.10.0",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
- "integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
- "requires": {
- "@babel/runtime": "^7.23.2"
- }
- },
- "i18next-fs-backend": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.3.1.tgz",
- "integrity": "sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg=="
- },
- "i18next-http-middleware": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.5.0.tgz",
- "integrity": "sha512-BqATaFCMVHJYZX4cBmhvpBqZNvnvjjmcSzxJvLWTwgJ4gn5kwYoyVikn7AB5kxiQrFjSuZsjDFv76CdsAHwpZw=="
- },
- "i18next-scanner": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/i18next-scanner/-/i18next-scanner-4.4.0.tgz",
- "integrity": "sha512-bgnVEfoFHLVxfXNQtsFFzexB/5kwgDZZkZ6+AnCmyaFKEQQbtMkgPgLHlMZ0deIIEG6KN/tYAus5ZJzng2Ac9g==",
- "dev": true,
- "requires": {
- "acorn": "^8.0.4",
- "acorn-jsx": "^5.3.1",
- "acorn-stage3": "^4.0.0",
- "acorn-walk": "^8.0.0",
- "chalk": "^4.1.0",
- "clone-deep": "^4.0.0",
- "commander": "^9.0.0",
- "deepmerge": "^4.0.0",
- "ensure-type": "^1.5.0",
- "eol": "^0.9.1",
- "esprima-next": "^5.7.0",
- "gulp-sort": "^2.0.0",
- "i18next": "*",
- "lodash": "^4.0.0",
- "parse5": "^6.0.0",
- "sortobject": "^4.0.0",
- "through2": "^4.0.0",
- "vinyl": "^3.0.0",
- "vinyl-fs": "^4.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "dev": true
- },
- "acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "commander": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
- "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "dev": true,
- "requires": {}
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
- },
- "ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="
- },
- "ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true
- },
- "image-size": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
- "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
- "dev": true,
- "optional": true
- },
- "immutable": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
- "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- }
- }
- },
- "import-in-the-middle": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz",
- "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==",
- "requires": {
- "acorn": "^8.8.2",
- "acorn-import-assertions": "^1.9.0",
- "cjs-module-lexer": "^1.2.2",
- "module-details-from-path": "^1.0.3"
- },
- "dependencies": {
- "acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
- },
- "acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "requires": {}
- }
- }
- },
- "import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "requires": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
- },
- "inflection": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
- "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "install": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz",
- "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA=="
- },
- "internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
- "requires": {
- "es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- }
- },
- "interpret": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "ioredis": {
- "version": "4.27.11",
- "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.27.11.tgz",
- "integrity": "sha512-qBU2uCHgRs4kJT/qzxeFhbmizmNLQ1HH59EvKt1WnzDPMjjWxZS1+W6ynXdE47TxxqNLKYemJxEXXUb7Y4JJ+w==",
- "requires": {
- "cluster-key-slot": "^1.1.0",
- "debug": "^4.3.1",
- "denque": "^1.1.0",
- "lodash.defaults": "^4.2.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isarguments": "^3.1.0",
- "p-map": "^2.1.0",
- "redis-commands": "1.7.0",
- "redis-errors": "^1.2.0",
- "redis-parser": "^3.0.0",
- "standard-as-callback": "^2.1.0"
- },
- "dependencies": {
- "p-map": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
- "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
- }
- }
- },
- "ip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
- "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ=="
- },
- "ip-regex": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
- "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
- "dev": true
- },
- "ip6addr": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz",
- "integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^2.0.2"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
- },
- "jsprim": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
- "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- }
- }
- }
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz",
- "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg=="
- },
- "is-absolute-url": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
- "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
- "dev": true
- },
- "is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
- },
- "is-arrow-function": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-arrow-function/-/is-arrow-function-2.0.3.tgz",
- "integrity": "sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==",
- "dev": true,
- "requires": {
- "is-callable": "^1.0.4"
- }
- },
- "is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "requires": {
- "has-bigints": "^1.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-builtin-module": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
- "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
- "dev": true,
- "requires": {
- "builtin-modules": "^3.3.0"
- }
- },
- "is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
- },
- "is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "requires": {
- "hasown": "^2.0.0"
- }
- },
- "is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
- "requires": {
- "is-typed-array": "^1.1.13"
- }
- },
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
- },
- "is-equal": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/is-equal/-/is-equal-1.7.0.tgz",
- "integrity": "sha512-hErktGR9jmoYXNWlbrwGjc8eHh09mbY6TWSTTFtnMcKaCuSMN8z+Ni5ma/8mkbVpe4CbB7V6kN1MkCg9bCx5bA==",
- "dev": true,
- "requires": {
- "es-get-iterator": "^1.1.3",
- "es-to-primitive": "^1.2.1",
- "functions-have-names": "^1.2.3",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0",
- "is-arrow-function": "^2.0.3",
- "is-bigint": "^1.0.4",
- "is-boolean-object": "^1.1.2",
- "is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-generator-function": "^1.0.10",
- "is-number-object": "^1.0.7",
- "is-regex": "^1.1.4",
- "is-string": "^1.0.7",
- "is-symbol": "^1.0.4",
- "isarray": "^2.0.5",
- "object-inspect": "^1.13.1",
- "object.entries": "^1.1.7",
- "object.getprototypeof": "^1.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1"
- }
- },
- "is-expression": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz",
- "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==",
- "requires": {
- "acorn": "^7.1.1",
- "object-assign": "^4.1.1"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-inside-container": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
- "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
- "dev": true,
- "requires": {
- "is-docker": "^3.0.0"
- },
- "dependencies": {
- "is-docker": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
- "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
- "dev": true
- }
- }
- },
- "is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "requires": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- }
- },
- "is-ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz",
- "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=",
- "dev": true,
- "requires": {
- "ip-regex": "^2.0.0"
- }
- },
- "is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true
- },
- "is-nan": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
- "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- }
- },
- "is-negated-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==",
- "dev": true
- },
- "is-negative-zero": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
- "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="
- },
- "is-network-error": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz",
- "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
- },
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true
- },
- "is-promise": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
- "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
- },
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true
- },
- "is-shallow-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz",
- "integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==",
- "dev": true
- },
- "is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
- "requires": {
- "call-bind": "^1.0.7"
- }
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
- },
- "is-stream-ended": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
- "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw=="
- },
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-subset": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
- "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
- "dev": true
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
- "requires": {
- "which-typed-array": "^1.1.14"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true
- },
- "is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==",
- "dev": true
- },
- "is-valid-hostname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-valid-hostname/-/is-valid-hostname-1.0.2.tgz",
- "integrity": "sha512-X/kiF3Xndj6WI7l/yLyzR7V1IbQd6L4S4cewSL0fRciemPmHbaXIKR2qtf+zseH+lbMG0vFp4HvCUe7amGZVhw=="
- },
- "is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true
- },
- "is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
- "is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- }
- },
- "is-what": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
- },
- "is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "requires": {
- "is-docker": "^2.0.0"
- }
- },
- "isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "istanbul-lib-coverage": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
- "dev": true
- },
- "istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "istanbul-reports": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
- "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
- "dev": true,
- "requires": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
- }
- },
- "jaeger-client": {
- "version": "3.19.0",
- "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz",
- "integrity": "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==",
- "requires": {
- "node-int64": "^0.4.0",
- "opentracing": "^0.14.4",
- "thriftrw": "^3.5.0",
- "uuid": "^8.3.2",
- "xorshift": "^1.1.1"
- },
- "dependencies": {
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- }
- }
- },
- "jake": {
- "version": "10.8.5",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
- "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
- "requires": {
- "async": "^3.2.3",
- "chalk": "^4.0.2",
- "filelist": "^1.0.1",
- "minimatch": "^3.0.4"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dev": true,
- "requires": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- }
- },
- "jiti": {
- "version": "1.18.2",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
- "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
- "dev": true
- },
- "jmespath": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz",
- "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="
- },
- "joi": {
- "version": "17.12.0",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.0.tgz",
- "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==",
- "requires": {
- "@hapi/hoek": "^9.3.0",
- "@hapi/topo": "^5.1.0",
- "@sideway/address": "^4.1.4",
- "@sideway/formula": "^3.0.1",
- "@sideway/pinpoint": "^2.0.0"
- }
- },
- "jose": {
- "version": "4.15.5",
- "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz",
- "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg=="
- },
- "jquery": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
- "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
- },
- "js-beautify": {
- "version": "1.14.7",
- "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.7.tgz",
- "integrity": "sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A==",
- "dev": true,
- "requires": {
- "config-chain": "^1.1.13",
- "editorconfig": "^0.15.3",
- "glob": "^8.0.3",
- "nopt": "^6.0.0"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- }
- },
- "minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "nopt": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
- "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
- "dev": true,
- "requires": {
- "abbrev": "^1.0.0"
- }
- }
- }
- },
- "js-stringify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
- "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "js2xmlparser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
- "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
- "requires": {
- "xmlcreate": "^2.0.4"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "jsdoc": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz",
- "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==",
- "requires": {
- "@babel/parser": "^7.20.15",
- "@jsdoc/salty": "^0.2.1",
- "@types/markdown-it": "^14.1.1",
- "bluebird": "^3.7.2",
- "catharsis": "^0.9.0",
- "escape-string-regexp": "^2.0.0",
- "js2xmlparser": "^4.0.2",
- "klaw": "^3.0.0",
- "markdown-it": "^14.1.0",
- "markdown-it-anchor": "^8.6.7",
- "marked": "^4.0.10",
- "mkdirp": "^1.0.4",
- "requizzle": "^0.2.3",
- "strip-json-comments": "^3.1.0",
- "underscore": "~1.13.2"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- }
- }
- },
- "jsdoc-type-pratt-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
- "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
- "dev": true
- },
- "jsdom": {
- "version": "19.0.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
- "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==",
- "dev": true,
- "requires": {
- "abab": "^2.0.5",
- "acorn": "^8.5.0",
- "acorn-globals": "^6.0.0",
- "cssom": "^0.5.0",
- "cssstyle": "^2.3.0",
- "data-urls": "^3.0.1",
- "decimal.js": "^10.3.1",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
- "form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.0",
- "parse5": "6.0.1",
- "saxes": "^5.0.1",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.0.0",
- "w3c-hr-time": "^1.0.2",
- "w3c-xmlserializer": "^3.0.0",
- "webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^10.0.0",
- "ws": "^8.2.3",
- "xml-name-validator": "^4.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
- "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
- "dev": true
- },
- "tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.1"
- }
- },
- "whatwg-url": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
- "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
- "dev": true,
- "requires": {
- "tr46": "^3.0.0",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "jsdom-global": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz",
- "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=",
- "dev": true,
- "requires": {}
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-bigint": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
- "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
- "requires": {
- "bignumber.js": "^9.0.0"
- }
- },
- "json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "peer": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
- "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
- },
- "json-ptr": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/json-ptr/-/json-ptr-3.1.1.tgz",
- "integrity": "sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg=="
- },
- "json-refs": {
- "version": "3.0.15",
- "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz",
- "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==",
- "requires": {
- "commander": "~4.1.1",
- "graphlib": "^2.1.8",
- "js-yaml": "^3.13.1",
- "lodash": "^4.17.15",
- "native-promise-only": "^0.8.1",
- "path-loader": "^1.0.10",
- "slash": "^3.0.0",
- "uri-js": "^4.2.2"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "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==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
- }
- }
- },
- "json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "json-stable-stringify": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz",
- "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==",
- "requires": {
- "call-bind": "^1.0.5",
- "isarray": "^2.0.5",
- "jsonify": "^0.0.1",
- "object-keys": "^1.1.1"
- }
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "json2csv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-4.5.4.tgz",
- "integrity": "sha512-YxBhY4Lmn8IvVZ36nqg5omxneLy9JlorkqW1j/EDCeqvmi+CQ4uM+wsvXlcIqvGDewIPXMC/O/oF8DX9EH5aoA==",
- "requires": {
- "commander": "^2.15.1",
- "jsonparse": "^1.3.1",
- "lodash.get": "^4.4.2"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
- }
- },
- "json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true
- },
- "jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^2.0.0"
- }
- },
- "jsonify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
- "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg=="
- },
- "jsonparse": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
- "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
- },
- "jsonwebtoken": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
- "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
- "requires": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^7.5.4"
- },
- "dependencies": {
- "jwa": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
- "requires": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
- "requires": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "jstransformer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
- "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
- "requires": {
- "is-promise": "^2.0.0",
- "promise": "^7.0.1"
- }
- },
- "jsx-ast-utils": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
- "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
- "dev": true,
- "requires": {
- "array-includes": "^3.1.5",
- "object.assign": "^4.1.3"
- }
- },
- "just-extend": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
- "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
- "dev": true
- },
- "jwa": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
- "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
- "requires": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "jws": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
- "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
- "requires": {
- "jwa": "^2.0.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "kareem": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
- "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA=="
- },
- "keycode": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz",
- "integrity": "sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg=="
- },
- "keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "peer": true,
- "requires": {
- "json-buffer": "3.0.1"
- }
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "klaw": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
- "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
- "requires": {
- "graceful-fs": "^4.1.9"
- }
- },
- "klaw-sync": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
- "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
- "requires": {
- "graceful-fs": "^4.1.11"
- }
- },
- "kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "dev": true
- },
- "knex": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.0.tgz",
- "integrity": "sha512-i0GWwqYp1Hs2yvc2rlDO6nzzkLhwdyOZKRdsMTB8ZxOs2IXQyL5rBjSbS1krowCh6V65T4X9CJaKtuIfkaPGSA==",
- "requires": {
- "colorette": "2.0.19",
- "commander": "^9.1.0",
- "debug": "4.3.4",
- "escalade": "^3.1.1",
- "esm": "^3.2.25",
- "get-package-type": "^0.1.0",
- "getopts": "2.3.0",
- "interpret": "^2.2.0",
- "lodash": "^4.17.21",
- "pg-connection-string": "2.5.0",
- "rechoir": "^0.8.0",
- "resolve-from": "^5.0.0",
- "tarn": "^3.0.2",
- "tildify": "2.0.0"
- },
- "dependencies": {
- "commander": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
- "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "known-css-properties": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz",
- "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==",
- "dev": true,
- "peer": true
- },
- "language-subtag-registry": {
- "version": "0.3.21",
- "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
- "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==",
- "dev": true
- },
- "language-tags": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
- "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
- "dev": true,
- "requires": {
- "language-subtag-registry": "~0.3.2"
- }
- },
- "latexqc": {
- "version": "file:services/latexqc",
- "requires": {
- "@babel/core": "^7.25.2",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-transform-object-assign": "^7.22.5",
- "@babel/plugin-transform-react-constant-elements": "^7.22.5",
- "@babel/plugin-transform-react-inline-elements": "^7.22.5",
- "@babel/polyfill": "^7.12.1",
- "@babel/preset-env": "^7.25.3",
- "@babel/preset-react": "^7.24.7",
- "@babel/register": "^7.24.6",
- "@overleaf/fetch-utils": "*",
- "@overleaf/o-error": "*",
- "@testing-library/react": "^12.1.5",
- "aws-sdk": "^2.1174.0",
- "babel-loader": "^9.1.3",
- "babel-plugin-react-transform": "^2.0.2",
- "babel-plugin-transform-react-remove-prop-types": "^0.3.3",
- "body-parser": "^1.20.3",
- "bootstrap": "^4.3.1",
- "chai": "^4.3.10",
- "chai-as-promised": "^7.1.1",
- "compression": "^1.7.1",
- "cookie-parser": "^1.4.6",
- "cross-env": "^4.0.0",
- "css-loader": "^6.8.1",
- "cssnano": "^6.0.0",
- "es6-promise": "^4.2.8",
- "eslint": "^7.21.0",
- "eslint-config-prettier": "^8.5.0",
- "eslint-config-standard": "^16.0.3",
- "eslint-plugin-react": "^7.32.2",
- "expect": "^1.15.2",
- "express": "^4.21.0",
- "express-basic-auth": "^1.2.0",
- "express-flash": "0.0.2",
- "express-rate-limit": "^2.11.0",
- "file-loader": "^6.2.0",
- "helmet": "^7.1.0",
- "jquery": "^3.7.1",
- "jsdom": "^20.0.0",
- "jsonwebtoken": "^9.0.2",
- "method-override": "^2.3.10",
- "mini-css-extract-plugin": "^2.7.6",
- "mocha": "^10.2.0",
- "nodemon": "^3.0.1",
- "postcss": "^8.4.31",
- "postcss-import": "^15.1.0",
- "postcss-loader": "^7.3.0",
- "postcss-preset-env": "^8.3.2",
- "postcss-reporter": "^7.0.5",
- "prop-types": "^15.8.1",
- "react": "^17.0.2",
- "react-bootstrap": "^0.33.1",
- "react-cookie": "^7.2.0",
- "react-dom": "^17.0.2",
- "react-dropzone": "^14.2.3",
- "react-helmet": "^6.1.0",
- "react-redux": "^7.2.2",
- "react-responsive": "^10.0.0",
- "react-router-dom": "^6.26.1",
- "react-transform-hmr": "^1.0.4",
- "redux": "^4.2.1",
- "redux-logger": "^3.0.1",
- "redux-mock-store": "1.5.0",
- "redux-thunk": "~2.2.0",
- "sandboxed-module": "^2.0.4",
- "sinon": "^19.0.2",
- "sinon-chai": "^3.7.0",
- "source-map-support": "^0.5.12",
- "style-loader": "^3.3.3",
- "throng": "^4.0.0",
- "url-loader": "^4.1.1",
- "webpack": "^5.93.0",
- "webpack-cli": "^5.1.4",
- "webpack-dev-middleware": "^6.1.2",
- "webpack-hot-middleware": "^2.25.1",
- "webpack-manifest-plugin": "^5.0.0"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
- "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.10.4"
- }
- },
- "@eslint/eslintrc": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
- "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- }
- },
- "@humanwhocodes/config-array": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
- "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
- "dev": true,
- "requires": {
- "@humanwhocodes/object-schema": "^1.2.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- }
- },
- "@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "dev": true,
- "requires": {
- "type-detect": "4.0.8"
- },
- "dependencies": {
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- }
- }
- },
- "@sinonjs/fake-timers": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz",
- "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^3.0.1"
- }
- },
- "@sinonjs/samsam": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz",
- "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^3.0.1",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.1.0"
- }
- },
- "@sinonjs/text-encoding": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz",
- "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==",
- "dev": true
- },
- "@types/hoist-non-react-statics": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
- "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
- "requires": {
- "@types/react": "*",
- "hoist-non-react-statics": "^3.3.0"
- }
- },
- "acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
- "dev": true,
- "requires": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- },
- "dependencies": {
- "acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true
- }
- }
- },
- "acorn-walk": {
- "version": "8.3.3",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
- "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
- "dev": true,
- "requires": {
- "acorn": "^8.11.0"
- },
- "dependencies": {
- "acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true
- }
- }
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "attr-accept": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz",
- "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
- },
- "bootstrap": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
- "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
- "requires": {}
- },
- "chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="
- },
- "deep-eql": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
- "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "diff": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
- "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
- "dev": true
- },
- "entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true
- },
- "eslint": {
- "version": "7.32.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
- "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.4.3",
- "@humanwhocodes/config-array": "^0.5.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.1",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.1.2",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^6.0.9",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- }
- },
- "eslint-config-standard": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz",
- "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==",
- "dev": true,
- "requires": {}
- },
- "eslint-plugin-promise": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz",
- "integrity": "sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==",
- "dev": true,
- "peer": true,
- "requires": {}
- },
- "espree": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
- "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
- "dev": true,
- "requires": {
- "acorn": "^7.4.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^1.3.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
- }
- },
- "globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "helmet": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz",
- "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg=="
- },
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "requires": {
- "agent-base": "6",
- "debug": "4"
- }
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "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,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsdom": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
- "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
- "dev": true,
- "requires": {
- "abab": "^2.0.6",
- "acorn": "^8.8.1",
- "acorn-globals": "^7.0.0",
- "cssom": "^0.5.0",
- "cssstyle": "^2.3.0",
- "data-urls": "^3.0.2",
- "decimal.js": "^10.4.2",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
- "form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.2",
- "parse5": "^7.1.1",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.1.2",
- "w3c-xmlserializer": "^4.0.0",
- "webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^11.0.0",
- "ws": "^8.11.0",
- "xml-name-validator": "^4.0.0"
- },
- "dependencies": {
- "acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true
- }
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "just-extend": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz",
- "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==",
- "dev": true
- },
- "method-override": {
- "version": "2.3.10",
- "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz",
- "integrity": "sha512-Ks2/7e+3JuwQcpLybc6wTHyqg13HDjOhLcE+YaAEub9DbSxF+ieMvxUlybmWW9luRMh9Cd0rO9aNtzUT51xfNQ==",
- "requires": {
- "debug": "2.6.9",
- "methods": "~1.1.2",
- "parseurl": "~1.3.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "nise": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz",
- "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^3.0.1",
- "@sinonjs/fake-timers": "^13.0.1",
- "@sinonjs/text-encoding": "^0.7.3",
- "just-extend": "^6.2.0",
- "path-to-regexp": "^8.1.0"
- }
- },
- "optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "requires": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- }
- },
- "parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
- "dev": true,
- "requires": {
- "entities": "^4.4.0"
- }
- },
- "path-to-regexp": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
- "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
- "dev": true
- },
- "react-cookie": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz",
- "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==",
- "requires": {
- "@types/hoist-non-react-statics": "^3.3.5",
- "hoist-non-react-statics": "^3.3.2",
- "universal-cookie": "^7.0.0"
- }
- },
- "react-dropzone": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz",
- "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==",
- "requires": {
- "attr-accept": "^2.2.2",
- "file-selector": "^0.6.0",
- "prop-types": "^15.8.1"
- }
- },
- "react-fast-compare": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
- "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
- },
- "react-helmet": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz",
- "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
- "requires": {
- "object-assign": "^4.1.1",
- "prop-types": "^15.7.2",
- "react-fast-compare": "^3.1.1",
- "react-side-effect": "^2.1.0"
- },
- "dependencies": {
- "react-side-effect": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz",
- "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==",
- "requires": {}
- }
- }
- },
- "saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
- "dev": true,
- "requires": {
- "xmlchars": "^2.2.0"
- }
- },
- "schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- }
- }
- },
- "semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "dev": true
- },
- "sinon": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz",
- "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^3.0.1",
- "@sinonjs/fake-timers": "^13.0.2",
- "@sinonjs/samsam": "^8.0.1",
- "diff": "^7.0.0",
- "nise": "^6.1.1",
- "supports-color": "^7.2.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.1"
- }
- },
- "type-detect": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
- "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
- "dev": true
- },
- "universal-cookie": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.2.0.tgz",
- "integrity": "sha512-PvcyflJAYACJKr28HABxkGemML5vafHmiL4ICe3e+BEKXRMt0GaFLZhAwgv637kFFnnfiSJ8e6jknrKkMrU+PQ==",
- "requires": {
- "@types/cookie": "^0.6.0",
- "cookie": "^0.6.0"
- }
- },
- "w3c-xmlserializer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
- "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
- "dev": true,
- "requires": {
- "xml-name-validator": "^4.0.0"
- }
- },
- "webpack-dev-middleware": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz",
- "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==",
- "dev": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.12",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- }
- },
- "whatwg-url": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
- "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
- "dev": true,
- "requires": {
- "tr46": "^3.0.0",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "launch-editor": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz",
- "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==",
- "dev": true,
- "requires": {
- "picocolors": "^1.0.0",
- "shell-quote": "^1.8.1"
- }
- },
- "lazy-ass": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
- "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
- "dev": true
- },
- "lazystream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
- "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
- "requires": {
- "readable-stream": "^2.0.5"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "ldap-filter": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz",
- "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=",
- "requires": {
- "assert-plus": "0.1.5"
- }
- },
- "ldapauth-fork": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.3.3.tgz",
- "integrity": "sha512-x76VpQ5ZqkwAJmqwcD6KIwDiNEbgIGIPGwC/eA17e1dxWhlTx36w0DlLOFwjTuZ2iuaLTsZsUprlVqvSlwc/1Q==",
- "requires": {
- "@types/ldapjs": "^1.0.0",
- "@types/node": "*",
- "bcryptjs": "^2.4.0",
- "ldapjs": "^1.0.2",
- "lru-cache": "^5.1.1"
- },
- "dependencies": {
- "asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "extsprintf": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz",
- "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk="
- },
- "ldapjs": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz",
- "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=",
- "requires": {
- "asn1": "0.2.3",
- "assert-plus": "^1.0.0",
- "backoff": "^2.5.0",
- "bunyan": "^1.8.3",
- "dashdash": "^1.14.0",
- "dtrace-provider": "~0.8",
- "ldap-filter": "0.2.2",
- "once": "^1.4.0",
- "vasync": "^1.6.4",
- "verror": "^1.8.1"
- }
- },
- "vasync": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz",
- "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=",
- "requires": {
- "verror": "1.6.0"
- },
- "dependencies": {
- "verror": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz",
- "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=",
- "requires": {
- "extsprintf": "1.2.0"
- }
- }
- }
- }
- }
- },
- "lead": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz",
- "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==",
- "dev": true
- },
- "less": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz",
- "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==",
- "dev": true,
- "requires": {
- "copy-anything": "^2.0.1",
- "errno": "^0.1.1",
- "graceful-fs": "^4.1.2",
- "image-size": "~0.5.0",
- "make-dir": "^2.1.0",
- "mime": "^1.4.1",
- "native-request": "^1.0.5",
- "source-map": "~0.6.0",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "optional": true
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "less-loader": {
- "version": "11.1.3",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz",
- "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==",
- "dev": true,
- "requires": {}
- },
- "levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "dev": true
- },
- "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
- },
- "linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
- "requires": {
- "uc.micro": "^2.0.0"
- },
- "dependencies": {
- "uc.micro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
- "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
- }
- }
- },
- "listr2": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
- "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
- "dev": true,
- "requires": {
- "cli-truncate": "^2.1.0",
- "colorette": "^2.0.16",
- "log-update": "^4.0.0",
- "p-map": "^4.0.0",
- "rfdc": "^1.3.0",
- "rxjs": "^7.5.1",
- "through": "^2.3.8",
- "wrap-ansi": "^7.0.0"
- }
- },
- "load-script": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
- "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=",
- "dev": true
- },
- "loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
- "dev": true
- },
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "dependencies": {
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
- }
- }
- },
- "locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "requires": {
- "p-locate": "^5.0.0"
- }
- },
- "lockfile": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz",
- "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==",
- "dev": true,
- "requires": {
- "signal-exit": "^3.0.2"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "lodash-es": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
- "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
- "dev": true
- },
- "lodash._arraypool": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz",
- "integrity": "sha1-6I7suS4ruEyQZWEv2VigcZzUf5Q="
- },
- "lodash._basebind": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz",
- "integrity": "sha1-6UC5690nwyfgqNqxtVkWxTQelXU=",
- "requires": {
- "lodash._basecreate": "~2.4.1",
- "lodash._setbinddata": "~2.4.1",
- "lodash._slice": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- },
- "lodash._baseclone": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-2.4.1.tgz",
- "integrity": "sha1-MPgj5X4X43NdODvWK2Czh1Q7QYY=",
- "requires": {
- "lodash._getarray": "~2.4.1",
- "lodash._releasearray": "~2.4.1",
- "lodash._slice": "~2.4.1",
- "lodash.assign": "~2.4.1",
- "lodash.foreach": "~2.4.1",
- "lodash.forown": "~2.4.1",
- "lodash.isarray": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- },
- "lodash._basecreate": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz",
- "integrity": "sha1-+Ob1tXip405UEXm1a47uv0oofgg=",
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash.isobject": "~2.4.1",
- "lodash.noop": "~2.4.1"
- }
- },
- "lodash._basecreatecallback": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz",
- "integrity": "sha1-fQsmdknLKeehOdAQO3wR+uhOSFE=",
- "requires": {
- "lodash._setbinddata": "~2.4.1",
- "lodash.bind": "~2.4.1",
- "lodash.identity": "~2.4.1",
- "lodash.support": "~2.4.1"
- }
- },
- "lodash._basecreatewrapper": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz",
- "integrity": "sha1-TTHy595+E0+/KAN2K4FQsyUZZm8=",
- "requires": {
- "lodash._basecreate": "~2.4.1",
- "lodash._setbinddata": "~2.4.1",
- "lodash._slice": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- },
- "lodash._createwrapper": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz",
- "integrity": "sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc=",
- "requires": {
- "lodash._basebind": "~2.4.1",
- "lodash._basecreatewrapper": "~2.4.1",
- "lodash._slice": "~2.4.1",
- "lodash.isfunction": "~2.4.1"
- }
- },
- "lodash._getarray": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._getarray/-/lodash._getarray-2.4.1.tgz",
- "integrity": "sha1-+vH3+BD6mFolHCGHQESBCUg55e4=",
- "requires": {
- "lodash._arraypool": "~2.4.1"
- }
- },
- "lodash._isnative": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz",
- "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw="
- },
- "lodash._maxpoolsize": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._maxpoolsize/-/lodash._maxpoolsize-2.4.1.tgz",
- "integrity": "sha1-nUgvRjuOZq++WcLBTtsRcGAXIzQ="
- },
- "lodash._objecttypes": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz",
- "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE="
- },
- "lodash._releasearray": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._releasearray/-/lodash._releasearray-2.4.1.tgz",
- "integrity": "sha1-phOWMNdtFTawfdyAliiJsIL2pkE=",
- "requires": {
- "lodash._arraypool": "~2.4.1",
- "lodash._maxpoolsize": "~2.4.1"
- }
- },
- "lodash._setbinddata": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz",
- "integrity": "sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI=",
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash.noop": "~2.4.1"
- }
- },
- "lodash._shimkeys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz",
- "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
- "requires": {
- "lodash._objecttypes": "~2.4.1"
- }
- },
- "lodash._slice": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz",
- "integrity": "sha1-dFz0GlNZexj2iImFREBe+isG2Q8="
- },
- "lodash.assign": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz",
- "integrity": "sha1-hMOVlt1xGBqXsGUpE6fJZ15Jsao=",
- "requires": {
- "lodash._basecreatecallback": "~2.4.1",
- "lodash._objecttypes": "~2.4.1",
- "lodash.keys": "~2.4.1"
- }
- },
- "lodash.bind": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz",
- "integrity": "sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc=",
- "requires": {
- "lodash._createwrapper": "~2.4.1",
- "lodash._slice": "~2.4.1"
- }
- },
- "lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
- },
- "lodash.clonedeep": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-2.4.1.tgz",
- "integrity": "sha1-8pIDtAsS/uCkXTYxZIJZvrq8eGg=",
- "requires": {
- "lodash._baseclone": "~2.4.1",
- "lodash._basecreatecallback": "~2.4.1"
- }
- },
- "lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "dev": true
- },
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
- },
- "lodash.difference": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
- },
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
- },
- "lodash.foreach": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-2.4.1.tgz",
- "integrity": "sha1-/j/Do0yGyUyrb5UiVgKCdB4BYwk=",
- "requires": {
- "lodash._basecreatecallback": "~2.4.1",
- "lodash.forown": "~2.4.1"
- }
- },
- "lodash.forown": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.forown/-/lodash.forown-2.4.1.tgz",
- "integrity": "sha1-eLQer+FAX6lmRZ6kGT/VAtCEUks=",
- "requires": {
- "lodash._basecreatecallback": "~2.4.1",
- "lodash._objecttypes": "~2.4.1",
- "lodash.keys": "~2.4.1"
- }
- },
- "lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
- },
- "lodash.has": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
- "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=",
- "dev": true
- },
- "lodash.identity": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz",
- "integrity": "sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE="
- },
- "lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
- },
- "lodash.isarray": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-2.4.1.tgz",
- "integrity": "sha1-tSoybB9i9tfac6MdVAHfbvRPD6E=",
- "requires": {
- "lodash._isnative": "~2.4.1"
- }
- },
- "lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
- },
- "lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
- },
- "lodash.isfunction": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz",
- "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE="
- },
- "lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
- },
- "lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
- },
- "lodash.isobject": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz",
- "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
- "requires": {
- "lodash._objecttypes": "~2.4.1"
- }
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
- },
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
- },
- "lodash.keys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- },
- "lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
- "dev": true
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "lodash.noop": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz",
- "integrity": "sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o="
- },
- "lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
- },
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
- "dev": true
- },
- "lodash.support": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz",
- "integrity": "sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU=",
- "requires": {
- "lodash._isnative": "~2.4.1"
- }
- },
- "lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true
- },
- "lodash.union": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
- },
- "lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
- "dev": true
- },
- "log": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz",
- "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==",
- "requires": {
- "d": "^1.0.1",
- "duration": "^0.2.2",
- "es5-ext": "^0.10.53",
- "event-emitter": "^0.3.5",
- "sprintf-kit": "^2.0.1",
- "type": "^2.5.0",
- "uni-global": "^1.0.0"
- }
- },
- "log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "log-update": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
- "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.3.0",
- "cli-cursor": "^3.1.0",
- "slice-ansi": "^4.0.0",
- "wrap-ansi": "^6.2.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- }
- }
- },
- "loglevel": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz",
- "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==",
- "dev": true
- },
- "long": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
- "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
- "dev": true,
- "requires": {
- "get-func-name": "^2.0.1"
- }
- },
- "lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
- "requires": {
- "tslib": "^2.0.3"
- }
- },
- "lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "lru-cache-for-clusters-as-promised": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/lru-cache-for-clusters-as-promised/-/lru-cache-for-clusters-as-promised-1.7.4.tgz",
- "integrity": "sha512-7A+O3nSLQZua1Et9MTuKP7Tl7Zo2L5OucBafTsmAXHQ7M9whxforWoM2RsX25sP3HmaVwF7D7Eg64o6iqAuZkw==",
- "requires": {
- "cron": "1.8.2",
- "debug": "4.3.3",
- "lru-cache": "6.0.0",
- "uuid": "8.3.2"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "lru-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
- "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
- "dev": true,
- "requires": {
- "es5-ext": "~0.10.2"
- }
- },
- "lz-string": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
- "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
- "dev": true
- },
- "magic-string": {
- "version": "0.30.8",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz",
- "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
- "dev": true,
- "requires": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "dependencies": {
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- }
- }
- },
- "make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
- "dev": true,
- "requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- },
- "dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true
- }
- }
- },
- "map-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk="
- },
- "map-or-similar": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
- "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==",
- "dev": true
- },
- "markdown-it": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
- "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
- "requires": {
- "argparse": "^2.0.1",
- "entities": "^4.4.0",
- "linkify-it": "^5.0.0",
- "mdurl": "^2.0.0",
- "punycode.js": "^2.3.1",
- "uc.micro": "^2.1.0"
- },
- "dependencies": {
- "entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
- },
- "uc.micro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
- "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
- }
- }
- },
- "markdown-it-anchor": {
- "version": "8.6.7",
- "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
- "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
- "requires": {}
- },
- "marked": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz",
- "integrity": "sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA=="
- },
- "match-sorter": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
- "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.12.5",
- "remove-accents": "0.4.2"
- }
- },
- "matchmediaquery": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.4.2.tgz",
- "integrity": "sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==",
- "requires": {
- "css-mediaquery": "^0.1.2"
- }
- },
- "material-colors": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
- "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
- "dev": true
- },
- "mathjax": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.2.2.tgz",
- "integrity": "sha512-Bt+SSVU8eBG27zChVewOicYs7Xsdt40qm4+UpHyX7k0/O9NliPc+x77k1/FEsPsjKPZGJvtRZM1vO+geW0OhGw==",
- "dev": true
- },
- "mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true,
- "peer": true
- },
- "maxmind": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.6.tgz",
- "integrity": "sha512-CwnEZqJX0T6b2rWrc0/V3n9hL/hWAMEn7fY09077YJUHiHx7cn/esA2ZIz8BpYLSJUf7cGVel0oUJa9jMwyQpg==",
- "requires": {
- "mmdb-lib": "2.0.2",
- "tiny-lru": "8.0.2"
- }
- },
- "mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
- "dev": true
- },
- "mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "memfs": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz",
- "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==",
- "dev": true,
- "requires": {
- "fs-monkey": "^1.0.3"
- }
- },
- "memoizee": {
- "version": "0.4.15",
- "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
- "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
- "dev": true,
- "requires": {
- "d": "^1.0.1",
- "es5-ext": "^0.10.53",
- "es6-weak-map": "^2.0.3",
- "event-emitter": "^0.3.5",
- "is-promise": "^2.2.2",
- "lru-queue": "^0.1.0",
- "next-tick": "^1.1.0",
- "timers-ext": "^0.1.7"
- }
- },
- "memoizerific": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz",
- "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==",
- "dev": true,
- "requires": {
- "map-or-similar": "^1.5.0"
- }
- },
- "memory-pager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
- },
- "mensch": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz",
- "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==",
- "dev": true
- },
- "meow": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
- "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
- "dev": true,
- "peer": true
- },
- "merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "method-override": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz",
- "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==",
- "requires": {
- "debug": "3.1.0",
- "methods": "~1.1.2",
- "parseurl": "~1.3.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mhook": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mhook/-/mhook-1.0.1.tgz",
- "integrity": "sha1-C6igyiARIlgzA9tKsdDi/5jytUw="
- },
- "micromark": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
- "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
- "dev": true,
- "requires": {
- "@types/debug": "^4.0.0",
- "debug": "^4.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-core-commonmark": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz",
- "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==",
- "dev": true,
- "requires": {
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-factory-destination": "^2.0.0",
- "micromark-factory-label": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-factory-title": "^2.0.0",
- "micromark-factory-whitespace": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-html-tag-name": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-factory-destination": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz",
- "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==",
- "dev": true,
- "requires": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-factory-label": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz",
- "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==",
- "dev": true,
- "requires": {
- "devlop": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "dev": true,
- "requires": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-factory-title": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz",
- "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==",
- "dev": true,
- "requires": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-factory-whitespace": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz",
- "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==",
- "dev": true,
- "requires": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-character": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz",
- "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==",
- "dev": true,
- "requires": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-chunked": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz",
- "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==",
- "dev": true,
- "requires": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "micromark-util-classify-character": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz",
- "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==",
- "dev": true,
- "requires": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-combine-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz",
- "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==",
- "dev": true,
- "requires": {
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-decode-numeric-character-reference": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz",
- "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==",
- "dev": true,
- "requires": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "micromark-util-encode": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz",
- "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==",
- "dev": true
- },
- "micromark-util-html-tag-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz",
- "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==",
- "dev": true
- },
- "micromark-util-normalize-identifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz",
- "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==",
- "dev": true,
- "requires": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "micromark-util-resolve-all": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz",
- "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==",
- "dev": true,
- "requires": {
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-sanitize-uri": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz",
- "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==",
- "dev": true,
- "requires": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "micromark-util-subtokenize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
- "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
- "dev": true,
- "requires": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "dev": true
- },
- "micromark-util-types": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
- "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "requires": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- }
- },
- "mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true
- },
- "mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
- },
- "mime-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz",
- "integrity": "sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=",
- "dev": true,
- "requires": {
- "wildcard": "^1.1.0"
- }
- },
- "mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "requires": {
- "mime-db": "1.51.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "dev": true,
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true
- },
- "mini-css-extract-plugin": {
- "version": "2.7.6",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
- "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
- "dev": true,
- "requires": {
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
- "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- }
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
- },
- "minipass": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
- "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
- "requires": {
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "requires": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "mirror_documentation": {
- "version": "file:jobs/mirror-documentation",
- "requires": {
- "bluebird": "^3.5.3",
- "glob": "^7.1.3",
- "googleapis": "^118.0.0",
- "node-fetch": "^2.7.0",
- "overleaf-editor-core": "*",
- "swagger-client": "^3.8.24",
- "tmp": "0.0.33"
- },
- "dependencies": {
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- }
- }
- },
- "mixme": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz",
- "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw=="
- },
- "mixpanel": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.13.0.tgz",
- "integrity": "sha512-YOWmpr/o4+zJ8LPjuLUkWLc2ImFeIkX6hF1t62Wlvq6loC6e8EK8qieYO4gYPTPxxtjAryl7xmIvf/7qnPwjrQ==",
- "requires": {
- "https-proxy-agent": "5.0.0"
- }
- },
- "mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "requires": {
- "minimist": "^1.2.6"
- }
- },
- "mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
- },
- "mmdb-lib": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz",
- "integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA=="
- },
- "mmmagic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mmmagic/-/mmmagic-0.5.3.tgz",
- "integrity": "sha512-xLqCu7GJYTzJczg0jafXFuh+iPzQL/ru0YYf4GiTTz8Cehru/wiXtUS8Pp8Xi77zNaiVndJ0OO1yAFci6iHyFg==",
- "requires": {
- "nan": "^2.13.2"
- }
- },
- "mocha": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
- "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
- "dev": true,
- "requires": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.4",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.2.0",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "5.0.1",
- "ms": "2.1.3",
- "nanoid": "3.3.3",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "workerpool": "6.2.1",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
- "minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
- "dev": true,
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- }
- }
- },
- "mocha-each": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mocha-each/-/mocha-each-2.0.1.tgz",
- "integrity": "sha512-0ZgWY5ajbnROXkfyaDb+0RAYzDBH3QVow/1zJiyl7lYMRnj1Nid8RDP2+/2TTajB5n4vr21v35MjB72GjFFj2g==",
- "dev": true,
- "requires": {
- "sprintf-js": "^1.0.3"
- }
- },
- "mock-fs": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-5.2.0.tgz",
- "integrity": "sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw==",
- "dev": true
- },
- "module-details-from-path": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
- "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is="
- },
- "moment": {
- "version": "2.29.4",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
- "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
- },
- "moment-timezone": {
- "version": "0.5.40",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz",
- "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==",
- "requires": {
- "moment": ">= 2.9.0"
- }
- },
- "mongodb": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz",
- "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==",
- "requires": {
- "@aws-sdk/credential-providers": "^3.186.0",
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^4.7.2",
- "mongodb-connection-string-url": "^2.6.0",
- "socks": "^2.7.1"
- },
- "dependencies": {
- "bson": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
- "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
- "requires": {
- "buffer": "^5.6.0"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- }
- }
- },
- "mongodb-connection-string-url": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
- "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
- "requires": {
- "@types/whatwg-url": "^8.2.1",
- "whatwg-url": "^11.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
- "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
- "requires": {
- "punycode": "^2.1.1"
- }
- },
- "whatwg-url": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
- "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
- "requires": {
- "tr46": "^3.0.0",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "mongodb-legacy": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb-legacy/-/mongodb-legacy-6.1.0.tgz",
- "integrity": "sha512-S/7HFTsCgbkFEM1hdA+uVRM1TBHR8+8RYVpjUnti9eyRQOdm+ecW6eUurjA2dh040nHEe5tMDxZNG5CReRKZhQ==",
- "requires": {
- "mongodb": "^6.0.0"
- },
- "dependencies": {
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.1.0.tgz",
- "integrity": "sha512-AvzNY0zMkpothZ5mJAaIo2bGDjlJQqqAbn9fvtVgwIIUPEfdrqGxqNjjbuKyrgQxg2EvCmfWdjq+4uj96c0YPw==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.1.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- }
- }
- },
- "mongoose": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.0.tgz",
- "integrity": "sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw==",
- "requires": {
- "bson": "^4.7.2",
- "kareem": "2.5.1",
- "mongodb": "4.17.1",
- "mpath": "0.9.0",
- "mquery": "4.0.3",
- "ms": "2.1.3",
- "sift": "16.0.1"
- },
- "dependencies": {
- "bson": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
- "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
- "requires": {
- "buffer": "^5.6.0"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- }
- }
- },
- "morgan": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
- "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
- "dev": true,
- "requires": {
- "basic-auth": "~2.0.1",
- "debug": "2.6.9",
- "depd": "~2.0.0",
- "on-finished": "~2.3.0",
- "on-headers": "~1.0.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- }
- }
- },
- "mpath": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
- "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="
- },
- "mquery": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
- "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
- "requires": {
- "debug": "4.x"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "multer": {
- "version": "1.4.5-lts.1",
- "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
- "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
- "requires": {
- "append-field": "^1.0.0",
- "busboy": "^1.0.0",
- "concat-stream": "^1.5.2",
- "mkdirp": "^0.5.4",
- "object-assign": "^4.1.1",
- "type-is": "^1.6.4",
- "xtend": "^4.0.0"
- }
- },
- "multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "dev": true,
- "requires": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- }
- },
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
- },
- "mv": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
- "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
- "optional": true,
- "requires": {
- "mkdirp": "~0.5.1",
- "ncp": "~2.0.0",
- "rimraf": "~2.4.0"
- },
- "dependencies": {
- "glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
- "optional": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "rimraf": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
- "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
- "optional": true,
- "requires": {
- "glob": "^6.0.1"
- }
- }
- }
- },
- "namespace-emitter": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
- "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==",
- "dev": true
- },
- "nan": {
- "version": "2.17.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
- "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ=="
- },
- "nanoclone": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
- "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==",
- "dev": true
- },
- "nanoid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
- "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
- "dev": true
- },
- "native-promise-only": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
- "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
- },
- "native-request": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz",
- "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==",
- "dev": true,
- "optional": true
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "ncp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
- "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
- "optional": true
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "next-tick": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
- "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
- },
- "nise": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz",
- "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.7.0",
- "@sinonjs/fake-timers": "^6.0.0",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "path-to-regexp": "^1.7.0"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "path-to-regexp": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
- "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
- "dev": true,
- "requires": {
- "isarray": "0.0.1"
- }
- }
- }
- },
- "no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dev": true,
- "requires": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "nocache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz",
- "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q=="
- },
- "nock": {
- "version": "13.5.4",
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.4.tgz",
- "integrity": "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "json-stringify-safe": "^5.0.1",
- "propagate": "^2.0.0"
- }
- },
- "node-abort-controller": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
- "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
- "dev": true
- },
- "node-addon-api": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
- "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
- },
- "node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
- },
- "node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "requires": {
- "whatwg-url": "^5.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "requires": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- }
- }
- },
- "node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="
- },
- "node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
- },
- "node-releases": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
- "dev": true
- },
- "nodemailer": {
- "version": "6.9.9",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz",
- "integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA=="
- },
- "nodemailer-ses-transport": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/nodemailer-ses-transport/-/nodemailer-ses-transport-1.5.1.tgz",
- "integrity": "sha1-3AWYwb9T6GUuYy6PMWks4CLX3qk=",
- "requires": {
- "aws-sdk": "^2.2.36"
- }
- },
- "nodemon": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
- "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
- "dev": true,
- "requires": {
- "chokidar": "^3.5.2",
- "debug": "^3.2.7",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.1.2",
- "pstree.remy": "^1.1.8",
- "semver": "^7.5.3",
- "simple-update-notifier": "^2.0.0",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.5"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "nopt": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
- "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true
- }
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
- "dev": true
- },
- "now-and-later": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz",
- "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "npmlog": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
- "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
- "requires": {
- "are-we-there-yet": "^2.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^3.0.0",
- "set-blocking": "^2.0.0"
- }
- },
- "nth-check": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
- "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0"
- }
- },
- "nvd3": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/nvd3/-/nvd3-1.8.6.tgz",
- "integrity": "sha1-LT66dL8zNjtRAevx0JPFmlOuc8Q=",
- "dev": true,
- "requires": {}
- },
- "nwsapi": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
- "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
- "dev": true
- },
- "oauth": {
- "version": "0.9.15",
- "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
- "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE="
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
- },
- "object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="
- },
- "object-is": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
- "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
- "requires": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- }
- },
- "object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- }
- },
- "object.fromentries": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
- "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
- "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- }
- },
- "object.getprototypeof": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/object.getprototypeof/-/object.getprototypeof-1.0.5.tgz",
- "integrity": "sha512-4G0QiXpoIppBUz5efmxTm/HTbVN2ioGjk/PbsaNvwISFX+saj8muGp6vNuzIdsosFxM4V/kpUVNvy/+9+DVBZQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "reflect.getprototypeof": "^1.0.4"
- }
- },
- "object.hasown": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
- "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
- "object.values": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
- "objectorarray": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz",
- "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
- "dev": true
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
- "dev": true
- },
- "octonode": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.9.5.tgz",
- "integrity": "sha512-l+aX9jNVkaagh7u/q2QpNKdL8XUagdztl+ebXxBRU6FJ1tpRxAH/ygIuWh0h7eS491BsyH6bb0QZIQEC2+u5oA==",
- "requires": {
- "bluebird": "^3.5.0",
- "deep-extend": "^0.6.0",
- "randomstring": "^1.1.5",
- "request": "^2.72.0"
- }
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
- "dev": true,
- "requires": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- }
- },
- "openapi3-ts": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-3.1.2.tgz",
- "integrity": "sha512-S8fijNOqe/ut0kEDAwHZnI7sVYqb8Q3XnISmSyXmK76jgrcf4ableI75KTY1qdksd9EI/t39Vi5M4VYKrkNKfQ==",
- "requires": {
- "yaml": "^2.1.3"
- },
- "dependencies": {
- "yaml": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
- "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ=="
- }
- }
- },
- "opentracing": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz",
- "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q=="
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "dependencies": {
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- }
- }
- },
- "options": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
- "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg=="
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "ospath": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
- "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
- "dev": true
- },
- "otplib": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz",
- "integrity": "sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==",
- "requires": {
- "@otplib/core": "^12.0.1",
- "@otplib/preset-default": "^12.0.1",
- "@otplib/preset-v11": "^12.0.1"
- }
- },
- "overleaf-editor": {
- "version": "file:services/history-v1",
- "requires": {
- "@overleaf/logger": "*",
- "@overleaf/metrics": "*",
- "@overleaf/o-error": "*",
- "@overleaf/object-persistor": "*",
- "@overleaf/redis-wrapper": "*",
- "@overleaf/settings": "*",
- "@overleaf/stream-utils": "^0.1.0",
- "archiver": "^5.3.0",
- "basic-auth": "^2.0.1",
- "benny": "^3.7.1",
- "bluebird": "^3.7.2",
- "body-parser": "^1.20.3",
- "bunyan": "^1.8.12",
- "chai": "^4.3.6",
- "chai-as-promised": "^7.1.1",
- "check-types": "^11.1.2",
- "command-line-args": "^3.0.3",
- "config": "^1.19.0",
- "express": "^4.21.0",
- "fs-extra": "^9.0.1",
- "generic-pool": "^2.1.1",
- "helmet": "^3.22.0",
- "http-status": "^1.4.2",
- "jsonwebtoken": "^9.0.0",
- "knex": "^2.4.0",
- "lodash": "^4.17.19",
- "mocha": "^10.2.0",
- "mongodb": "^6.2.0",
- "node-fetch": "^2.7.0",
- "overleaf-editor-core": "*",
- "pg": "^8.7.1",
- "sinon": "^9.0.2",
- "swagger-client": "^3.10.0",
- "swagger-tools": "^0.10.4",
- "temp": "^0.8.3",
- "throng": "^4.0.0",
- "tsscmp": "^1.0.6",
- "typescript": "^5.0.4",
- "utf-8-validate": "^5.0.4",
- "yauzl": "^2.9.1"
- },
- "dependencies": {
- "array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
- "requires": {
- "typical": "^2.6.0"
- }
- },
- "check-types": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz",
- "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ=="
- },
- "command-line-args": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
- "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
- "requires": {
- "array-back": "^1.0.4",
- "feature-detect-es6": "^1.3.1",
- "find-replace": "^1.0.2",
- "typical": "^2.6.0"
- }
- },
- "find-replace": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
- "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
- "requires": {
- "array-back": "^1.0.4",
- "test-value": "^2.1.0"
- }
- },
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "gcp-metadata": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
- "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
- "optional": true,
- "peer": true,
- "requires": {
- "gaxios": "^5.0.0",
- "json-bigint": "^1.0.0"
- }
- },
- "mongodb": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
- "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.0",
- "bson": "^6.2.0",
- "mongodb-connection-string-url": "^2.6.0"
- }
- },
- "test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
- "requires": {
- "array-back": "^1.0.3",
- "typical": "^2.6.0"
- }
- }
- }
- },
- "overleaf-editor-core": {
- "version": "file:libraries/overleaf-editor-core",
- "requires": {
- "@overleaf/o-error": "*",
- "@types/check-types": "^7.3.7",
- "@types/path-browserify": "^1.0.2",
- "chai": "^3.3.0",
- "check-types": "^5.1.0",
- "lodash": "^4.17.19",
- "mocha": "^10.2.0",
- "p-map": "^4.0.0",
- "path-browserify": "^1.0.1",
- "sinon": "^9.2.4",
- "typescript": "^5.0.4"
- },
- "dependencies": {
- "chai": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
- "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
- "dev": true,
- "requires": {
- "assertion-error": "^1.0.1",
- "deep-eql": "^0.1.3",
- "type-detect": "^1.0.0"
- }
- },
- "deep-eql": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
- "dev": true,
- "requires": {
- "type-detect": "0.1.1"
- },
- "dependencies": {
- "type-detect": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
- "dev": true
- }
- }
- },
- "type-detect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
- "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
- "dev": true
- }
- }
- },
- "p-event": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz",
- "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==",
- "requires": {
- "p-timeout": "^3.1.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "requires": {
- "p-limit": "^3.0.2"
- }
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-props": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-props/-/p-props-4.0.0.tgz",
- "integrity": "sha512-3iKFbPdoPG7Ne3cMA53JnjPsTMaIzE9gxKZnvKJJivTAeqLEZPBu6zfi6DYq9AsH1nYycWmo3sWCNI8Kz6T2Zg==",
- "requires": {
- "p-map": "^4.0.0"
- }
- },
- "p-queue": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz",
- "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==",
- "dev": true,
- "requires": {
- "eventemitter3": "^5.0.1",
- "p-timeout": "^5.0.2"
- },
- "dependencies": {
- "eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
- "dev": true
- },
- "p-timeout": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
- "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
- "dev": true
- }
- }
- },
- "p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "@types/retry": "^0.12.0",
- "retry": "^0.13.1"
- }
- },
- "p-throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-4.1.1.tgz",
- "integrity": "sha512-TuU8Ato+pRTPJoDzYD4s7ocJYcNSEZRvlxoq3hcPI2kZDZ49IQ1Wkj7/gDJc3X7XiEAAvRGtDzdXJI0tC3IL1g=="
- },
- "p-timeout": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
- "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
- },
- "package-json-from-dist": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
- "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
- "dev": true
- },
- "packet-reader": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
- "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
- },
- "param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dev": true,
- "requires": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-data-url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-data-url/-/parse-data-url-2.0.0.tgz",
- "integrity": "sha512-6iXM6OBCHADCN9Bzv5QbWm1v41xSH15kIWE5hAJ9+sdkVM6pJFg+FlLm8n7gZ17pmZv6Wdr3+leXB2Uifxm7kw==",
- "requires": {
- "valid-data-url": "^2.0.0"
- }
- },
- "parse-duration": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz",
- "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ=="
- },
- "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,
- "requires": {
- "@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"
- }
- },
- "parse-ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
- "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="
- },
- "parse-srcset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
- "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
- },
- "parse5": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
- "dev": true
- },
- "parse5-htmlparser2-tree-adapter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
- "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
- "dev": true,
- "requires": {
- "parse5": "^6.0.1"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dev": true,
- "requires": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "passport": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
- "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
- "requires": {
- "passport-strategy": "1.x.x",
- "pause": "0.0.1",
- "utils-merge": "^1.0.1"
- }
- },
- "passport-google-oauth20": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz",
- "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==",
- "requires": {
- "passport-oauth2": "1.x.x"
- }
- },
- "passport-ldapauth": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.4.tgz",
- "integrity": "sha512-VeVL69ZK+cpJe0DKMSGuwcf7k+V4dr0U0Y7ZhXL785pcRb5gRA6qYZfIH+XTsAzwqTK9l0Dn3Ds4weOZ1jKkLQ==",
- "requires": {
- "@types/node": "*",
- "@types/passport": "^1.0.0",
- "ldapauth-fork": "^4.3.2",
- "passport-strategy": "^1.0.0"
- }
- },
- "passport-local": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
- "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=",
- "requires": {
- "passport-strategy": "1.x.x"
- }
- },
- "passport-oauth2": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.6.1.tgz",
- "integrity": "sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==",
- "requires": {
- "base64url": "3.x.x",
- "oauth": "0.9.x",
- "passport-strategy": "1.x.x",
- "uid2": "0.0.x",
- "utils-merge": "1.x.x"
- }
- },
- "passport-orcid": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/passport-orcid/-/passport-orcid-0.0.4.tgz",
- "integrity": "sha512-swqn1PIQpzAz0qHXwlBlBaRFkfYXsXJ9o33T11QykCuuxR/UppbHGPgBOnrZaIf/Mytq6uYn8s5C4lAahaMYxQ==",
- "requires": {
- "passport-oauth2": "^1.5.0"
- }
- },
- "passport-strategy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
- "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
- },
- "patch-package": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz",
- "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==",
- "requires": {
- "@yarnpkg/lockfile": "^1.1.0",
- "chalk": "^4.1.2",
- "ci-info": "^3.7.0",
- "cross-spawn": "^7.0.3",
- "find-yarn-workspace-root": "^2.0.0",
- "fs-extra": "^9.0.0",
- "json-stable-stringify": "^1.0.2",
- "klaw-sync": "^6.0.0",
- "minimist": "^1.2.6",
- "open": "^7.4.2",
- "rimraf": "^2.6.3",
- "semver": "^7.5.3",
- "slash": "^2.0.0",
- "tmp": "^0.0.33",
- "yaml": "^2.2.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "open": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
- "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
- "requires": {
- "is-docker": "^2.0.0",
- "is-wsl": "^2.1.1"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "yaml": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
- "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA=="
- }
- }
- },
- "path-browserify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
- "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
- },
- "path-loader": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz",
- "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==",
- "requires": {
- "native-promise-only": "^0.8.1",
- "superagent": "^3.8.3"
- }
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "dev": true,
- "requires": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true
- },
- "minipass": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
- "dev": true
- }
- }
- },
- "path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w=="
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "path2d": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.1.tgz",
- "integrity": "sha512-Fl2z/BHvkTNvkuBzYTpTuirHZg6wW9z8+4SND/3mDTEcYbbNKWAy21dz9D3ePNNwrrK8pqZO5vLPZ1hLF6T7XA==",
- "dev": true,
- "optional": true
- },
- "pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true
- },
- "pause": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
- "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
- },
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "pg": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz",
- "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==",
- "requires": {
- "buffer-writer": "2.0.0",
- "packet-reader": "1.0.0",
- "pg-connection-string": "^2.5.0",
- "pg-pool": "^3.4.1",
- "pg-protocol": "^1.5.0",
- "pg-types": "^2.1.0",
- "pgpass": "1.x"
- }
- },
- "pg-connection-string": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
- "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
- },
- "pg-copy-streams": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/pg-copy-streams/-/pg-copy-streams-2.2.2.tgz",
- "integrity": "sha512-mjSqs6hrsRhBojCuY2hxyg48B+3th5ARBjMxBCEisIqBvdRD0g5ETdbts20TzrOfha8ueJQOmQCJCprtczJtGQ=="
- },
- "pg-int8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
- },
- "pg-pool": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz",
- "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==",
- "requires": {}
- },
- "pg-protocol": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
- "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
- },
- "pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
- "requires": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
- }
- },
- "pgpass": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
- "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
- "requires": {
- "split2": "^4.1.0"
- }
- },
- "picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true
- },
- "pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "requires": {
- "find-up": "^4.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- }
- }
- },
- "pkg-up": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
- "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true
- }
- }
- },
- "platform": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
- "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
- "dev": true
- },
- "pluralize": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
- "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
- "dev": true
- },
- "pngjs": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
- "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
- "dev": true
- },
- "policyfile": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz",
- "integrity": "sha1-1rgurZiueeviKOLa9ZAzEeyYLk0="
- },
- "polished": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz",
- "integrity": "sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.17.8"
- }
- },
- "popper.js": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
- "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
- "peer": true
- },
- "possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="
- },
- "postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "requires": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "dependencies": {
- "nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
- }
- }
- },
- "postcss-attribute-case-insensitive": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.2.tgz",
- "integrity": "sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-calc": {
+ "tools/saas-e2e/node_modules/uuid": {
"version": "9.0.1",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
- "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.11",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-clamp": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
- "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-color-functional-notation": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-5.1.0.tgz",
- "integrity": "sha512-w2R4py6zrVE1U7FwNaAc76tNQlG9GLkrBbcFw+VhUjyDDiV28vfZG+l4LyPmpoQpeSJVtu8VgNjE8Jv5SpC7dQ==",
- "dev": true,
- "requires": {
- "@csstools/postcss-progressive-custom-properties": "^2.3.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-color-hex-alpha": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.2.tgz",
- "integrity": "sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-color-rebeccapurple": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-8.0.2.tgz",
- "integrity": "sha512-xWf/JmAxVoB5bltHpXk+uGRoGFwu4WDAR7210el+iyvTdqiKpDhtcT8N3edXMoVJY0WHFMrKMUieql/wRNiXkw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-colormin": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz",
- "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0",
- "colord": "^2.9.1",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-convert-values": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz",
- "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-custom-media": {
- "version": "9.1.5",
- "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-9.1.5.tgz",
- "integrity": "sha512-GStyWMz7Qbo/Gtw1xVspzVSX8eipgNg4lpsO3CAeY4/A1mzok+RV6MCv3fg62trWijh/lYEj6vps4o8JcBBpDA==",
- "dev": true,
- "requires": {
- "@csstools/cascade-layer-name-parser": "^1.0.2",
- "@csstools/css-parser-algorithms": "^2.2.0",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/media-query-list-parser": "^2.1.1"
- }
- },
- "postcss-custom-properties": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.2.tgz",
- "integrity": "sha512-2Coszybpo8lpLY24vy2CYv9AasiZ39/bs8Imv0pWMq55Gl8NWzfc24OAo3zIX7rc6uUJAqESnVOMZ6V6lpMjJA==",
- "dev": true,
- "requires": {
- "@csstools/cascade-layer-name-parser": "^1.0.5",
- "@csstools/css-parser-algorithms": "^2.3.2",
- "@csstools/css-tokenizer": "^2.2.1",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-custom-selectors": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.6.tgz",
- "integrity": "sha512-svsjWRaxqL3vAzv71dV0/65P24/FB8TbPX+lWyyf9SZ7aZm4S4NhCn7N3Bg+Z5sZunG3FS8xQ80LrCU9hb37cw==",
- "dev": true,
- "requires": {
- "@csstools/cascade-layer-name-parser": "^1.0.5",
- "@csstools/css-parser-algorithms": "^2.3.2",
- "@csstools/css-tokenizer": "^2.2.1",
- "postcss-selector-parser": "^6.0.13"
- }
- },
- "postcss-dir-pseudo-class": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-7.0.2.tgz",
- "integrity": "sha512-cMnslilYxBf9k3qejnovrUONZx1rXeUZJw06fgIUBzABJe3D2LiLL5WAER7Imt3nrkaIgG05XZBztueLEf5P8w==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-discard-comments": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz",
- "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==",
- "dev": true,
- "requires": {}
- },
- "postcss-discard-duplicates": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz",
- "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==",
- "dev": true,
- "requires": {}
- },
- "postcss-discard-empty": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz",
- "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-discard-overridden": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz",
- "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==",
- "dev": true,
- "requires": {}
- },
- "postcss-double-position-gradients": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.4.tgz",
- "integrity": "sha512-nUAbUXURemLXIrl4Xoia2tiu5z/n8sY+BVDZApoeT9BlpByyrp02P/lFCRrRvZ/zrGRE+MOGLhk8o7VcMCtPtQ==",
- "dev": true,
- "requires": {
- "@csstools/postcss-progressive-custom-properties": "^2.3.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-focus-visible": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-8.0.2.tgz",
- "integrity": "sha512-f/Vd+EC/GaKElknU59esVcRYr/Y3t1ZAQyL4u2xSOgkDy4bMCmG7VP5cGvj3+BTLNE9ETfEuz2nnt4qkZwTTeA==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-focus-within": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-7.0.2.tgz",
- "integrity": "sha512-AHAJ89UQBcqBvFgQJE9XasGuwMNkKsGj4D/f9Uk60jFmEBHpAL14DrnSk3Rj+SwZTr/WUG+mh+Rvf8fid/346w==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-font-variant": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
- "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
- "dev": true,
- "requires": {}
- },
- "postcss-gap-properties": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-4.0.1.tgz",
- "integrity": "sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg==",
- "dev": true,
- "requires": {}
- },
- "postcss-image-set-function": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-5.0.2.tgz",
- "integrity": "sha512-Sszjwo0ubETX0Fi5MvpYzsONwrsjeabjMoc5YqHvURFItXgIu3HdCjcVuVKGMPGzKRhgaknmdM5uVWInWPJmeg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- }
- },
- "postcss-initial": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
- "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-lab-function": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-5.2.3.tgz",
- "integrity": "sha512-fi32AYKzji5/rvgxo5zXHFvAYBw0u0OzELbeCNjEZVLUir18Oj+9RmNphtM8QdLUaUnrfx8zy8vVYLmFLkdmrQ==",
- "dev": true,
- "requires": {
- "@csstools/css-color-parser": "^1.2.0",
- "@csstools/css-parser-algorithms": "^2.1.1",
- "@csstools/css-tokenizer": "^2.1.1",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0"
- }
- },
- "postcss-loader": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz",
- "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==",
- "dev": true,
- "requires": {
- "cosmiconfig": "^8.2.0",
- "jiti": "^1.18.2",
- "semver": "^7.3.8"
- },
- "dependencies": {
- "cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
- "dev": true,
- "requires": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
- }
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "postcss-logical": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-6.2.0.tgz",
- "integrity": "sha512-aqlfKGaY0nnbgI9jwUikp4gJKBqcH5noU/EdnIVceghaaDPYhZuyJVxlvWNy55tlTG5tunRKCTAX9yljLiFgmw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
- "dev": true
- },
- "postcss-merge-longhand": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz",
- "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0",
- "stylehacks": "^6.0.0"
- }
- },
- "postcss-merge-rules": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz",
- "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0",
- "cssnano-utils": "^4.0.0",
- "postcss-selector-parser": "^6.0.5"
- }
- },
- "postcss-minify-font-values": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz",
- "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-minify-gradients": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz",
- "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==",
- "dev": true,
- "requires": {
- "colord": "^2.9.1",
- "cssnano-utils": "^4.0.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-minify-params": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz",
- "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "cssnano-utils": "^4.0.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-minify-selectors": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz",
- "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.5"
- }
- },
- "postcss-modules-local-by-default": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
- "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
- "dev": true,
- "requires": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
- }
- },
- "postcss-nesting": {
- "version": "11.3.0",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-11.3.0.tgz",
- "integrity": "sha512-JlS10AQm/RzyrUGgl5irVkAlZYTJ99mNueUl+Qab+TcHhVedLiylWVkKBhRale+rS9yWIJK48JVzQlq3LcSdeA==",
- "dev": true,
- "requires": {
- "@csstools/selector-specificity": "^2.0.0",
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-normalize-charset": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz",
- "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-normalize-display-values": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz",
- "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-positions": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz",
- "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-repeat-style": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz",
- "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-string": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz",
- "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-timing-functions": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz",
- "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-unicode": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz",
- "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-url": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz",
- "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-normalize-whitespace": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz",
- "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-opacity-percentage": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz",
- "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-ordered-values": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz",
- "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==",
- "dev": true,
- "requires": {
- "cssnano-utils": "^4.0.0",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-overflow-shorthand": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-4.0.1.tgz",
- "integrity": "sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-page-break": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
- "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
- "dev": true,
- "requires": {}
- },
- "postcss-place": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-8.0.1.tgz",
- "integrity": "sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-preset-env": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-8.5.1.tgz",
- "integrity": "sha512-qhWnJJjP6ArLUINWJ38t6Aftxnv9NW6cXK0NuwcLCcRilbuw72dSFLkCVUJeCfHGgJiKzX+pnhkGiki0PEynWg==",
- "dev": true,
- "requires": {
- "@csstools/postcss-cascade-layers": "^3.0.1",
- "@csstools/postcss-color-function": "^2.2.3",
- "@csstools/postcss-color-mix-function": "^1.0.3",
- "@csstools/postcss-font-format-keywords": "^2.0.2",
- "@csstools/postcss-gradients-interpolation-method": "^3.0.6",
- "@csstools/postcss-hwb-function": "^2.2.2",
- "@csstools/postcss-ic-unit": "^2.0.4",
- "@csstools/postcss-is-pseudo-class": "^3.2.1",
- "@csstools/postcss-logical-float-and-clear": "^1.0.1",
- "@csstools/postcss-logical-resize": "^1.0.1",
- "@csstools/postcss-logical-viewport-units": "^1.0.3",
- "@csstools/postcss-media-minmax": "^1.0.4",
- "@csstools/postcss-media-queries-aspect-ratio-number-values": "^1.0.4",
- "@csstools/postcss-nested-calc": "^2.0.2",
- "@csstools/postcss-normalize-display-values": "^2.0.1",
- "@csstools/postcss-oklab-function": "^2.2.3",
- "@csstools/postcss-progressive-custom-properties": "^2.3.0",
- "@csstools/postcss-relative-color-syntax": "^1.0.2",
- "@csstools/postcss-scope-pseudo-class": "^2.0.2",
- "@csstools/postcss-stepped-value-functions": "^2.1.1",
- "@csstools/postcss-text-decoration-shorthand": "^2.2.4",
- "@csstools/postcss-trigonometric-functions": "^2.1.1",
- "@csstools/postcss-unset-value": "^2.0.1",
- "autoprefixer": "^10.4.14",
- "browserslist": "^4.21.9",
- "css-blank-pseudo": "^5.0.2",
- "css-has-pseudo": "^5.0.2",
- "css-prefers-color-scheme": "^8.0.2",
- "cssdb": "^7.6.0",
- "postcss-attribute-case-insensitive": "^6.0.2",
- "postcss-clamp": "^4.1.0",
- "postcss-color-functional-notation": "^5.1.0",
- "postcss-color-hex-alpha": "^9.0.2",
- "postcss-color-rebeccapurple": "^8.0.2",
- "postcss-custom-media": "^9.1.5",
- "postcss-custom-properties": "^13.2.0",
- "postcss-custom-selectors": "^7.1.3",
- "postcss-dir-pseudo-class": "^7.0.2",
- "postcss-double-position-gradients": "^4.0.4",
- "postcss-focus-visible": "^8.0.2",
- "postcss-focus-within": "^7.0.2",
- "postcss-font-variant": "^5.0.0",
- "postcss-gap-properties": "^4.0.1",
- "postcss-image-set-function": "^5.0.2",
- "postcss-initial": "^4.0.1",
- "postcss-lab-function": "^5.2.3",
- "postcss-logical": "^6.2.0",
- "postcss-nesting": "^11.3.0",
- "postcss-opacity-percentage": "^2.0.0",
- "postcss-overflow-shorthand": "^4.0.1",
- "postcss-page-break": "^3.0.4",
- "postcss-place": "^8.0.1",
- "postcss-pseudo-class-any-link": "^8.0.2",
- "postcss-replace-overflow-wrap": "^4.0.0",
- "postcss-selector-not": "^7.0.1",
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-pseudo-class-any-link": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-8.0.2.tgz",
- "integrity": "sha512-FYTIuRE07jZ2CW8POvctRgArQJ43yxhr5vLmImdKUvjFCkR09kh8pIdlCwdx/jbFm7MiW4QP58L4oOUv3grQYA==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-reduce-initial": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz",
- "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "caniuse-api": "^3.0.0"
- }
- },
- "postcss-reduce-transforms": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz",
- "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0"
- }
- },
- "postcss-replace-overflow-wrap": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
- "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
- "dev": true,
- "requires": {}
- },
- "postcss-reporter": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz",
- "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==",
- "dev": true,
- "requires": {
- "picocolors": "^1.0.0",
- "thenby": "^1.3.4"
- }
- },
- "postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
- "dev": true
- },
- "postcss-safe-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
- "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
- "dev": true,
- "peer": true,
- "requires": {}
- },
- "postcss-scss": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
- "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
- "dev": true,
- "requires": {}
- },
- "postcss-selector-not": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.1.tgz",
- "integrity": "sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.10"
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.16",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
- "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- }
- },
- "postcss-svgo": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz",
- "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==",
- "dev": true,
- "requires": {
- "postcss-value-parser": "^4.2.0",
- "svgo": "^3.0.2"
- }
- },
- "postcss-unique-selectors": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz",
- "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==",
- "dev": true,
- "requires": {
- "postcss-selector-parser": "^6.0.5"
- }
- },
- "postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "postgres-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
- },
- "postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
- },
- "postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
- },
- "postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
- "requires": {
- "xtend": "^4.0.0"
- }
- },
- "pprof": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/pprof/-/pprof-3.2.1.tgz",
- "integrity": "sha512-KnextTM3EHQ2zqN8fUjB0VpE+njcVR7cOfo7DjJSLKzIbKTPelDtokI04ScR/Vd8CLDj+M99tsaKV+K6FHzpzA==",
- "requires": {
- "@mapbox/node-pre-gyp": "^1.0.0",
- "bindings": "^1.2.1",
- "delay": "^5.0.0",
- "findit2": "^2.2.3",
- "nan": "^2.14.0",
- "p-limit": "^3.0.0",
- "pify": "^5.0.0",
- "protobufjs": "~7.2.4",
- "source-map": "^0.7.3",
- "split": "^1.0.1"
- },
- "dependencies": {
- "pify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
- "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="
- },
- "source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="
- }
- }
- },
- "precond": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
- "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw="
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
- },
- "prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
- "dev": true
- },
- "prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "requires": {
- "fast-diff": "^1.1.2"
- }
- },
- "pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "dev": true
- },
- "pretty-error": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
- "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.20",
- "renderkid": "^3.0.0"
- }
- },
- "pretty-format": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
- "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1",
- "ansi-styles": "^5.0.0",
- "react-is": "^17.0.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true
- }
- }
- },
- "pretty-ms": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
- "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==",
- "requires": {
- "parse-ms": "^2.1.0"
- }
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "prom-client": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz",
- "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==",
- "requires": {
- "tdigest": "^0.1.1"
- }
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "~2.0.3"
- }
- },
- "promise-breaker": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-6.0.0.tgz",
- "integrity": "sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA=="
- },
- "promise.prototype.finally": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.3.tgz",
- "integrity": "sha512-EXRF3fC9/0gz4qkt/f5EP5iW4kj9oFpBICNpCNOb/52+8nlHIX07FPLbi/q4qYBQ1xZqivMzTpNQSnArVASolQ==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- }
- },
- "promptly": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/promptly/-/promptly-3.2.0.tgz",
- "integrity": "sha512-WnR9obtgW+rG4oUV3hSnNGl1pHm3V1H/qD9iJBumGSmVsSC5HpZOLuu8qdMb6yCItGfT7dcRszejr/5P3i9Pug==",
- "requires": {
- "read": "^1.0.4"
- }
- },
- "prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- }
- }
- },
- "prop-types-extra": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
- "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
- "requires": {
- "react-is": "^16.3.2",
- "warning": "^4.0.0"
- },
- "dependencies": {
- "react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- }
- }
- },
- "propagate": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
- "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
- "dev": true
- },
- "property-expr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
- "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==",
- "dev": true
- },
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
- "dev": true
- },
- "proto3-json-serializer": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz",
- "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==",
- "requires": {
- "protobufjs": "^7.2.5"
- }
- },
- "protobufjs": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz",
- "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==",
- "requires": {
- "@protobufjs/aspromise": "^1.1.2",
- "@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
- "@protobufjs/eventemitter": "^1.1.0",
- "@protobufjs/fetch": "^1.1.0",
- "@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
- "@protobufjs/path": "^1.1.2",
- "@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
- "@types/node": ">=13.7.0",
- "long": "^5.0.0"
- }
- },
- "protobufjs-cli": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz",
- "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==",
- "requires": {
- "chalk": "^4.0.0",
- "escodegen": "^1.13.0",
- "espree": "^9.0.0",
- "estraverse": "^5.1.0",
- "glob": "^8.0.0",
- "jsdoc": "^4.0.0",
- "minimist": "^1.2.0",
- "semver": "^7.1.2",
- "tmp": "^0.2.1",
- "uglify-js": "^3.7.7"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "requires": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
- }
- }
- },
- "glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- }
- },
- "minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- },
- "semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w=="
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "proxy-from-env": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
- "dev": true
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
- "dev": true,
- "optional": true
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
- "pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "pug": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz",
- "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==",
- "requires": {
- "pug-code-gen": "^3.0.3",
- "pug-filters": "^4.0.0",
- "pug-lexer": "^5.0.1",
- "pug-linker": "^4.0.0",
- "pug-load": "^3.0.0",
- "pug-parser": "^6.0.0",
- "pug-runtime": "^3.0.1",
- "pug-strip-comments": "^2.0.0"
- }
- },
- "pug-attrs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz",
- "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==",
- "requires": {
- "constantinople": "^4.0.1",
- "js-stringify": "^1.0.2",
- "pug-runtime": "^3.0.0"
- }
- },
- "pug-code-gen": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz",
- "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==",
- "requires": {
- "constantinople": "^4.0.1",
- "doctypes": "^1.1.0",
- "js-stringify": "^1.0.2",
- "pug-attrs": "^3.0.0",
- "pug-error": "^2.1.0",
- "pug-runtime": "^3.0.1",
- "void-elements": "^3.1.0",
- "with": "^7.0.0"
- }
- },
- "pug-error": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz",
- "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg=="
- },
- "pug-filters": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz",
- "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==",
- "requires": {
- "constantinople": "^4.0.1",
- "jstransformer": "1.0.0",
- "pug-error": "^2.0.0",
- "pug-walk": "^2.0.0",
- "resolve": "^1.15.1"
- }
- },
- "pug-lexer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz",
- "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==",
- "requires": {
- "character-parser": "^2.2.0",
- "is-expression": "^4.0.0",
- "pug-error": "^2.0.0"
- }
- },
- "pug-linker": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz",
- "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==",
- "requires": {
- "pug-error": "^2.0.0",
- "pug-walk": "^2.0.0"
- }
- },
- "pug-load": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz",
- "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==",
- "requires": {
- "object-assign": "^4.1.1",
- "pug-walk": "^2.0.0"
- }
- },
- "pug-parser": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz",
- "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==",
- "requires": {
- "pug-error": "^2.0.0",
- "token-stream": "1.0.0"
- }
- },
- "pug-runtime": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz",
- "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg=="
- },
- "pug-strip-comments": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz",
- "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==",
- "requires": {
- "pug-error": "^2.0.0"
- }
- },
- "pug-walk": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz",
- "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ=="
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pumpify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
- "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
- "requires": {
- "duplexify": "^4.1.1",
- "inherits": "^2.0.3",
- "pump": "^3.0.0"
- },
- "dependencies": {
- "duplexify": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
- "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
- "requires": {
- "end-of-stream": "^1.4.1",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1",
- "stream-shift": "^1.0.0"
- }
- }
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- },
- "punycode.js": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
- "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="
- },
- "qrcode": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.0.tgz",
- "integrity": "sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==",
- "dev": true,
- "requires": {
- "dijkstrajs": "^1.0.1",
- "encode-utf8": "^1.0.3",
- "pngjs": "^5.0.0",
- "yargs": "^15.3.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "y18n": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "dev": true
- },
- "yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "dev": true,
- "requires": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- }
- },
- "yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "requires": {
- "side-channel": "^1.0.6"
- }
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
- },
- "querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
- "dev": true
- },
- "querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
- },
- "queue-tick": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
- "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
- "dev": true
- },
- "quick-lru": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g="
- },
- "rambda": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
- "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==",
- "dev": true
- },
- "random-bytes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
- "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
- },
- "randombytes": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
- "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew="
- },
- "randomstring": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz",
- "integrity": "sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg==",
- "requires": {
- "array-uniq": "1.0.2",
- "randombytes": "2.0.3"
- },
- "dependencies": {
- "array-uniq": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz",
- "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0="
- }
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "rate-limiter-flexible": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz",
- "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g=="
- },
- "raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "react": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
- "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "react-async-script": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.2.0.tgz",
- "integrity": "sha512-bCpkbm9JiAuMGhkqoAiC0lLkb40DJ0HOEJIku+9JDjxX3Rcs+ztEOG13wbrOskt3n2DTrjshhaQ/iay+SnGg5Q==",
- "dev": true,
- "requires": {
- "hoist-non-react-statics": "^3.3.0",
- "prop-types": "^15.5.0"
- }
- },
- "react-bootstrap": {
- "version": "0.33.1",
- "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.33.1.tgz",
- "integrity": "sha512-qWTRravSds87P8WC82tETy2yIso8qDqlIm0czsrduCaYAFtHuyLu0XDbUlfLXeRzqgwm5sRk2wRaTNoiVkk/YQ==",
- "requires": {
- "@babel/runtime-corejs2": "^7.0.0",
- "classnames": "^2.2.5",
- "dom-helpers": "^3.2.0",
- "invariant": "^2.2.4",
- "keycode": "^2.2.0",
- "prop-types": "^15.6.1",
- "prop-types-extra": "^1.0.1",
- "react-overlays": "^0.9.0",
- "react-prop-types": "^0.4.0",
- "react-transition-group": "^2.0.0",
- "uncontrollable": "^7.0.2",
- "warning": "^3.0.0"
- }
- },
- "react-bootstrap-5": {
- "version": "npm:react-bootstrap@2.10.2",
- "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.2.tgz",
- "integrity": "sha512-UvB7mRqQjivdZNxJNEA2yOQRB7L9N43nBnKc33K47+cH90/ujmnMwatTCwQLu83gLhrzAl8fsa6Lqig/KLghaA==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.22.5",
- "@restart/hooks": "^0.4.9",
- "@restart/ui": "^1.6.8",
- "@types/react-transition-group": "^4.4.6",
- "classnames": "^2.3.2",
- "dom-helpers": "^5.2.1",
- "invariant": "^2.2.4",
- "prop-types": "^15.8.1",
- "prop-types-extra": "^1.1.0",
- "react-transition-group": "^4.4.5",
- "uncontrollable": "^7.2.1",
- "warning": "^4.0.3"
- },
- "dependencies": {
- "dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- }
- },
- "warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- }
- }
- },
- "react-chartjs-2": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.0.1.tgz",
- "integrity": "sha512-u38C9OxynlNCBp+79grgXRs7DSJ9w8FuQ5/HO5FbYBbri8HSZW+9SWgjVshLkbXBfXnMGWakbHEtvN0nL2UG7Q==",
- "dev": true,
- "requires": {}
- },
- "react-color": {
- "version": "2.19.3",
- "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
- "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
- "dev": true,
- "requires": {
- "@icons/material": "^0.2.4",
- "lodash": "^4.17.15",
- "lodash-es": "^4.17.15",
- "material-colors": "^1.2.1",
- "prop-types": "^15.5.10",
- "reactcss": "^1.2.0",
- "tinycolor2": "^1.4.1"
- }
- },
- "react-colorful": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
- "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
- "dev": true,
- "requires": {}
- },
- "react-deep-force-update": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz",
- "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==",
- "dev": true
- },
- "react-dnd": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz",
- "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==",
- "dev": true,
- "requires": {
- "@react-dnd/invariant": "^4.0.1",
- "@react-dnd/shallowequal": "^4.0.1",
- "dnd-core": "^16.0.1",
- "fast-deep-equal": "^3.1.3",
- "hoist-non-react-statics": "^3.3.2"
- }
- },
- "react-dnd-html5-backend": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz",
- "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==",
- "dev": true,
- "requires": {
- "dnd-core": "^16.0.1"
- }
- },
- "react-docgen": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz",
- "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.18.9",
- "@babel/traverse": "^7.18.9",
- "@babel/types": "^7.18.9",
- "@types/babel__core": "^7.18.0",
- "@types/babel__traverse": "^7.18.0",
- "@types/doctrine": "^0.0.9",
- "@types/resolve": "^1.20.2",
- "doctrine": "^3.0.0",
- "resolve": "^1.22.1",
- "strip-indent": "^4.0.0"
- },
- "dependencies": {
- "@types/doctrine": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
- "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
- "dev": true
- }
- }
- },
- "react-docgen-typescript": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz",
- "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==",
- "dev": true,
- "requires": {}
- },
- "react-dom": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
- "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "scheduler": "^0.20.2"
- }
- },
- "react-element-to-jsx-string": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
- "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
- "dev": true,
- "requires": {
- "@base2/pretty-print-object": "1.0.1",
- "is-plain-object": "5.0.0",
- "react-is": "18.1.0"
- },
- "dependencies": {
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true
- },
- "react-is": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
- "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
- "dev": true
- }
- }
- },
- "react-error-boundary": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-2.3.2.tgz",
- "integrity": "sha512-ZMzi7s4pj/6A/6i9RS4tG7g1PdF2Rgr4/7FTQ8sbKHex19uNji0j+xq0OS//c6TUgQRKoL6P51BNNNFmYpRMhw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.11.2"
- }
- },
- "react-fast-compare": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
- "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==",
- "dev": true
- },
- "react-google-recaptcha": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-3.1.0.tgz",
- "integrity": "sha512-cYW2/DWas8nEKZGD7SCu9BSuVz8iOcOLHChHyi7upUuVhkpkhYG/6N3KDiTQ3XAiZ2UAZkfvYKMfAHOzBOcGEg==",
- "dev": true,
- "requires": {
- "prop-types": "^15.5.0",
- "react-async-script": "^1.2.0"
- }
- },
- "react-i18next": {
- "version": "13.3.1",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.3.1.tgz",
- "integrity": "sha512-JAtYREK879JXaN9GdzfBI4yJeo/XyLeXWUsRABvYXiFUakhZJ40l+kaTo+i+A/3cKIED41kS/HAbZ5BzFtq/Og==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.22.5",
- "html-parse-stringify": "^3.0.1"
- }
- },
- "react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
- },
- "react-lifecycles-compat": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- },
- "react-linkify": {
- "version": "1.0.0-alpha",
- "resolved": "https://registry.npmjs.org/react-linkify/-/react-linkify-1.0.0-alpha.tgz",
- "integrity": "sha512-7gcIUvJkAXXttt1fmBK9cwn+1jTa4hbKLGCZ9J1U6EOkyb2/+LKL1Z28d9rtDLMnpvImlNlLPdTPooorl5cpmg==",
- "dev": true,
- "requires": {
- "linkify-it": "^2.0.3",
- "tlds": "^1.199.0"
- },
- "dependencies": {
- "linkify-it": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
- "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
- "dev": true,
- "requires": {
- "uc.micro": "^1.0.1"
- }
- }
- }
- },
- "react-overlays": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz",
- "integrity": "sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ==",
- "requires": {
- "classnames": "^2.2.5",
- "dom-helpers": "^3.2.1",
- "prop-types": "^15.5.10",
- "prop-types-extra": "^1.0.1",
- "react-transition-group": "^2.2.1",
- "warning": "^3.0.0"
- }
- },
- "react-prop-types": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz",
- "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=",
- "requires": {
- "warning": "^3.0.0"
- }
- },
- "react-proxy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz",
- "integrity": "sha512-46GkBpZD97R/vV+iw+u6aFACzIHOst9gCl41d5K5vepPBz2i2gqHmXQJWKXsrUsSOdylKahN3sd9taswFN8Wzw==",
- "dev": true,
- "requires": {
- "lodash": "^4.6.1",
- "react-deep-force-update": "^1.0.0"
- }
- },
- "react-redux": {
- "version": "7.2.9",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz",
- "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==",
- "requires": {
- "@babel/runtime": "^7.15.4",
- "@types/react-redux": "^7.1.20",
- "hoist-non-react-statics": "^3.3.2",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.7.2",
- "react-is": "^17.0.2"
- }
- },
- "react-refresh": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
- "dev": true
- },
- "react-resizable-panels": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.1.tgz",
- "integrity": "sha512-+cUV/yZBYfiBj+WJtpWDJ3NtR4zgDZfHt3+xtaETKE+FCvp+RK/NJxacDQKxMHgRUTSkfA6AnGljQ5QZNsCQoA==",
- "dev": true,
- "requires": {}
- },
- "react-responsive": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-10.0.0.tgz",
- "integrity": "sha512-N6/UiRLGQyGUqrarhBZmrSmHi2FXSD++N5VbSKsBBvWfG0ZV7asvUBluSv5lSzdMyEVjzZ6Y8DL4OHABiztDOg==",
- "requires": {
- "hyphenate-style-name": "^1.0.0",
- "matchmediaquery": "^0.4.2",
- "prop-types": "^15.6.1",
- "shallow-equal": "^3.1.0"
- }
- },
- "react-router": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
- "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
- "requires": {
- "@remix-run/router": "1.19.1"
- }
- },
- "react-router-dom": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
- "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
- "requires": {
- "@remix-run/router": "1.19.1",
- "react-router": "6.26.1"
- }
- },
- "react-transform-hmr": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz",
- "integrity": "sha512-8bK1DWUZynE6swD2jNPbzO5mvhB8fs9Ub5GksoVqYkc9i06FdSLC36qQYjaKOW79KBdsROq2cK0tRKITiEzmyg==",
- "dev": true,
- "requires": {
- "global": "^4.3.0",
- "react-proxy": "^1.1.7"
- }
- },
- "react-transition-group": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
- "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
- "requires": {
- "dom-helpers": "^3.4.0",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2",
- "react-lifecycles-compat": "^3.0.4"
- }
- },
- "reactcss": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
- "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
- "dev": true,
- "requires": {
- "lodash": "^4.0.1"
- }
- },
- "read": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
- "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
- "requires": {
- "mute-stream": "~0.0.4"
- }
- },
- "read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "requires": {
- "pify": "^2.3.0"
- }
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdir-glob": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
- "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
- "requires": {
- "minimatch": "^5.1.0"
- },
- "dependencies": {
- "brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "requires": {
- "balanced-match": "^1.0.0"
- }
- },
- "minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "requires": {
- "brace-expansion": "^2.0.1"
- }
- }
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "recast": {
- "version": "0.23.9",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
- "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
- "dev": true,
- "requires": {
- "ast-types": "^0.16.1",
- "esprima": "~4.0.0",
- "source-map": "~0.6.1",
- "tiny-invariant": "^1.3.3",
- "tslib": "^2.0.1"
- }
- },
- "rechoir": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
- "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
- "requires": {
- "resolve": "^1.20.0"
- }
- },
- "recurly": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/recurly/-/recurly-4.12.0.tgz",
- "integrity": "sha512-pmsREYXBBPYYAqeurlAAmB7sNiYfRva5Imi+nxZ41QHDZsDWuM35Q4/TSouLy8HdEE+HPfB4XHHpGNjo2LAM+A=="
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "dependencies": {
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- }
- }
- },
- "redis-commands": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
- "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
- },
- "redis-errors": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
- "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
- },
- "redis-parser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
- "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
- "requires": {
- "redis-errors": "^1.0.0"
- }
- },
- "redlock": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/redlock/-/redlock-4.2.0.tgz",
- "integrity": "sha512-j+oQlG+dOwcetUt2WJWttu4CZVeRzUrcVcISFmEmfyuwCVSJ93rDT7YSgg7H7rnxwoRyk/jU46kycVka5tW7jA==",
- "requires": {
- "bluebird": "^3.7.2"
- }
- },
- "reduce": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz",
- "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.1.0"
- }
- },
- "redux": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
- "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
- "requires": {
- "@babel/runtime": "^7.9.2"
- }
- },
- "redux-logger": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz",
- "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==",
- "requires": {
- "deep-diff": "^0.3.5"
- }
- },
- "redux-mock-store": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/redux-mock-store/-/redux-mock-store-1.5.0.tgz",
- "integrity": "sha512-8AN6ti8SeH28FZm/mz+E2sj2JoaFCDudswbeFrt4Rnbi4KmI/KXumbskY7caO52zAgsda+DIgKBc60MJJhnhbg==",
- "dev": true,
- "requires": {
- "lodash.isplainobject": "^4.0.6"
- }
- },
- "redux-thunk": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.2.0.tgz",
- "integrity": "sha512-OOFWh9mt/7i94QPq4IAxhSIUyfIJJRnk6pe1IwgXethQik3kyg1wuxVZZlW9QOmL5rP/MrwzV+Cb+/HBKlvM8Q=="
- },
- "referer-parser": {
- "version": "git+ssh://git@github.com/overleaf/nodejs-referer-parser.git#8b8b103762d05b7be4cfa2f810e1d408be67d7bb",
- "integrity": "sha512-73u9iYlvAoOF3PuteH1Yl3hdIGcGefyyZbgcNcaF8gAnSrx/cHlgiht/AhbT+rcM0dv0bPo9NxBmTrR1jr8DMQ==",
- "from": "referer-parser@github:overleaf/nodejs-referer-parser#8b8b103762d05b7be4cfa2f810e1d408be67d7bb",
- "requires": {
- "js-yaml": "^4.1.0"
- }
- },
- "referrer-policy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz",
- "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA=="
- },
- "reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
- }
- },
- "regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "dev": true
- },
- "regenerate-unicode-properties": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
- "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.2"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
- },
- "regenerator-transform": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "regex-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
- "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
- "dev": true
- },
- "regexp-tree": {
- "version": "0.1.27",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
- "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
- "dev": true
- },
- "regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
- "requires": {
- "call-bind": "^1.0.6",
- "define-properties": "^1.2.1",
- "es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
- }
- },
- "regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true
- },
- "regexpu-core": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
- "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
- "dev": true,
- "requires": {
- "@babel/regjsgen": "^0.8.0",
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.1.0",
- "regjsparser": "^0.9.1",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
- }
- },
- "regjsparser": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
- "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
- "dev": true
- }
- }
- },
- "rehype-external-links": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
- "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
- "dev": true,
- "requires": {
- "@types/hast": "^3.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "hast-util-is-element": "^3.0.0",
- "is-absolute-url": "^4.0.0",
- "space-separated-tokens": "^2.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "dependencies": {
- "is-absolute-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
- "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
- "dev": true
- }
- }
- },
- "rehype-slug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
- "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
- "dev": true,
- "requires": {
- "@types/hast": "^3.0.0",
- "github-slugger": "^2.0.0",
- "hast-util-heading-rank": "^3.0.0",
- "hast-util-to-string": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- }
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
- "dev": true
- },
- "remove-accents": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
- "integrity": "sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U=",
- "dev": true
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
- "dev": true
- },
- "renderkid": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
- "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
- "dev": true,
- "requires": {
- "css-select": "^4.1.3",
- "dom-converter": "^0.2.0",
- "htmlparser2": "^6.1.0",
- "lodash": "^4.17.21",
- "strip-ansi": "^6.0.1"
- }
- },
- "replace-ext": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz",
- "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==",
- "dev": true
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- }
- }
- },
- "request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=",
- "dev": true,
- "requires": {
- "throttleit": "^1.0.0"
- }
- },
- "requestretry": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-7.1.0.tgz",
- "integrity": "sha512-TqVDgp251BW4b8ddQ2ptaj/57Z3LZHLscAUT7v6qs70buqF2/IoOVjYbpjJ6HiW7j5+waqegGI8xKJ/+uzgDmw==",
- "requires": {
- "extend": "^3.0.2",
- "lodash": "^4.17.15"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
- },
- "require-like": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
- "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=",
- "dev": true
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
- },
- "requizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
- "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
- "requires": {
- "lodash": "^4.17.21"
- }
- },
- "reselect": {
- "version": "4.1.8",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
- "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
- "dev": true
- },
- "resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "requires": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- },
- "resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "requires": {
- "resolve-from": "^5.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
- },
- "resolve-options": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz",
- "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==",
- "dev": true,
- "requires": {
- "value-or-function": "^4.0.0"
- }
- },
- "resolve-url-loader": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
- "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==",
- "dev": true,
- "requires": {
- "adjust-sourcemap-loader": "^4.0.0",
- "convert-source-map": "^1.7.0",
- "loader-utils": "^2.0.0",
- "postcss": "^8.2.14",
- "source-map": "0.6.1"
- }
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
- },
- "retry-as-promised": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
- "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
- },
- "retry-request": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz",
- "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==",
- "requires": {
- "debug": "^4.1.1",
- "extend": "^3.0.2"
- }
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
- },
- "rfdc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
- "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
- "dev": true
- },
- "rimraf": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz",
- "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w="
- },
- "rndm": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz",
- "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
- },
- "route-recognizer": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz",
- "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==",
- "dev": true
- },
- "run-applescript": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
- "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
- "dev": true
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "rxjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
- "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
- "dev": true,
- "requires": {
- "tslib": "^2.1.0"
- }
- },
- "safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
- "requires": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
- "isarray": "^2.0.5"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safe-json-stringify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
- "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
- "optional": true
- },
- "safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
- "requires": {
- "call-bind": "^1.0.6",
- "es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "saml": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/saml/-/saml-3.0.1.tgz",
- "integrity": "sha512-bOjVqZcHY8PkdTBD7Y27KHykC7403BEM46SeCq5r0QPNEPE7M7RmWKy7hPjYsID9VNkCNSHYSVrrRS8Y9hNVWA==",
- "requires": {
- "@xmldom/xmldom": "^0.7.4",
- "async": "^3.2.4",
- "moment": "^2.29.4",
- "valid-url": "~1.0.9",
- "xml-crypto": "^2.1.3",
- "xml-encryption": "^2.0.0",
- "xml-name-validator": "~2.0.1",
- "xpath": "0.0.5"
- },
- "dependencies": {
- "xml-name-validator": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
- "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA=="
- }
- }
- },
- "samlp": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/samlp/-/samlp-7.0.2.tgz",
- "integrity": "sha512-ajROyMKj4HKqXEbThx5ktsMWRsIGziAWWgh9ObnzobUJgCObSUPB13KM9G50huIQffMy3lXx87JDhzYXg5iJ5A==",
- "requires": {
- "@auth0/thumbprint": "0.0.6",
- "@auth0/xmldom": "0.1.21",
- "auth0-id-generator": "^0.2.0",
- "ejs": "^3.1.8",
- "flowstate": "^0.4.0",
- "querystring": "^0.2.0",
- "saml": "^3.0.1",
- "xml-crypto": "^2.0.0",
- "xpath": "0.0.5",
- "xtend": "^1.0.3"
- },
- "dependencies": {
- "xtend": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-1.0.3.tgz",
- "integrity": "sha1-P12Tc1PM7Y4IU5mlY/2yJUHClgo="
- }
- }
- },
- "sandboxed-module": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.4.tgz",
- "integrity": "sha512-AwEPOdO8mg/wJjr876yCHP2DHqVN0MaggEXhp6IIf3bcI5cYoQl9QrrCHSrvToHjvdEiS5x4TVZRgjD2bEmNTA==",
- "dev": true,
- "requires": {
- "require-like": "0.1.2",
- "stack-trace": "0.0.9"
- }
- },
- "sanitize-html": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.12.1.tgz",
- "integrity": "sha512-Plh+JAn0UVDpBRP/xEjsk+xDCoOvMBwQUf/K+/cBAVuTbtX8bj2VB7S1sL1dssVpykqp0/KPSesHrqXtokVBpA==",
- "requires": {
- "deepmerge": "^4.2.2",
- "escape-string-regexp": "^4.0.0",
- "htmlparser2": "^8.0.0",
- "is-plain-object": "^5.0.0",
- "parse-srcset": "^1.0.2",
- "postcss": "^8.3.11"
- },
- "dependencies": {
- "dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "requires": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- }
- },
- "domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "requires": {
- "domelementtype": "^2.3.0"
- }
- },
- "domutils": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
- "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
- "requires": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.1"
- }
- },
- "entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
- },
- "htmlparser2": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
- "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
- "requires": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "entities": "^4.3.0"
- }
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
- }
- }
- },
- "sass": {
- "version": "1.77.1",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz",
- "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==",
- "dev": true,
- "requires": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- }
- },
- "sass-loader": {
- "version": "14.2.1",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz",
- "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==",
- "dev": true,
- "requires": {
- "neo-async": "^2.6.2"
- }
- },
- "sax": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
- "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
- },
- "saxes": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
- "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
- "dev": true,
- "requires": {
- "xmlchars": "^2.2.0"
- }
- },
- "scheduler": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
- "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- }
- },
- "scroll-into-view-if-needed": {
- "version": "2.2.28",
- "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz",
- "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==",
- "dev": true,
- "requires": {
- "compute-scroll-into-view": "^1.0.17"
- }
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
- "dev": true
- },
- "selfsigned": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
- "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
- "requires": {
- "@types/node-forge": "^1.3.0",
- "node-forge": "^1"
- }
- },
- "semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true
- },
- "send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- }
- }
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- }
- }
- },
- "sequelize": {
- "version": "6.31.0",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.31.0.tgz",
- "integrity": "sha512-nCPVtv+QydBmb3Us2jCNAr1Dx3gST83VZxxrUQn/JAVFCOrmYOgUaPUz5bevummyNf30zfHsZhIKYAOD3ULfTA==",
- "requires": {
- "@types/debug": "^4.1.7",
- "@types/validator": "^13.7.1",
- "debug": "^4.3.3",
- "dottie": "^2.0.2",
- "inflection": "^1.13.2",
- "lodash": "^4.17.21",
- "moment": "^2.29.1",
- "moment-timezone": "^0.5.35",
- "pg-connection-string": "^2.5.0",
- "retry-as-promised": "^7.0.3",
- "semver": "^7.3.5",
- "sequelize-pool": "^7.1.0",
- "toposort-class": "^1.0.1",
- "uuid": "^8.3.2",
- "validator": "^13.7.0",
- "wkx": "^0.5.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "sequelize-cli": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.0.tgz",
- "integrity": "sha512-FwTClhGRvXKanFRHMZbgfXOBV8UC2B3VkE0WOdW1n39/36PF4lWyurF95f246une/V4eaO3a7/Ywvy++3r+Jmg==",
- "dev": true,
- "requires": {
- "cli-color": "^2.0.3",
- "fs-extra": "^9.1.0",
- "js-beautify": "^1.14.5",
- "lodash": "^4.17.21",
- "resolve": "^1.22.1",
- "umzug": "^2.3.0",
- "yargs": "^16.2.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- }
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- }
- }
- },
- "sequelize-pool": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
- "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg=="
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- },
- "dependencies": {
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- }
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "requires": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "dependencies": {
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- }
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "set-cookie-parser": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz",
- "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==",
- "dev": true
- },
- "set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "requires": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- }
- },
- "set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
- "requires": {
- "define-data-property": "^1.0.1",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "shallow-equal": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz",
- "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg=="
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
- },
- "shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
- "dev": true
- },
- "shimmer": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
- "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
- },
- "side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "requires": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- }
- },
- "sift": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
- "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
- },
- "sigmund": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
- },
- "simple-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
- "dev": true,
- "optional": true
- },
- "simple-get": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
- "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
- "dev": true,
- "optional": true,
- "requires": {
- "decompress-response": "^4.2.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- },
- "dependencies": {
- "decompress-response": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
- "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
- "dev": true,
- "optional": true,
- "requires": {
- "mimic-response": "^2.0.0"
- }
- },
- "mimic-response": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
- "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
- "dev": true,
- "optional": true
- }
- }
- },
- "simple-oauth2": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/simple-oauth2/-/simple-oauth2-5.0.0.tgz",
- "integrity": "sha512-8291lo/z5ZdpmiOFzOs1kF3cxn22bMj5FFH+DNUppLJrpoIlM1QnFiE7KpshHu3J3i21TVcx4yW+gXYjdCKDLQ==",
- "requires": {
- "@hapi/hoek": "^10.0.1",
- "@hapi/wreck": "^18.0.0",
- "debug": "^4.3.4",
- "joi": "^17.6.4"
- },
- "dependencies": {
- "@hapi/hoek": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-10.0.1.tgz",
- "integrity": "sha512-CvlW7jmOhWzuqOqiJQ3rQVLMcREh0eel4IBnxDx2FAcK8g7qoJRQK4L1CPBASoCY6y8e6zuCy3f2g+HWdkzcMw=="
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "simple-update-notifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
- "dev": true,
- "requires": {
- "semver": "^7.5.3"
- },
- "dependencies": {
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- }
- }
- },
- "sinon": {
- "version": "9.2.4",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz",
- "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==",
- "dev": true,
- "requires": {
- "@sinonjs/commons": "^1.8.1",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/samsam": "^5.3.1",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "sinon-chai": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz",
- "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==",
- "dev": true,
- "requires": {}
- },
- "sinon-stub-promise": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/sinon-stub-promise/-/sinon-stub-promise-4.0.0.tgz",
- "integrity": "sha1-bUmLoRmFV80B40Zq+S3H33JRksI=",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="
- },
- "slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- }
- }
- },
- "slugify": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz",
- "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==",
- "dev": true
- },
- "smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
- },
- "socket.io": {
- "version": "git+ssh://git@github.com/overleaf/socket.io.git#7ac322c2a5b26a4647834868d78afbb0db1f8849",
- "from": "socket.io@github:overleaf/socket.io#0.9.19-overleaf-10",
- "requires": {
- "base64id": "0.1.0",
- "policyfile": "0.0.4",
- "redis": "0.7.3"
- },
- "dependencies": {
- "redis": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz",
- "integrity": "sha512-0Pgb0jOLfn6eREtEIRn/ifyZJjl2H+wUY4F/Pe7T4UhmoSrZ/1HU5ZqiBpDk8I8Wbyv2N5DpXKzbEtMj3drprg==",
- "optional": true
- }
- }
- },
- "socket.io-client": {
- "version": "git+ssh://git@github.com/overleaf/socket.io-client.git#805a73d2a2e2408982597d5986a401088b7aa588",
- "from": "socket.io-client@github:overleaf/socket.io-client#0.9.17-overleaf-5",
- "requires": {
- "ws": "^1.1.5",
- "xmlhttprequest": "^1.8.0"
- },
- "dependencies": {
- "ws": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
- "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
- "requires": {
- "options": ">=0.0.5",
- "ultron": "1.0.x"
- }
- }
- }
- },
- "sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dev": true,
- "requires": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- },
- "dependencies": {
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true
- }
- }
- },
- "socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
- "requires": {
- "ip": "^2.0.0",
- "smart-buffer": "^4.2.0"
- }
- },
- "sortobject": {
- "version": "4.16.0",
- "resolved": "https://registry.npmjs.org/sortobject/-/sortobject-4.16.0.tgz",
- "integrity": "sha512-jdcWhqJjxyYxRcXa30qImF3PZea1GpNwdKxUac28T28+GodptH4XihPuRlgCY0hITIEQVnw8DtQ81Fb6fomBaw==",
- "dev": true
- },
- "source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg=="
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "dev": true
- },
- "spark-md5": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz",
- "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
- },
- "sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
- "requires": {
- "memory-pager": "^1.0.2"
- }
- },
- "spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
- "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.20",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
- "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
- "dev": true
- },
- "spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "requires": {
- "through": "2"
- }
- },
- "split-ca": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
- "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY="
- },
- "split2": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
- "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "sprintf-kit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz",
- "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==",
- "requires": {
- "es5-ext": "^0.10.53"
- }
- },
- "ssh2": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.6.0.tgz",
- "integrity": "sha512-lxc+uvXqOxyQ99N2M7k5o4pkYDO5GptOTYduWw7hIM41icxvoBcCNHcj+LTKrjkL0vFcAl+qfZekthoSFRJn2Q==",
- "requires": {
- "asn1": "^0.2.4",
- "bcrypt-pbkdf": "^1.0.2",
- "cpu-features": "0.0.2",
- "nan": "^2.15.0"
- },
- "dependencies": {
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- }
- }
- },
- "sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "dependencies": {
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "stack-trace": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
- "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=",
- "dev": true
- },
- "stackframe": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
- "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
- "dev": true
- },
- "standard-as-callback": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
- "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "stop-iteration-iterator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
- "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
- "dev": true,
- "requires": {
- "internal-slot": "^1.0.4"
- }
- },
- "stream-composer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
- "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==",
- "dev": true,
- "requires": {
- "streamx": "^2.13.2"
- }
- },
- "stream-events": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
- "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
- "requires": {
- "stubs": "^3.0.0"
- }
- },
- "stream-shift": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
- "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="
- },
- "stream-transform": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz",
- "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==",
- "requires": {
- "mixme": "^0.5.1"
- }
- },
- "streamifier": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
- "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
- "dev": true
- },
- "streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="
- },
- "streamx": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz",
- "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==",
- "dev": true,
- "requires": {
- "fast-fifo": "^1.1.0",
- "queue-tick": "^1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "string-template": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
- "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw=="
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "string-width-cjs": {
- "version": "npm:string-width@4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "string.prototype.matchall": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
- "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "regexp.prototype.flags": "^1.4.3",
- "side-channel": "^1.0.4"
- }
- },
- "string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
- "requires": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
- }
- },
- "string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
- "requires": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
- "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
- "requires": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-ansi-cjs": {
- "version": "npm:strip-ansi@6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true
- },
- "strip-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz",
- "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.1"
- }
- },
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
- },
- "strnum": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
- "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
- "optional": true
- },
- "stubs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
- "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls="
- },
- "style-loader": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz",
- "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==",
- "dev": true,
- "requires": {}
- },
- "style-mod": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz",
- "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==",
- "dev": true
- },
- "stylehacks": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz",
- "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.21.4",
- "postcss-selector-parser": "^6.0.4"
- }
- },
- "stylelint": {
- "version": "16.4.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.4.0.tgz",
- "integrity": "sha512-uSx7VMuXwLuYcNSIg+0/fFNv0WinsfLAqsVVy7h7p80clKOHiGE8pfY6UjqwylTHiJrRIahTl6a8FPxGezhWoA==",
- "dev": true,
- "peer": true,
- "requires": {
- "@csstools/css-parser-algorithms": "^2.6.1",
- "@csstools/css-tokenizer": "^2.2.4",
- "@csstools/media-query-list-parser": "^2.1.9",
- "@csstools/selector-specificity": "^3.0.3",
- "@dual-bundle/import-meta-resolve": "^4.0.0",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.2",
- "css-tree": "^2.3.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^8.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.3.1",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.30.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^13.2.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.38",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.0.16",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.2",
- "write-file-atomic": "^5.0.1"
- },
- "dependencies": {
- "@csstools/selector-specificity": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz",
- "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==",
- "dev": true,
- "peer": true,
- "requires": {}
- },
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "peer": true
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "peer": true
- },
- "balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true,
- "peer": true
- },
- "cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
- "dev": true,
- "peer": true,
- "requires": {
- "env-paths": "^2.2.1",
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "flat-cache": "^4.0.0"
- }
- },
- "flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "peer": true,
- "requires": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- }
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "peer": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "peer": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true,
- "peer": true
- },
- "signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "peer": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "peer": true
- },
- "strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "peer": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
- "write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
- "dev": true,
- "peer": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- }
- }
- }
- },
- "stylelint-config-recommended": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
- "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
- "dev": true,
- "requires": {}
- },
- "stylelint-config-recommended-scss": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz",
- "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==",
- "dev": true,
- "requires": {
- "postcss-scss": "^4.0.9",
- "stylelint-config-recommended": "^14.0.0",
- "stylelint-scss": "^6.0.0"
- }
- },
- "stylelint-config-standard": {
- "version": "36.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz",
- "integrity": "sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended": "^14.0.0"
- }
- },
- "stylelint-config-standard-scss": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz",
- "integrity": "sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==",
- "dev": true,
- "requires": {
- "stylelint-config-recommended-scss": "^14.0.0",
- "stylelint-config-standard": "^36.0.0"
- }
- },
- "stylelint-scss": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz",
- "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==",
- "dev": true,
- "requires": {
- "known-css-properties": "^0.29.0",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-selector-parser": "^6.0.15",
- "postcss-value-parser": "^4.2.0"
- },
- "dependencies": {
- "known-css-properties": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
- "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
- "dev": true
- }
- }
- },
- "superagent": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
- "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
- "requires": {
- "component-emitter": "^1.2.0",
- "cookiejar": "^2.1.0",
- "debug": "^3.1.0",
- "extend": "^3.0.0",
- "form-data": "^2.3.1",
- "formidable": "^1.2.0",
- "methods": "^1.1.1",
- "mime": "^1.4.1",
- "qs": "^6.5.1",
- "readable-stream": "^2.3.5"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "supports-hyperlinks": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
- "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "peer": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
- },
- "svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
- "dev": true,
- "peer": true
- },
- "svgo": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.4.tgz",
- "integrity": "sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==",
- "dev": true,
- "requires": {
- "@trysound/sax": "0.2.0",
- "commander": "^7.2.0",
- "css-select": "^5.1.0",
- "css-tree": "^2.2.1",
- "css-what": "^6.1.0",
- "csso": "5.0.5",
- "picocolors": "^1.0.0"
- },
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true
- },
- "css-select": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
- "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^6.1.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "nth-check": "^2.0.1"
- }
- },
- "css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "dev": true
- },
- "dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- }
- },
- "domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "dev": true,
- "requires": {
- "domelementtype": "^2.3.0"
- }
- },
- "domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
- "dev": true,
- "requires": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
- }
- },
- "entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true
- }
- }
- },
- "swagger-client": {
- "version": "3.18.4",
- "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.18.4.tgz",
- "integrity": "sha512-Wj26oEctONq/u0uM+eSj18675YM5e2vFnx7Kr4neLeXEHKUsfceVQ/OdtrBXdrT3VbtdBbZfMTfl1JOBpix2MA==",
- "requires": {
- "@babel/runtime-corejs3": "^7.11.2",
- "btoa": "^1.2.1",
- "cookie": "~0.4.1",
- "cross-fetch": "^3.1.5",
- "deepmerge": "~4.2.2",
- "fast-json-patch": "^3.0.0-1",
- "form-data-encoder": "^1.4.3",
- "formdata-node": "^4.0.0",
- "is-plain-object": "^5.0.0",
- "js-yaml": "^4.1.0",
- "lodash": "^4.17.21",
- "qs": "^6.10.2",
- "traverse": "~0.6.6",
- "url": "~0.11.0"
- },
- "dependencies": {
- "cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
- },
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
- },
- "traverse": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
- "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- }
- }
- }
- },
- "swagger-converter": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/swagger-converter/-/swagger-converter-0.1.7.tgz",
- "integrity": "sha1-oJdRnG8e5N1n4wjZtT3cnCslf5c=",
- "requires": {
- "lodash.clonedeep": "^2.4.1"
- }
- },
- "swagger-tools": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/swagger-tools/-/swagger-tools-0.10.4.tgz",
- "integrity": "sha512-VQpijIi8cpB/frUZOZlVpS7U3CrdSAZBfiHu448R1njiNXUnE7heF3Svz3qFBr5SYtaPvaqWpHMbvboirCXVzA==",
- "requires": {
- "async": "^2.5.0",
- "body-parser": "1.20.3",
- "commander": "~2.11.0",
- "debug": "^3.1.0",
- "js-yaml": "^3.3.1",
- "json-refs": "^3.0.2",
- "lodash": "^4.17.4",
- "multer": "1.4.5-lts.1",
- "parseurl": "^1.3.0",
- "path-to-regexp": "3.3.0",
- "qs": "6.13.0",
- "serve-static": "^1.10.0",
- "spark-md5": "^3.0.0",
- "superagent": "^3.5.2",
- "swagger-converter": "^0.1.7",
- "traverse": "^0.6.6",
- "z-schema": "^3.15.4"
- },
- "dependencies": {
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "commander": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
- "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ=="
- },
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "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==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "path-to-regexp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz",
- "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="
- }
- }
- },
- "symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true
- },
- "table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
- "dev": true,
- "requires": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
- }
- },
- "tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true
- },
- "tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
- "requires": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "dependencies": {
- "chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
- },
- "minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
- },
- "tar-fs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
- "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
- "requires": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.0.0"
- }
- },
- "tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "requires": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- }
- },
- "tarn": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
- "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="
- },
- "tdigest": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz",
- "integrity": "sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=",
- "requires": {
- "bintrees": "1.0.1"
- }
- },
- "teeny-request": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz",
- "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==",
- "requires": {
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "node-fetch": "^2.6.1",
- "stream-events": "^1.0.5",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- }
- }
- },
- "teex": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
- "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
- "dev": true,
- "requires": {
- "streamx": "^2.12.5"
- }
- },
- "telejson": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz",
- "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==",
- "dev": true,
- "requires": {
- "memoizerific": "^1.11.3"
- }
- },
- "temp": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
- "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==",
- "requires": {
- "rimraf": "~2.6.2"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "terser": {
- "version": "5.31.3",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz",
- "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==",
- "dev": true,
- "requires": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "dependencies": {
- "acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- }
- }
- },
- "terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.20",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
- },
- "dependencies": {
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- }
- }
- },
- "test-exclude": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
- "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
- "dev": true,
- "requires": {
- "@istanbuljs/schema": "^0.1.2",
- "glob": "^7.1.4",
- "minimatch": "^3.0.4"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "thenby": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz",
- "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==",
- "dev": true
- },
- "thingies": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
- "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
- "dev": true,
- "requires": {}
- },
- "thirty-two": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
- "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno="
- },
- "thread-loader": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-4.0.2.tgz",
- "integrity": "sha512-UOk/KBydsQjh4Ja5kocxDUzhv11KYptHN/h8gdSwo6/MBkYrWqQua6K2qwlpXnCXS9c/uLs8F/JF8rpveF0+fA==",
- "dev": true,
- "requires": {
- "json-parse-better-errors": "^1.0.2",
- "loader-runner": "^4.1.0",
- "neo-async": "^2.6.2",
- "schema-utils": "^4.0.1"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- }
- }
- },
- "thriftrw": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.12.0.tgz",
- "integrity": "sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw==",
- "requires": {
- "bufrw": "^1.3.0",
- "error": "7.0.2",
- "long": "^2.4.0"
- },
- "dependencies": {
- "long": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz",
- "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ=="
- }
- }
- },
- "throng": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/throng/-/throng-4.0.0.tgz",
- "integrity": "sha1-mDxroZk7WOroWZmKpof/6I34TBc=",
- "requires": {
- "lodash.defaults": "^4.0.1"
- }
- },
- "throttleit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
- "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
- "dev": true
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
- "dev": true,
- "requires": {
- "readable-stream": "3"
- }
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
- "dev": true
- },
- "tildify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz",
- "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="
- },
- "timekeeper": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-2.2.0.tgz",
- "integrity": "sha512-W3AmPTJWZkRwu+iSNxPIsLZ2ByADsOLbbLxe46UJyWj3mlYLlwucKiq+/dPm0l9wTzqoF3/2PH0AGFCebjq23A==",
- "dev": true
- },
- "timers-ext": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
- "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
- "dev": true,
- "requires": {
- "es5-ext": "~0.10.46",
- "next-tick": "1"
- }
- },
- "tiny-async-pool": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz",
- "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==",
- "requires": {
- "semver": "^5.5.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
- }
- }
- },
- "tiny-invariant": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
- "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
- "dev": true
- },
- "tiny-lru": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.2.tgz",
- "integrity": "sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg=="
- },
- "tiny-warning": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
- "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
- "dev": true
- },
- "tinycolor2": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
- "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
- "dev": true
- },
- "tinyrainbow": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
- "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
- "dev": true
- },
- "tlds": {
- "version": "1.228.0",
- "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.228.0.tgz",
- "integrity": "sha512-Q0TU9zh5hDs2CpRFNM7SOW3K7OSgUgJC/cMrq9t44ei4tu+G3KV8BZyIJuYVvryJHH96mKgc9WXdhgKVvGD7jg==",
- "dev": true
- },
- "tmatch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz",
- "integrity": "sha512-OHn/lzGWAsh5MBNTXUiHc595HAbIASCs6M+hDrkMObbSzsXej0SCKrQxr4J6EmRHbdo3qwyetPzuzEktkZiy4g==",
- "dev": true
- },
- "tmp": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
- "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "to-string-loader": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.2.0.tgz",
- "integrity": "sha512-KsWUL8FccgBW9FPFm4vYoQbOOcO5m6hKOGYoXjbseD9/4Ft+ravXN5jolQ9kTKYcK4zPt1j+khx97GPGnVoi6A==",
- "dev": true,
- "requires": {
- "loader-utils": "^1.0.0"
- },
- "dependencies": {
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
- },
- "json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
- "dev": true,
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- }
- }
- }
- },
- "to-through": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz",
- "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==",
- "dev": true,
- "requires": {
- "streamx": "^2.12.5"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "token-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz",
- "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ="
- },
- "toposort": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
- "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=",
- "dev": true
- },
- "toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
- },
- "touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "requires": {
- "nopt": "~1.0.10"
- },
- "dependencies": {
- "nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- }
- }
- },
- "tough-cookie": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
- "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
- "requires": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
- "dependencies": {
- "universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
- }
- }
- },
- "tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "traverse": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz",
- "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==",
- "requires": {
- "gopd": "^1.0.1",
- "typedarray.prototype.slice": "^1.0.3",
- "which-typed-array": "^1.1.15"
- }
- },
- "tree-dump": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
- "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
- "dev": true,
- "requires": {}
- },
- "ts-api-utils": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
- "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
- "dev": true,
- "requires": {}
- },
- "ts-dedent": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
- "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
- "dev": true
- },
- "tsconfig-paths": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
- "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
- "dev": true,
- "requires": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.1",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "tslib": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
- "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA=="
- },
- "tsscmp": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
- "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="
- },
- "tty-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
- "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "type": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
- "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
- },
- "type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
- "requires": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
- }
- },
- "typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
- "requires": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- }
- },
- "typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
- "requires": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
- }
- },
- "typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
- "requires": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "typedarray.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
- "requires": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-errors": "^1.3.0",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-offset": "^1.0.2"
- }
- },
- "typescript": {
- "version": "5.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
- "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
- "dev": true
- },
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
- },
- "uc.micro": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
- "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
- "dev": true
- },
- "uglify-js": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz",
- "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg=="
- },
- "uid-safe": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
- "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
- "requires": {
- "random-bytes": "~1.0.0"
- }
- },
- "uid2": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
- "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="
- },
- "ultron": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
- "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow=="
- },
- "umzug": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz",
- "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==",
- "dev": true,
- "requires": {
- "bluebird": "^3.7.2"
- }
- },
- "unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- }
- },
- "uncontrollable": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
- "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==",
- "requires": {
- "@babel/runtime": "^7.6.3",
- "@types/react": ">=16.9.11",
- "invariant": "^2.2.4",
- "react-lifecycles-compat": "^3.0.4"
- }
- },
- "undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "underscore": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
- "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
- },
- "undici-types": {
- "version": "6.19.8",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
- "dev": true
- },
- "uni-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
- "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==",
- "requires": {
- "type": "^2.5.0"
- }
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
- "dev": true
- },
- "unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "dev": true,
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
- "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
- "dev": true
- },
- "unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
- "dev": true
- },
- "unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dev": true,
- "requires": {
- "@types/unist": "^3.0.0"
- }
- },
- "unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dev": true,
- "requires": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dev": true,
- "requires": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- }
- },
- "universal-user-agent": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
- "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
- },
- "universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "unplugin": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz",
- "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==",
- "dev": true,
- "requires": {
- "acorn": "^8.11.3",
- "chokidar": "^3.6.0",
- "webpack-sources": "^3.2.3",
- "webpack-virtual-modules": "^0.6.1"
- },
- "dependencies": {
- "acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true
- },
- "chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- }
- },
- "webpack-virtual-modules": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
- "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
- "dev": true
- }
- }
- },
- "untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true
- },
- "update-browserslist-db": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
- "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
- "dev": true,
- "requires": {
- "escalade": "^3.1.2",
- "picocolors": "^1.0.1"
- }
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "url": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
- "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
- }
- }
- },
- "url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "dev": true,
- "requires": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- }
- },
- "url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "url-template": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
- "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw=="
- },
- "utf-8-validate": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz",
- "integrity": "sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA==",
- "requires": {
- "node-gyp-build": "^4.3.0"
- },
- "dependencies": {
- "node-gyp-build": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
- "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q=="
- }
- }
- },
- "utf8-byte-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
- "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==",
- "dev": true
- },
- "util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "requires": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
- "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "for-each": "^0.3.3",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.1"
- }
- },
- "utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
- "dev": true
- },
- "utils-flatten": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/utils-flatten/-/utils-flatten-1.0.0.tgz",
- "integrity": "sha1-AfMNMZO+RkxAsxdV5nQNDbDO8kM="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "v8-compile-cache": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
- "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
- "dev": true
- },
- "v8-to-istanbul": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
- "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
- "dev": true,
- "requires": {
- "@jridgewell/trace-mapping": "^0.3.12",
- "@types/istanbul-lib-coverage": "^2.0.1",
- "convert-source-map": "^1.6.0"
- }
- },
- "valid-data-url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-2.0.0.tgz",
- "integrity": "sha512-dyCZnv3aCey7yfTgIqdZanKl7xWAEEKCbgmR7SKqyK6QT/Z07ROactrgD1eA37C69ODRj7rNOjzKWVPh0EUjBA=="
- },
- "valid-url": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz",
- "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA="
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "validator": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
- "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw=="
- },
- "value-or-function": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz",
- "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==",
- "dev": true
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- },
- "dependencies": {
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- }
- }
- },
- "vinyl": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz",
- "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==",
- "dev": true,
- "requires": {
- "clone": "^2.1.2",
- "clone-stats": "^1.0.0",
- "remove-trailing-separator": "^1.1.0",
- "replace-ext": "^2.0.0",
- "teex": "^1.0.1"
- }
- },
- "vinyl-contents": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz",
- "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==",
- "dev": true,
- "requires": {
- "bl": "^5.0.0",
- "vinyl": "^3.0.0"
- },
- "dependencies": {
- "bl": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
- "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
- "dev": true,
- "requires": {
- "buffer": "^6.0.3",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true
- }
- }
- },
- "vinyl-fs": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz",
- "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==",
- "dev": true,
- "requires": {
- "fs-mkdirp-stream": "^2.0.1",
- "glob-stream": "^8.0.0",
- "graceful-fs": "^4.2.11",
- "iconv-lite": "^0.6.3",
- "is-valid-glob": "^1.0.0",
- "lead": "^4.0.0",
- "normalize-path": "3.0.0",
- "resolve-options": "^2.0.0",
- "stream-composer": "^1.0.2",
- "streamx": "^2.14.0",
- "to-through": "^3.0.0",
- "value-or-function": "^4.0.0",
- "vinyl": "^3.0.0",
- "vinyl-sourcemap": "^2.0.0"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- }
- }
- },
- "vinyl-sourcemap": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz",
- "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==",
- "dev": true,
- "requires": {
- "convert-source-map": "^2.0.0",
- "graceful-fs": "^4.2.10",
- "now-and-later": "^3.0.0",
- "streamx": "^2.12.5",
- "vinyl": "^3.0.0",
- "vinyl-contents": "^2.0.0"
- },
- "dependencies": {
- "convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- }
- }
- },
- "void-elements": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="
- },
- "w3c-hr-time": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
- "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
- "dev": true,
- "requires": {
- "browser-process-hrtime": "^1.0.0"
- }
- },
- "w3c-keyname": {
- "version": "2.2.8",
- "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
- "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
- },
- "w3c-xmlserializer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
- "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
- "dev": true,
- "requires": {
- "xml-name-validator": "^4.0.0"
- }
- },
- "walkdir": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
- "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
- },
- "warning": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
- "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "watchpack": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz",
- "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==",
- "dev": true,
- "requires": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dev": true,
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "web-streams-polyfill": {
- "version": "4.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz",
- "integrity": "sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ=="
- },
- "webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
- },
- "webpack": {
- "version": "5.93.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
- "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
- "dev": true,
- "requires": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.5",
- "@webassemblyjs/ast": "^1.12.1",
- "@webassemblyjs/wasm-edit": "^1.12.1",
- "@webassemblyjs/wasm-parser": "^1.12.1",
- "acorn": "^8.7.1",
- "acorn-import-attributes": "^1.9.5",
- "browserslist": "^4.21.10",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.11",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.10",
- "watchpack": "^2.4.1",
- "webpack-sources": "^3.2.3"
- },
- "dependencies": {
- "acorn": {
- "version": "8.12.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
- "dev": true
- },
- "acorn-import-attributes": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
- "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
- "dev": true,
- "requires": {}
- },
- "events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true
- }
- }
- },
- "webpack-assets-manifest": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-5.2.1.tgz",
- "integrity": "sha512-MsEcXVio1GY6R+b4dVfTHIDMB0RB90KajQG8neRbH92vE2S1ClGw9mNa9NPlratYBvZOhExmN0qqMNFTaCTuIg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.2",
- "deepmerge": "^4.3.1",
- "lockfile": "^1.0.4",
- "lodash.get": "^4.4.2",
- "lodash.has": "^4.5.2",
- "schema-utils": "^3.3.0",
- "tapable": "^2.2.1"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "webpack-cli": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
- "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
- "dev": true,
- "requires": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^2.1.1",
- "@webpack-cli/info": "^2.0.2",
- "@webpack-cli/serve": "^2.0.5",
- "colorette": "^2.0.14",
- "commander": "^10.0.1",
- "cross-spawn": "^7.0.3",
- "envinfo": "^7.7.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^3.1.1",
- "rechoir": "^0.8.0",
- "webpack-merge": "^5.7.3"
- },
- "dependencies": {
- "commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "dev": true
- },
- "interpret": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
- "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
- "dev": true
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
- "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- }
- }
- }
- },
- "webpack-dev-server": {
- "version": "4.15.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
- "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.4",
- "ws": "^8.13.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "ipaddr.js": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
- "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
- }
- },
- "webpack-hot-middleware": {
- "version": "2.25.3",
- "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.3.tgz",
- "integrity": "sha512-IK/0WAHs7MTu1tzLTjio73LjS3Ov+VvBKQmE8WPlJutgG5zT6Urgq/BbAdRrHTRpyzK0dvAvFh1Qg98akxgZpA==",
- "dev": true,
- "requires": {
- "ansi-html-community": "0.0.8",
- "html-entities": "^2.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "webpack-manifest-plugin": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-5.0.0.tgz",
- "integrity": "sha512-8RQfMAdc5Uw3QbCQ/CBV/AXqOR8mt03B6GJmRbhWopE8GzRfEpn+k0ZuWywxW+5QZsffhmFDY1J6ohqJo+eMuw==",
- "dev": true,
- "requires": {
- "tapable": "^2.0.0",
- "webpack-sources": "^2.2.0"
- },
- "dependencies": {
- "webpack-sources": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
- "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
- "dev": true,
- "requires": {
- "source-list-map": "^2.0.1",
- "source-map": "^0.6.1"
- }
- }
- }
- },
- "webpack-merge": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
- "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
- "dev": true,
- "requires": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.0"
- },
- "dependencies": {
- "wildcard": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
- "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
- "dev": true
- }
- }
- },
- "webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true
- },
- "websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true
- },
- "whatwg-encoding": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
- "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
- "dev": true,
- "requires": {
- "iconv-lite": "0.6.3"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- }
- }
- },
- "whatwg-mimetype": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
- "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
- "dev": true
- },
- "whatwg-url": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
- "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "dev": true,
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- },
- "dependencies": {
- "webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
- }
- }
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "requires": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- }
- },
- "which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dev": true,
- "requires": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- }
- },
- "which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
- "dev": true,
- "requires": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
- },
- "which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
- "requires": {
- "available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.2"
- }
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "requires": {
- "string-width": "^1.0.2 || 2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "wildcard": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz",
- "integrity": "sha1-pwIEUwhNjNLv5wup02liY94XEKU=",
- "dev": true
- },
- "with": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz",
- "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==",
- "requires": {
- "@babel/parser": "^7.9.6",
- "@babel/types": "^7.9.6",
- "assert-never": "^1.2.1",
- "babel-walk": "3.0.0-canary-5"
- }
- },
- "wkx": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
- "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- },
- "workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw=="
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
- "color-convert": "^2.0.1"
- }
- }
- }
- },
- "wrap-ansi-cjs": {
- "version": "npm:wrap-ansi@7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "ws": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
- "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
- "dev": true,
- "requires": {}
- },
- "x-xss-protection": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz",
- "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg=="
- },
- "xml-crypto": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-2.1.3.tgz",
- "integrity": "sha512-MpXZwnn9JK0mNPZ5mnFIbNnQa+8lMGK4NtnX2FlJMfMWR60sJdFO9X72yO6ji068pxixzk53O7x0/iSKh6IhyQ==",
- "requires": {
- "@xmldom/xmldom": "^0.7.0",
- "xpath": "0.0.32"
- },
- "dependencies": {
- "xpath": {
- "version": "0.0.32",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
- "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
- }
- }
- },
- "xml-encryption": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-2.0.0.tgz",
- "integrity": "sha512-4Av83DdvAgUQQMfi/w8G01aJshbEZP9ewjmZMpS9t3H+OCZBDvyK4GJPnHGfWiXlArnPbYvR58JB9qF2x9Ds+Q==",
- "requires": {
- "@xmldom/xmldom": "^0.7.0",
- "escape-html": "^1.0.3",
- "xpath": "0.0.32"
- },
- "dependencies": {
- "xpath": {
- "version": "0.0.32",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz",
- "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
- }
- }
- },
- "xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
- "dev": true
- },
- "xml2js": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
- "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- },
- "dependencies": {
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
- }
- }
- },
- "xmlbuilder": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
- "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="
- },
- "xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true
- },
- "xmlcreate": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
- "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
- },
- "xmlhttprequest": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
- "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA=="
- },
- "xorshift": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz",
- "integrity": "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g=="
- },
- "xpath": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.5.tgz",
- "integrity": "sha1-RUA29u8PPfWvXUukoRn7dWdLPmw="
- },
- "xregexp": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz",
- "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==",
- "requires": {
- "@babel/runtime-corejs3": "^7.12.1"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- },
- "yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true
- },
- "yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "requires": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "dependencies": {
- "cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- }
- },
- "yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="
- }
- }
- },
- "yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true
- },
- "yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "requires": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "dependencies": {
- "decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- }
- }
- },
- "yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
- "requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
- },
- "yup": {
- "version": "0.32.11",
- "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz",
- "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.15.4",
- "@types/lodash": "^4.14.175",
- "lodash": "^4.17.21",
- "lodash-es": "^4.17.21",
- "nanoclone": "^0.2.1",
- "property-expr": "^2.0.4",
- "toposort": "^2.0.2"
- }
- },
- "z-schema": {
- "version": "3.25.1",
- "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz",
- "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==",
- "requires": {
- "commander": "^2.7.1",
- "core-js": "^2.5.7",
- "lodash.get": "^4.0.0",
- "lodash.isequal": "^4.0.0",
- "validator": "^10.0.0"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "optional": true
- },
- "core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
- },
- "validator": {
- "version": "10.11.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
- "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw=="
- }
- }
- },
- "zip-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
- "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
- "requires": {
- "archiver-utils": "^2.1.0",
- "compress-commons": "^4.1.0",
- "readable-stream": "^3.6.0"
- }
- },
- "zlib": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz",
- "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w=="
- },
- "zone.js": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz",
- "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==",
- "dev": true,
- "requires": {
- "tslib": "^2.0.0"
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
}
}
diff --git a/package.json b/package.json
index ac49094af7..44fffc4664 100644
--- a/package.json
+++ b/package.json
@@ -5,9 +5,11 @@
"patch-package": "^8.0.0"
},
"devDependencies": {
+ "@types/chai": "^4.3.0",
+ "@types/chai-as-promised": "^7.1.8",
"@types/mocha": "^10.0.6",
- "@typescript-eslint/eslint-plugin": "^8.0.0",
- "@typescript-eslint/parser": "^8.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.30.1",
+ "@typescript-eslint/parser": "^8.30.1",
"eslint": "^8.15.0",
"eslint-config-prettier": "^8.5.0",
"eslint-config-standard": "^17.0.0",
@@ -16,24 +18,24 @@
"eslint-plugin-cypress": "^2.15.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-mocha": "^10.1.0",
- "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-n": "^15.7.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^6.0.0",
- "prettier": "3.3.3",
- "typescript": "^5.5.4"
+ "eslint-plugin-unicorn": "^56.0.0",
+ "prettier": "3.6.2",
+ "typescript": "^5.8.3"
+ },
+ "engines": {
+ "npm": "11.4.2"
},
"overrides": {
- "fetch-mock": {
- "path-to-regexp": "3.3.0"
- },
- "google-gax": {
- "protobufjs": "^7.2.5"
- },
- "swagger-tools": {
- "body-parser": "1.20.3",
- "multer": "1.4.5-lts.1",
+ "swagger-tools@0.10.4": {
"path-to-regexp": "3.3.0",
- "qs": "6.13.0"
+ "body-parser": "1.20.3",
+ "multer": "2.0.1"
+ },
+ "request@2.88.2": {
+ "tough-cookie": "5.1.2"
}
},
"scripts": {
@@ -49,6 +51,7 @@
"services/analytics",
"services/chat",
"services/clsi",
+ "services/clsi-cache",
"services/clsi-perf",
"services/contacts",
"services/docstore",
@@ -63,11 +66,11 @@
"services/project-history",
"services/real-time",
"services/references",
- "services/spelling",
"services/templates",
"services/third-party-datastore",
"services/third-party-references",
"services/tpdsworker",
- "services/web"
+ "services/web",
+ "tools/saas-e2e"
]
}
diff --git a/patches/@node-saml+node-saml+4.0.5.patch b/patches/@node-saml+node-saml+4.0.5.patch
new file mode 100644
index 0000000000..81fd700b31
--- /dev/null
+++ b/patches/@node-saml+node-saml+4.0.5.patch
@@ -0,0 +1,23 @@
+diff --git a/node_modules/@node-saml/node-saml/lib/saml.js b/node_modules/@node-saml/node-saml/lib/saml.js
+index fba15b9..a5778cb 100644
+--- a/node_modules/@node-saml/node-saml/lib/saml.js
++++ b/node_modules/@node-saml/node-saml/lib/saml.js
+@@ -336,7 +336,8 @@ class SAML {
+ const requestOrResponse = request || response;
+ (0, utility_1.assertRequired)(requestOrResponse, "either request or response is required");
+ let buffer;
+- if (this.options.skipRequestCompression) {
++ // logout requestOrResponse must be compressed anyway
++ if (this.options.skipRequestCompression && operation !== "logout") {
+ buffer = Buffer.from(requestOrResponse, "utf8");
+ }
+ else {
+@@ -495,7 +496,7 @@ class SAML {
+ try {
+ xml = Buffer.from(container.SAMLResponse, "base64").toString("utf8");
+ doc = await (0, xml_1.parseDomFromString)(xml);
+- const inResponseToNodes = xml_1.xpath.selectAttributes(doc, "/*[local-name()='Response']/@InResponseTo");
++ const inResponseToNodes = xml_1.xpath.selectAttributes(doc, "/*[local-name()='Response' or local-name()='LogoutResponse']/@InResponseTo");
+ if (inResponseToNodes) {
+ inResponseTo = inResponseToNodes.length ? inResponseToNodes[0].nodeValue : null;
+ await this.validateInResponseTo(inResponseTo);
diff --git a/patches/ldapauth-fork+4.3.3.patch b/patches/ldapauth-fork+4.3.3.patch
new file mode 100644
index 0000000000..4d31210c9d
--- /dev/null
+++ b/patches/ldapauth-fork+4.3.3.patch
@@ -0,0 +1,64 @@
+diff --git a/node_modules/ldapauth-fork/lib/ldapauth.js b/node_modules/ldapauth-fork/lib/ldapauth.js
+index 85ecf36a8b..a7d07e0f78 100644
+--- a/node_modules/ldapauth-fork/lib/ldapauth.js
++++ b/node_modules/ldapauth-fork/lib/ldapauth.js
+@@ -69,6 +69,7 @@ function LdapAuth(opts) {
+ this.opts.bindProperty || (this.opts.bindProperty = 'dn');
+ this.opts.groupSearchScope || (this.opts.groupSearchScope = 'sub');
+ this.opts.groupDnProperty || (this.opts.groupDnProperty = 'dn');
++ this.opts.tlsStarted = false;
+
+ EventEmitter.call(this);
+
+@@ -108,21 +109,7 @@ function LdapAuth(opts) {
+ this._userClient.on('error', this._handleError.bind(this));
+
+ var self = this;
+- if (this.opts.starttls) {
+- // When starttls is enabled, this callback supplants the 'connect' callback
+- this._adminClient.starttls(this.opts.tlsOptions, this._adminClient.controls, function(err) {
+- if (err) {
+- self._handleError(err);
+- } else {
+- self._onConnectAdmin();
+- }
+- });
+- this._userClient.starttls(this.opts.tlsOptions, this._userClient.controls, function(err) {
+- if (err) {
+- self._handleError(err);
+- }
+- });
+- } else if (opts.reconnect) {
++ if (opts.reconnect && !this.opts.starttls) {
+ this.once('_installReconnectListener', function() {
+ self.log && self.log.trace('install reconnect listener');
+ self._adminClient.on('connect', function() {
+@@ -384,6 +371,28 @@ LdapAuth.prototype._findGroups = function(user, callback) {
+ */
+ LdapAuth.prototype.authenticate = function(username, password, callback) {
+ var self = this;
++ if (this.opts.starttls && !this.opts.tlsStarted) {
++ // When starttls is enabled, this callback supplants the 'connect' callback
++ this._adminClient.starttls(this.opts.tlsOptions, this._adminClient.controls, function (err) {
++ if (err) {
++ self._handleError(err);
++ } else {
++ self._onConnectAdmin(function(){self._handleAuthenticate(username, password, callback);});
++ }
++ });
++ this._userClient.starttls(this.opts.tlsOptions, this._userClient.controls, function (err) {
++ if (err) {
++ self._handleError(err);
++ }
++ });
++ } else {
++ self._handleAuthenticate(username, password, callback);
++ }
++};
++
++LdapAuth.prototype._handleAuthenticate = function (username, password, callback) {
++ this.opts.tlsStarted = true;
++ var self = this;
+
+ if (typeof password === 'undefined' || password === null || password === '') {
+ return callback(new Error('no password given'));
diff --git a/patches/pdfjs-dist+5.1.91.patch b/patches/pdfjs-dist+5.1.91.patch
new file mode 100644
index 0000000000..24f6e2adc9
--- /dev/null
+++ b/patches/pdfjs-dist+5.1.91.patch
@@ -0,0 +1,22 @@
+diff --git a/node_modules/pdfjs-dist/build/pdf.worker.mjs b/node_modules/pdfjs-dist/build/pdf.worker.mjs
+index 6c5c6f1..bb6b7d1 100644
+--- a/node_modules/pdfjs-dist/build/pdf.worker.mjs
++++ b/node_modules/pdfjs-dist/build/pdf.worker.mjs
+@@ -1830,7 +1830,7 @@ async function __wbg_init(module_or_path) {
+ }
+ }
+ if (typeof module_or_path === 'undefined') {
+- module_or_path = new URL('qcms_bg.wasm', import.meta.url);
++ module_or_path = new URL(/* webpackIgnore: true */ 'qcms_bg.wasm', import.meta.url);
+ }
+ const imports = __wbg_get_imports();
+ if (typeof module_or_path === 'string' || typeof Request === 'function' && module_or_path instanceof Request || typeof URL === 'function' && module_or_path instanceof URL) {
+@@ -5358,7 +5358,7 @@ var OpenJPEG = (() => {
+ if (Module["locateFile"]) {
+ return locateFile("openjpeg.wasm");
+ }
+- return new URL("openjpeg.wasm", import.meta.url).href;
++ return new URL(/* webpackIgnore: true */ "openjpeg.wasm", import.meta.url).href;
+ }
+ function getBinarySync(file) {
+ if (file == wasmBinaryFile && wasmBinary) {
diff --git a/server-ce/.dockerignore b/server-ce/.dockerignore
index 960cfd1df8..81a97331cc 100644
--- a/server-ce/.dockerignore
+++ b/server-ce/.dockerignore
@@ -1,6 +1,7 @@
.DS_Store
.git/
services/git-bridge
+server-ce/server-ce
server-ce/test
# omit scripts with extra dependencies
diff --git a/server-ce/.eslintrc b/server-ce/.eslintrc
index 3a2bb3247c..fc58ef3e98 100644
--- a/server-ce/.eslintrc
+++ b/server-ce/.eslintrc
@@ -4,6 +4,9 @@
"standard",
"prettier"
],
+ "plugins": [
+ "unicorn"
+ ],
"parserOptions": {
"ecmaVersion": 2020
},
@@ -12,7 +15,8 @@
},
"rules": {
// Do not allow importing of implicit dependencies.
- "import/no-extraneous-dependencies": "error"
+ "import/no-extraneous-dependencies": "error",
+ "unicorn/prefer-node-protocol": "error"
},
"overrides": [
// Extra rules for Cypress tests
diff --git a/server-ce/Dockerfile b/server-ce/Dockerfile
index 0c33505550..5f32eb67cb 100644
--- a/server-ce/Dockerfile
+++ b/server-ce/Dockerfile
@@ -115,9 +115,3 @@ ENV LOG_LEVEL="info"
EXPOSE 80
ENTRYPOINT ["/sbin/my_init"]
-
-# Store the revision
-# ------------------
-# This should be the last step to optimize docker image caching.
-ARG MONOREPO_REVISION
-RUN echo "monorepo-server-ce,$MONOREPO_REVISION" > /var/www/revisions.txt
diff --git a/server-ce/Dockerfile-base b/server-ce/Dockerfile-base
index f20634e02e..e130d7a414 100644
--- a/server-ce/Dockerfile-base
+++ b/server-ce/Dockerfile-base
@@ -2,7 +2,7 @@
# Overleaf Base Image (sharelatex/sharelatex-base)
# --------------------------------------------------
-FROM phusion/baseimage:jammy-1.0.4
+FROM phusion/baseimage:noble-1.0.2
# Makes sure LuaTex cache is writable
# -----------------------------------
@@ -10,7 +10,7 @@ ENV TEXMFVAR=/var/lib/overleaf/tmp/texmf-var
# Update to ensure dependencies are updated
# ------------------------------------------
-ENV REBUILT_AFTER="2024-15-10"
+ENV REBUILT_AFTER="2025-05-19"
# Install dependencies
# --------------------
@@ -25,13 +25,12 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
unattended-upgrades \
build-essential wget net-tools unzip time imagemagick optipng strace nginx git python3 python-is-python3 zlib1g-dev libpcre3-dev gettext-base libwww-perl ca-certificates curl gnupg \
qpdf \
- aspell aspell-en aspell-af aspell-am aspell-ar aspell-ar-large aspell-bg aspell-bn aspell-br aspell-ca aspell-cs aspell-cy aspell-da aspell-de aspell-de-1901 aspell-el aspell-eo aspell-es aspell-et aspell-eu-es aspell-fa aspell-fo aspell-fr aspell-ga aspell-gl-minimos aspell-gu aspell-he aspell-hi aspell-hr aspell-hsb aspell-hu aspell-hy aspell-id aspell-is aspell-it aspell-kk aspell-kn aspell-ku aspell-lt aspell-lv aspell-ml aspell-mr aspell-nl aspell-no aspell-nr aspell-ns aspell-pa aspell-pl aspell-pt aspell-pt-br aspell-ro aspell-ru aspell-sk aspell-sl aspell-ss aspell-st aspell-sv aspell-tl aspell-tn aspell-ts aspell-uk aspell-uz aspell-xh aspell-zu \
# upgrade base-image, batch all the upgrades together, rather than installing them on-by-one (which is slow!)
&& unattended-upgrade --verbose --no-minimal-upgrade-steps \
# install Node.js https://github.com/nodesource/distributions#nodejs
&& 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_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
+&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
&& apt-get update \
&& apt-get install -y nodejs \
\
diff --git a/server-ce/Makefile b/server-ce/Makefile
index 6a70a8e027..8e2fe7d14f 100644
--- a/server-ce/Makefile
+++ b/server-ce/Makefile
@@ -1,6 +1,7 @@
# Makefile
MONOREPO_ROOT := ../
+HERE=$(shell pwd)
export MONOREPO_REVISION := $(shell git rev-parse HEAD)
export BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD)
export OVERLEAF_BASE_BRANCH ?= sharelatex/sharelatex-base:$(BRANCH_NAME)
@@ -23,6 +24,7 @@ build-base:
--cache-from $(OVERLEAF_BASE_BRANCH) \
--tag $(OVERLEAF_BASE_TAG) \
--tag $(OVERLEAF_BASE_BRANCH) \
+ --network=host \
$(MONOREPO_ROOT)
@@ -32,13 +34,34 @@ build-community:
--build-arg BUILDKIT_INLINE_CACHE=1 \
--progress=plain \
--build-arg OVERLEAF_BASE_TAG \
- --build-arg MONOREPO_REVISION \
+ --label "com.overleaf.ce.revision=$(MONOREPO_REVISION)" \
--cache-from $(OVERLEAF_LATEST) \
--cache-from $(OVERLEAF_BRANCH) \
--file Dockerfile \
--tag $(OVERLEAF_TAG) \
--tag $(OVERLEAF_BRANCH) \
+ --network=host \
$(MONOREPO_ROOT)
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources \
+ --exclude=SC1091
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
-.PHONY: all build-base build-community
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
+
+.PHONY: all \
+ build-base build-community \
+ shellcheck shellcheck_fix
diff --git a/server-ce/bin/grunt b/server-ce/bin/grunt
index 8b3e65730e..462c68df4d 100755
--- a/server-ce/bin/grunt
+++ b/server-ce/bin/grunt
@@ -11,22 +11,22 @@ cd /overleaf/services/web
case "$TASK" in
user:create-admin)
echo "The grunt command is deprecated, run the create-user script using node instead"
- node modules/server-ce-scripts/scripts/create-user --admin "$@"
+ node modules/server-ce-scripts/scripts/create-user.mjs --admin "$@"
;;
user:delete)
echo "The grunt command is deprecated, run the delete-user script using node instead"
- node modules/server-ce-scripts/scripts/delete-user "$@"
+ node modules/server-ce-scripts/scripts/delete-user.mjs "$@"
;;
check:mongo)
echo "The grunt command is deprecated, run the check-mongodb script using node instead"
- node modules/server-ce-scripts/scripts/check-mongodb
+ node modules/server-ce-scripts/scripts/check-mongodb.mjs
;;
check:redis)
echo "The grunt command is deprecated, run the check-redis script using node instead"
- node modules/server-ce-scripts/scripts/check-redis
+ node modules/server-ce-scripts/scripts/check-redis.mjs
;;
*)
diff --git a/server-ce/bin/shared b/server-ce/bin/shared
new file mode 120000
index 0000000000..418b1bc599
--- /dev/null
+++ b/server-ce/bin/shared
@@ -0,0 +1 @@
+../../bin/shared/
\ No newline at end of file
diff --git a/server-ce/config/crontab-history b/server-ce/config/crontab-history
index cfa12f9fc8..ac6dcc1c7b 100644
--- a/server-ce/config/crontab-history
+++ b/server-ce/config/crontab-history
@@ -1,3 +1,4 @@
*/20 * * * * root /overleaf/cron/project-history-periodic-flush.sh >> /var/log/overleaf/cron-project-history-periodic-flush.log 2>&1
30 * * * * root /overleaf/cron/project-history-retry-soft.sh >> /var/log/overleaf/project-history-retry-soft.log 2>&1
45 * * * * root /overleaf/cron/project-history-retry-hard.sh >> /var/log/overleaf/project-history-retry-hard.log 2>&1
+0 3 * * * root /overleaf/cron/project-history-flush-all.sh >> /var/log/overleaf/project-history-flush-all.log 2>&1
diff --git a/server-ce/config/custom-environment-variables.json b/server-ce/config/custom-environment-variables.json
index f666065b4c..f65f74ae2b 100644
--- a/server-ce/config/custom-environment-variables.json
+++ b/server-ce/config/custom-environment-variables.json
@@ -1,5 +1,6 @@
{
"databaseUrl": "HISTORY_CONNECTION_STRING",
+ "databaseUrlReadOnly": "HISTORY_FOLLOWER_CONNECTION_STRING",
"herokuDatabaseUrl": "DATABASE_URL",
"databasePoolMin": "DATABASE_POOL_MIN",
"databasePoolMax": "DATABASE_POOL_MAX",
@@ -44,5 +45,17 @@
"clusterWorkers": "CLUSTER_WORKERS",
"maxFileUploadSize": "MAX_FILE_UPLOAD_SIZE",
"httpsOnly": "HTTPS_ONLY",
- "httpRequestTimeout": "OVERLEAF_HISTORY_V1_HTTP_REQUEST_TIMEOUT"
+ "httpRequestTimeout": "OVERLEAF_HISTORY_V1_HTTP_REQUEST_TIMEOUT",
+ "redis": {
+ "history": {
+ "host": "OVERLEAF_REDIS_HOST",
+ "password": "OVERLEAF_REDIS_PASS",
+ "port": "OVERLEAF_REDIS_PORT"
+ },
+ "lock": {
+ "host": "OVERLEAF_REDIS_HOST",
+ "password": "OVERLEAF_REDIS_PASS",
+ "port": "OVERLEAF_REDIS_PORT"
+ }
+ }
}
diff --git a/server-ce/config/env.sh b/server-ce/config/env.sh
index 2dee36a151..81cebe4caa 100644
--- a/server-ce/config/env.sh
+++ b/server-ce/config/env.sh
@@ -9,6 +9,6 @@ export HISTORY_V1_HOST=127.0.0.1
export NOTIFICATIONS_HOST=127.0.0.1
export PROJECT_HISTORY_HOST=127.0.0.1
export REALTIME_HOST=127.0.0.1
-export SPELLING_HOST=127.0.0.1
+export REFERENCES_HOST=127.0.0.1
export WEB_HOST=127.0.0.1
export WEB_API_HOST=127.0.0.1
diff --git a/server-ce/config/settings.js b/server-ce/config/settings.js
index 36224f0750..47d34fd870 100644
--- a/server-ce/config/settings.js
+++ b/server-ce/config/settings.js
@@ -79,6 +79,7 @@ const settings = {
host: process.env.OVERLEAF_REDIS_HOST || 'dockerhost',
port: process.env.OVERLEAF_REDIS_PORT || '6379',
password: process.env.OVERLEAF_REDIS_PASS || undefined,
+ tls: process.env.OVERLEAF_REDIS_TLS === 'true' ? {} : undefined,
key_schema: {
// document-updater
blockingKey({ doc_id }) {
@@ -139,6 +140,7 @@ const settings = {
api: redisConfig,
pubsub: redisConfig,
project_history: redisConfig,
+ references: redisConfig,
project_history_migration: {
host: redisConfig.host,
@@ -182,7 +184,10 @@ const settings = {
siteUrl: (siteUrl = process.env.OVERLEAF_SITE_URL || 'http://localhost'),
// Status page URL as displayed on the maintenance/500 pages.
- statusPageUrl: process.env.OVERLEAF_STATUS_PAGE_URL,
+ statusPageUrl: process.env.OVERLEAF_STATUS_PAGE_URL ?
+ // Add https:// protocol prefix if not set (Allow plain-text http:// for Server Pro/CE).
+ (process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('http://') || process.env.OVERLEAF_STATUS_PAGE_URL.startsWith('https://')) ? process.env.OVERLEAF_STATUS_PAGE_URL : `https://${process.env.OVERLEAF_STATUS_PAGE_URL}`
+ : undefined,
// The name this is used to describe your Overleaf Community Edition Installation
appName: process.env.OVERLEAF_APP_NAME || 'Overleaf Community Edition',
@@ -212,6 +217,11 @@ const settings = {
enabled: process.env.OVERLEAF_CSP_ENABLED !== 'false',
},
+ rateLimit: {
+ subnetRateLimiterDisabled:
+ process.env.SUBNET_RATE_LIMITER_DISABLED !== 'false',
+ },
+
// These credentials are used for authenticating api requests
// between services that may need to go over public channels
httpAuthUsers,
@@ -326,6 +336,14 @@ if (process.env.OVERLEAF_HEADER_EXTRAS != null) {
}
}
+if (process.env.OVERLEAF_LOGIN_SUPPORT_TEXT != null) {
+ settings.nav.login_support_text = process.env.OVERLEAF_LOGIN_SUPPORT_TEXT
+}
+
+if (process.env.OVERLEAF_LOGIN_SUPPORT_TITLE != null) {
+ settings.nav.login_support_title = process.env.OVERLEAF_LOGIN_SUPPORT_TITLE
+}
+
// Sending Email
// -------------
//
diff --git a/server-ce/cron/deactivate-projects.sh b/server-ce/cron/deactivate-projects.sh
index fab0fbfbf6..a391f99a5b 100755
--- a/server-ce/cron/deactivate-projects.sh
+++ b/server-ce/cron/deactivate-projects.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "-------------------------"
echo "Deactivating old projects"
diff --git a/server-ce/cron/delete-projects.sh b/server-ce/cron/delete-projects.sh
index e1ea5ac5e6..7cd4577171 100755
--- a/server-ce/cron/delete-projects.sh
+++ b/server-ce/cron/delete-projects.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "-------------------------"
echo "Expiring deleted projects"
diff --git a/server-ce/cron/delete-users.sh b/server-ce/cron/delete-users.sh
index fe97bffeea..30872ac556 100755
--- a/server-ce/cron/delete-users.sh
+++ b/server-ce/cron/delete-users.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "----------------------"
echo "Expiring deleted users"
diff --git a/server-ce/cron/project-history-flush-all.sh b/server-ce/cron/project-history-flush-all.sh
new file mode 100755
index 0000000000..8fe9eea5fc
--- /dev/null
+++ b/server-ce/cron/project-history-flush-all.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+set -eu
+
+echo "---------------------------------"
+echo "Flush all project-history changes"
+echo "---------------------------------"
+date
+
+source /etc/container_environment.sh
+source /etc/overleaf/env.sh
+cd /overleaf/services/project-history && node scripts/flush_all.js
+
+echo "Done flushing all project-history changes"
diff --git a/server-ce/cron/project-history-periodic-flush.sh b/server-ce/cron/project-history-periodic-flush.sh
index 76feae410e..1b8efff6cc 100755
--- a/server-ce/cron/project-history-periodic-flush.sh
+++ b/server-ce/cron/project-history-periodic-flush.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "--------------------------"
echo "Flush project-history queue"
diff --git a/server-ce/cron/project-history-retry-hard.sh b/server-ce/cron/project-history-retry-hard.sh
index 651a6615f2..df9b4703a5 100755
--- a/server-ce/cron/project-history-retry-hard.sh
+++ b/server-ce/cron/project-history-retry-hard.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "-----------------------------------"
echo "Retry project-history errors (hard)"
diff --git a/server-ce/cron/project-history-retry-soft.sh b/server-ce/cron/project-history-retry-soft.sh
index 70c597021b..cbb6e714ca 100755
--- a/server-ce/cron/project-history-retry-soft.sh
+++ b/server-ce/cron/project-history-retry-soft.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-set -eux
+set -eu
echo "-----------------------------------"
echo "Retry project-history errors (soft)"
diff --git a/server-ce/genScript.js b/server-ce/genScript.js
index 81fa0e176c..c433f3a60a 100644
--- a/server-ce/genScript.js
+++ b/server-ce/genScript.js
@@ -12,6 +12,10 @@ switch (process.argv.pop()) {
console.log('pushd', `services/${service.name}`)
switch (service.name) {
case 'web':
+ // precompile pug in background
+ console.log('npm run precompile-pug &')
+ console.log('pug_precompile=$!')
+
// Avoid downloading of cypress
console.log('export CYPRESS_INSTALL_BINARY=0')
@@ -21,8 +25,9 @@ switch (process.argv.pop()) {
console.log('npm run webpack:production')
// uninstall webpack and frontend dependencies
console.log('npm install --omit=dev')
- // precompile pug
- console.log('npm run precompile-pug')
+
+ // Wait for pug precompile to finish
+ console.log('wait "$pug_precompile"')
break
default:
console.log(`echo ${service.name} does not require a compilation`)
diff --git a/server-ce/hotfix/4.2.9/Dockerfile b/server-ce/hotfix/4.2.9/Dockerfile
new file mode 100644
index 0000000000..43ca479826
--- /dev/null
+++ b/server-ce/hotfix/4.2.9/Dockerfile
@@ -0,0 +1 @@
+FROM sharelatex/sharelatex:4.2.8
diff --git a/server-ce/hotfix/5.2.1/Dockerfile b/server-ce/hotfix/5.2.1/Dockerfile
new file mode 100644
index 0000000000..63cc952d0d
--- /dev/null
+++ b/server-ce/hotfix/5.2.1/Dockerfile
@@ -0,0 +1,5 @@
+FROM sharelatex/sharelatex:5.2.0
+
+# Subnet rate limiter fix
+COPY pr_21327.patch /
+RUN cd / && patch -p0 < pr_21327.patch && rm pr_21327.patch
diff --git a/server-ce/hotfix/5.2.1/pr_21327.patch b/server-ce/hotfix/5.2.1/pr_21327.patch
new file mode 100644
index 0000000000..f2e49df985
--- /dev/null
+++ b/server-ce/hotfix/5.2.1/pr_21327.patch
@@ -0,0 +1,36 @@
+--- overleaf/services/web/app/src/infrastructure/RateLimiter.js
++++ overleaf/services/web/app/src/infrastructure/RateLimiter.js
+@@ -39,7 +39,7 @@ class RateLimiter {
+ keyPrefix: `rate-limit:${name}`,
+ storeClient: rclient,
+ })
+- if (opts.subnetPoints) {
++ if (opts.subnetPoints && !Settings.rateLimit?.subnetRateLimiterDisabled) {
+ this._subnetRateLimiter = new RateLimiterFlexible.RateLimiterRedis({
+ ...opts,
+ points: opts.subnetPoints,
+--- overleaf/services/web/config/settings.defaults.js
++++ overleaf/services/web/config/settings.defaults.js
+@@ -777,6 +777,8 @@ module.exports = {
+ reloadModuleViewsOnEachRequest: process.env.NODE_ENV === 'development',
+
+ rateLimit: {
++ subnetRateLimiterDisabled:
++ process.env.SUBNET_RATE_LIMITER_DISABLED === 'true',
+ autoCompile: {
+ everyone: process.env.RATE_LIMIT_AUTO_COMPILE_EVERYONE || 100,
+ standard: process.env.RATE_LIMIT_AUTO_COMPILE_STANDARD || 25,
+--- etc/overleaf/settings.js
++++ etc/overleaf/settings.js
+@@ -212,6 +212,11 @@ const settings = {
+ enabled: process.env.OVERLEAF_CSP_ENABLED !== 'false',
+ },
+
++ rateLimit: {
++ subnetRateLimiterDisabled:
++ process.env.SUBNET_RATE_LIMITER_DISABLED !== 'false',
++ },
++
+ // These credentials are used for authenticating api requests
+ // between services that may need to go over public channels
+ httpAuthUsers,
diff --git a/server-ce/hotfix/5.3.1/Dockerfile b/server-ce/hotfix/5.3.1/Dockerfile
new file mode 100644
index 0000000000..ec0bef5444
--- /dev/null
+++ b/server-ce/hotfix/5.3.1/Dockerfile
@@ -0,0 +1,14 @@
+FROM sharelatex/sharelatex:5.3.0
+
+# Update copyright year
+COPY pr_22950.patch .
+RUN patch -p0 < pr_22950.patch && rm pr_22950.patch
+
+
+# Update Mongoose
+RUN npm install mongoose@^8.9.5 --save -w services/web \
+ && npm install mongodb@6.12.0 --save \
+ -w services/chat -w services/contacts -w services/docstore \
+ -w services/history-v1 -w libraries/mongo-utils \
+ && npm install mongodb@6.12.0 --save \
+ && rm -rf /root/.cache /root/.npm $(find /tmp/ -mindepth 1 -maxdepth 1)
diff --git a/server-ce/hotfix/5.3.1/pr_22950.patch b/server-ce/hotfix/5.3.1/pr_22950.patch
new file mode 100644
index 0000000000..cd066f9456
--- /dev/null
+++ b/server-ce/hotfix/5.3.1/pr_22950.patch
@@ -0,0 +1,33 @@
+--- services/web/app/views/layout/thin-footer-bootstrap-5.pug
++++ services/web/app/views/layout/thin-footer-bootstrap-5.pug
+@@ -7,7 +7,7 @@ footer.site-footer
+ if !settings.nav.hide_powered_by
+ li
+ //- year of Server Pro release, static
+- | © 2024
++ | © 2025
+ |
+ a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
+
+--- services/web/app/views/layout/thin-footer.pug
++++ services/web/app/views/layout/thin-footer.pug
+@@ -9,7 +9,7 @@ footer.site-footer
+ else if !settings.nav.hide_powered_by
+ li
+ //- year of Server Pro release, static
+- | © 2024
++ | © 2025
+ |
+ a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
+
+--- services/web/frontend/js/features/ui/components/bootstrap-5/footer/thin-footer.tsx
++++ services/web/frontend/js/features/ui/components/bootstrap-5/footer/thin-footer.tsx
+@@ -60,7 +60,7 @@ function ThinFooter({
+ {showPoweredBy ? (
+ <>
+
+- {/* year of Server Pro release, static */}© 2024{' '}
++ {/* year of Server Pro release, static */}© 2025{' '}
+
+ Powered by Overleaf
+
diff --git a/server-ce/hotfix/5.3.2/Dockerfile b/server-ce/hotfix/5.3.2/Dockerfile
new file mode 100644
index 0000000000..3a43371e6f
--- /dev/null
+++ b/server-ce/hotfix/5.3.2/Dockerfile
@@ -0,0 +1 @@
+FROM sharelatex/sharelatex:5.3.1
diff --git a/server-ce/hotfix/5.3.3/Dockerfile b/server-ce/hotfix/5.3.3/Dockerfile
new file mode 100644
index 0000000000..034eafbe76
--- /dev/null
+++ b/server-ce/hotfix/5.3.3/Dockerfile
@@ -0,0 +1 @@
+FROM sharelatex/sharelatex:5.3.2
diff --git a/server-ce/hotfix/5.4.1/Dockerfile b/server-ce/hotfix/5.4.1/Dockerfile
new file mode 100644
index 0000000000..46bde4013c
--- /dev/null
+++ b/server-ce/hotfix/5.4.1/Dockerfile
@@ -0,0 +1,14 @@
+FROM sharelatex/sharelatex:5.4.0
+
+RUN apt update && apt install -y linux-libc-dev \
+ && unattended-upgrade --verbose --no-minimal-upgrade-steps \
+ && rm -rf /var/lib/apt/lists/*
+COPY package-lock.json.diff .
+RUN patch package-lock.json < package-lock.json.diff
+RUN npm install --omit=dev
+
+
+# fix tls configuration in redis
+COPY issue_24996.patch .
+RUN patch -p0 /etc/overleaf/settings.js < issue_24996.patch \
+ && rm issue_24996.patch
diff --git a/server-ce/hotfix/5.4.1/issue_24996.patch b/server-ce/hotfix/5.4.1/issue_24996.patch
new file mode 100644
index 0000000000..3067aab968
--- /dev/null
+++ b/server-ce/hotfix/5.4.1/issue_24996.patch
@@ -0,0 +1,10 @@
+--- settings.js
++++ settings.js
+@@ -79,6 +79,7 @@ const settings = {
+ host: process.env.OVERLEAF_REDIS_HOST || 'dockerhost',
+ port: process.env.OVERLEAF_REDIS_PORT || '6379',
+ password: process.env.OVERLEAF_REDIS_PASS || undefined,
++ tls: process.env.OVERLEAF_REDIS_TLS === 'true' ? {} : undefined,
+ key_schema: {
+ // document-updater
+ blockingKey({ doc_id }) {
diff --git a/server-ce/hotfix/5.4.1/package-lock.json.diff b/server-ce/hotfix/5.4.1/package-lock.json.diff
new file mode 100644
index 0000000000..f4f7ae4788
--- /dev/null
+++ b/server-ce/hotfix/5.4.1/package-lock.json.diff
@@ -0,0 +1,2024 @@
+151c151
+< "@google-cloud/profiler": "^6.0.0",
+---
+> "@google-cloud/profiler": "^6.0.3",
+173a174,507
+> "libraries/metrics/node_modules/@google-cloud/logging-min": {
+> "version": "11.2.0",
+> "resolved": "https://registry.npmjs.org/@google-cloud/logging-min/-/logging-min-11.2.0.tgz",
+> "integrity": "sha512-o1mwzi1+9NMEjwYZJ0X3tK64obf9PzPVBAhzEJv65L0h7jVl3Fw7GswtsMUkdUvZexf96vAvlZZMvXB9jAIW2Q==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@google-cloud/common": "^5.0.0",
+> "@google-cloud/paginator": "^5.0.0",
+> "@google-cloud/projectify": "^4.0.0",
+> "@google-cloud/promisify": "^4.0.0",
+> "@opentelemetry/api": "^1.7.0",
+> "arrify": "^2.0.1",
+> "dot-prop": "^6.0.0",
+> "eventid": "^2.0.0",
+> "extend": "^3.0.2",
+> "gcp-metadata": "^6.0.0",
+> "google-auth-library": "^9.0.0",
+> "google-gax": "^4.0.3",
+> "on-finished": "^2.3.0",
+> "pumpify": "^2.0.1",
+> "stream-events": "^1.0.5",
+> "uuid": "^9.0.0"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/@google-cloud/paginator": {
+> "version": "5.0.2",
+> "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz",
+> "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "arrify": "^2.0.0",
+> "extend": "^3.0.2"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/@google-cloud/profiler": {
+> "version": "6.0.3",
+> "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-6.0.3.tgz",
+> "integrity": "sha512-Ey8li6Vc2CbfEzOTSZaqKolxPMGacxVUQuhChNT0Wi55a3nfImMiiuDgqYw1In/a9Q3Z62O7jUg2L8f1XwMN7Q==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@google-cloud/common": "^5.0.0",
+> "@google-cloud/logging-min": "^11.0.0",
+> "@google-cloud/promisify": "~4.0.0",
+> "@types/console-log-level": "^1.4.0",
+> "@types/semver": "^7.0.0",
+> "console-log-level": "^1.4.0",
+> "delay": "^5.0.0",
+> "extend": "^3.0.2",
+> "gcp-metadata": "^6.0.0",
+> "ms": "^2.1.3",
+> "pprof": "4.0.0",
+> "pretty-ms": "^7.0.0",
+> "protobufjs": "~7.4.0",
+> "semver": "^7.0.0",
+> "teeny-request": "^9.0.0"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/@google-cloud/profiler/node_modules/protobufjs": {
+> "version": "7.4.0",
+> "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
+> "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
+> "hasInstallScript": true,
+> "license": "BSD-3-Clause",
+> "dependencies": {
+> "@protobufjs/aspromise": "^1.1.2",
+> "@protobufjs/base64": "^1.1.2",
+> "@protobufjs/codegen": "^2.0.4",
+> "@protobufjs/eventemitter": "^1.1.0",
+> "@protobufjs/fetch": "^1.1.0",
+> "@protobufjs/float": "^1.0.2",
+> "@protobufjs/inquire": "^1.1.0",
+> "@protobufjs/path": "^1.1.2",
+> "@protobufjs/pool": "^1.1.0",
+> "@protobufjs/utf8": "^1.1.0",
+> "@types/node": ">=13.7.0",
+> "long": "^5.0.0"
+> },
+> "engines": {
+> "node": ">=12.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/@mapbox/node-pre-gyp": {
+> "version": "1.0.11",
+> "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+> "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
+> "license": "BSD-3-Clause",
+> "dependencies": {
+> "detect-libc": "^2.0.0",
+> "https-proxy-agent": "^5.0.0",
+> "make-dir": "^3.1.0",
+> "node-fetch": "^2.6.7",
+> "nopt": "^5.0.0",
+> "npmlog": "^5.0.1",
+> "rimraf": "^3.0.2",
+> "semver": "^7.3.5",
+> "tar": "^6.1.11"
+> },
+> "bin": {
+> "node-pre-gyp": "bin/node-pre-gyp"
+> }
+> },
+> "libraries/metrics/node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": {
+> "version": "6.0.2",
+> "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+> "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+> "license": "MIT",
+> "dependencies": {
+> "debug": "4"
+> },
+> "engines": {
+> "node": ">= 6.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": {
+> "version": "5.0.1",
+> "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+> "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+> "license": "MIT",
+> "dependencies": {
+> "agent-base": "6",
+> "debug": "4"
+> },
+> "engines": {
+> "node": ">= 6"
+> }
+> },
+> "libraries/metrics/node_modules/@opentelemetry/api": {
+> "version": "1.9.0",
+> "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+> "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+> "license": "Apache-2.0",
+> "engines": {
+> "node": ">=8.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/agent-base": {
+> "version": "7.1.3",
+> "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+> "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 14"
+> }
+> },
+> "libraries/metrics/node_modules/detect-libc": {
+> "version": "2.0.4",
+> "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+> "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+> "license": "Apache-2.0",
+> "engines": {
+> "node": ">=8"
+> }
+> },
+> "libraries/metrics/node_modules/gaxios": {
+> "version": "6.7.1",
+> "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+> "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "extend": "^3.0.2",
+> "https-proxy-agent": "^7.0.1",
+> "is-stream": "^2.0.0",
+> "node-fetch": "^2.6.9",
+> "uuid": "^9.0.1"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "libraries/metrics/node_modules/gcp-metadata": {
+> "version": "6.1.1",
+> "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+> "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "gaxios": "^6.1.1",
+> "google-logging-utils": "^0.0.2",
+> "json-bigint": "^1.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "libraries/metrics/node_modules/google-auth-library": {
+> "version": "9.15.1",
+> "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+> "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "base64-js": "^1.3.0",
+> "ecdsa-sig-formatter": "^1.0.11",
+> "gaxios": "^6.1.1",
+> "gcp-metadata": "^6.1.0",
+> "gtoken": "^7.0.0",
+> "jws": "^4.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "libraries/metrics/node_modules/gtoken": {
+> "version": "7.1.0",
+> "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+> "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+> "license": "MIT",
+> "dependencies": {
+> "gaxios": "^6.0.0",
+> "jws": "^4.0.0"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/https-proxy-agent": {
+> "version": "7.0.6",
+> "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+> "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+> "license": "MIT",
+> "dependencies": {
+> "agent-base": "^7.1.2",
+> "debug": "4"
+> },
+> "engines": {
+> "node": ">= 14"
+> }
+> },
+> "libraries/metrics/node_modules/make-dir": {
+> "version": "3.1.0",
+> "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+> "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+> "license": "MIT",
+> "dependencies": {
+> "semver": "^6.0.0"
+> },
+> "engines": {
+> "node": ">=8"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/sindresorhus"
+> }
+> },
+> "libraries/metrics/node_modules/make-dir/node_modules/semver": {
+> "version": "6.3.1",
+> "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+> "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+> "license": "ISC",
+> "bin": {
+> "semver": "bin/semver.js"
+> }
+> },
+> "libraries/metrics/node_modules/pprof": {
+> "version": "4.0.0",
+> "resolved": "https://registry.npmjs.org/pprof/-/pprof-4.0.0.tgz",
+> "integrity": "sha512-Yhfk7Y0G1MYsy97oXxmSG5nvbM1sCz9EALiNhW/isAv5Xf7svzP+1RfGeBlS6mLSgRJvgSLh6Mi5DaisQuPttw==",
+> "hasInstallScript": true,
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@mapbox/node-pre-gyp": "^1.0.9",
+> "bindings": "^1.2.1",
+> "delay": "^5.0.0",
+> "findit2": "^2.2.3",
+> "nan": "^2.17.0",
+> "p-limit": "^3.0.0",
+> "protobufjs": "~7.2.4",
+> "source-map": "~0.8.0-beta.0",
+> "split": "^1.0.1"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "libraries/metrics/node_modules/semver": {
+> "version": "7.7.1",
+> "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+> "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+> "license": "ISC",
+> "bin": {
+> "semver": "bin/semver.js"
+> },
+> "engines": {
+> "node": ">=10"
+> }
+> },
+> "libraries/metrics/node_modules/source-map": {
+> "version": "0.8.0-beta.0",
+> "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+> "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+> "license": "BSD-3-Clause",
+> "dependencies": {
+> "whatwg-url": "^7.0.0"
+> },
+> "engines": {
+> "node": ">= 8"
+> }
+> },
+> "libraries/metrics/node_modules/uuid": {
+> "version": "9.0.1",
+> "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+> "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+> "funding": [
+> "https://github.com/sponsors/broofa",
+> "https://github.com/sponsors/ctavan"
+> ],
+> "license": "MIT",
+> "bin": {
+> "uuid": "dist/bin/uuid"
+> }
+> },
+> "libraries/metrics/node_modules/webidl-conversions": {
+> "version": "4.0.2",
+> "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+> "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+> "license": "BSD-2-Clause"
+> },
+> "libraries/metrics/node_modules/whatwg-url": {
+> "version": "7.1.0",
+> "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+> "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+> "license": "MIT",
+> "dependencies": {
+> "lodash.sortby": "^4.7.0",
+> "tr46": "^1.0.1",
+> "webidl-conversions": "^4.0.2"
+> }
+> },
+3205a3540,3545
+> "node_modules/@balena/dockerignore": {
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz",
+> "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==",
+> "license": "Apache-2.0"
+> },
+4095a4436,4550
+> "node_modules/@google-cloud/common": {
+> "version": "5.0.2",
+> "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
+> "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@google-cloud/projectify": "^4.0.0",
+> "@google-cloud/promisify": "^4.0.0",
+> "arrify": "^2.0.1",
+> "duplexify": "^4.1.1",
+> "extend": "^3.0.2",
+> "google-auth-library": "^9.0.0",
+> "html-entities": "^2.5.2",
+> "retry-request": "^7.0.0",
+> "teeny-request": "^9.0.0"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/agent-base": {
+> "version": "7.1.3",
+> "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+> "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 14"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/gaxios": {
+> "version": "6.7.1",
+> "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+> "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "extend": "^3.0.2",
+> "https-proxy-agent": "^7.0.1",
+> "is-stream": "^2.0.0",
+> "node-fetch": "^2.6.9",
+> "uuid": "^9.0.1"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/gcp-metadata": {
+> "version": "6.1.1",
+> "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+> "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "gaxios": "^6.1.1",
+> "google-logging-utils": "^0.0.2",
+> "json-bigint": "^1.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/google-auth-library": {
+> "version": "9.15.1",
+> "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
+> "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "base64-js": "^1.3.0",
+> "ecdsa-sig-formatter": "^1.0.11",
+> "gaxios": "^6.1.1",
+> "gcp-metadata": "^6.1.0",
+> "gtoken": "^7.0.0",
+> "jws": "^4.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/gtoken": {
+> "version": "7.1.0",
+> "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
+> "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
+> "license": "MIT",
+> "dependencies": {
+> "gaxios": "^6.0.0",
+> "jws": "^4.0.0"
+> },
+> "engines": {
+> "node": ">=14.0.0"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/https-proxy-agent": {
+> "version": "7.0.6",
+> "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+> "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+> "license": "MIT",
+> "dependencies": {
+> "agent-base": "^7.1.2",
+> "debug": "4"
+> },
+> "engines": {
+> "node": ">= 14"
+> }
+> },
+> "node_modules/@google-cloud/common/node_modules/uuid": {
+> "version": "9.0.1",
+> "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+> "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+> "funding": [
+> "https://github.com/sponsors/broofa",
+> "https://github.com/sponsors/ctavan"
+> ],
+> "license": "MIT",
+> "bin": {
+> "uuid": "dist/bin/uuid"
+> }
+> },
+4251,4529d4705
+< "node_modules/@google-cloud/logging-min": {
+< "version": "10.4.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/logging-min/-/logging-min-10.4.0.tgz",
+< "integrity": "sha512-TcblDYAATO9hHcDcWYFh+vqt3pAV7Qddaih1JK3cpkzLa+BWjD5gAVAWww8W9Wr5yxOX+8CkssanH/xSS4n76Q==",
+< "dependencies": {
+< "@google-cloud/common": "^4.0.0",
+< "@google-cloud/paginator": "^4.0.0",
+< "@google-cloud/projectify": "^3.0.0",
+< "@google-cloud/promisify": "^3.0.0",
+< "arrify": "^2.0.1",
+< "dot-prop": "^6.0.0",
+< "eventid": "^2.0.0",
+< "extend": "^3.0.2",
+< "gcp-metadata": "^4.0.0",
+< "google-auth-library": "^8.0.2",
+< "google-gax": "^3.5.2",
+< "on-finished": "^2.3.0",
+< "pumpify": "^2.0.1",
+< "stream-events": "^1.0.5",
+< "uuid": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/@google-cloud/common": {
+< "version": "4.0.3",
+< "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
+< "integrity": "sha512-fUoMo5b8iAKbrYpneIRV3z95AlxVJPrjpevxs4SKoclngWZvTXBSGpNisF5+x5m+oNGve7jfB1e6vNBZBUs7Fw==",
+< "dependencies": {
+< "@google-cloud/projectify": "^3.0.0",
+< "@google-cloud/promisify": "^3.0.0",
+< "arrify": "^2.0.1",
+< "duplexify": "^4.1.1",
+< "ent": "^2.2.0",
+< "extend": "^3.0.2",
+< "google-auth-library": "^8.0.2",
+< "retry-request": "^5.0.0",
+< "teeny-request": "^8.0.0"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/@google-cloud/paginator": {
+< "version": "4.0.1",
+< "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-4.0.1.tgz",
+< "integrity": "sha512-6G1ui6bWhNyHjmbYwavdN7mpVPRBtyDg/bfqBTAlwr413On2TnFNfDxc9UhTJctkgoCDgQXEKiRPLPR9USlkbQ==",
+< "dependencies": {
+< "arrify": "^2.0.0",
+< "extend": "^3.0.2"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/@google-cloud/projectify": {
+< "version": "3.0.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz",
+< "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==",
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/@google-cloud/promisify": {
+< "version": "3.0.1",
+< "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz",
+< "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==",
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/duplexify": {
+< "version": "4.1.2",
+< "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+< "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+< "dependencies": {
+< "end-of-stream": "^1.4.1",
+< "inherits": "^2.0.3",
+< "readable-stream": "^3.1.1",
+< "stream-shift": "^1.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/gcp-metadata": {
+< "version": "4.3.1",
+< "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz",
+< "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==",
+< "dependencies": {
+< "gaxios": "^4.0.0",
+< "json-bigint": "^1.0.0"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/gcp-metadata/node_modules/gaxios": {
+< "version": "4.3.3",
+< "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.3.tgz",
+< "integrity": "sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==",
+< "dependencies": {
+< "abort-controller": "^3.0.0",
+< "extend": "^3.0.2",
+< "https-proxy-agent": "^5.0.0",
+< "is-stream": "^2.0.0",
+< "node-fetch": "^2.6.7"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/google-auth-library": {
+< "version": "8.9.0",
+< "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz",
+< "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==",
+< "dependencies": {
+< "arrify": "^2.0.0",
+< "base64-js": "^1.3.0",
+< "ecdsa-sig-formatter": "^1.0.11",
+< "fast-text-encoding": "^1.0.0",
+< "gaxios": "^5.0.0",
+< "gcp-metadata": "^5.3.0",
+< "gtoken": "^6.1.0",
+< "jws": "^4.0.0",
+< "lru-cache": "^6.0.0"
+< },
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/google-auth-library/node_modules/gcp-metadata": {
+< "version": "5.3.0",
+< "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz",
+< "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==",
+< "dependencies": {
+< "gaxios": "^5.0.0",
+< "json-bigint": "^1.0.0"
+< },
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/google-gax": {
+< "version": "3.6.1",
+< "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz",
+< "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==",
+< "dependencies": {
+< "@grpc/grpc-js": "~1.8.0",
+< "@grpc/proto-loader": "^0.7.0",
+< "@types/long": "^4.0.0",
+< "@types/rimraf": "^3.0.2",
+< "abort-controller": "^3.0.0",
+< "duplexify": "^4.0.0",
+< "fast-text-encoding": "^1.0.3",
+< "google-auth-library": "^8.0.2",
+< "is-stream-ended": "^0.1.4",
+< "node-fetch": "^2.6.1",
+< "object-hash": "^3.0.0",
+< "proto3-json-serializer": "^1.0.0",
+< "protobufjs": "7.2.4",
+< "protobufjs-cli": "1.1.1",
+< "retry-request": "^5.0.0"
+< },
+< "bin": {
+< "compileProtos": "build/tools/compileProtos.js",
+< "minifyProtoJson": "build/tools/minify.js"
+< },
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/google-p12-pem": {
+< "version": "4.0.1",
+< "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz",
+< "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==",
+< "dependencies": {
+< "node-forge": "^1.3.1"
+< },
+< "bin": {
+< "gp12-pem": "build/src/bin/gp12-pem.js"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/gtoken": {
+< "version": "6.1.2",
+< "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz",
+< "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==",
+< "dependencies": {
+< "gaxios": "^5.0.1",
+< "google-p12-pem": "^4.0.0",
+< "jws": "^4.0.0"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/lru-cache": {
+< "version": "6.0.0",
+< "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+< "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+< "dependencies": {
+< "yallist": "^4.0.0"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/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==",
+< "engines": {
+< "node": ">= 6"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/retry-request": {
+< "version": "5.0.2",
+< "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz",
+< "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==",
+< "dependencies": {
+< "debug": "^4.1.1",
+< "extend": "^3.0.2"
+< },
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/teeny-request": {
+< "version": "8.0.3",
+< "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz",
+< "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==",
+< "dependencies": {
+< "http-proxy-agent": "^5.0.0",
+< "https-proxy-agent": "^5.0.0",
+< "node-fetch": "^2.6.1",
+< "stream-events": "^1.0.5",
+< "uuid": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=12"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/uuid": {
+< "version": "9.0.1",
+< "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+< "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+< "funding": [
+< "https://github.com/sponsors/broofa",
+< "https://github.com/sponsors/ctavan"
+< ],
+< "bin": {
+< "uuid": "dist/bin/uuid"
+< }
+< },
+< "node_modules/@google-cloud/logging-min/node_modules/yallist": {
+< "version": "4.0.0",
+< "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+< "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+< },
+< "node_modules/@google-cloud/logging/node_modules/@google-cloud/common": {
+< "version": "5.0.2",
+< "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz",
+< "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==",
+< "dependencies": {
+< "@google-cloud/projectify": "^4.0.0",
+< "@google-cloud/promisify": "^4.0.0",
+< "arrify": "^2.0.1",
+< "duplexify": "^4.1.1",
+< "extend": "^3.0.2",
+< "google-auth-library": "^9.0.0",
+< "html-entities": "^2.5.2",
+< "retry-request": "^7.0.0",
+< "teeny-request": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14.0.0"
+< }
+< },
+4542,4557d4717
+< "node_modules/@google-cloud/logging/node_modules/@google-cloud/projectify": {
+< "version": "4.0.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz",
+< "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==",
+< "engines": {
+< "node": ">=14.0.0"
+< }
+< },
+< "node_modules/@google-cloud/logging/node_modules/@google-cloud/promisify": {
+< "version": "4.0.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz",
+< "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==",
+< "engines": {
+< "node": ">=14"
+< }
+< },
+4585,4595d4744
+< "node_modules/@google-cloud/logging/node_modules/duplexify": {
+< "version": "4.1.3",
+< "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+< "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+< "dependencies": {
+< "end-of-stream": "^1.4.1",
+< "inherits": "^2.0.3",
+< "readable-stream": "^3.1.1",
+< "stream-shift": "^1.0.2"
+< }
+< },
+4668,4695d4816
+< "node_modules/@google-cloud/logging/node_modules/retry-request": {
+< "version": "7.0.2",
+< "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
+< "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
+< "dependencies": {
+< "@types/request": "^2.48.8",
+< "extend": "^3.0.2",
+< "teeny-request": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/logging/node_modules/teeny-request": {
+< "version": "9.0.0",
+< "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+< "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+< "dependencies": {
+< "http-proxy-agent": "^5.0.0",
+< "https-proxy-agent": "^5.0.0",
+< "node-fetch": "^2.6.9",
+< "stream-events": "^1.0.5",
+< "uuid": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+4756,4799c4877
+< "node_modules/@google-cloud/profiler": {
+< "version": "6.0.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-6.0.0.tgz",
+< "integrity": "sha512-EAxPbDiNRidAKOEnlUK3M+CcOlqG+REkUEZKirLtxFwzI/m7LmGqDzQvrVWTOSFSEYJ9qQRRnO+Q1osNGk3NUg==",
+< "dependencies": {
+< "@google-cloud/common": "^5.0.0",
+< "@google-cloud/logging-min": "^10.0.0",
+< "@types/console-log-level": "^1.4.0",
+< "@types/semver": "^7.0.0",
+< "console-log-level": "^1.4.0",
+< "delay": "^5.0.0",
+< "extend": "^3.0.2",
+< "gcp-metadata": "^6.0.0",
+< "parse-duration": "^1.0.0",
+< "pprof": "3.2.1",
+< "pretty-ms": "^7.0.0",
+< "protobufjs": "~7.2.4",
+< "semver": "^7.0.0",
+< "teeny-request": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14.0.0"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/@google-cloud/common": {
+< "version": "5.0.0",
+< "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.0.tgz",
+< "integrity": "sha512-IsbTVr7Ag+04GMT87X738vDs85QU1rMvaesm2wEQrtTbZAR92tGmUQ8/D/kdnYgAi98Q4zmfhF+T8Xs/Lw4zAA==",
+< "dependencies": {
+< "@google-cloud/projectify": "^4.0.0",
+< "@google-cloud/promisify": "^4.0.0",
+< "arrify": "^2.0.1",
+< "duplexify": "^4.1.1",
+< "ent": "^2.2.0",
+< "extend": "^3.0.2",
+< "google-auth-library": "^9.0.0",
+< "retry-request": "^6.0.0",
+< "teeny-request": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14.0.0"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/@google-cloud/projectify": {
+---
+> "node_modules/@google-cloud/projectify": {
+4802a4881
+> "license": "Apache-2.0",
+4807c4886
+< "node_modules/@google-cloud/profiler/node_modules/@google-cloud/promisify": {
+---
+> "node_modules/@google-cloud/promisify": {
+4810a4890
+> "license": "Apache-2.0",
+4815,4993d4894
+< "node_modules/@google-cloud/profiler/node_modules/agent-base": {
+< "version": "7.1.0",
+< "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+< "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+< "dependencies": {
+< "debug": "^4.3.4"
+< },
+< "engines": {
+< "node": ">= 14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/debug": {
+< "version": "4.3.4",
+< "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+< "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+< "dependencies": {
+< "ms": "2.1.2"
+< },
+< "engines": {
+< "node": ">=6.0"
+< },
+< "peerDependenciesMeta": {
+< "supports-color": {
+< "optional": true
+< }
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/duplexify": {
+< "version": "4.1.2",
+< "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+< "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+< "dependencies": {
+< "end-of-stream": "^1.4.1",
+< "inherits": "^2.0.3",
+< "readable-stream": "^3.1.1",
+< "stream-shift": "^1.0.0"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/gaxios": {
+< "version": "6.1.1",
+< "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz",
+< "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==",
+< "dependencies": {
+< "extend": "^3.0.2",
+< "https-proxy-agent": "^7.0.1",
+< "is-stream": "^2.0.0",
+< "node-fetch": "^2.6.9"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/gaxios/node_modules/https-proxy-agent": {
+< "version": "7.0.2",
+< "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+< "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+< "dependencies": {
+< "agent-base": "^7.0.2",
+< "debug": "4"
+< },
+< "engines": {
+< "node": ">= 14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/gcp-metadata": {
+< "version": "6.0.0",
+< "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.0.0.tgz",
+< "integrity": "sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==",
+< "dependencies": {
+< "gaxios": "^6.0.0",
+< "json-bigint": "^1.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/google-auth-library": {
+< "version": "9.1.0",
+< "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.1.0.tgz",
+< "integrity": "sha512-1M9HdOcQNPV5BwSXqwwT238MTKodJFBxZ/V2JP397ieOLv4FjQdfYb9SooR7Mb+oUT2IJ92mLJQf804dyx0MJA==",
+< "dependencies": {
+< "base64-js": "^1.3.0",
+< "ecdsa-sig-formatter": "^1.0.11",
+< "gaxios": "^6.0.0",
+< "gcp-metadata": "^6.0.0",
+< "gtoken": "^7.0.0",
+< "jws": "^4.0.0",
+< "lru-cache": "^6.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/gtoken": {
+< "version": "7.0.1",
+< "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz",
+< "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==",
+< "dependencies": {
+< "gaxios": "^6.0.0",
+< "jws": "^4.0.0"
+< },
+< "engines": {
+< "node": ">=14.0.0"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/lru-cache": {
+< "version": "6.0.0",
+< "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+< "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+< "dependencies": {
+< "yallist": "^4.0.0"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/ms": {
+< "version": "2.1.2",
+< "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+< "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+< },
+< "node_modules/@google-cloud/profiler/node_modules/retry-request": {
+< "version": "6.0.0",
+< "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-6.0.0.tgz",
+< "integrity": "sha512-24kaFMd3wCnT3n4uPnsQh90ZSV8OISpfTFXJ00Wi+/oD2OPrp63EQ8hznk6rhxdlpwx2QBhQSDz2Fg46ki852g==",
+< "dependencies": {
+< "debug": "^4.1.1",
+< "extend": "^3.0.2"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/semver": {
+< "version": "7.5.4",
+< "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+< "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+< "dependencies": {
+< "lru-cache": "^6.0.0"
+< },
+< "bin": {
+< "semver": "bin/semver.js"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/teeny-request": {
+< "version": "9.0.0",
+< "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+< "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+< "dependencies": {
+< "http-proxy-agent": "^5.0.0",
+< "https-proxy-agent": "^5.0.0",
+< "node-fetch": "^2.6.9",
+< "stream-events": "^1.0.5",
+< "uuid": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/uuid": {
+< "version": "9.0.1",
+< "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+< "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+< "funding": [
+< "https://github.com/sponsors/broofa",
+< "https://github.com/sponsors/ctavan"
+< ],
+< "bin": {
+< "uuid": "dist/bin/uuid"
+< }
+< },
+< "node_modules/@google-cloud/profiler/node_modules/yallist": {
+< "version": "4.0.0",
+< "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+< "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+< },
+5048,5058d4948
+< "node_modules/@google-cloud/storage/node_modules/duplexify": {
+< "version": "4.1.2",
+< "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+< "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+< "dependencies": {
+< "end-of-stream": "^1.4.1",
+< "inherits": "^2.0.3",
+< "readable-stream": "^3.1.1",
+< "stream-shift": "^1.0.0"
+< }
+< },
+5598,5608d5487
+< "node_modules/@jsdoc/salty": {
+< "version": "0.2.8",
+< "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz",
+< "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==",
+< "dependencies": {
+< "lodash": "^4.17.21"
+< },
+< "engines": {
+< "node": ">=v12.0.0"
+< }
+< },
+5809,5822d5687
+< "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": {
+< "version": "3.0.2",
+< "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+< "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+< "dependencies": {
+< "glob": "^7.1.3"
+< },
+< "bin": {
+< "rimraf": "bin.js"
+< },
+< "funding": {
+< "url": "https://github.com/sponsors/isaacs"
+< }
+< },
+11095,11103d10959
+< "node_modules/@types/glob": {
+< "version": "8.1.0",
+< "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
+< "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
+< "dependencies": {
+< "@types/minimatch": "^5.1.2",
+< "@types/node": "*"
+< }
+< },
+11266,11270d11121
+< "node_modules/@types/linkify-it": {
+< "version": "5.0.0",
+< "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+< "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
+< },
+11282,11295d11132
+< "node_modules/@types/markdown-it": {
+< "version": "14.1.1",
+< "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz",
+< "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==",
+< "dependencies": {
+< "@types/linkify-it": "^5",
+< "@types/mdurl": "^2"
+< }
+< },
+< "node_modules/@types/mdurl": {
+< "version": "2.0.0",
+< "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+< "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
+< },
+11321,11325d11157
+< "node_modules/@types/minimatch": {
+< "version": "5.1.2",
+< "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+< "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
+< },
+11574,11582d11405
+< "node_modules/@types/rimraf": {
+< "version": "3.0.2",
+< "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz",
+< "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==",
+< "dependencies": {
+< "@types/glob": "*",
+< "@types/node": "*"
+< }
+< },
+13204a13028
+> "dev": true,
+13842a13667,13675
+> "node_modules/asn1": {
+> "version": "0.2.6",
+> "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+> "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+> "license": "MIT",
+> "dependencies": {
+> "safer-buffer": "~2.1.0"
+> }
+> },
+14965a14799,14807
+> "node_modules/buildcheck": {
+> "version": "0.0.6",
+> "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz",
+> "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==",
+> "optional": true,
+> "engines": {
+> "node": ">=10.0.0"
+> }
+> },
+15160,15174d15001
+< "node_modules/c8/node_modules/rimraf": {
+< "version": "3.0.2",
+< "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+< "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+< "dev": true,
+< "dependencies": {
+< "glob": "^7.1.3"
+< },
+< "bin": {
+< "rimraf": "bin.js"
+< },
+< "funding": {
+< "url": "https://github.com/sponsors/isaacs"
+< }
+< },
+15367,15377d15193
+< "node_modules/catharsis": {
+< "version": "0.9.0",
+< "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+< "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+< "dependencies": {
+< "lodash": "^4.17.15"
+< },
+< "engines": {
+< "node": ">= 10"
+< }
+< },
+16502,16514d16317
+< "node_modules/cpu-features": {
+< "version": "0.0.2",
+< "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz",
+< "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==",
+< "hasInstallScript": true,
+< "optional": true,
+< "dependencies": {
+< "nan": "^2.14.1"
+< },
+< "engines": {
+< "node": ">=8.0.0"
+< }
+< },
+17652c17455,17456
+< "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+---
+> "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+> "dev": true
+17910,17935d17713
+< "node_modules/docker-modem": {
+< "version": "3.0.3",
+< "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz",
+< "integrity": "sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw==",
+< "dependencies": {
+< "debug": "^4.1.1",
+< "readable-stream": "^3.5.0",
+< "split-ca": "^1.0.1",
+< "ssh2": "^1.4.0"
+< },
+< "engines": {
+< "node": ">= 8.0"
+< }
+< },
+< "node_modules/dockerode": {
+< "version": "3.3.1",
+< "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz",
+< "integrity": "sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==",
+< "dependencies": {
+< "docker-modem": "^3.0.0",
+< "tar-fs": "~2.0.1"
+< },
+< "engines": {
+< "node": ">= 8.0"
+< }
+< },
+18119a17898,17909
+> "node_modules/duplexify": {
+> "version": "4.1.3",
+> "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
+> "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==",
+> "license": "MIT",
+> "dependencies": {
+> "end-of-stream": "^1.4.1",
+> "inherits": "^2.0.3",
+> "readable-stream": "^3.1.1",
+> "stream-shift": "^1.0.2"
+> }
+> },
+19831a19622
+> "dev": true,
+19847a19639
+> "dev": true,
+19858a19651
+> "dev": true,
+19918a19712
+> "dev": true,
+19936a19731
+> "dev": true,
+20628c20423,20424
+< "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+---
+> "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+> "dev": true
+21080,21094d20875
+< "node_modules/flat-cache/node_modules/rimraf": {
+< "version": "3.0.2",
+< "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+< "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+< "dev": true,
+< "dependencies": {
+< "glob": "^7.1.3"
+< },
+< "bin": {
+< "rimraf": "bin.js"
+< },
+< "funding": {
+< "url": "https://github.com/sponsors/isaacs"
+< }
+< },
+22169,22219d21949
+< "node_modules/google-gax/node_modules/retry-request": {
+< "version": "7.0.2",
+< "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
+< "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
+< "dependencies": {
+< "@types/request": "^2.48.8",
+< "extend": "^3.0.2",
+< "teeny-request": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/google-gax/node_modules/teeny-request": {
+< "version": "9.0.0",
+< "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+< "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+< "dependencies": {
+< "http-proxy-agent": "^5.0.0",
+< "https-proxy-agent": "^5.0.0",
+< "node-fetch": "^2.6.9",
+< "stream-events": "^1.0.5",
+< "uuid": "^9.0.0"
+< },
+< "engines": {
+< "node": ">=14"
+< }
+< },
+< "node_modules/google-gax/node_modules/teeny-request/node_modules/agent-base": {
+< "version": "6.0.2",
+< "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+< "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+< "dependencies": {
+< "debug": "4"
+< },
+< "engines": {
+< "node": ">= 6.0.0"
+< }
+< },
+< "node_modules/google-gax/node_modules/teeny-request/node_modules/https-proxy-agent": {
+< "version": "5.0.1",
+< "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+< "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+< "dependencies": {
+< "agent-base": "6",
+< "debug": "4"
+< },
+< "engines": {
+< "node": ">= 6"
+< }
+< },
+22231a21962,21970
+> "node_modules/google-logging-utils": {
+> "version": "0.0.2",
+> "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+> "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+> "license": "Apache-2.0",
+> "engines": {
+> "node": ">=14"
+> }
+> },
+24058,24062d23796
+< "node_modules/is-stream-ended": {
+< "version": "0.1.4",
+< "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
+< "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw=="
+< },
+24518,24525d24251
+< "node_modules/js2xmlparser": {
+< "version": "4.0.2",
+< "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+< "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+< "dependencies": {
+< "xmlcreate": "^2.0.4"
+< }
+< },
+24597,24624d24322
+< "node_modules/jsdoc": {
+< "version": "4.0.3",
+< "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz",
+< "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==",
+< "dependencies": {
+< "@babel/parser": "^7.20.15",
+< "@jsdoc/salty": "^0.2.1",
+< "@types/markdown-it": "^14.1.1",
+< "bluebird": "^3.7.2",
+< "catharsis": "^0.9.0",
+< "escape-string-regexp": "^2.0.0",
+< "js2xmlparser": "^4.0.2",
+< "klaw": "^3.0.0",
+< "markdown-it": "^14.1.0",
+< "markdown-it-anchor": "^8.6.7",
+< "marked": "^4.0.10",
+< "mkdirp": "^1.0.4",
+< "requizzle": "^0.2.3",
+< "strip-json-comments": "^3.1.0",
+< "underscore": "~1.13.2"
+< },
+< "bin": {
+< "jsdoc": "jsdoc.js"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+24635,24653d24332
+< "node_modules/jsdoc/node_modules/escape-string-regexp": {
+< "version": "2.0.0",
+< "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+< "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+< "engines": {
+< "node": ">=8"
+< }
+< },
+< "node_modules/jsdoc/node_modules/mkdirp": {
+< "version": "1.0.4",
+< "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+< "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+< "bin": {
+< "mkdirp": "bin/cmd.js"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+25108,25115d24786
+< "node_modules/klaw": {
+< "version": "3.0.0",
+< "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+< "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+< "dependencies": {
+< "graceful-fs": "^4.1.9"
+< }
+< },
+25497,25509d25167
+< "node_modules/linkify-it": {
+< "version": "5.0.0",
+< "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+< "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+< "dependencies": {
+< "uc.micro": "^2.0.0"
+< }
+< },
+< "node_modules/linkify-it/node_modules/uc.micro": {
+< "version": "2.1.0",
+< "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+< "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+< },
+25922,25923c25580
+< "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+< "dev": true
+---
+> "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
+26248,26288d25904
+< "node_modules/markdown-it": {
+< "version": "14.1.0",
+< "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+< "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+< "dependencies": {
+< "argparse": "^2.0.1",
+< "entities": "^4.4.0",
+< "linkify-it": "^5.0.0",
+< "mdurl": "^2.0.0",
+< "punycode.js": "^2.3.1",
+< "uc.micro": "^2.1.0"
+< },
+< "bin": {
+< "markdown-it": "bin/markdown-it.mjs"
+< }
+< },
+< "node_modules/markdown-it-anchor": {
+< "version": "8.6.7",
+< "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+< "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+< "peerDependencies": {
+< "@types/markdown-it": "*",
+< "markdown-it": "*"
+< }
+< },
+< "node_modules/markdown-it/node_modules/entities": {
+< "version": "4.5.0",
+< "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+< "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+< "engines": {
+< "node": ">=0.12"
+< },
+< "funding": {
+< "url": "https://github.com/fb55/entities?sponsor=1"
+< }
+< },
+< "node_modules/markdown-it/node_modules/uc.micro": {
+< "version": "2.1.0",
+< "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+< "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+< },
+26339,26343d25954
+< "node_modules/mdurl": {
+< "version": "2.0.0",
+< "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+< "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+< },
+28390,28436d28000
+< "node_modules/optionator": {
+< "version": "0.8.3",
+< "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+< "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+< "dependencies": {
+< "deep-is": "~0.1.3",
+< "fast-levenshtein": "~2.0.6",
+< "levn": "~0.3.0",
+< "prelude-ls": "~1.1.2",
+< "type-check": "~0.3.2",
+< "word-wrap": "~1.2.3"
+< },
+< "engines": {
+< "node": ">= 0.8.0"
+< }
+< },
+< "node_modules/optionator/node_modules/levn": {
+< "version": "0.3.0",
+< "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+< "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+< "dependencies": {
+< "prelude-ls": "~1.1.2",
+< "type-check": "~0.3.2"
+< },
+< "engines": {
+< "node": ">= 0.8.0"
+< }
+< },
+< "node_modules/optionator/node_modules/prelude-ls": {
+< "version": "1.1.2",
+< "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+< "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+< "engines": {
+< "node": ">= 0.8.0"
+< }
+< },
+< "node_modules/optionator/node_modules/type-check": {
+< "version": "0.3.2",
+< "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+< "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+< "dependencies": {
+< "prelude-ls": "~1.1.2"
+< },
+< "engines": {
+< "node": ">= 0.8.0"
+< }
+< },
+28682,28686d28245
+< "node_modules/parse-duration": {
+< "version": "1.1.0",
+< "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz",
+< "integrity": "sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ=="
+< },
+30167,30206d29725
+< "node_modules/pprof": {
+< "version": "3.2.1",
+< "resolved": "https://registry.npmjs.org/pprof/-/pprof-3.2.1.tgz",
+< "integrity": "sha512-KnextTM3EHQ2zqN8fUjB0VpE+njcVR7cOfo7DjJSLKzIbKTPelDtokI04ScR/Vd8CLDj+M99tsaKV+K6FHzpzA==",
+< "hasInstallScript": true,
+< "dependencies": {
+< "@mapbox/node-pre-gyp": "^1.0.0",
+< "bindings": "^1.2.1",
+< "delay": "^5.0.0",
+< "findit2": "^2.2.3",
+< "nan": "^2.14.0",
+< "p-limit": "^3.0.0",
+< "pify": "^5.0.0",
+< "protobufjs": "~7.2.4",
+< "source-map": "^0.7.3",
+< "split": "^1.0.1"
+< },
+< "engines": {
+< "node": ">=10.4.1"
+< }
+< },
+< "node_modules/pprof/node_modules/pify": {
+< "version": "5.0.0",
+< "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+< "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
+< "engines": {
+< "node": ">=10"
+< },
+< "funding": {
+< "url": "https://github.com/sponsors/sindresorhus"
+< }
+< },
+< "node_modules/pprof/node_modules/source-map": {
+< "version": "0.7.4",
+< "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+< "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+< "engines": {
+< "node": ">= 8"
+< }
+< },
+30457,30467d29975
+< "node_modules/proto3-json-serializer": {
+< "version": "1.1.1",
+< "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz",
+< "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==",
+< "dependencies": {
+< "protobufjs": "^7.0.0"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+30491,30635d29998
+< "node_modules/protobufjs-cli": {
+< "version": "1.1.1",
+< "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz",
+< "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==",
+< "dependencies": {
+< "chalk": "^4.0.0",
+< "escodegen": "^1.13.0",
+< "espree": "^9.0.0",
+< "estraverse": "^5.1.0",
+< "glob": "^8.0.0",
+< "jsdoc": "^4.0.0",
+< "minimist": "^1.2.0",
+< "semver": "^7.1.2",
+< "tmp": "^0.2.1",
+< "uglify-js": "^3.7.7"
+< },
+< "bin": {
+< "pbjs": "bin/pbjs",
+< "pbts": "bin/pbts"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< },
+< "peerDependencies": {
+< "protobufjs": "^7.0.0"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/ansi-styles": {
+< "version": "4.3.0",
+< "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+< "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+< "dependencies": {
+< "color-convert": "^2.0.1"
+< },
+< "engines": {
+< "node": ">=8"
+< },
+< "funding": {
+< "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/brace-expansion": {
+< "version": "2.0.1",
+< "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+< "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+< "dependencies": {
+< "balanced-match": "^1.0.0"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/chalk": {
+< "version": "4.1.2",
+< "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+< "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+< "dependencies": {
+< "ansi-styles": "^4.1.0",
+< "supports-color": "^7.1.0"
+< },
+< "engines": {
+< "node": ">=10"
+< },
+< "funding": {
+< "url": "https://github.com/chalk/chalk?sponsor=1"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/escodegen": {
+< "version": "1.14.3",
+< "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+< "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+< "dependencies": {
+< "esprima": "^4.0.1",
+< "estraverse": "^4.2.0",
+< "esutils": "^2.0.2",
+< "optionator": "^0.8.1"
+< },
+< "bin": {
+< "escodegen": "bin/escodegen.js",
+< "esgenerate": "bin/esgenerate.js"
+< },
+< "engines": {
+< "node": ">=4.0"
+< },
+< "optionalDependencies": {
+< "source-map": "~0.6.1"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/escodegen/node_modules/estraverse": {
+< "version": "4.3.0",
+< "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+< "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+< "engines": {
+< "node": ">=4.0"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/glob": {
+< "version": "8.1.0",
+< "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+< "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+< "deprecated": "Glob versions prior to v9 are no longer supported",
+< "dependencies": {
+< "fs.realpath": "^1.0.0",
+< "inflight": "^1.0.4",
+< "inherits": "2",
+< "minimatch": "^5.0.1",
+< "once": "^1.3.0"
+< },
+< "engines": {
+< "node": ">=12"
+< },
+< "funding": {
+< "url": "https://github.com/sponsors/isaacs"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/minimatch": {
+< "version": "5.1.6",
+< "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+< "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+< "dependencies": {
+< "brace-expansion": "^2.0.1"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/semver": {
+< "version": "7.6.2",
+< "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+< "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+< "bin": {
+< "semver": "bin/semver.js"
+< },
+< "engines": {
+< "node": ">=10"
+< }
+< },
+< "node_modules/protobufjs-cli/node_modules/supports-color": {
+< "version": "7.2.0",
+< "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+< "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+< "dependencies": {
+< "has-flag": "^4.0.0"
+< },
+< "engines": {
+< "node": ">=8"
+< }
+< },
+30797,30807d30159
+< "node_modules/pumpify/node_modules/duplexify": {
+< "version": "4.1.2",
+< "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+< "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+< "dependencies": {
+< "end-of-stream": "^1.4.1",
+< "inherits": "^2.0.3",
+< "readable-stream": "^3.1.1",
+< "stream-shift": "^1.0.0"
+< }
+< },
+30816,30823d30167
+< "node_modules/punycode.js": {
+< "version": "2.3.1",
+< "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+< "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+< "engines": {
+< "node": ">=6"
+< }
+< },
+31992,31999d31335
+< "node_modules/requizzle": {
+< "version": "0.2.4",
+< "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+< "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+< "dependencies": {
+< "lodash": "^4.17.21"
+< }
+< },
+32106a31443,31456
+> "node_modules/retry-request": {
+> "version": "7.0.2",
+> "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
+> "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
+> "license": "MIT",
+> "dependencies": {
+> "@types/request": "^2.48.8",
+> "extend": "^3.0.2",
+> "teeny-request": "^9.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+32122a31473,31488
+> "node_modules/rimraf": {
+> "version": "3.0.2",
+> "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+> "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+> "deprecated": "Rimraf versions prior to v4 are no longer supported",
+> "license": "ISC",
+> "dependencies": {
+> "glob": "^7.1.3"
+> },
+> "bin": {
+> "rimraf": "bin.js"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/isaacs"
+> }
+> },
+33320c32686
+< "devOptional": true,
+---
+> "dev": true,
+33488,33512d32853
+< "node_modules/ssh2": {
+< "version": "1.6.0",
+< "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.6.0.tgz",
+< "integrity": "sha512-lxc+uvXqOxyQ99N2M7k5o4pkYDO5GptOTYduWw7hIM41icxvoBcCNHcj+LTKrjkL0vFcAl+qfZekthoSFRJn2Q==",
+< "hasInstallScript": true,
+< "dependencies": {
+< "asn1": "^0.2.4",
+< "bcrypt-pbkdf": "^1.0.2"
+< },
+< "engines": {
+< "node": ">=10.16.0"
+< },
+< "optionalDependencies": {
+< "cpu-features": "0.0.2",
+< "nan": "^2.15.0"
+< }
+< },
+< "node_modules/ssh2/node_modules/asn1": {
+< "version": "0.2.6",
+< "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+< "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+< "dependencies": {
+< "safer-buffer": "~2.1.0"
+< }
+< },
+33537,33544d32877
+< "node_modules/sshpk/node_modules/asn1": {
+< "version": "0.2.6",
+< "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+< "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+< "dependencies": {
+< "safer-buffer": "~2.1.0"
+< }
+< },
+33896a33230
+> "dev": true,
+34789,34799d34122
+< "node_modules/tar-fs": {
+< "version": "2.0.1",
+< "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
+< "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
+< "dependencies": {
+< "chownr": "^1.1.1",
+< "mkdirp-classic": "^0.5.2",
+< "pump": "^3.0.0",
+< "tar-stream": "^2.0.0"
+< }
+< },
+34862a34186,34214
+> "node_modules/teeny-request": {
+> "version": "9.0.0",
+> "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
+> "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "http-proxy-agent": "^5.0.0",
+> "https-proxy-agent": "^5.0.0",
+> "node-fetch": "^2.6.9",
+> "stream-events": "^1.0.5",
+> "uuid": "^9.0.0"
+> },
+> "engines": {
+> "node": ">=14"
+> }
+> },
+> "node_modules/teeny-request/node_modules/uuid": {
+> "version": "9.0.1",
+> "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+> "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+> "funding": [
+> "https://github.com/sponsors/broofa",
+> "https://github.com/sponsors/ctavan"
+> ],
+> "license": "MIT",
+> "bin": {
+> "uuid": "dist/bin/uuid"
+> }
+> },
+35286a34639
+> "dev": true,
+35442d34794
+< "dev": true,
+35745a35098,35099
+> "dev": true,
+> "optional": true,
+37308,37315d36661
+< "node_modules/word-wrap": {
+< "version": "1.2.5",
+< "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+< "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+< "engines": {
+< "node": ">=0.10.0"
+< }
+< },
+37546,37550d36891
+< "node_modules/xmlcreate": {
+< "version": "2.0.4",
+< "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+< "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg=="
+< },
+37861c37202
+< "dockerode": "^3.1.0",
+---
+> "dockerode": "^4.0.6",
+37904a37246,37272
+> "services/clsi/node_modules/@grpc/grpc-js": {
+> "version": "1.13.3",
+> "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz",
+> "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@grpc/proto-loader": "^0.7.13",
+> "@js-sdsl/ordered-map": "^4.4.2"
+> },
+> "engines": {
+> "node": ">=12.10.0"
+> }
+> },
+> "services/clsi/node_modules/cpu-features": {
+> "version": "0.0.10",
+> "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
+> "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
+> "hasInstallScript": true,
+> "optional": true,
+> "dependencies": {
+> "buildcheck": "~0.0.6",
+> "nan": "^2.19.0"
+> },
+> "engines": {
+> "node": ">=10.0.0"
+> }
+> },
+37913a37282,37345
+> "services/clsi/node_modules/docker-modem": {
+> "version": "5.0.6",
+> "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz",
+> "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "debug": "^4.1.1",
+> "readable-stream": "^3.5.0",
+> "split-ca": "^1.0.1",
+> "ssh2": "^1.15.0"
+> },
+> "engines": {
+> "node": ">= 8.0"
+> }
+> },
+> "services/clsi/node_modules/dockerode": {
+> "version": "4.0.6",
+> "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.6.tgz",
+> "integrity": "sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@balena/dockerignore": "^1.0.2",
+> "@grpc/grpc-js": "^1.11.1",
+> "@grpc/proto-loader": "^0.7.13",
+> "docker-modem": "^5.0.6",
+> "protobufjs": "^7.3.2",
+> "tar-fs": "~2.1.2",
+> "uuid": "^10.0.0"
+> },
+> "engines": {
+> "node": ">= 8.0"
+> }
+> },
+> "services/clsi/node_modules/nan": {
+> "version": "2.22.2",
+> "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz",
+> "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==",
+> "license": "MIT",
+> "optional": true
+> },
+> "services/clsi/node_modules/protobufjs": {
+> "version": "7.5.0",
+> "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz",
+> "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==",
+> "hasInstallScript": true,
+> "license": "BSD-3-Clause",
+> "dependencies": {
+> "@protobufjs/aspromise": "^1.1.2",
+> "@protobufjs/base64": "^1.1.2",
+> "@protobufjs/codegen": "^2.0.4",
+> "@protobufjs/eventemitter": "^1.1.0",
+> "@protobufjs/fetch": "^1.1.0",
+> "@protobufjs/float": "^1.0.2",
+> "@protobufjs/inquire": "^1.1.0",
+> "@protobufjs/path": "^1.1.2",
+> "@protobufjs/pool": "^1.1.0",
+> "@protobufjs/utf8": "^1.1.0",
+> "@types/node": ">=13.7.0",
+> "long": "^5.0.0"
+> },
+> "engines": {
+> "node": ">=12.0.0"
+> }
+> },
+37932a37365,37381
+> "services/clsi/node_modules/ssh2": {
+> "version": "1.16.0",
+> "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz",
+> "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==",
+> "hasInstallScript": true,
+> "dependencies": {
+> "asn1": "^0.2.6",
+> "bcrypt-pbkdf": "^1.0.2"
+> },
+> "engines": {
+> "node": ">=10.16.0"
+> },
+> "optionalDependencies": {
+> "cpu-features": "~0.0.10",
+> "nan": "^2.20.0"
+> }
+> },
+37942a37392,37416
+> }
+> },
+> "services/clsi/node_modules/tar-fs": {
+> "version": "2.1.2",
+> "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
+> "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
+> "license": "MIT",
+> "dependencies": {
+> "chownr": "^1.1.1",
+> "mkdirp-classic": "^0.5.2",
+> "pump": "^3.0.0",
+> "tar-stream": "^2.1.4"
+> }
+> },
+> "services/clsi/node_modules/uuid": {
+> "version": "10.0.0",
+> "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+> "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+> "funding": [
+> "https://github.com/sponsors/broofa",
+> "https://github.com/sponsors/ctavan"
+> ],
+> "license": "MIT",
+> "bin": {
+> "uuid": "dist/bin/uuid"
diff --git a/server-ce/hotfix/5.5.1/Dockerfile b/server-ce/hotfix/5.5.1/Dockerfile
new file mode 100644
index 0000000000..9572d29740
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/Dockerfile
@@ -0,0 +1,28 @@
+FROM sharelatex/sharelatex:5.5.0
+
+
+# fix tls configuration in redis for history-v1
+COPY pr_25168.patch .
+RUN patch -p1 < pr_25168.patch && rm pr_25168.patch
+
+# improve logging in history system
+COPY pr_26086.patch .
+RUN patch -p1 < pr_26086.patch && rm pr_26086.patch
+
+# fix create-user.mjs script
+COPY pr_26152.patch .
+RUN patch -p1 < pr_26152.patch && rm pr_26152.patch
+
+# check mongo featureCompatibilityVersion
+COPY pr_26091.patch .
+RUN patch -p1 < pr_26091.patch && rm pr_26091.patch
+
+# update multer and tar-fs
+RUN sed -i 's/"multer": "2.0.0"/"multer": "2.0.1"/g' package.json
+RUN sed -i 's/"dockerode": "^4.0.5"/"dockerode": "^4.0.7"/g' services/clsi/package.json
+RUN sed -i 's/"tar-fs": "^3.0.4"/"tar-fs": "^3.0.9"/g' services/clsi/package.json
+RUN sed -i 's/199c5ff05bd375c508f4074498237baead7f5148/4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23/g' services/web/package.json
+COPY package-lock.json.diff .
+RUN patch package-lock.json < package-lock.json.diff
+RUN npm install --omit=dev
+RUN npm install @paralleldrive/cuid2@2.2.2 -w services/history-v1
diff --git a/server-ce/hotfix/5.5.1/package-lock.json.diff b/server-ce/hotfix/5.5.1/package-lock.json.diff
new file mode 100644
index 0000000000..ecbf851bc8
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/package-lock.json.diff
@@ -0,0 +1,2202 @@
+4954,4956c4954,4957
+< "version": "1.8.22",
+< "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.22.tgz",
+< "integrity": "sha512-oAjDdN7fzbUi+4hZjKG96MR6KTEubAeMpQEb+77qy+3r0Ua5xTFuie6JOLr4ZZgl5g+W5/uRTS2M1V8mVAFPuA==",
+---
+> "version": "1.13.4",
+> "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz",
+> "integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==",
+> "license": "Apache-2.0",
+4958,4959c4959,4960
+< "@grpc/proto-loader": "^0.7.0",
+< "@types/node": ">=12.12.47"
+---
+> "@grpc/proto-loader": "^0.7.13",
+> "@js-sdsl/ordered-map": "^4.4.2"
+4962c4963
+< "node": "^8.13.0 || >=10.10.0"
+---
+> "node": ">=12.10.0"
+5915a5917,5928
+> "node_modules/@noble/hashes": {
+> "version": "1.8.0",
+> "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+> "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+> "license": "MIT",
+> "engines": {
+> "node": "^14.21.3 || >=16"
+> },
+> "funding": {
+> "url": "https://paulmillr.com/funding/"
+> }
+> },
+7528a7542,7550
+> "node_modules/@paralleldrive/cuid2": {
+> "version": "2.2.2",
+> "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
+> "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+> "license": "MIT",
+> "dependencies": {
+> "@noble/hashes": "^1.1.5"
+> }
+> },
+13479,13481c13501,13503
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+< "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+---
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+> "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+13484,13485c13506,13507
+< "call-bind": "^1.0.5",
+< "is-array-buffer": "^3.0.4"
+---
+> "call-bound": "^1.0.3",
+> "is-array-buffer": "^3.0.5"
+13601,13603c13623,13625
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+< "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+---
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+> "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+13607c13629
+< "call-bind": "^1.0.5",
+---
+> "call-bind": "^1.0.8",
+13609,13613c13631,13634
+< "es-abstract": "^1.22.3",
+< "es-errors": "^1.2.1",
+< "get-intrinsic": "^1.2.3",
+< "is-array-buffer": "^3.0.4",
+< "is-shared-array-buffer": "^1.0.2"
+---
+> "es-abstract": "^1.23.5",
+> "es-errors": "^1.3.0",
+> "get-intrinsic": "^1.2.6",
+> "is-array-buffer": "^3.0.4"
+13706a13728,13736
+> "node_modules/async-function": {
+> "version": "1.0.0",
+> "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+> "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+14255,14257c14285,14287
+< "version": "4.0.1",
+< "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.1.tgz",
+< "integrity": "sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==",
+---
+> "version": "4.1.5",
+> "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz",
+> "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==",
+14261c14291
+< "bare-events": "^2.0.0",
+---
+> "bare-events": "^2.5.4",
+14263c14293
+< "bare-stream": "^2.0.0"
+---
+> "bare-stream": "^2.6.4"
+14266c14296,14304
+< "bare": ">=1.7.0"
+---
+> "bare": ">=1.16.0"
+> },
+> "peerDependencies": {
+> "bare-buffer": "*"
+> },
+> "peerDependenciesMeta": {
+> "bare-buffer": {
+> "optional": true
+> }
+14270,14272c14308,14310
+< "version": "3.6.0",
+< "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.0.tgz",
+< "integrity": "sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw==",
+---
+> "version": "3.6.1",
+> "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
+> "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
+15110,15112c15148,15151
+< "version": "1.0.7",
+< "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+< "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+---
+> "version": "1.0.8",
+> "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+> "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+> "license": "MIT",
+15113a15153
+> "call-bind-apply-helpers": "^1.0.0",
+15115,15116d15154
+< "es-errors": "^1.3.0",
+< "function-bind": "^1.1.2",
+15118c15156,15185
+< "set-function-length": "^1.2.1"
+---
+> "set-function-length": "^1.2.2"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+> "node_modules/call-bind-apply-helpers": {
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+> "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+> "license": "MIT",
+> "dependencies": {
+> "es-errors": "^1.3.0",
+> "function-bind": "^1.1.2"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+> "node_modules/call-bound": {
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+> "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bind-apply-helpers": "^1.0.2",
+> "get-intrinsic": "^1.3.0"
+15423c15490,15491
+< "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+---
+> "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+> "license": "ISC"
+15751,15756c15819,15822
+< "version": "4.1.1",
+< "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+< "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+< "engines": {
+< "node": ">= 6"
+< }
+---
+> "version": "2.11.0",
+> "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+> "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+> "license": "MIT"
+15871,15873c15937,15939
+< "version": "1.6.2",
+< "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+< "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+---
+> "version": "2.0.0",
+> "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+> "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+15875c15941
+< "node >= 0.8"
+---
+> "node >= 6.0"
+15876a15943
+> "license": "MIT",
+15880c15947
+< "readable-stream": "^2.2.2",
+---
+> "readable-stream": "^3.0.2",
+15884,15910d15950
+< "node_modules/concat-stream/node_modules/isarray": {
+< "version": "1.0.0",
+< "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+< "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+< },
+< "node_modules/concat-stream/node_modules/readable-stream": {
+< "version": "2.3.8",
+< "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+< "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+< "dependencies": {
+< "core-util-is": "~1.0.0",
+< "inherits": "~2.0.3",
+< "isarray": "~1.0.0",
+< "process-nextick-args": "~2.0.0",
+< "safe-buffer": "~5.1.1",
+< "string_decoder": "~1.1.1",
+< "util-deprecate": "~1.0.1"
+< }
+< },
+< "node_modules/concat-stream/node_modules/string_decoder": {
+< "version": "1.1.1",
+< "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+< "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+< "dependencies": {
+< "safe-buffer": "~5.1.0"
+< }
+< },
+16125c16165,16166
+< "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
+---
+> "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
+> "license": "MIT"
+16337a16379,16392
+> "node_modules/cpu-features": {
+> "version": "0.0.10",
+> "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
+> "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
+> "hasInstallScript": true,
+> "optional": true,
+> "dependencies": {
+> "buildcheck": "~0.0.6",
+> "nan": "^2.19.0"
+> },
+> "engines": {
+> "node": ">=10.0.0"
+> }
+> },
+17268,17270c17323,17325
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+< "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+---
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+> "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+17273c17328
+< "call-bind": "^1.0.6",
+---
+> "call-bound": "^1.0.3",
+17275c17330
+< "is-data-view": "^1.0.1"
+---
+> "is-data-view": "^1.0.2"
+17285,17287c17340,17342
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+< "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+---
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+> "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+17290c17345
+< "call-bind": "^1.0.7",
+---
+> "call-bound": "^1.0.3",
+17292c17347
+< "is-data-view": "^1.0.1"
+---
+> "is-data-view": "^1.0.2"
+17298c17353
+< "url": "https://github.com/sponsors/ljharb"
+---
+> "url": "https://github.com/sponsors/inspect-js"
+17302,17304c17357,17359
+< "version": "1.0.0",
+< "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+< "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+---
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+> "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+17307c17362
+< "call-bind": "^1.0.6",
+---
+> "call-bound": "^1.0.2",
+17666a17722,17731
+> "node_modules/dezalgo": {
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+> "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+> "license": "ISC",
+> "dependencies": {
+> "asap": "^2.0.0",
+> "wrappy": "1"
+> }
+> },
+17725a17791,17872
+> "node_modules/docker-modem": {
+> "version": "5.0.6",
+> "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz",
+> "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "debug": "^4.1.1",
+> "readable-stream": "^3.5.0",
+> "split-ca": "^1.0.1",
+> "ssh2": "^1.15.0"
+> },
+> "engines": {
+> "node": ">= 8.0"
+> }
+> },
+> "node_modules/dockerode": {
+> "version": "4.0.7",
+> "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.7.tgz",
+> "integrity": "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==",
+> "license": "Apache-2.0",
+> "dependencies": {
+> "@balena/dockerignore": "^1.0.2",
+> "@grpc/grpc-js": "^1.11.1",
+> "@grpc/proto-loader": "^0.7.13",
+> "docker-modem": "^5.0.6",
+> "protobufjs": "^7.3.2",
+> "tar-fs": "~2.1.2",
+> "uuid": "^10.0.0"
+> },
+> "engines": {
+> "node": ">= 8.0"
+> }
+> },
+> "node_modules/dockerode/node_modules/protobufjs": {
+> "version": "7.5.3",
+> "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz",
+> "integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==",
+> "hasInstallScript": true,
+> "license": "BSD-3-Clause",
+> "dependencies": {
+> "@protobufjs/aspromise": "^1.1.2",
+> "@protobufjs/base64": "^1.1.2",
+> "@protobufjs/codegen": "^2.0.4",
+> "@protobufjs/eventemitter": "^1.1.0",
+> "@protobufjs/fetch": "^1.1.0",
+> "@protobufjs/float": "^1.0.2",
+> "@protobufjs/inquire": "^1.1.0",
+> "@protobufjs/path": "^1.1.2",
+> "@protobufjs/pool": "^1.1.0",
+> "@protobufjs/utf8": "^1.1.0",
+> "@types/node": ">=13.7.0",
+> "long": "^5.0.0"
+> },
+> "engines": {
+> "node": ">=12.0.0"
+> }
+> },
+> "node_modules/dockerode/node_modules/tar-fs": {
+> "version": "2.1.3",
+> "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
+> "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+> "license": "MIT",
+> "dependencies": {
+> "chownr": "^1.1.1",
+> "mkdirp-classic": "^0.5.2",
+> "pump": "^3.0.0",
+> "tar-stream": "^2.1.4"
+> }
+> },
+> "node_modules/dockerode/node_modules/uuid": {
+> "version": "10.0.0",
+> "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+> "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+> "funding": [
+> "https://github.com/sponsors/broofa",
+> "https://github.com/sponsors/ctavan"
+> ],
+> "license": "MIT",
+> "bin": {
+> "uuid": "dist/bin/uuid"
+> }
+> },
+17926a18074,18087
+> "node_modules/dunder-proto": {
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+> "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bind-apply-helpers": "^1.0.1",
+> "es-errors": "^1.3.0",
+> "gopd": "^1.2.0"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+18212,18214c18373,18375
+< "version": "1.23.3",
+< "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+< "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+---
+> "version": "1.24.0",
+> "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+> "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+18217,18218c18378,18379
+< "array-buffer-byte-length": "^1.0.1",
+< "arraybuffer.prototype.slice": "^1.0.3",
+---
+> "array-buffer-byte-length": "^1.0.2",
+> "arraybuffer.prototype.slice": "^1.0.4",
+18220,18224c18381,18386
+< "call-bind": "^1.0.7",
+< "data-view-buffer": "^1.0.1",
+< "data-view-byte-length": "^1.0.1",
+< "data-view-byte-offset": "^1.0.0",
+< "es-define-property": "^1.0.0",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.4",
+> "data-view-buffer": "^1.0.2",
+> "data-view-byte-length": "^1.0.2",
+> "data-view-byte-offset": "^1.0.1",
+> "es-define-property": "^1.0.1",
+18226,18233c18388,18396
+< "es-object-atoms": "^1.0.0",
+< "es-set-tostringtag": "^2.0.3",
+< "es-to-primitive": "^1.2.1",
+< "function.prototype.name": "^1.1.6",
+< "get-intrinsic": "^1.2.4",
+< "get-symbol-description": "^1.0.2",
+< "globalthis": "^1.0.3",
+< "gopd": "^1.0.1",
+---
+> "es-object-atoms": "^1.1.1",
+> "es-set-tostringtag": "^2.1.0",
+> "es-to-primitive": "^1.3.0",
+> "function.prototype.name": "^1.1.8",
+> "get-intrinsic": "^1.3.0",
+> "get-proto": "^1.0.1",
+> "get-symbol-description": "^1.1.0",
+> "globalthis": "^1.0.4",
+> "gopd": "^1.2.0",
+18235,18236c18398,18399
+< "has-proto": "^1.0.3",
+< "has-symbols": "^1.0.3",
+---
+> "has-proto": "^1.2.0",
+> "has-symbols": "^1.1.0",
+18238,18239c18401,18402
+< "internal-slot": "^1.0.7",
+< "is-array-buffer": "^3.0.4",
+---
+> "internal-slot": "^1.1.0",
+> "is-array-buffer": "^3.0.5",
+18241c18404
+< "is-data-view": "^1.0.1",
+---
+> "is-data-view": "^1.0.2",
+18243,18248c18406,18413
+< "is-regex": "^1.1.4",
+< "is-shared-array-buffer": "^1.0.3",
+< "is-string": "^1.0.7",
+< "is-typed-array": "^1.1.13",
+< "is-weakref": "^1.0.2",
+< "object-inspect": "^1.13.1",
+---
+> "is-regex": "^1.2.1",
+> "is-set": "^2.0.3",
+> "is-shared-array-buffer": "^1.0.4",
+> "is-string": "^1.1.1",
+> "is-typed-array": "^1.1.15",
+> "is-weakref": "^1.1.1",
+> "math-intrinsics": "^1.1.0",
+> "object-inspect": "^1.13.4",
+18250,18255c18415,18424
+< "object.assign": "^4.1.5",
+< "regexp.prototype.flags": "^1.5.2",
+< "safe-array-concat": "^1.1.2",
+< "safe-regex-test": "^1.0.3",
+< "string.prototype.trim": "^1.2.9",
+< "string.prototype.trimend": "^1.0.8",
+---
+> "object.assign": "^4.1.7",
+> "own-keys": "^1.0.1",
+> "regexp.prototype.flags": "^1.5.4",
+> "safe-array-concat": "^1.1.3",
+> "safe-push-apply": "^1.0.0",
+> "safe-regex-test": "^1.1.0",
+> "set-proto": "^1.0.0",
+> "stop-iteration-iterator": "^1.1.0",
+> "string.prototype.trim": "^1.2.10",
+> "string.prototype.trimend": "^1.0.9",
+18257,18262c18426,18431
+< "typed-array-buffer": "^1.0.2",
+< "typed-array-byte-length": "^1.0.1",
+< "typed-array-byte-offset": "^1.0.2",
+< "typed-array-length": "^1.0.6",
+< "unbox-primitive": "^1.0.2",
+< "which-typed-array": "^1.1.15"
+---
+> "typed-array-buffer": "^1.0.3",
+> "typed-array-byte-length": "^1.0.3",
+> "typed-array-byte-offset": "^1.0.4",
+> "typed-array-length": "^1.0.7",
+> "unbox-primitive": "^1.1.0",
+> "which-typed-array": "^1.1.19"
+18272,18277c18441,18444
+< "version": "1.0.0",
+< "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+< "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+< "dependencies": {
+< "get-intrinsic": "^1.2.4"
+< },
+---
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+> "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+> "license": "MIT",
+18318,18320c18485,18487
+< "version": "1.0.0",
+< "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+< "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+> "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+18330,18332c18497,18499
+< "version": "2.0.3",
+< "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+< "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+---
+> "version": "2.1.0",
+> "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+> "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+18335c18502,18503
+< "get-intrinsic": "^1.2.4",
+---
+> "es-errors": "^1.3.0",
+> "get-intrinsic": "^1.2.6",
+18337c18505
+< "hasown": "^2.0.1"
+---
+> "hasown": "^2.0.2"
+18353,18355c18521,18524
+< "version": "1.2.1",
+< "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+< "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+---
+> "version": "1.3.0",
+> "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+> "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+> "license": "MIT",
+18357,18359c18526,18528
+< "is-callable": "^1.1.4",
+< "is-date-object": "^1.0.1",
+< "is-symbol": "^1.0.2"
+---
+> "is-callable": "^1.2.7",
+> "is-date-object": "^1.0.5",
+> "is-symbol": "^1.0.4"
+20463a20633,20638
+> "node_modules/fast-safe-stringify": {
+> "version": "2.1.1",
+> "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+> "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+> "license": "MIT"
+> },
+20933,20935c21108,21111
+< "version": "0.3.3",
+< "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+< "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+---
+> "version": "0.3.5",
+> "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+> "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+> "license": "MIT",
+20937c21113,21119
+< "is-callable": "^1.1.3"
+---
+> "is-callable": "^1.2.7"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+21100a21283
+> "license": "MIT",
+21272,21274c21455,21458
+< "version": "1.1.6",
+< "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+< "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+---
+> "version": "1.1.8",
+> "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+> "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+> "license": "MIT",
+21276,21279c21460,21465
+< "call-bind": "^1.0.2",
+< "define-properties": "^1.2.0",
+< "es-abstract": "^1.22.1",
+< "functions-have-names": "^1.2.3"
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.3",
+> "define-properties": "^1.2.1",
+> "functions-have-names": "^1.2.3",
+> "hasown": "^2.0.2",
+> "is-callable": "^1.2.7"
+21385,21387c21571,21574
+< "version": "1.2.4",
+< "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+< "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+---
+> "version": "1.3.0",
+> "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+> "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+> "license": "MIT",
+21388a21576,21577
+> "call-bind-apply-helpers": "^1.0.2",
+> "es-define-property": "^1.0.1",
+21389a21579
+> "es-object-atoms": "^1.1.1",
+21391,21393c21581,21585
+< "has-proto": "^1.0.1",
+< "has-symbols": "^1.0.3",
+< "hasown": "^2.0.0"
+---
+> "get-proto": "^1.0.1",
+> "gopd": "^1.2.0",
+> "has-symbols": "^1.1.0",
+> "hasown": "^2.0.2",
+> "math-intrinsics": "^1.1.0"
+21420a21613,21625
+> "node_modules/get-proto": {
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+> "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+> "license": "MIT",
+> "dependencies": {
+> "dunder-proto": "^1.0.1",
+> "es-object-atoms": "^1.0.0"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+21437,21439c21642,21644
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+< "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+> "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+21442c21647
+< "call-bind": "^1.0.5",
+---
+> "call-bound": "^1.0.3",
+21444c21649
+< "get-intrinsic": "^1.2.4"
+---
+> "get-intrinsic": "^1.2.6"
+21664,21666c21869,21872
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+< "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+---
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+> "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+> "license": "MIT",
+21668c21874,21875
+< "define-properties": "^1.1.3"
+---
+> "define-properties": "^1.2.1",
+> "gopd": "^1.0.1"
+22055,22059c22262,22267
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+< "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+< "dependencies": {
+< "get-intrinsic": "^1.1.3"
+---
+> "version": "1.2.0",
+> "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+> "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+22079a22288
+> "license": "MIT",
+22300,22302c22509,22511
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+< "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+---
+> "version": "1.2.0",
+> "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+> "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+22303a22513,22515
+> "dependencies": {
+> "dunder-proto": "^1.0.0"
+> },
+22312,22314c22524,22527
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+< "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+> "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+> "license": "MIT",
+23257,23259c23470,23472
+< "version": "1.0.7",
+< "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+< "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+> "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+23263,23264c23476,23477
+< "hasown": "^2.0.0",
+< "side-channel": "^1.0.4"
+---
+> "hasown": "^2.0.2",
+> "side-channel": "^1.1.0"
+23402,23404c23615,23617
+< "version": "3.0.4",
+< "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+< "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+---
+> "version": "3.0.5",
+> "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+> "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+23407,23408c23620,23622
+< "call-bind": "^1.0.2",
+< "get-intrinsic": "^1.2.1"
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.3",
+> "get-intrinsic": "^1.2.6"
+23422a23637,23655
+> "node_modules/is-async-function": {
+> "version": "2.1.1",
+> "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+> "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+> "license": "MIT",
+> "dependencies": {
+> "async-function": "^1.0.0",
+> "call-bound": "^1.0.3",
+> "get-proto": "^1.0.1",
+> "has-tostringtag": "^1.0.2",
+> "safe-regex-test": "^1.1.0"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+23424,23426c23657,23660
+< "version": "1.0.4",
+< "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+< "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+> "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+> "license": "MIT",
+23428c23662,23665
+< "has-bigints": "^1.0.1"
+---
+> "has-bigints": "^1.0.2"
+> },
+> "engines": {
+> "node": ">= 0.4"
+23447,23449c23684,23687
+< "version": "1.1.2",
+< "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+< "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+---
+> "version": "1.2.2",
+> "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+> "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+> "license": "MIT",
+23451,23452c23689,23690
+< "call-bind": "^1.0.2",
+< "has-tostringtag": "^1.0.0"
+---
+> "call-bound": "^1.0.3",
+> "has-tostringtag": "^1.0.2"
+23517,23519c23755,23757
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+< "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+---
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+> "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+23521a23760,23761
+> "call-bound": "^1.0.2",
+> "get-intrinsic": "^1.2.6",
+23532,23534c23772,23775
+< "version": "1.0.5",
+< "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+< "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+> "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+> "license": "MIT",
+23536c23777,23778
+< "has-tostringtag": "^1.0.0"
+---
+> "call-bound": "^1.0.2",
+> "has-tostringtag": "^1.0.2"
+23601a23844,23858
+> "node_modules/is-finalizationregistry": {
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+> "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bound": "^1.0.3"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+23688,23691c23945,23951
+< "version": "2.0.2",
+< "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+< "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+< "dev": true,
+---
+> "version": "2.0.3",
+> "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+> "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> },
+23753,23755c24013,24016
+< "version": "1.0.7",
+< "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+< "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+> "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+> "license": "MIT",
+23757c24018,24019
+< "has-tostringtag": "^1.0.0"
+---
+> "call-bound": "^1.0.3",
+> "has-tostringtag": "^1.0.2"
+23817,23819c24079,24082
+< "version": "1.1.4",
+< "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+< "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+---
+> "version": "1.2.1",
+> "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+> "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+> "license": "MIT",
+23821,23822c24084,24087
+< "call-bind": "^1.0.2",
+< "has-tostringtag": "^1.0.0"
+---
+> "call-bound": "^1.0.2",
+> "gopd": "^1.2.0",
+> "has-tostringtag": "^1.0.2",
+> "hasown": "^2.0.2"
+23832,23835c24097,24103
+< "version": "2.0.2",
+< "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+< "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+< "dev": true,
+---
+> "version": "2.0.3",
+> "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+> "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> },
+23848,23850c24116,24118
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+< "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+---
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+> "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+23853c24121
+< "call-bind": "^1.0.7"
+---
+> "call-bound": "^1.0.3"
+23874,23876c24142,24145
+< "version": "1.0.7",
+< "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+< "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+> "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+> "license": "MIT",
+23878c24147,24148
+< "has-tostringtag": "^1.0.0"
+---
+> "call-bound": "^1.0.3",
+> "has-tostringtag": "^1.0.2"
+23888,23890c24158,24161
+< "version": "1.0.4",
+< "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+< "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+> "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+> "license": "MIT",
+23892c24163,24165
+< "has-symbols": "^1.0.2"
+---
+> "call-bound": "^1.0.2",
+> "has-symbols": "^1.1.0",
+> "safe-regex-test": "^1.1.0"
+23902,23904c24175,24177
+< "version": "1.1.13",
+< "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+< "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+---
+> "version": "1.1.15",
+> "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+> "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+23907c24180
+< "which-typed-array": "^1.1.14"
+---
+> "which-typed-array": "^1.1.16"
+23943,23946c24216,24222
+< "version": "2.0.1",
+< "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+< "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+< "dev": true,
+---
+> "version": "2.0.2",
+> "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+> "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> },
+23952,23954c24228,24231
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+< "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+> "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+> "license": "MIT",
+23956c24233,24236
+< "call-bind": "^1.0.2"
+---
+> "call-bound": "^1.0.3"
+> },
+> "engines": {
+> "node": ">= 0.4"
+23963,23966c24243,24246
+< "version": "2.0.2",
+< "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+< "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+< "dev": true,
+---
+> "version": "2.0.4",
+> "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+> "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+> "license": "MIT",
+23968,23969c24248,24252
+< "call-bind": "^1.0.2",
+< "get-intrinsic": "^1.1.1"
+---
+> "call-bound": "^1.0.3",
+> "get-intrinsic": "^1.2.6"
+> },
+> "engines": {
+> "node": ">= 0.4"
+24543a24827
+> "license": "MIT",
+24564a24849
+> "license": "MIT",
+24568a24854,24862
+> "node_modules/json-refs/node_modules/commander": {
+> "version": "4.1.1",
+> "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+> "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 6"
+> }
+> },
+24572a24867
+> "license": "MIT",
+24584a24880
+> "license": "MIT",
+25175,25187d25470
+< "node_modules/less/node_modules/mime": {
+< "version": "1.6.0",
+< "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+< "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+< "dev": true,
+< "optional": true,
+< "bin": {
+< "mime": "cli.js"
+< },
+< "engines": {
+< "node": ">=4"
+< }
+< },
+25335c25618,25619
+< "integrity": "sha1-6I7suS4ruEyQZWEv2VigcZzUf5Q="
+---
+> "integrity": "sha512-tC2aLC7bbkDXKNrjDu9OLiVx9pFIvjinID2eD9PzNdAQGZScWUd/h8faqOw5d6oLsOvFRCRbz1ASoB+deyMVUw==",
+> "license": "MIT"
+25340c25624,25625
+< "integrity": "sha1-6UC5690nwyfgqNqxtVkWxTQelXU=",
+---
+> "integrity": "sha512-VGHm6DH+1UiuafQdE/DNMqxOcSyhRu0xO9+jPDq7xITRn5YOorGrHVQmavMVXCYmTm80YRTZZCn/jTW7MokwLg==",
+> "license": "MIT",
+25351c25636,25637
+< "integrity": "sha1-MPgj5X4X43NdODvWK2Czh1Q7QYY=",
+---
+> "integrity": "sha512-+zJVXs0VxC/Au+/7foiKzw8UaWvfSfPh20XhqK/6HFQiUeclL5fz05zY7G9yDAFItAKKZwB4cgpzGvxiwuG1wQ==",
+> "license": "MIT",
+25366c25652,25653
+< "integrity": "sha1-+Ob1tXip405UEXm1a47uv0oofgg=",
+---
+> "integrity": "sha512-8JJ3FnMPm54t3BwPLk8q8mPyQKQXm/rt9df+awr4NGtyJrtcCXM3Of1I86S6jVy1b4yAyFBb8wbKPEauuqzRmQ==",
+> "license": "MIT",
+25376c25663,25664
+< "integrity": "sha1-fQsmdknLKeehOdAQO3wR+uhOSFE=",
+---
+> "integrity": "sha512-SLczhg860fGW7AKlYcuOFstDtJuQhaANlJ4Y/jrOoRxhmVtK41vbJDH3OefVRSRkSCQo4HI82QVkAVsoGa5gSw==",
+> "license": "MIT",
+25387c25675,25676
+< "integrity": "sha1-TTHy595+E0+/KAN2K4FQsyUZZm8=",
+---
+> "integrity": "sha512-x2ja1fa/qmzbizuXgVM4QAP9svtMbdxjG8Anl9bCeDAwLOVQ1vLrA0hLb/NkpbGi9evjtkl0aWLTEoOlUdBPQA==",
+> "license": "MIT",
+25398c25687,25688
+< "integrity": "sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc=",
+---
+> "integrity": "sha512-5TCfLt1haQpsa7bgLYRKNNE4yqhO4ZxIayN1btQmazMchO6Q8JYFRMqbJ3W+uNmMm4R0Jw7KGkZX5YfDDnywuw==",
+> "license": "MIT",
+25409c25699,25700
+< "integrity": "sha1-+vH3+BD6mFolHCGHQESBCUg55e4=",
+---
+> "integrity": "sha512-iIrScwY3atGvLVbQL/+CNUznaPwBJg78S/JO4cTUFXRkRsZgEBhscB27cVoT4tsIOUyFu/5M/0umfHNGJ6wYwg==",
+> "license": "MIT",
+25417c25708,25709
+< "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw="
+---
+> "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==",
+> "license": "MIT"
+25422c25714,25715
+< "integrity": "sha1-nUgvRjuOZq++WcLBTtsRcGAXIzQ="
+---
+> "integrity": "sha512-xKDem1BxoIfcCtaJHotjtyfdIvZO9qrF+mv3G1+ngQmaI3MJt3Qm46i9HLk/CbzABbavUrr1/EomQT8KxtsrYA==",
+> "license": "MIT"
+25427c25720,25721
+< "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE="
+---
+> "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==",
+> "license": "MIT"
+25432c25726,25727
+< "integrity": "sha1-phOWMNdtFTawfdyAliiJsIL2pkE=",
+---
+> "integrity": "sha512-wwCwWX8PK/mYR5VZjcU5JFl6py/qrfLGMxzpKOfSqgA1PaZ6Z625CZLCxH1KsqyxSkOFmNm+mEYjeDpXlM4hrg==",
+> "license": "MIT",
+25441c25736,25737
+< "integrity": "sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI=",
+---
+> "integrity": "sha512-Vx0XKzpg2DFbQw4wrp1xSWd2sfl3W/BG6bucSRZmftS1AzbWRemCmBQDxyQTNhlLNec428PXkuuja+VNBZgu2A==",
+> "license": "MIT",
+25450c25746,25747
+< "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
+---
+> "integrity": "sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==",
+> "license": "MIT",
+25458c25755,25756
+< "integrity": "sha1-dFz0GlNZexj2iImFREBe+isG2Q8="
+---
+> "integrity": "sha512-+odPJa4PE2UgYnQgJgkLs0UD03QU78R2ivhrFnG9GdtYOZdE6ObxOj7KiUEUlqOOgatFT+ZqSypFjDSduTigKg==",
+> "license": "MIT"
+25463c25761,25762
+< "integrity": "sha1-hMOVlt1xGBqXsGUpE6fJZ15Jsao=",
+---
+> "integrity": "sha512-AqQ4AJz5buSx9ELXWt5dONwJyVPd4NTADMKhoVYWCugjoVf172/LpvVhwmSJn4g8/Dc0S8hxTe8rt5Dob3X9KQ==",
+> "license": "MIT",
+25473c25772,25773
+< "integrity": "sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc=",
+---
+> "integrity": "sha512-hn2VWYZ+N9aYncRad4jORvlGgpFrn+axnPIWRvFxjk6CWcZH5b5alI8EymYsHITI23Z9wrW/+ORq+azrVFpOfw==",
+> "license": "MIT",
+25487c25787,25788
+< "integrity": "sha1-8pIDtAsS/uCkXTYxZIJZvrq8eGg=",
+---
+> "integrity": "sha512-zj5vReFLkR+lJOBKP1wyteZ13zut/KSmXtdCBgxcy/m4UTitcBxpeVZT7gwk8BQrztPI5dIgO4bhBppXV4rpTQ==",
+> "license": "MIT",
+25517c25818,25819
+< "integrity": "sha1-/j/Do0yGyUyrb5UiVgKCdB4BYwk=",
+---
+> "integrity": "sha512-AvOobAkE7qBtIiHU5QHQIfveWH5Usr9pIcFIzBv7u4S6bvb3FWpFrh9ltqBY7UeL5lw6e8d+SggiUXQVyh+FpA==",
+> "license": "MIT",
+25526c25828,25829
+< "integrity": "sha1-eLQer+FAX6lmRZ6kGT/VAtCEUks=",
+---
+> "integrity": "sha512-VC+CKm/zSs5t3i/MHv71HZoQphuqOvez1xhjWBwHU5zAbsCYrqwHr+MyQyMk14HzA3hSRNA5lCqDMSw5G2Qscg==",
+> "license": "MIT",
+25547c25850,25851
+< "integrity": "sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE="
+---
+> "integrity": "sha512-VRYX+8XipeLjorag5bz3YBBRJ+5kj8hVBzfnaHgXPZAVTYowBdY5l0M5ZnOmlAMCOXBFabQtm7f5VqjMKEji0w==",
+> "license": "MIT"
+25562c25866,25867
+< "integrity": "sha1-tSoybB9i9tfac6MdVAHfbvRPD6E=",
+---
+> "integrity": "sha512-yRDd0z+APziDqbk0MqR6Qfwj/Qn3jLxFJbI9U8MuvdTnqIXdZ5YXyGLnwuzCpZmjr26F1GNOjKLMMZ10i/wy6A==",
+> "license": "MIT",
+25575c25880,25882
+< "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+---
+> "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+> "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
+> "license": "MIT"
+25580c25887,25888
+< "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE="
+---
+> "integrity": "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==",
+> "license": "MIT"
+25595c25903,25904
+< "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
+---
+> "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==",
+> "license": "MIT",
+25613c25922,25923
+< "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
+---
+> "integrity": "sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==",
+> "license": "MIT",
+25634c25944,25945
+< "integrity": "sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o="
+---
+> "integrity": "sha512-uNcV98/blRhInPUGQEnj9ekXXfG+q+rfoNSFZgl/eBfog9yBDW9gfUv2AHX/rAF7zZRlzWhbslGhbGQFZlCkZA==",
+> "license": "MIT"
+25650c25961,25962
+< "integrity": "sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU=",
+---
+> "integrity": "sha512-6SwqWwGFHhTXEiqB/yQgu8FYd//tm786d49y7kizHVCJH7zdzs191UQn3ES3tkkDbUddNRfkCRYqJFHtbLnbCw==",
+> "license": "MIT",
+25997a26310,26318
+> "node_modules/math-intrinsics": {
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+> "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+26577a26899,26910
+> "node_modules/mime": {
+> "version": "1.6.0",
+> "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+> "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+> "license": "MIT",
+> "bin": {
+> "mime": "cli.js"
+> },
+> "engines": {
+> "node": ">=4"
+> }
+> },
+26579,26581c26912,26915
+< "version": "1.51.0",
+< "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
+< "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
+---
+> "version": "1.52.0",
+> "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+> "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+> "license": "MIT",
+26597,26599c26931,26934
+< "version": "2.1.34",
+< "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
+< "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
+---
+> "version": "2.1.35",
+> "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+> "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+> "license": "MIT",
+26601c26936
+< "mime-db": "1.51.0"
+---
+> "mime-db": "1.52.0"
+26792c27127,27128
+< "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+---
+> "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+> "license": "MIT"
+27248,27250c27584,27586
+< "version": "2.0.0",
+< "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.0.tgz",
+< "integrity": "sha512-bS8rPZurbAuHGAnApbM9d4h1wSoYqrOqkE+6a64KLMK9yWU7gJXBDDVklKQ3TPi9DRb85cRs6yXaC0+cjxRtRg==",
+---
+> "version": "2.0.1",
+> "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz",
+> "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==",
+27254,27256c27590,27592
+< "busboy": "^1.0.0",
+< "concat-stream": "^1.5.2",
+< "mkdirp": "^0.5.4",
+---
+> "busboy": "^1.6.0",
+> "concat-stream": "^2.0.0",
+> "mkdirp": "^0.5.6",
+27258,27259c27594,27595
+< "type-is": "^1.6.4",
+< "xtend": "^4.0.0"
+---
+> "type-is": "^1.6.18",
+> "xtend": "^4.0.2"
+27384c27720,27721
+< "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+---
+> "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==",
+> "license": "MIT"
+27842,27844c28179,28185
+< "version": "1.13.1",
+< "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+< "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+---
+> "version": "1.13.4",
+> "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+> "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.4"
+> },
+27886,27888c28227,28229
+< "version": "4.1.5",
+< "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+< "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+---
+> "version": "4.1.7",
+> "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+> "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+27891c28232,28233
+< "call-bind": "^1.0.5",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.3",
+27893c28235,28236
+< "has-symbols": "^1.0.3",
+---
+> "es-object-atoms": "^1.0.0",
+> "has-symbols": "^1.1.0",
+28129a28473,28489
+> "node_modules/own-keys": {
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+> "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+> "license": "MIT",
+> "dependencies": {
+> "get-intrinsic": "^1.2.6",
+> "object-keys": "^1.1.1",
+> "safe-push-apply": "^1.0.0"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+28684,28686c29044,29047
+< "version": "1.0.10",
+< "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz",
+< "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==",
+---
+> "version": "1.0.12",
+> "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz",
+> "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==",
+> "license": "MIT",
+28689c29050,29129
+< "superagent": "^3.8.3"
+---
+> "superagent": "^7.1.6"
+> }
+> },
+> "node_modules/path-loader/node_modules/debug": {
+> "version": "4.4.1",
+> "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+> "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+> "license": "MIT",
+> "dependencies": {
+> "ms": "^2.1.3"
+> },
+> "engines": {
+> "node": ">=6.0"
+> },
+> "peerDependenciesMeta": {
+> "supports-color": {
+> "optional": true
+> }
+> }
+> },
+> "node_modules/path-loader/node_modules/formidable": {
+> "version": "2.1.5",
+> "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz",
+> "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==",
+> "license": "MIT",
+> "dependencies": {
+> "@paralleldrive/cuid2": "^2.2.2",
+> "dezalgo": "^1.0.4",
+> "once": "^1.4.0",
+> "qs": "^6.11.0"
+> },
+> "funding": {
+> "url": "https://ko-fi.com/tunnckoCore/commissions"
+> }
+> },
+> "node_modules/path-loader/node_modules/mime": {
+> "version": "2.6.0",
+> "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+> "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+> "license": "MIT",
+> "bin": {
+> "mime": "cli.js"
+> },
+> "engines": {
+> "node": ">=4.0.0"
+> }
+> },
+> "node_modules/path-loader/node_modules/semver": {
+> "version": "7.7.2",
+> "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+> "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+> "license": "ISC",
+> "bin": {
+> "semver": "bin/semver.js"
+> },
+> "engines": {
+> "node": ">=10"
+> }
+> },
+> "node_modules/path-loader/node_modules/superagent": {
+> "version": "7.1.6",
+> "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz",
+> "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==",
+> "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net",
+> "license": "MIT",
+> "dependencies": {
+> "component-emitter": "^1.3.0",
+> "cookiejar": "^2.1.3",
+> "debug": "^4.3.4",
+> "fast-safe-stringify": "^2.1.1",
+> "form-data": "^4.0.0",
+> "formidable": "^2.0.1",
+> "methods": "^1.1.2",
+> "mime": "2.6.0",
+> "qs": "^6.10.3",
+> "readable-stream": "^3.6.0",
+> "semver": "^7.3.7"
+> },
+> "engines": {
+> "node": ">=6.4.0 <13 || >=14"
+31146a31587,31608
+> "node_modules/reflect.getprototypeof": {
+> "version": "1.0.10",
+> "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+> "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bind": "^1.0.8",
+> "define-properties": "^1.2.1",
+> "es-abstract": "^1.23.9",
+> "es-errors": "^1.3.0",
+> "es-object-atoms": "^1.0.0",
+> "get-intrinsic": "^1.2.7",
+> "get-proto": "^1.0.1",
+> "which-builtin-type": "^1.2.1"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+31211,31213c31673,31675
+< "version": "1.5.2",
+< "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
+< "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+---
+> "version": "1.5.4",
+> "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+> "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+31216c31678
+< "call-bind": "^1.0.6",
+---
+> "call-bind": "^1.0.8",
+31219c31681,31683
+< "set-function-name": "^2.0.1"
+---
+> "get-proto": "^1.0.1",
+> "gopd": "^1.2.0",
+> "set-function-name": "^2.0.2"
+31679,31681c32143,32145
+< "version": "1.1.2",
+< "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+< "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+---
+> "version": "1.1.3",
+> "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+> "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+31684,31686c32148,32151
+< "call-bind": "^1.0.7",
+< "get-intrinsic": "^1.2.4",
+< "has-symbols": "^1.0.3",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.2",
+> "get-intrinsic": "^1.2.6",
+> "has-symbols": "^1.1.0",
+31706a32172,32187
+> "node_modules/safe-push-apply": {
+> "version": "1.0.0",
+> "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+> "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+> "license": "MIT",
+> "dependencies": {
+> "es-errors": "^1.3.0",
+> "isarray": "^2.0.5"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+31717,31719c32198,32200
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+< "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+> "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+31722c32203
+< "call-bind": "^1.0.6",
+---
+> "call-bound": "^1.0.2",
+31724c32205
+< "is-regex": "^1.1.4"
+---
+> "is-regex": "^1.2.1"
+32123,32133d32603
+< "node_modules/send/node_modules/mime": {
+< "version": "1.6.0",
+< "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+< "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+< "bin": {
+< "mime": "cli.js"
+< },
+< "engines": {
+< "node": ">=4"
+< }
+< },
+32288,32290c32758,32761
+< "version": "2.0.1",
+< "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+< "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+---
+> "version": "2.0.2",
+> "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+> "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+> "license": "MIT",
+32292c32763,32764
+< "define-data-property": "^1.0.1",
+---
+> "define-data-property": "^1.1.4",
+> "es-errors": "^1.3.0",
+32294c32766,32780
+< "has-property-descriptors": "^1.0.0"
+---
+> "has-property-descriptors": "^1.0.2"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> }
+> },
+> "node_modules/set-proto": {
+> "version": "1.0.0",
+> "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+> "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+> "license": "MIT",
+> "dependencies": {
+> "dunder-proto": "^1.0.1",
+> "es-errors": "^1.3.0",
+> "es-object-atoms": "^1.0.0"
+32391,32393c32877,32880
+< "version": "1.0.6",
+< "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+< "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+> "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+> "license": "MIT",
+32395d32881
+< "call-bind": "^1.0.7",
+32397,32398c32883,32939
+< "get-intrinsic": "^1.2.4",
+< "object-inspect": "^1.13.1"
+---
+> "object-inspect": "^1.13.3",
+> "side-channel-list": "^1.0.0",
+> "side-channel-map": "^1.0.1",
+> "side-channel-weakmap": "^1.0.2"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+> "node_modules/side-channel-list": {
+> "version": "1.0.0",
+> "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+> "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+> "license": "MIT",
+> "dependencies": {
+> "es-errors": "^1.3.0",
+> "object-inspect": "^1.13.3"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+> "node_modules/side-channel-map": {
+> "version": "1.0.1",
+> "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+> "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bound": "^1.0.2",
+> "es-errors": "^1.3.0",
+> "get-intrinsic": "^1.2.5",
+> "object-inspect": "^1.13.3"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+> "node_modules/side-channel-weakmap": {
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+> "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bound": "^1.0.2",
+> "es-errors": "^1.3.0",
+> "get-intrinsic": "^1.2.5",
+> "object-inspect": "^1.13.3",
+> "side-channel-map": "^1.0.1"
+32871c33412,33413
+< "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
+---
+> "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==",
+> "license": "(WTFPL OR MIT)"
+32960c33502,33503
+< "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY="
+---
+> "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==",
+> "license": "ISC"
+32994a33538,33554
+> "node_modules/ssh2": {
+> "version": "1.16.0",
+> "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz",
+> "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==",
+> "hasInstallScript": true,
+> "dependencies": {
+> "asn1": "^0.2.6",
+> "bcrypt-pbkdf": "^1.0.2"
+> },
+> "engines": {
+> "node": ">=10.16.0"
+> },
+> "optionalDependencies": {
+> "cpu-features": "~0.0.10",
+> "nan": "^2.20.0"
+> }
+> },
+33095,33098c33655,33658
+< "version": "1.0.0",
+< "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+< "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+< "dev": true,
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+> "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+> "license": "MIT",
+33100c33660,33661
+< "internal-slot": "^1.0.4"
+---
+> "es-errors": "^1.3.0",
+> "internal-slot": "^1.1.0"
+33265,33267c33826,33828
+< "version": "1.2.9",
+< "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+< "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+---
+> "version": "1.2.10",
+> "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+> "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+33270c33831,33833
+< "call-bind": "^1.0.7",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.2",
+> "define-data-property": "^1.1.4",
+33272,33273c33835,33837
+< "es-abstract": "^1.23.0",
+< "es-object-atoms": "^1.0.0"
+---
+> "es-abstract": "^1.23.5",
+> "es-object-atoms": "^1.0.0",
+> "has-property-descriptors": "^1.0.2"
+33283,33285c33847,33849
+< "version": "1.0.8",
+< "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+< "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+---
+> "version": "1.0.9",
+> "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+> "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+33288c33852,33853
+< "call-bind": "^1.0.7",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.2",
+33291a33857,33859
+> "engines": {
+> "node": ">= 0.4"
+> },
+33781c34349,34350
+< "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email at .",
+---
+> "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net",
+> "license": "MIT",
+33801a34371
+> "license": "MIT",
+33807,33809c34377,34380
+< "version": "2.5.1",
+< "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+< "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+---
+> "version": "2.5.3",
+> "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz",
+> "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==",
+> "license": "MIT",
+33812,33813c34383,34386
+< "combined-stream": "^1.0.6",
+< "mime-types": "^2.1.12"
+---
+> "combined-stream": "^1.0.8",
+> "es-set-tostringtag": "^2.1.0",
+> "mime-types": "^2.1.35",
+> "safe-buffer": "^5.2.1"
+33818a34392,34411
+> "node_modules/superagent/node_modules/form-data/node_modules/safe-buffer": {
+> "version": "5.2.1",
+> "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+> "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+> "funding": [
+> {
+> "type": "github",
+> "url": "https://github.com/sponsors/feross"
+> },
+> {
+> "type": "patreon",
+> "url": "https://www.patreon.com/feross"
+> },
+> {
+> "type": "consulting",
+> "url": "https://feross.org/support"
+> }
+> ],
+> "license": "MIT"
+> },
+33822,33833c34415,34416
+< "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+< },
+< "node_modules/superagent/node_modules/mime": {
+< "version": "1.6.0",
+< "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+< "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+< "bin": {
+< "mime": "cli.js"
+< },
+< "engines": {
+< "node": ">=4"
+< }
+---
+> "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+> "license": "MIT"
+33836,33838c34419,34422
+< "version": "2.3.7",
+< "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+< "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+---
+> "version": "2.3.8",
+> "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+> "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+> "license": "MIT",
+33852a34437
+> "license": "MIT",
+34099c34684,34685
+< "integrity": "sha1-oJdRnG8e5N1n4wjZtT3cnCslf5c=",
+---
+> "integrity": "sha512-O2hZbWqq8x6j0uZ4qWj5dw45WPoAxKsJLJZqOgTqRtPNi8IqA+rDkDV/48S8qanS3KGv1QcVoPNLivMbyHHdAQ==",
+> "license": "MIT",
+34150,34155d34735
+< "node_modules/swagger-tools/node_modules/commander": {
+< "version": "2.11.0",
+< "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+< "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+< "license": "MIT"
+< },
+34257,34259c34837,34839
+< "version": "3.0.8",
+< "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz",
+< "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==",
+---
+> "version": "3.0.9",
+> "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz",
+> "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==",
+34943,34945c35523,35525
+< "version": "0.6.9",
+< "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz",
+< "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==",
+---
+> "version": "0.6.11",
+> "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz",
+> "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==",
+34948,34950c35528,35530
+< "gopd": "^1.0.1",
+< "typedarray.prototype.slice": "^1.0.3",
+< "which-typed-array": "^1.1.15"
+---
+> "gopd": "^1.2.0",
+> "typedarray.prototype.slice": "^1.0.5",
+> "which-typed-array": "^1.1.18"
+35110,35112c35690,35692
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+< "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+---
+> "version": "1.0.3",
+> "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+> "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+35115c35695
+< "call-bind": "^1.0.7",
+---
+> "call-bound": "^1.0.3",
+35117c35697
+< "is-typed-array": "^1.1.13"
+---
+> "is-typed-array": "^1.1.14"
+35124,35126c35704,35706
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+< "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+---
+> "version": "1.0.3",
+> "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+> "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+35129c35709
+< "call-bind": "^1.0.7",
+---
+> "call-bind": "^1.0.8",
+35131,35133c35711,35713
+< "gopd": "^1.0.1",
+< "has-proto": "^1.0.3",
+< "is-typed-array": "^1.1.13"
+---
+> "gopd": "^1.2.0",
+> "has-proto": "^1.2.0",
+> "is-typed-array": "^1.1.14"
+35143,35145c35723,35725
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+< "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+---
+> "version": "1.0.4",
+> "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+> "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+35149c35729
+< "call-bind": "^1.0.7",
+---
+> "call-bind": "^1.0.8",
+35151,35153c35731,35734
+< "gopd": "^1.0.1",
+< "has-proto": "^1.0.3",
+< "is-typed-array": "^1.1.13"
+---
+> "gopd": "^1.2.0",
+> "has-proto": "^1.2.0",
+> "is-typed-array": "^1.1.15",
+> "reflect.getprototypeof": "^1.0.9"
+35163,35165c35744,35746
+< "version": "1.0.6",
+< "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+< "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+---
+> "version": "1.0.7",
+> "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+> "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+35171d35751
+< "has-proto": "^1.0.3",
+35173c35753,35754
+< "possible-typed-array-names": "^1.0.0"
+---
+> "possible-typed-array-names": "^1.0.0",
+> "reflect.getprototypeof": "^1.0.6"
+35188,35190c35769,35771
+< "version": "1.0.3",
+< "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz",
+< "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==",
+---
+> "version": "1.0.5",
+> "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz",
+> "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==",
+35193c35774
+< "call-bind": "^1.0.7",
+---
+> "call-bind": "^1.0.8",
+35195c35776
+< "es-abstract": "^1.23.0",
+---
+> "es-abstract": "^1.23.9",
+35197,35198c35778,35781
+< "typed-array-buffer": "^1.0.2",
+< "typed-array-byte-offset": "^1.0.2"
+---
+> "get-proto": "^1.0.1",
+> "math-intrinsics": "^1.1.0",
+> "typed-array-buffer": "^1.0.3",
+> "typed-array-byte-offset": "^1.0.4"
+35274,35276c35857,35860
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+< "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+---
+> "version": "1.1.0",
+> "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+> "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+> "license": "MIT",
+35278c35862
+< "call-bind": "^1.0.2",
+---
+> "call-bound": "^1.0.3",
+35280,35281c35864,35868
+< "has-symbols": "^1.0.3",
+< "which-boxed-primitive": "^1.0.2"
+---
+> "has-symbols": "^1.1.0",
+> "which-boxed-primitive": "^1.1.1"
+> },
+> "engines": {
+> "node": ">= 0.4"
+35709a36297,36305
+> "node_modules/validator": {
+> "version": "10.11.0",
+> "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
+> "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==",
+> "license": "MIT",
+> "engines": {
+> "node": ">= 0.10"
+> }
+> },
+36697,36699c37293,37296
+< "version": "1.0.2",
+< "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+< "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+---
+> "version": "1.1.1",
+> "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+> "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+> "license": "MIT",
+36701,36705c37298,37332
+< "is-bigint": "^1.0.1",
+< "is-boolean-object": "^1.1.0",
+< "is-number-object": "^1.0.4",
+< "is-string": "^1.0.5",
+< "is-symbol": "^1.0.3"
+---
+> "is-bigint": "^1.1.0",
+> "is-boolean-object": "^1.2.1",
+> "is-number-object": "^1.1.1",
+> "is-string": "^1.1.1",
+> "is-symbol": "^1.1.1"
+> },
+> "engines": {
+> "node": ">= 0.4"
+> },
+> "funding": {
+> "url": "https://github.com/sponsors/ljharb"
+> }
+> },
+> "node_modules/which-builtin-type": {
+> "version": "1.2.1",
+> "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+> "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+> "license": "MIT",
+> "dependencies": {
+> "call-bound": "^1.0.2",
+> "function.prototype.name": "^1.1.6",
+> "has-tostringtag": "^1.0.2",
+> "is-async-function": "^2.0.0",
+> "is-date-object": "^1.1.0",
+> "is-finalizationregistry": "^1.1.0",
+> "is-generator-function": "^1.0.10",
+> "is-regex": "^1.2.1",
+> "is-weakref": "^1.0.2",
+> "isarray": "^2.0.5",
+> "which-boxed-primitive": "^1.1.0",
+> "which-collection": "^1.0.2",
+> "which-typed-array": "^1.1.16"
+> },
+> "engines": {
+> "node": ">= 0.4"
+36712,36715c37339,37342
+< "version": "1.0.1",
+< "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+< "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+< "dev": true,
+---
+> "version": "1.0.2",
+> "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+> "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+> "license": "MIT",
+36717,36720c37344,37350
+< "is-map": "^2.0.1",
+< "is-set": "^2.0.1",
+< "is-weakmap": "^2.0.1",
+< "is-weakset": "^2.0.1"
+---
+> "is-map": "^2.0.3",
+> "is-set": "^2.0.3",
+> "is-weakmap": "^2.0.2",
+> "is-weakset": "^2.0.3"
+> },
+> "engines": {
+> "node": ">= 0.4"
+36733,36735c37363,37365
+< "version": "1.1.15",
+< "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+< "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+---
+> "version": "1.1.19",
+> "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+> "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+36739,36741c37369,37373
+< "call-bind": "^1.0.7",
+< "for-each": "^0.3.3",
+< "gopd": "^1.0.1",
+---
+> "call-bind": "^1.0.8",
+> "call-bound": "^1.0.4",
+> "for-each": "^0.3.5",
+> "get-proto": "^1.0.1",
+> "gopd": "^1.2.0",
+37217a37850
+> "license": "MIT",
+37231,37236d37863
+< "node_modules/z-schema/node_modules/commander": {
+< "version": "2.20.3",
+< "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+< "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+< "optional": true
+< },
+37241,37250c37868,37870
+< "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
+< "hasInstallScript": true
+< },
+< "node_modules/z-schema/node_modules/validator": {
+< "version": "10.11.0",
+< "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
+< "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==",
+< "engines": {
+< "node": ">= 0.10"
+< }
+---
+> "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+> "hasInstallScript": true,
+> "license": "MIT"
+37358c37978
+< "dockerode": "^4.0.5",
+---
+> "dockerode": "^4.0.7",
+37364c37984
+< "tar-fs": "^3.0.4",
+---
+> "tar-fs": "^3.0.9",
+37425,37451d38044
+< "services/clsi/node_modules/@grpc/grpc-js": {
+< "version": "1.13.2",
+< "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz",
+< "integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==",
+< "license": "Apache-2.0",
+< "dependencies": {
+< "@grpc/proto-loader": "^0.7.13",
+< "@js-sdsl/ordered-map": "^4.4.2"
+< },
+< "engines": {
+< "node": ">=12.10.0"
+< }
+< },
+< "services/clsi/node_modules/cpu-features": {
+< "version": "0.0.10",
+< "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz",
+< "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==",
+< "hasInstallScript": true,
+< "optional": true,
+< "dependencies": {
+< "buildcheck": "~0.0.6",
+< "nan": "^2.19.0"
+< },
+< "engines": {
+< "node": ">=10.0.0"
+< }
+< },
+37461,37529d38053
+< "services/clsi/node_modules/docker-modem": {
+< "version": "5.0.6",
+< "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-5.0.6.tgz",
+< "integrity": "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==",
+< "license": "Apache-2.0",
+< "dependencies": {
+< "debug": "^4.1.1",
+< "readable-stream": "^3.5.0",
+< "split-ca": "^1.0.1",
+< "ssh2": "^1.15.0"
+< },
+< "engines": {
+< "node": ">= 8.0"
+< }
+< },
+< "services/clsi/node_modules/dockerode": {
+< "version": "4.0.5",
+< "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.5.tgz",
+< "integrity": "sha512-ZPmKSr1k1571Mrh7oIBS/j0AqAccoecY2yH420ni5j1KyNMgnoTh4Nu4FWunh0HZIJmRSmSysJjBIpa/zyWUEA==",
+< "license": "Apache-2.0",
+< "dependencies": {
+< "@balena/dockerignore": "^1.0.2",
+< "@grpc/grpc-js": "^1.11.1",
+< "@grpc/proto-loader": "^0.7.13",
+< "docker-modem": "^5.0.6",
+< "protobufjs": "^7.3.2",
+< "tar-fs": "~2.1.2",
+< "uuid": "^10.0.0"
+< },
+< "engines": {
+< "node": ">= 8.0"
+< }
+< },
+< "services/clsi/node_modules/dockerode/node_modules/tar-fs": {
+< "version": "2.1.2",
+< "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
+< "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
+< "license": "MIT",
+< "dependencies": {
+< "chownr": "^1.1.1",
+< "mkdirp-classic": "^0.5.2",
+< "pump": "^3.0.0",
+< "tar-stream": "^2.1.4"
+< }
+< },
+< "services/clsi/node_modules/protobufjs": {
+< "version": "7.4.0",
+< "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
+< "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
+< "hasInstallScript": true,
+< "license": "BSD-3-Clause",
+< "dependencies": {
+< "@protobufjs/aspromise": "^1.1.2",
+< "@protobufjs/base64": "^1.1.2",
+< "@protobufjs/codegen": "^2.0.4",
+< "@protobufjs/eventemitter": "^1.1.0",
+< "@protobufjs/fetch": "^1.1.0",
+< "@protobufjs/float": "^1.0.2",
+< "@protobufjs/inquire": "^1.1.0",
+< "@protobufjs/path": "^1.1.2",
+< "@protobufjs/pool": "^1.1.0",
+< "@protobufjs/utf8": "^1.1.0",
+< "@types/node": ">=13.7.0",
+< "long": "^5.0.0"
+< },
+< "engines": {
+< "node": ">=12.0.0"
+< }
+< },
+37549,37565d38072
+< "services/clsi/node_modules/ssh2": {
+< "version": "1.16.0",
+< "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz",
+< "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==",
+< "hasInstallScript": true,
+< "dependencies": {
+< "asn1": "^0.2.6",
+< "bcrypt-pbkdf": "^1.0.2"
+< },
+< "engines": {
+< "node": ">=10.16.0"
+< },
+< "optionalDependencies": {
+< "cpu-features": "~0.0.10",
+< "nan": "^2.20.0"
+< }
+< },
+37578,37590d38084
+< "services/clsi/node_modules/uuid": {
+< "version": "10.0.0",
+< "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+< "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+< "funding": [
+< "https://github.com/sponsors/broofa",
+< "https://github.com/sponsors/ctavan"
+< ],
+< "license": "MIT",
+< "bin": {
+< "uuid": "dist/bin/uuid"
+< }
+< },
+38683c39177
+< "multer": "overleaf/multer#199c5ff05bd375c508f4074498237baead7f5148",
+---
+> "multer": "github:overleaf/multer#4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23",
+39602,39604c40096,40098
+< "version": "2.0.0",
+< "resolved": "git+ssh://git@github.com/overleaf/multer.git#199c5ff05bd375c508f4074498237baead7f5148",
+< "integrity": "sha512-S5MlIoOgrDr+a2jLS8z7jQlbzvZ0m30U2tRwdyLrxhnnMUQZYEzkVysEv10Dw41RTpM5bQQDs563Vzl1LLhxhQ==",
+---
+> "version": "2.0.1",
+> "resolved": "git+ssh://git@github.com/overleaf/multer.git#4dbceda355efc3fc8ac3cf5c66c3778c8a6fdb23",
+> "integrity": "sha512-kkvPK48OQibR5vIoTQBbZp1uWVCvT9MrW3Y0mqdhFYJP/HVJujb4eSCEU0yj+hyf0Y+H/BKCmPdM4fJnzqAO4w==",
+39608,39610c40102,40104
+< "busboy": "^1.0.0",
+< "concat-stream": "^1.5.2",
+< "mkdirp": "^0.5.4",
+---
+> "busboy": "^1.6.0",
+> "concat-stream": "^2.0.0",
+> "mkdirp": "^0.5.6",
+39612,39613c40106,40107
+< "type-is": "^1.6.4",
+< "xtend": "^4.0.0"
+---
+> "type-is": "^1.6.18",
+> "xtend": "^4.0.2"
diff --git a/server-ce/hotfix/5.5.1/pr_25168.patch b/server-ce/hotfix/5.5.1/pr_25168.patch
new file mode 100644
index 0000000000..5d496d1f67
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/pr_25168.patch
@@ -0,0 +1,19 @@
+--- a/services/history-v1/config/custom-environment-variables.json
++++ b/services/history-v1/config/custom-environment-variables.json
+@@ -50,12 +50,14 @@
+ "history": {
+ "host": "OVERLEAF_REDIS_HOST",
+ "password": "OVERLEAF_REDIS_PASS",
+- "port": "OVERLEAF_REDIS_PORT"
++ "port": "OVERLEAF_REDIS_PORT",
++ "tls": "OVERLEAF_REDIS_TLS"
+ },
+ "lock": {
+ "host": "OVERLEAF_REDIS_HOST",
+ "password": "OVERLEAF_REDIS_PASS",
+- "port": "OVERLEAF_REDIS_PORT"
++ "port": "OVERLEAF_REDIS_PORT",
++ "tls": "OVERLEAF_REDIS_TLS"
+ }
+ }
+ }
diff --git a/server-ce/hotfix/5.5.1/pr_26086.patch b/server-ce/hotfix/5.5.1/pr_26086.patch
new file mode 100644
index 0000000000..fec417b3a5
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/pr_26086.patch
@@ -0,0 +1,200 @@
+--- a/services/history-v1/api/controllers/project_import.js
++++ b/services/history-v1/api/controllers/project_import.js
+@@ -35,6 +35,7 @@ async function importSnapshot(req, res) {
+ try {
+ snapshot = Snapshot.fromRaw(rawSnapshot)
+ } catch (err) {
++ logger.warn({ err, projectId }, 'failed to import snapshot')
+ return render.unprocessableEntity(res)
+ }
+
+@@ -43,6 +44,7 @@ async function importSnapshot(req, res) {
+ historyId = await chunkStore.initializeProject(projectId, snapshot)
+ } catch (err) {
+ if (err instanceof chunkStore.AlreadyInitialized) {
++ logger.warn({ err, projectId }, 'already initialized')
+ return render.conflict(res)
+ } else {
+ throw err
+--- a/services/history-v1/api/controllers/projects.js
++++ b/services/history-v1/api/controllers/projects.js
+@@ -34,6 +34,7 @@ async function initializeProject(req, res, next) {
+ res.status(HTTPStatus.OK).json({ projectId })
+ } catch (err) {
+ if (err instanceof chunkStore.AlreadyInitialized) {
++ logger.warn({ err, projectId }, 'failed to initialize')
+ render.conflict(res)
+ } else {
+ throw err
+@@ -242,11 +243,15 @@ async function createProjectBlob(req, res, next) {
+ const sizeLimit = new StreamSizeLimit(maxUploadSize)
+ await pipeline(req, sizeLimit, fs.createWriteStream(tmpPath))
+ if (sizeLimit.sizeLimitExceeded) {
++ logger.warn(
++ { projectId, expectedHash, maxUploadSize },
++ 'blob exceeds size threshold'
++ )
+ return render.requestEntityTooLarge(res)
+ }
+ const hash = await blobHash.fromFile(tmpPath)
+ if (hash !== expectedHash) {
+- logger.debug({ hash, expectedHash }, 'Hash mismatch')
++ logger.warn({ projectId, hash, expectedHash }, 'Hash mismatch')
+ return render.conflict(res, 'File hash mismatch')
+ }
+
+@@ -343,6 +348,10 @@ async function copyProjectBlob(req, res, next) {
+ targetBlobStore.getBlob(blobHash),
+ ])
+ if (!sourceBlob) {
++ logger.warn(
++ { sourceProjectId, targetProjectId, blobHash },
++ 'missing source blob when copying across projects'
++ )
+ return render.notFound(res)
+ }
+ // Exit early if the blob exists in the target project.
+--- a/services/history-v1/app.js
++++ b/services/history-v1/app.js
+@@ -100,11 +100,13 @@ function setupErrorHandling() {
+ })
+ }
+ if (err.code === 'ENUM_MISMATCH') {
++ logger.warn({ err, projectId }, err.message)
+ return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
+ message: 'invalid enum value: ' + err.paramName,
+ })
+ }
+ if (err.code === 'REQUIRED') {
++ logger.warn({ err, projectId }, err.message)
+ return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
+ message: err.message,
+ })
+--- a/services/project-history/app/js/HistoryStoreManager.js
++++ b/services/project-history/app/js/HistoryStoreManager.js
+@@ -35,7 +35,10 @@ class StringStream extends stream.Readable {
+ _mocks.getMostRecentChunk = (projectId, historyId, callback) => {
+ const path = `projects/${historyId}/latest/history`
+ logger.debug({ projectId, historyId }, 'getting chunk from history service')
+- _requestChunk({ path, json: true }, callback)
++ _requestChunk({ path, json: true }, (err, chunk) => {
++ if (err) return callback(OError.tag(err))
++ callback(null, chunk)
++ })
+ }
+
+ /**
+@@ -54,7 +57,10 @@ export function getChunkAtVersion(projectId, historyId, version, callback) {
+ { projectId, historyId, version },
+ 'getting chunk from history service for version'
+ )
+- _requestChunk({ path, json: true }, callback)
++ _requestChunk({ path, json: true }, (err, chunk) => {
++ if (err) return callback(OError.tag(err))
++ callback(null, chunk)
++ })
+ }
+
+ export function getMostRecentVersion(projectId, historyId, callback) {
+@@ -68,8 +74,10 @@ export function getMostRecentVersion(projectId, historyId, callback) {
+ _.sortBy(chunk.chunk.history.changes || [], x => x.timestamp)
+ )
+ // find the latest project and doc versions in the chunk
+- _getLatestProjectVersion(projectId, chunk, (err1, projectVersion) =>
++ _getLatestProjectVersion(projectId, chunk, (err1, projectVersion) => {
++ if (err1) err1 = OError.tag(err1)
+ _getLatestV2DocVersions(projectId, chunk, (err2, v2DocVersions) => {
++ if (err2) err2 = OError.tag(err2)
+ // return the project and doc versions
+ const projectStructureAndDocVersions = {
+ project: projectVersion,
+@@ -83,7 +91,7 @@ export function getMostRecentVersion(projectId, historyId, callback) {
+ chunk
+ )
+ })
+- )
++ })
+ })
+ }
+
+@@ -211,7 +219,10 @@ export function getProjectBlob(historyId, blobHash, callback) {
+ logger.debug({ historyId, blobHash }, 'getting blob from history service')
+ _requestHistoryService(
+ { path: `projects/${historyId}/blobs/${blobHash}` },
+- callback
++ (err, blob) => {
++ if (err) return callback(OError.tag(err))
++ callback(null, blob)
++ }
+ )
+ }
+
+@@ -277,7 +288,10 @@ function createBlobFromString(historyId, data, fileId, callback) {
+ (fsPath, cb) => {
+ _createBlob(historyId, fsPath, cb)
+ },
+- callback
++ (err, hash) => {
++ if (err) return callback(OError.tag(err))
++ callback(null, hash)
++ }
+ )
+ }
+
+@@ -330,7 +344,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
+ try {
+ ranges = HistoryBlobTranslator.createRangeBlobDataFromUpdate(update)
+ } catch (error) {
+- return callback(error)
++ return callback(OError.tag(error))
+ }
+ createBlobFromString(
+ historyId,
+@@ -338,7 +352,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
+ `project-${projectId}-doc-${update.doc}`,
+ (err, fileHash) => {
+ if (err) {
+- return callback(err)
++ return callback(OError.tag(err))
+ }
+ if (ranges) {
+ createBlobFromString(
+@@ -347,7 +361,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
+ `project-${projectId}-doc-${update.doc}-ranges`,
+ (err, rangesHash) => {
+ if (err) {
+- return callback(err)
++ return callback(OError.tag(err))
+ }
+ logger.debug(
+ { fileHash, rangesHash },
+@@ -415,7 +429,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
+ },
+ (err, fileHash) => {
+ if (err) {
+- return callback(err)
++ return callback(OError.tag(err))
+ }
+ if (update.hash && update.hash !== fileHash) {
+ logger.warn(
+@@ -447,7 +461,7 @@ export function createBlobForUpdate(projectId, historyId, update, callback) {
+ },
+ (err, fileHash) => {
+ if (err) {
+- return callback(err)
++ return callback(OError.tag(err))
+ }
+ logger.debug({ fileHash }, 'created empty blob for file')
+ callback(null, { file: fileHash })
+@@ -520,7 +534,10 @@ export function initializeProject(historyId, callback) {
+ export function deleteProject(projectId, callback) {
+ _requestHistoryService(
+ { method: 'DELETE', path: `projects/${projectId}` },
+- callback
++ err => {
++ if (err) return callback(OError.tag(err))
++ callback(null)
++ }
+ )
+ }
+
diff --git a/server-ce/hotfix/5.5.1/pr_26091.patch b/server-ce/hotfix/5.5.1/pr_26091.patch
new file mode 100644
index 0000000000..c88618b8d0
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/pr_26091.patch
@@ -0,0 +1,60 @@
+--- a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
++++ b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
+@@ -7,6 +7,7 @@ import {
+ const { ObjectId } = mongodb
+
+ const MIN_MONGO_VERSION = [6, 0]
++const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0]
+
+ async function main() {
+ let mongoClient
+@@ -18,6 +19,7 @@ async function main() {
+ }
+
+ await checkMongoVersion(mongoClient)
++ await checkFeatureCompatibilityVersion(mongoClient)
+
+ try {
+ await testTransactions(mongoClient)
+@@ -53,6 +55,41 @@ async function checkMongoVersion(mongoClient) {
+ }
+ }
+
++async function checkFeatureCompatibilityVersion(mongoClient) {
++ const {
++ featureCompatibilityVersion: { version },
++ } = await mongoClient
++ .db()
++ .admin()
++ .command({ getParameter: 1, featureCompatibilityVersion: 1 })
++ const [major, minor] = version.split('.').map(v => parseInt(v))
++ const [minMajor, minMinor] = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION
++
++ if (major < minMajor || (major === minMajor && minor < minMinor)) {
++ const minVersion = MIN_MONGO_FEATURE_COMPATIBILITY_VERSION.join('.')
++ console.error(`
++The MongoDB server has featureCompatibilityVersion=${version}, but Overleaf requires at least version ${minVersion}.
++
++Open a mongo shell:
++- Overleaf Toolkit deployments: $ bin/mongo
++- Legacy docker-compose.yml deployments: $ docker exec -it mongo mongosh localhost/sharelatex
++
++In the mongo shell:
++> db.adminCommand( { setFeatureCompatibilityVersion: "${minMajor}.${minMinor}" } )
++
++Verify the new value:
++> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
++ ...
++ {
++ featureCompatibilityVersion: { version: ${minMajor}.${minMinor}' },
++...
++
++Aborting.
++`)
++ process.exit(1)
++ }
++}
++
+ main()
+ .then(() => {
+ console.error('Mongodb is up.')
diff --git a/server-ce/hotfix/5.5.1/pr_26152.patch b/server-ce/hotfix/5.5.1/pr_26152.patch
new file mode 100644
index 0000000000..9dc5d50e28
--- /dev/null
+++ b/server-ce/hotfix/5.5.1/pr_26152.patch
@@ -0,0 +1,16 @@
+--- a/services/web/modules/server-ce-scripts/scripts/create-user.mjs
++++ b/services/web/modules/server-ce-scripts/scripts/create-user.mjs
+@@ -48,3 +48,13 @@ Please visit the following URL to set a password for ${email} and log in:
+ )
+ })
+ }
++
++if (filename === process.argv[1]) {
++ try {
++ await main()
++ process.exit(0)
++ } catch (error) {
++ console.error({ error })
++ process.exit(1)
++ }
++}
diff --git a/server-ce/hotfix/5.5.2/Dockerfile b/server-ce/hotfix/5.5.2/Dockerfile
new file mode 100644
index 0000000000..13f82e81a4
--- /dev/null
+++ b/server-ce/hotfix/5.5.2/Dockerfile
@@ -0,0 +1,27 @@
+FROM sharelatex/sharelatex:5.5.1
+
+# https://github.com/overleaf/internal/pull/25944
+# Removed changes to services/web/frontend/js/features/ide-redesign/components/rail.tsx due to incompatibility with 5.5.1
+COPY pr_25944.patch .
+RUN patch -p1 < pr_25944.patch && rm pr_25944.patch
+
+# https://github.com/overleaf/internal/pull/26637
+# Removed changes to server-ce/test/create-and-compile-project.spec.ts and server-ce/test/helpers/compile.ts due to incompatibility with 5.5.1
+COPY pr_26637.patch .
+RUN patch -p1 < pr_26637.patch && rm pr_26637.patch
+
+# https://github.com/overleaf/internal/pull/26783
+COPY pr_26783.patch .
+RUN patch -p1 < pr_26783.patch && rm pr_26783.patch
+
+# https://github.com/overleaf/internal/pull/26697
+COPY pr_26697.patch .
+RUN patch -p1 < pr_26697.patch && rm pr_26697.patch
+
+# Apply security updates to base image
+RUN apt update && apt install -y linux-libc-dev \
+ && unattended-upgrade --verbose --no-minimal-upgrade-steps \
+ && rm -rf /var/lib/apt/lists/*
+
+# Recompile frontend assets
+RUN node genScript compile | bash
diff --git a/server-ce/hotfix/5.5.2/pr_25944.patch b/server-ce/hotfix/5.5.2/pr_25944.patch
new file mode 100644
index 0000000000..e3b9f54246
--- /dev/null
+++ b/server-ce/hotfix/5.5.2/pr_25944.patch
@@ -0,0 +1,219 @@
+diff --git a/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx b/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
+index 20e157dfee9..ad943772d0d 100644
+--- a/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
++++ b/services/web/frontend/js/features/review-panel-new/context/review-panel-providers.tsx
+@@ -4,10 +4,16 @@ import { ChangesUsersProvider } from './changes-users-context'
+ import { TrackChangesStateProvider } from './track-changes-state-context'
+ import { ThreadsProvider } from './threads-context'
+ import { ReviewPanelViewProvider } from './review-panel-view-context'
++import { useProjectContext } from '@/shared/context/project-context'
+
+ export const ReviewPanelProviders: FC = ({
+ children,
+ }) => {
++ const { features } = useProjectContext()
++ if (!features.trackChangesVisible) {
++ return children
++ }
++
+ return (
+
+
+diff --git a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
+index 8606fb11fad..e80fb037116 100644
+--- a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
++++ b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.tsx
+@@ -176,24 +176,34 @@ export default function AddCollaborators({ readOnly }: { readOnly?: boolean }) {
+ ])
+
+ const privilegeOptions = useMemo(() => {
+- return [
++ const options: {
++ key: string
++ label: string
++ description?: string | null
++ }[] = [
+ {
+ key: 'readAndWrite',
+ label: t('editor'),
+ },
+- {
++ ]
++
++ if (features.trackChangesVisible) {
++ options.push({
+ key: 'review',
+ label: t('reviewer'),
+ description: !features.trackChanges
+ ? t('comment_only_upgrade_for_track_changes')
+ : null,
+- },
+- {
+- key: 'readOnly',
+- label: t('viewer'),
+- },
+- ]
+- }, [features.trackChanges, t])
++ })
++ }
++
++ options.push({
++ key: 'readOnly',
++ label: t('viewer'),
++ })
++
++ return options
++ }, [features.trackChanges, features.trackChangesVisible, t])
+
+ return (
+
+diff --git a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
+index 6d806968b12..9f24cddc4ad 100644
+--- a/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
++++ b/services/web/frontend/js/features/share-project-modal/components/edit-member.tsx
+@@ -244,14 +244,22 @@ function SelectPrivilege({
+ const { features } = useProjectContext()
+
+ const privileges = useMemo(
+- (): Privilege[] => [
+- { key: 'owner', label: t('make_owner') },
+- { key: 'readAndWrite', label: t('editor') },
+- { key: 'review', label: t('reviewer') },
+- { key: 'readOnly', label: t('viewer') },
+- { key: 'removeAccess', label: t('remove_access') },
+- ],
+- [t]
++ (): Privilege[] =>
++ features.trackChangesVisible
++ ? [
++ { key: 'owner', label: t('make_owner') },
++ { key: 'readAndWrite', label: t('editor') },
++ { key: 'review', label: t('reviewer') },
++ { key: 'readOnly', label: t('viewer') },
++ { key: 'removeAccess', label: t('remove_access') },
++ ]
++ : [
++ { key: 'owner', label: t('make_owner') },
++ { key: 'readAndWrite', label: t('editor') },
++ { key: 'readOnly', label: t('viewer') },
++ { key: 'removeAccess', label: t('remove_access') },
++ ],
++ [features.trackChangesVisible, t]
+ )
+
+ const downgradedPseudoPrivilege: Privilege = {
+diff --git a/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx b/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
+index c1808cbb301..4bdfe2682c8 100644
+--- a/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
++++ b/services/web/frontend/js/features/source-editor/components/codemirror-editor.tsx
+@@ -18,6 +18,7 @@ import {
+ } from './codemirror-context'
+ import MathPreviewTooltip from './math-preview-tooltip'
+ import { useToolbarMenuBarEditorCommands } from '@/features/ide-redesign/hooks/use-toolbar-menu-editor-commands'
++import { useProjectContext } from '@/shared/context/project-context'
+
+ // TODO: remove this when definitely no longer used
+ export * from './codemirror-context'
+@@ -67,6 +68,7 @@ function CodeMirrorEditor() {
+
+ function CodeMirrorEditorComponents() {
+ useToolbarMenuBarEditorCommands()
++ const { features } = useProjectContext()
+
+ return (
+
+@@ -83,8 +85,8 @@ function CodeMirrorEditorComponents() {
+
+
+
+-
+-
++ {features.trackChangesVisible && }
++ {features.trackChangesVisible && }
+
+ {sourceEditorComponents.map(
+ ({ import: { default: Component }, path }) => (
+diff --git a/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx b/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
+index e70663683fc..c5d9f3d3e47 100644
+--- a/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
++++ b/services/web/frontend/js/features/source-editor/components/toolbar/toolbar-items.tsx
+@@ -14,6 +14,7 @@ import { LegacyTableDropdown } from './table-inserter-dropdown-legacy'
+ import { withinFormattingCommand } from '@/features/source-editor/utils/tree-operations/formatting'
+ import { isSplitTestEnabled } from '@/utils/splitTestUtils'
+ import { isMac } from '@/shared/utils/os'
++import { useProjectContext } from '@/shared/context/project-context'
+
+ export const ToolbarItems: FC<{
+ state: EditorState
+@@ -31,6 +32,7 @@ export const ToolbarItems: FC<{
+ const { t } = useTranslation()
+ const { toggleSymbolPalette, showSymbolPalette, writefullInstance } =
+ useEditorContext()
++ const { features } = useProjectContext()
+ const isActive = withinFormattingCommand(state)
+
+ const symbolPaletteAvailable = getMeta('ol-symbolPaletteAvailable')
+@@ -127,13 +129,15 @@ export const ToolbarItems: FC<{
+ command={commands.wrapInHref}
+ icon="add_link"
+ />
+-
++ {features.trackChangesVisible && (
++
++ )}
+ ', function () {
+ removeChangeIds,
+ },
+ },
++ projectFeatures: { trackChangesVisible: true },
+ })
+
+ cy.wrap(scope).as('scope')
+@@ -626,7 +627,7 @@ describe(' for free users', function () {
+ function mountEditor(ownerId = USER_ID) {
+ const scope = mockScope(undefined, {
+ permissions: { write: true, trackedWrite: false, comment: true },
+- projectFeatures: { trackChanges: false },
++ projectFeatures: { trackChanges: false, trackChangesVisible: true },
+ projectOwner: {
+ _id: ownerId,
+ },
+diff --git a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
+index b86207fb0f7..dfce8134d1c 100644
+--- a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
++++ b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.jsx
+@@ -694,6 +694,7 @@ describe(' ', function () {
+ features: {
+ collaborators: 0,
+ compileGroup: 'standard',
++ trackChangesVisible: true,
+ },
+ },
+ },
+@@ -723,6 +724,7 @@ describe(' ', function () {
+ ...project,
+ features: {
+ collaborators: 1,
++ trackChangesVisible: true,
+ },
+ members: [
+ {
diff --git a/server-ce/hotfix/5.5.2/pr_26637.patch b/server-ce/hotfix/5.5.2/pr_26637.patch
new file mode 100644
index 0000000000..f2183723bf
--- /dev/null
+++ b/server-ce/hotfix/5.5.2/pr_26637.patch
@@ -0,0 +1,86 @@
+diff --git a/services/clsi/app/js/LocalCommandRunner.js b/services/clsi/app/js/LocalCommandRunner.js
+index ce274733585..aa62825443c 100644
+--- a/services/clsi/app/js/LocalCommandRunner.js
++++ b/services/clsi/app/js/LocalCommandRunner.js
+@@ -54,6 +54,7 @@ module.exports = CommandRunner = {
+ cwd: directory,
+ env,
+ stdio: ['pipe', 'pipe', 'ignore'],
++ detached: true,
+ })
+
+ let stdout = ''
+diff --git a/services/clsi/test/acceptance/js/StopCompile.js b/services/clsi/test/acceptance/js/StopCompile.js
+new file mode 100644
+index 00000000000..103a70f37d7
+--- /dev/null
++++ b/services/clsi/test/acceptance/js/StopCompile.js
+@@ -0,0 +1,47 @@
++const Client = require('./helpers/Client')
++const ClsiApp = require('./helpers/ClsiApp')
++const { expect } = require('chai')
++
++describe('Stop compile', function () {
++ before(function (done) {
++ this.request = {
++ options: {
++ timeout: 100,
++ }, // seconds
++ resources: [
++ {
++ path: 'main.tex',
++ content: `\
++\\documentclass{article}
++\\begin{document}
++\\def\\x{Hello!\\par\\x}
++\\x
++\\end{document}\
++`,
++ },
++ ],
++ }
++ this.project_id = Client.randomId()
++ ClsiApp.ensureRunning(() => {
++ // start the compile in the background
++ Client.compile(this.project_id, this.request, (error, res, body) => {
++ this.compileResult = { error, res, body }
++ })
++ // wait for 1 second before stopping the compile
++ setTimeout(() => {
++ Client.stopCompile(this.project_id, (error, res, body) => {
++ this.stopResult = { error, res, body }
++ setTimeout(done, 1000) // allow time for the compile request to terminate
++ })
++ }, 1000)
++ })
++ })
++
++ it('should force a compile response with an error status', function () {
++ expect(this.stopResult.error).to.be.null
++ expect(this.stopResult.res.statusCode).to.equal(204)
++ expect(this.compileResult.res.statusCode).to.equal(200)
++ expect(this.compileResult.body.compile.status).to.equal('terminated')
++ expect(this.compileResult.body.compile.error).to.equal('terminated')
++ })
++})
+diff --git a/services/clsi/test/acceptance/js/helpers/Client.js b/services/clsi/test/acceptance/js/helpers/Client.js
+index a0bdce734f3..49bf7390c6f 100644
+--- a/services/clsi/test/acceptance/js/helpers/Client.js
++++ b/services/clsi/test/acceptance/js/helpers/Client.js
+@@ -42,6 +42,16 @@ module.exports = Client = {
+ )
+ },
+
++ stopCompile(projectId, callback) {
++ if (callback == null) {
++ callback = function () {}
++ }
++ return request.post(
++ { url: `${this.host}/project/${projectId}/compile/stop` },
++ callback
++ )
++ },
++
+ clearCache(projectId, callback) {
+ if (callback == null) {
+ callback = function () {}
diff --git a/server-ce/hotfix/5.5.2/pr_26697.patch b/server-ce/hotfix/5.5.2/pr_26697.patch
new file mode 100644
index 0000000000..a6dd006d0a
--- /dev/null
+++ b/server-ce/hotfix/5.5.2/pr_26697.patch
@@ -0,0 +1,172 @@
+diff --git a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
+index 8f3b3a8e5d0..f8c8014e1c0 100644
+--- a/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
++++ b/services/web/frontend/js/features/project-list/components/project-list-ds-nav.tsx
+@@ -55,7 +55,11 @@ export function ProjectListDsNav() {
+
+ return (
+
+-
++
+
+
+
+diff --git a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
+index 2480b7f061f..8e5429dbde6 100644
+--- a/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
++++ b/services/web/frontend/js/features/ui/components/bootstrap-5/navbar/default-navbar.tsx
+@@ -1,4 +1,4 @@
+-import { useState } from 'react'
++import React, { useState } from 'react'
+ import { sendMB } from '@/infrastructure/event-tracking'
+ import { useTranslation } from 'react-i18next'
+ import { Button, Container, Nav, Navbar } from 'react-bootstrap'
+@@ -13,9 +13,15 @@ import MaterialIcon from '@/shared/components/material-icon'
+ import { useContactUsModal } from '@/shared/hooks/use-contact-us-modal'
+ import { UserProvider } from '@/shared/context/user-context'
+ import { X } from '@phosphor-icons/react'
++import overleafWhiteLogo from '@/shared/svgs/overleaf-white.svg'
++import overleafBlackLogo from '@/shared/svgs/overleaf-black.svg'
++import type { CSSPropertiesWithVariables } from '../../../../../../../types/css-properties-with-variables'
+
+-function DefaultNavbar(props: DefaultNavbarMetadata) {
++function DefaultNavbar(
++ props: DefaultNavbarMetadata & { overleafLogo?: string }
++) {
+ const {
++ overleafLogo,
+ customLogo,
+ title,
+ canDisplayAdminMenu,
+@@ -49,10 +55,20 @@ function DefaultNavbar(props: DefaultNavbarMetadata) {
+ className="navbar-default navbar-main"
+ expand="lg"
+ onToggle={expanded => setExpanded(expanded)}
++ style={
++ {
++ '--navbar-brand-image-default-url': `url("${overleafWhiteLogo}")`,
++ '--navbar-brand-image-redesign-url': `url("${overleafBlackLogo}")`,
++ } as CSSPropertiesWithVariables
++ }
+ >
+
+
+-
++
+ {enableUpgradeButton ? (
+
) {
++}: Pick & {
++ overleafLogo?: string
++}) {
+ const { appName } = getMeta('ol-ExposedSettings')
+-
+ if (customLogo) {
+ return (
+ // eslint-disable-next-line jsx-a11y/anchor-has-content
+@@ -24,9 +26,16 @@ export default function HeaderLogoOrTitle({
+
+ )
+ } else {
++ const style = overleafLogo
++ ? {
++ style: {
++ backgroundImage: `url("${overleafLogo}")`,
++ },
++ }
++ : null
+ return (
+ // eslint-disable-next-line jsx-a11y/anchor-has-content
+-
++
+ )
+ }
+ }
+diff --git a/services/web/frontend/js/shared/svgs/overleaf-black.svg b/services/web/frontend/js/shared/svgs/overleaf-black.svg
+new file mode 100644
+index 00000000000..ea0678438ba
+--- /dev/null
++++ b/services/web/frontend/js/shared/svgs/overleaf-black.svg
+@@ -0,0 +1,9 @@
++
++
++
++
++
++
++
++
++
+diff --git a/services/web/frontend/js/shared/svgs/overleaf-white.svg b/services/web/frontend/js/shared/svgs/overleaf-white.svg
+new file mode 100644
+index 00000000000..2ced81aa46d
+--- /dev/null
++++ b/services/web/frontend/js/shared/svgs/overleaf-white.svg
+@@ -0,0 +1 @@
++
+\ No newline at end of file
+diff --git a/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss b/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
+index 5d28341cf53..dd0600ed15d 100644
+--- a/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
++++ b/services/web/frontend/stylesheets/bootstrap-5/components/nav.scss
+@@ -8,7 +8,10 @@
+ --navbar-padding-h: var(--spacing-05);
+ --navbar-padding: 0 var(--navbar-padding-h);
+ --navbar-brand-width: 130px;
+- --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-white.svg');
++ --navbar-brand-image-url: var(
++ --navbar-brand-image-default-url,
++ url('../../../../public/img/ol-brand/overleaf-white.svg')
++ );
+
+ // Title, when used instead of a logo
+ --navbar-title-font-size: var(--font-size-05);
+diff --git a/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss b/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
+index 3b984bb6f36..a8855ea1ca3 100644
+--- a/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
++++ b/services/web/frontend/stylesheets/bootstrap-5/components/navbar.scss
+@@ -216,7 +216,10 @@
+ .website-redesign .navbar-default {
+ --navbar-title-color: var(--content-primary);
+ --navbar-title-color-hover: var(--content-secondary);
+- --navbar-brand-image-url: url('../../../../public/img/ol-brand/overleaf-black.svg');
++ --navbar-brand-image-url: var(
++ --navbar-brand-image-redesign-url,
++ url('../../../../public/img/ol-brand/overleaf-black.svg')
++ );
+ --navbar-subdued-color: var(--content-primary);
+ --navbar-subdued-hover-bg: var(--bg-dark-primary);
+ --navbar-subdued-hover-color: var(--content-primary-dark);
+diff --git a/services/web/types/css-properties-with-variables.tsx b/services/web/types/css-properties-with-variables.tsx
+new file mode 100644
+index 00000000000..fe0e85902a6
+--- /dev/null
++++ b/services/web/types/css-properties-with-variables.tsx
+@@ -0,0 +1,4 @@
++import { CSSProperties } from 'react'
++
++export type CSSPropertiesWithVariables = CSSProperties &
++ Record<`--${string}`, number | string>
+--
+2.43.0
+
diff --git a/server-ce/hotfix/5.5.2/pr_26783.patch b/server-ce/hotfix/5.5.2/pr_26783.patch
new file mode 100644
index 0000000000..74db897a5f
--- /dev/null
+++ b/server-ce/hotfix/5.5.2/pr_26783.patch
@@ -0,0 +1,58 @@
+diff --git a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
+index 29f5e7ffd26..46be91a1d9c 100644
+--- a/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
++++ b/services/web/modules/server-ce-scripts/scripts/check-mongodb.mjs
+@@ -9,6 +9,34 @@ const { ObjectId } = mongodb
+ const MIN_MONGO_VERSION = [6, 0]
+ const MIN_MONGO_FEATURE_COMPATIBILITY_VERSION = [6, 0]
+
++// Allow ignoring admin check failures via an environment variable
++const OVERRIDE_ENV_VAR_NAME = 'ALLOW_MONGO_ADMIN_CHECK_FAILURES'
++
++function shouldSkipAdminChecks() {
++ return process.env[OVERRIDE_ENV_VAR_NAME] === 'true'
++}
++
++function handleUnauthorizedError(err, feature) {
++ if (
++ err instanceof mongodb.MongoServerError &&
++ err.codeName === 'Unauthorized'
++ ) {
++ console.warn(`Warning: failed to check ${feature} (not authorised)`)
++ if (!shouldSkipAdminChecks()) {
++ console.error(
++ `Please ensure the MongoDB user has the required admin permissions, or\n` +
++ `set the environment variable ${OVERRIDE_ENV_VAR_NAME}=true to ignore this check.`
++ )
++ process.exit(1)
++ }
++ console.warn(
++ `Ignoring ${feature} check failure (${OVERRIDE_ENV_VAR_NAME}=${process.env[OVERRIDE_ENV_VAR_NAME]})`
++ )
++ } else {
++ throw err
++ }
++}
++
+ async function main() {
+ let mongoClient
+ try {
+@@ -18,8 +46,16 @@ async function main() {
+ throw err
+ }
+
+- await checkMongoVersion(mongoClient)
+- await checkFeatureCompatibilityVersion(mongoClient)
++ try {
++ await checkMongoVersion(mongoClient)
++ } catch (err) {
++ handleUnauthorizedError(err, 'MongoDB version')
++ }
++ try {
++ await checkFeatureCompatibilityVersion(mongoClient)
++ } catch (err) {
++ handleUnauthorizedError(err, 'MongoDB feature compatibility version')
++ }
+
+ try {
+ await testTransactions(mongoClient)
diff --git a/server-ce/init_preshutdown_scripts/00_close_site b/server-ce/init_preshutdown_scripts/00_close_site
index 0afb9e26e3..ed5404f817 100755
--- a/server-ce/init_preshutdown_scripts/00_close_site
+++ b/server-ce/init_preshutdown_scripts/00_close_site
@@ -12,12 +12,12 @@ echo "closed" > "${SITE_MAINTENANCE_FILE}"
sleep 5
# giving a grace period of 5 seconds for users before disconnecting them and start shutting down
-cd /overleaf/services/web && node scripts/disconnect_all_users.js --delay-in-seconds=5 >> /var/log/overleaf/web.log 2>&1
+cd /overleaf/services/web && node scripts/disconnect_all_users.mjs --delay-in-seconds=5 >> /var/log/overleaf/web.log 2>&1
EXIT_CODE="$?"
if [ $EXIT_CODE -ne 0 ]
then
- echo "scripts/disconnect_all_users.js failed with exit code $EXIT_CODE"
+ echo "scripts/disconnect_all_users.mjs failed with exit code $EXIT_CODE"
exit 1
fi
diff --git a/server-ce/init_scripts/100_set_docker_host_ipaddress.sh b/server-ce/init_scripts/100_set_docker_host_ipaddress.sh
index 0587a9b222..646b55ada7 100755
--- a/server-ce/init_scripts/100_set_docker_host_ipaddress.sh
+++ b/server-ce/init_scripts/100_set_docker_host_ipaddress.sh
@@ -2,4 +2,4 @@
set -e -o pipefail
# See the bottom of http://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
-echo "`route -n | awk '/UG[ \t]/{print $2}'` dockerhost" >> /etc/hosts
+echo "$(route -n | awk '/UG[ \t]/{print $2}') dockerhost" >> /etc/hosts
diff --git a/server-ce/init_scripts/200_nginx_config_template.sh b/server-ce/init_scripts/200_nginx_config_template.sh
index f652574c6f..f5707260ce 100755
--- a/server-ce/init_scripts/200_nginx_config_template.sh
+++ b/server-ce/init_scripts/200_nginx_config_template.sh
@@ -26,6 +26,7 @@ if [ -f "${nginx_template_file}" ]; then
# Note the single-quotes, they are important.
# This is a pass-list of env-vars that envsubst
# should operate on.
+ # shellcheck disable=SC2016
envsubst '
${NGINX_KEEPALIVE_TIMEOUT}
${NGINX_WORKER_CONNECTIONS}
diff --git a/server-ce/init_scripts/500_check_db_access.sh b/server-ce/init_scripts/500_check_db_access.sh
index 507295e471..bbf2b9ec26 100755
--- a/server-ce/init_scripts/500_check_db_access.sh
+++ b/server-ce/init_scripts/500_check_db_access.sh
@@ -3,6 +3,6 @@ set -e
echo "Checking can connect to mongo and redis"
cd /overleaf/services/web
-node modules/server-ce-scripts/scripts/check-mongodb
-node modules/server-ce-scripts/scripts/check-redis
+node modules/server-ce-scripts/scripts/check-mongodb.mjs
+node modules/server-ce-scripts/scripts/check-redis.mjs
echo "All checks passed"
diff --git a/server-ce/init_scripts/910_check_texlive_images b/server-ce/init_scripts/910_check_texlive_images
index 63fc1ba8fb..90dec0061f 100755
--- a/server-ce/init_scripts/910_check_texlive_images
+++ b/server-ce/init_scripts/910_check_texlive_images
@@ -3,4 +3,4 @@ set -e
echo "Checking texlive images"
cd /overleaf/services/web
-node modules/server-ce-scripts/scripts/check-texlive-images
+node modules/server-ce-scripts/scripts/check-texlive-images.mjs
diff --git a/server-ce/mongodb-init-replica-set.js b/server-ce/mongodb-init-replica-set.js
deleted file mode 100644
index 8d993774c7..0000000000
--- a/server-ce/mongodb-init-replica-set.js
+++ /dev/null
@@ -1 +0,0 @@
-rs.initiate({ _id: "overleaf", members: [ { _id: 0, host: "mongo:27017" } ] })
diff --git a/server-ce/nginx/clsi-nginx.conf b/server-ce/nginx/clsi-nginx.conf
index 94ce060706..aac976ecd8 100644
--- a/server-ce/nginx/clsi-nginx.conf
+++ b/server-ce/nginx/clsi-nginx.conf
@@ -30,7 +30,7 @@ server {
application/pdf pdf;
}
# handle output files for specific users
- location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/output.$4;
}
# handle .blg files for specific users
@@ -38,7 +38,7 @@ server {
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/$4.blg;
}
# handle output files for anonymous users
- location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
alias /var/lib/overleaf/data/output/$1/generated-files/$2/output.$3;
}
# handle .blg files for anonymous users
diff --git a/server-ce/nginx/overleaf.conf b/server-ce/nginx/overleaf.conf
index 78af603c1e..77e59df5a0 100644
--- a/server-ce/nginx/overleaf.conf
+++ b/server-ce/nginx/overleaf.conf
@@ -47,12 +47,12 @@ server {
}
# handle output files for specific users
- location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
proxy_http_version 1.1;
}
# handle output files for anonymous users
- location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
proxy_http_version 1.1;
}
diff --git a/server-ce/runit/clsi-overleaf/run b/server-ce/runit/clsi-overleaf/run
index cb365ec75b..ece2031769 100755
--- a/server-ce/runit/clsi-overleaf/run
+++ b/server-ce/runit/clsi-overleaf/run
@@ -11,7 +11,7 @@ fi
if [ -e '/var/run/docker.sock' ]; then
echo ">> Setting permissions on docker socket"
DOCKER_GROUP=$(stat -c '%g' /var/run/docker.sock)
- groupadd --non-unique --gid ${DOCKER_GROUP} dockeronhost
+ groupadd --non-unique --gid "${DOCKER_GROUP}" dockeronhost
usermod -aG dockeronhost www-data
fi
diff --git a/server-ce/runit/spelling-overleaf/run b/server-ce/runit/references-overleaf/run
similarity index 56%
rename from server-ce/runit/spelling-overleaf/run
rename to server-ce/runit/references-overleaf/run
index 65ef61cd64..875023df9f 100755
--- a/server-ce/runit/spelling-overleaf/run
+++ b/server-ce/runit/references-overleaf/run
@@ -2,11 +2,11 @@
NODE_PARAMS=""
if [ "$DEBUG_NODE" == "true" ]; then
- echo "running debug - spelling"
- NODE_PARAMS="--inspect=0.0.0.0:30050"
+ echo "running debug - references"
+ NODE_PARAMS="--inspect=0.0.0.0:30560"
fi
source /etc/overleaf/env.sh
export LISTEN_ADDRESS=127.0.0.1
-exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/spelling/app.js >> /var/log/overleaf/spelling.log 2>&1
+exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/references/app.js >> /var/log/overleaf/references.log 2>&1
diff --git a/server-ce/services.js b/server-ce/services.js
index e91e252ea9..e0282f3bad 100644
--- a/server-ce/services.js
+++ b/server-ce/services.js
@@ -20,9 +20,6 @@ module.exports = [
{
name: 'chat',
},
- {
- name: 'spelling',
- },
{
name: 'contacts',
},
@@ -32,6 +29,9 @@ module.exports = [
{
name: 'project-history',
},
+ {
+ name: 'references',
+ },
{
name: 'history-v1',
},
diff --git a/server-ce/test/Dockerfile b/server-ce/test/Dockerfile
index 3d00ca401f..7cc86f7ff9 100644
--- a/server-ce/test/Dockerfile
+++ b/server-ce/test/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:18.20.2
+FROM node:22.17.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/server-ce/test/Makefile b/server-ce/test/Makefile
index 1671b9f986..fb7c980293 100644
--- a/server-ce/test/Makefile
+++ b/server-ce/test/Makefile
@@ -6,8 +6,8 @@ all: test-e2e
# Notable the container labels com.docker.compose.project.working_dir and com.docker.compose.project.config_files need to match when creating containers from the docker host (how you started things) and from host-admin (how tests reconfigure the instance).
export PWD = $(shell pwd)
-export TEX_LIVE_DOCKER_IMAGE ?= gcr.io/overleaf-ops/texlive-full:2023.1
-export ALL_TEX_LIVE_DOCKER_IMAGES ?= gcr.io/overleaf-ops/texlive-full:2023.1,gcr.io/overleaf-ops/texlive-full:2022.1
+export TEX_LIVE_DOCKER_IMAGE ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2023.1
+export ALL_TEX_LIVE_DOCKER_IMAGES ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2023.1,us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2022.1
export IMAGE_TAG_PRO ?= us-east1-docker.pkg.dev/overleaf-ops/ol-docker/pro:latest
export CYPRESS_SHARD ?=
export COMPOSE_PROJECT_NAME ?= test
@@ -20,9 +20,12 @@ test-e2e-native:
npm run cypress:open
test-e2e:
+ docker compose build host-admin
+ docker compose up -d host-admin
docker compose up --no-log-prefix --exit-code-from=e2e e2e
test-e2e-open:
+ docker compose up -d host-admin
docker compose up --no-log-prefix --exit-code-from=e2e-open e2e-open
clean:
@@ -44,8 +47,8 @@ prefetch_custom_compose_pull:
prefetch_custom: prefetch_custom_texlive
prefetch_custom_texlive:
- echo -n "$$ALL_TEX_LIVE_DOCKER_IMAGES" | xargs -d, -I% \
- sh -exc 'tag=%; re_tag=quay.io/sharelatex/$${tag#*/*/}; docker pull $$tag; docker tag $$tag $$re_tag'
+ echo "$$ALL_TEX_LIVE_DOCKER_IMAGES" | tr ',' '\n' | xargs -I% \
+ sh -exc 'tag=%; re_tag=quay.io/sharelatex/$${tag#*/*/*/}; docker pull $$tag; docker tag $$tag $$re_tag'
prefetch_custom: prefetch_old
prefetch_old:
diff --git a/server-ce/test/accounts.spec.ts b/server-ce/test/accounts.spec.ts
index eeeb104087..85d545535a 100644
--- a/server-ce/test/accounts.spec.ts
+++ b/server-ce/test/accounts.spec.ts
@@ -9,7 +9,7 @@ describe('Accounts', function () {
it('can log in and out', function () {
login('user@example.com')
cy.visit('/project')
- cy.findByText('Account').click()
+ cy.findByRole('menuitem', { name: 'Account' }).click()
cy.findByText('Log Out').click()
cy.url().should('include', '/login')
cy.visit('/project')
diff --git a/server-ce/test/admin.spec.ts b/server-ce/test/admin.spec.ts
index 7a982bf672..50a89fb855 100644
--- a/server-ce/test/admin.spec.ts
+++ b/server-ce/test/admin.spec.ts
@@ -127,10 +127,12 @@ describe('admin panel', function () {
testProjectName = `project-${uuid()}`
deletedProjectName = `deleted-project-${uuid()}`
login(user1)
- cy.visit('/project')
- createProject(testProjectName).then(id => (testProjectId = id))
- cy.visit('/project')
- createProject(deletedProjectName).then(id => (projectToDeleteId = id))
+ createProject(testProjectName, { open: false }).then(
+ id => (testProjectId = id)
+ )
+ createProject(deletedProjectName, { open: false }).then(
+ id => (projectToDeleteId = id)
+ )
})
describe('manage site', () => {
@@ -177,6 +179,21 @@ describe('admin panel', function () {
cy.get('nav').findByText('Manage Users').click()
})
+ it('displays expected tabs', () => {
+ const tabs = ['Users', 'License Usage']
+ cy.get('[role="tab"]').each((el, index) => {
+ cy.wrap(el).findByText(tabs[index]).click()
+ })
+ cy.get('[role="tab"]').should('have.length', tabs.length)
+ })
+
+ it('license usage tab', () => {
+ cy.get('a').contains('License Usage').click()
+ cy.findByText(
+ 'An active user is one who has opened a project in this Server Pro instance in the last 12 months.'
+ )
+ })
+
describe('create users', () => {
beforeEach(() => {
cy.get('a').contains('New User').click()
@@ -291,8 +308,8 @@ describe('admin panel', function () {
cy.findByText(deletedProjectName).should('not.exist')
cy.log('navigate to thrashed projects and delete the project')
- cy.get('.project-list-sidebar-react').within(() => {
- cy.findByText('Trashed Projects').click()
+ cy.get('.project-list-sidebar-scroll').within(() => {
+ cy.findByText('Trashed projects').click()
})
findProjectRow(deletedProjectName).within(() =>
cy.findByRole('button', { name: 'Delete' }).click()
@@ -316,8 +333,8 @@ describe('admin panel', function () {
cy.log('login as the user and verify the project is restored')
login(user1)
cy.visit('/project')
- cy.get('.project-list-sidebar-react').within(() => {
- cy.findByText('Trashed Projects').click()
+ cy.get('.project-list-sidebar-scroll').within(() => {
+ cy.findByText('Trashed projects').click()
})
cy.findByText(`${deletedProjectName} (Restored)`)
})
diff --git a/server-ce/test/create-and-compile-project.spec.ts b/server-ce/test/create-and-compile-project.spec.ts
index 1bfcfa999a..a0e03fe8d0 100644
--- a/server-ce/test/create-and-compile-project.spec.ts
+++ b/server-ce/test/create-and-compile-project.spec.ts
@@ -1,5 +1,8 @@
import { ensureUserExists, login } from './helpers/login'
-import { createProject } from './helpers/project'
+import {
+ createProject,
+ openProjectViaInviteNotification,
+} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { throttledRecompile } from './helpers/compile'
@@ -11,10 +14,7 @@ describe('Project creation and compilation', function () {
it('users can create project and compile it', function () {
login('user@example.com')
- cy.visit('/project')
- // this is the first project created, the welcome screen is displayed instead of the project list
createProject('test-project')
- cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
const recompile = throttledRecompile()
cy.findByText('\\maketitle').parent().click()
cy.findByText('\\maketitle').parent().type('\n\\section{{}Test Section}')
@@ -26,8 +26,8 @@ describe('Project creation and compilation', function () {
const fileName = `test-${Date.now()}.md`
const markdownContent = '# Markdown title'
login('user@example.com')
- cy.visit('/project')
createProject('test-project')
+
// FIXME: Add aria-label maybe? or at least data-test-id
cy.findByText('New file').click({ force: true })
cy.findByRole('dialog').within(() => {
@@ -40,9 +40,15 @@ describe('Project creation and compilation', function () {
cy.get('.cm-line').should('have.length', 1)
cy.get('.cm-line').type(markdownContent)
cy.findByText('main.tex').click()
- cy.get('.cm-content').should('contain.text', '\\maketitle')
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ '\\maketitle'
+ )
cy.findByText(fileName).click()
- cy.get('.cm-content').should('contain.text', markdownContent)
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ markdownContent
+ )
})
it('can link and display linked image from other project', function () {
@@ -50,12 +56,10 @@ describe('Project creation and compilation', function () {
const targetProjectName = `${sourceProjectName}-target`
login('user@example.com')
- cy.visit('/project')
- createProject(sourceProjectName, { type: 'Example Project' }).as(
- 'sourceProjectId'
- )
-
- cy.visit('/project')
+ createProject(sourceProjectName, {
+ type: 'Example project',
+ open: false,
+ }).as('sourceProjectId')
createProject(targetProjectName)
// link the image from `projectName` into this project
@@ -80,13 +84,10 @@ describe('Project creation and compilation', function () {
const sourceProjectName = `test-project-${Date.now()}`
const targetProjectName = `${sourceProjectName}-target`
login('user@example.com')
-
- cy.visit('/project')
- createProject(sourceProjectName, { type: 'Example Project' }).as(
- 'sourceProjectId'
- )
-
- cy.visit('/project')
+ createProject(sourceProjectName, {
+ type: 'Example project',
+ open: false,
+ }).as('sourceProjectId')
createProject(targetProjectName).as('targetProjectId')
// link the image from `projectName` into this project
@@ -100,24 +101,15 @@ describe('Project creation and compilation', function () {
cy.findByText('Share').click()
cy.findByRole('dialog').within(() => {
- cy.get('input').type('collaborator@example.com,')
- cy.findByText('Share').click({ force: true })
+ cy.findByTestId('collaborator-email-input').type(
+ 'collaborator@example.com,'
+ )
+ cy.findByText('Invite').click({ force: true })
+ cy.findByText('Invite not yet accepted.')
})
- cy.visit('/project')
- cy.findByText('Account').click()
- cy.findByText('Log Out').click()
-
login('collaborator@example.com')
- cy.visit('/project')
- cy.findByText(targetProjectName)
- .parent()
- .parent()
- .within(() => {
- cy.findByText('Join Project').click()
- })
- cy.findByText('Open Project').click()
- cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
+ openProjectViaInviteNotification(targetProjectName)
cy.get('@targetProjectId').then(targetProjectId => {
cy.url().should('include', targetProjectId)
})
diff --git a/server-ce/test/docker-compose.yml b/server-ce/test/docker-compose.yml
index ee97a6cb01..d16c5e2b71 100644
--- a/server-ce/test/docker-compose.yml
+++ b/server-ce/test/docker-compose.yml
@@ -20,7 +20,7 @@ services:
OVERLEAF_EMAIL_SMTP_HOST: 'mailtrap'
OVERLEAF_EMAIL_SMTP_PORT: '25'
OVERLEAF_EMAIL_SMTP_IGNORE_TLS: 'true'
- ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
+ ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file,url'
ENABLE_CONVERSIONS: 'true'
EMAIL_CONFIRMATION_DISABLED: 'true'
healthcheck:
@@ -35,10 +35,10 @@ services:
MAILTRAP_PASSWORD: 'password-for-mailtrap'
mongo:
- image: mongo:5.0.17
+ image: mongo:8.0.11
command: '--replSet overleaf'
volumes:
- - ../mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ - ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
environment:
MONGO_INITDB_DATABASE: sharelatex
extra_hosts:
@@ -46,7 +46,7 @@ services:
# This override is not needed when running the setup after starting up mongo.
- mongo:127.0.0.1
healthcheck:
- test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
+ test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
interval: 3s
timeout: 3s
retries: 30
@@ -91,6 +91,7 @@ services:
volumes:
- ./:/e2e
- /tmp/.X11-unix:/tmp/.X11-unix
+ - ${XAUTHORITY:-/dev/null}:/home/node/.Xauthority
user: "${DOCKER_USER:-1000:1000}"
environment:
CYPRESS_SHARD:
@@ -131,7 +132,7 @@ services:
saml:
restart: always
- image: gcr.io/overleaf-ops/saml-test
+ image: us-east1-docker.pkg.dev/overleaf-ops/ol-docker/saml-test
environment:
SAML_TEST_SP_ENTITY_ID: 'sharelatex-test-saml'
SAML_BASE_URL_PATH: 'http://saml/simplesaml/'
diff --git a/server-ce/test/editor.spec.ts b/server-ce/test/editor.spec.ts
index 572d80965c..3e57b94f8f 100644
--- a/server-ce/test/editor.spec.ts
+++ b/server-ce/test/editor.spec.ts
@@ -1,7 +1,14 @@
-import { createProject } from './helpers/project'
+import {
+ createNewFile,
+ createProject,
+ openProjectById,
+ testNewFileUpload,
+} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { ensureUserExists, login } from './helpers/login'
import { v4 as uuid } from 'uuid'
+import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
+import { prepareWaitForNextCompileSlot } from './helpers/compile'
describe('editor', () => {
if (isExcludedBySharding('PRO_DEFAULT_1')) return
@@ -9,186 +16,80 @@ describe('editor', () => {
ensureUserExists({ email: 'user@example.com' })
ensureUserExists({ email: 'collaborator@example.com' })
- it('word dictionary and spelling', () => {
- const fileName = 'test.tex'
- const word = createRandomLetterString()
+ let projectName: string
+ let projectId: string
+ let recompile: () => void
+ let waitForCompileRateLimitCoolOff: (fn: () => void) => void
+ beforeWithReRunOnTestRetry(function () {
+ projectName = `project-${uuid()}`
login('user@example.com')
- cy.visit('/project')
- createProject('test-project')
-
- cy.log('create new project file')
- cy.get('button').contains('New file').click({ force: true })
- cy.findByRole('dialog').within(() => {
- cy.get('input').clear()
- cy.get('input').type(fileName)
- cy.findByText('Create').click()
- })
- cy.findByText(fileName).click()
-
- cy.log('edit project file')
- // wait until we've switched to the newly created empty file
- cy.get('.cm-line').should('have.length', 1)
- cy.get('.cm-line').type(word)
-
- cy.get('.ol-cm-spelling-error').should('exist')
-
- cy.log('change project language')
- cy.get('button').contains('Menu').click()
- cy.get('select[id=settings-menu-spellCheckLanguage]').select('Spanish')
- cy.get('[id="left-menu"]').type('{esc}') // close left menu
-
- cy.log('add word to dictionary')
- cy.get('.ol-cm-spelling-error').contains(word).rightclick()
- cy.findByText('Add to Dictionary').click()
- cy.get('.ol-cm-spelling-error').should('not.exist')
-
- cy.log('remove word from dictionary')
- cy.get('button').contains('Menu').click()
- cy.get('button').contains('Edit').click()
- cy.get('[id="dictionary-modal"').within(() => {
- cy.findByText(word)
- .parent()
- .within(() => cy.get('button').click())
-
- // the modal has 2 close buttons, this ensures the one with the visible label is
- // clicked, otherwise it would need `force: true`
- cy.get('.btn').contains('Close').click()
- })
-
- cy.log('close left panel')
- cy.get('[id="left-menu"]').type('{esc}')
-
- cy.log('rewrite word to force spelling error')
- cy.get('.cm-line').type('{selectAll}{del}' + word + '{enter}')
-
- cy.get('.ol-cm-spelling-error').should('contain.text', word)
+ createProject(projectName, { type: 'Example project', open: false }).then(
+ id => (projectId = id)
+ )
+ ;({ recompile, waitForCompileRateLimitCoolOff } =
+ prepareWaitForNextCompileSlot())
})
- describe('collaboration', () => {
- let projectId: string
+ beforeEach(() => {
+ login('user@example.com')
+ waitForCompileRateLimitCoolOff(() => {
+ openProjectById(projectId)
+ })
+ })
- beforeEach(() => {
- login('user@example.com')
- cy.visit(`/project`)
- createProject('test-editor', { type: 'Example Project' }).then(
- (id: string) => {
- projectId = id
+ describe('spelling', function () {
+ function changeSpellCheckLanguageTo(lng: string) {
+ cy.log(`change project language to '${lng}'`)
+ cy.get('button').contains('Menu').click()
+ cy.get('select[id=settings-menu-spellCheckLanguage]').select(lng)
+ cy.get('[id="left-menu"]').type('{esc}') // close left menu
+ }
- cy.log('make project shareable')
- cy.findByText('Share').click()
- cy.findByText('Turn on link sharing').click()
-
- cy.log('accept project invitation')
- cy.findByText('Anyone with this link can edit this project')
- .next()
- .should('contain.text', 'http://') // wait for the link to appear
- .then(el => {
- const linkSharingReadAndWrite = el.text()
- login('collaborator@example.com')
- cy.visit(linkSharingReadAndWrite)
- cy.get('button').contains('Join Project').click()
- cy.log(
- 'navigate to project dashboard to avoid cross session requests from editor'
- )
- cy.visit('/project')
- })
-
- login('user@example.com')
- cy.visit(`/project/${projectId}`)
- }
- )
+ afterEach(function () {
+ changeSpellCheckLanguageTo('Off')
})
- it('track-changes', () => {
- cy.log('enable track-changes for everyone')
- cy.findByText('Review').click()
- cy.get('.review-panel-toolbar-collapse-button').click() // make track-changes switches visible
+ it('word dictionary and spelling', () => {
+ changeSpellCheckLanguageTo('English (American)')
+ createNewFile()
+ const word = createRandomLetterString()
- cy.intercept('POST', '**/track_changes').as('enableTrackChanges')
- cy.findByText('Everyone')
- .parent()
- .within(() => cy.get('.input-switch').click())
- cy.wait('@enableTrackChanges')
+ cy.log('edit project file')
+ cy.get('.cm-line').type(word)
- login('collaborator@example.com')
- cy.visit(`/project/${projectId}`)
+ cy.get('.ol-cm-spelling-error').should('exist')
- cy.log('make changes in main file')
- // cy.type() "clicks" in the center of the selected element before typing. This "click" discards the text as selected by the dblclick.
- // Go down to the lower level event based typing, the frontend tests in web use similar events.
- cy.get('.cm-editor').as('editor')
- cy.get('@editor').findByText('\\maketitle').dblclick()
- cy.get('@editor').trigger('keydown', { key: 'Delete' })
- cy.get('@editor').trigger('keydown', { key: 'Enter' })
- cy.get('@editor').trigger('keydown', { key: 'Enter' })
+ changeSpellCheckLanguageTo('Spanish')
- cy.log('recompile to force flush')
- cy.findByText('Recompile').click()
+ cy.log('add word to dictionary')
+ cy.get('.ol-cm-spelling-error').contains(word).rightclick()
+ cy.findByText('Add to dictionary').click()
+ cy.get('.ol-cm-spelling-error').should('not.exist')
- login('user@example.com')
- cy.visit(`/project/${projectId}`)
+ cy.log('remove word from dictionary')
+ cy.get('button').contains('Menu').click()
+ cy.get('button#dictionary-settings').contains('Edit').click()
+ cy.get('[id="dictionary-modal"]').within(() => {
+ cy.findByText(word)
+ .parent()
+ .within(() => cy.get('button').click())
- cy.log('reject changes')
- cy.findByText('Review').click()
- cy.get('.cm-content').should('not.contain.text', '\\maketitle')
- cy.findByText('Reject').click({ force: true })
+ // the modal has 2 close buttons, this ensures the one with the visible label is
+ // clicked, otherwise it would need `force: true`
+ cy.get('.btn').contains('Close').click()
+ })
- cy.log('verify the changes are applied')
- cy.get('.cm-content').should('contain.text', '\\maketitle')
- })
+ cy.log('close left panel')
+ cy.get('[id="left-menu"]').type('{esc}')
- it('track-changes rich text', () => {
- cy.log('enable track-changes for everyone')
- cy.findByText('Visual Editor').click()
- cy.findByText('Review').click()
- cy.get('.review-panel-toolbar-collapse-button').click() // make track-changes switches visible
+ cy.log('rewrite word to force spelling error')
+ cy.get('.cm-line').type('{selectAll}{del}' + word + '{enter}')
- cy.intercept('POST', '**/track_changes').as('enableTrackChanges')
- cy.findByText('Everyone')
- .parent()
- .within(() => cy.get('.input-switch').click())
- cy.wait('@enableTrackChanges')
-
- login('collaborator@example.com')
- cy.visit(`/project/${projectId}`)
-
- cy.log('enable visual editor and make changes in main file')
- cy.findByText('Visual Editor').click()
-
- // cy.type() "clicks" in the center of the selected element before typing. This "click" discards the text as selected by the dblclick.
- // Go down to the lower level event based typing, the frontend tests in web use similar events.
- cy.get('.cm-editor').as('editor')
- cy.get('@editor').contains('Introduction').dblclick()
- cy.get('@editor').trigger('keydown', { key: 'Delete' })
- cy.get('@editor').trigger('keydown', { key: 'Enter' })
- cy.get('@editor').trigger('keydown', { key: 'Enter' })
-
- cy.log('recompile to force flush')
- cy.findByText('Recompile').click()
-
- login('user@example.com')
- cy.visit(`/project/${projectId}`)
-
- cy.log('reject changes')
- cy.findByText('Review').click()
- cy.get('.cm-content').should('not.contain.text', 'Introduction')
- cy.findAllByText('Reject').first().click({ force: true })
-
- cy.log('verify the changes are applied in the visual editor')
- cy.findByText('Visual Editor').click()
- cy.get('.cm-content').should('contain.text', 'Introduction')
+ cy.get('.ol-cm-spelling-error').should('contain.text', word)
})
})
describe('editor', () => {
- beforeEach(() => {
- login('user@example.com')
- cy.visit(`/project`)
- createProject(`project-${uuid()}`, { type: 'Example Project' })
- // wait until the main document is rendered
- cy.findByText(/Loading/).should('not.exist')
- })
-
it('renders jpg', () => {
cy.findByTestId('file-tree').findByText('frog.jpg').click()
cy.get('[alt="frog.jpg"]')
@@ -198,40 +99,28 @@ describe('editor', () => {
})
it('symbol palette', () => {
+ createNewFile()
+
cy.get('button[aria-label="Toggle Symbol Palette"]').click({
force: true,
})
cy.get('button').contains('𝜉').click()
- cy.get('.cm-content').should('contain.text', '\\xi')
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ '\\xi'
+ )
+
+ cy.log('recompile to force flush and avoid "unsaved changes" prompt')
+ recompile()
})
})
describe('add new file to project', () => {
- let projectName: string
-
beforeEach(() => {
- projectName = `project-${uuid()}`
- login('user@example.com')
- cy.visit(`/project`)
- createProject(projectName, { type: 'Example Project' })
cy.get('button').contains('New file').click({ force: true })
})
- it('can upload file', () => {
- cy.get('button').contains('Upload').click({ force: true })
- cy.get('input[type=file]')
- .first()
- .selectFile(
- {
- contents: Cypress.Buffer.from('Test File Content'),
- fileName: 'file.txt',
- lastModified: Date.now(),
- },
- { force: true }
- )
- cy.findByTestId('file-tree').findByText('file.txt').click({ force: true })
- cy.findByText('Test File Content')
- })
+ testNewFileUpload()
it('should not display import from URL', () => {
cy.findByText('From external URL').should('not.exist')
@@ -239,20 +128,15 @@ describe('editor', () => {
})
describe('left menu', () => {
- let projectName: string
-
beforeEach(() => {
- projectName = `project-${uuid()}`
- login('user@example.com')
- cy.visit(`/project`)
- createProject(projectName, { type: 'Example Project' })
cy.get('button').contains('Menu').click()
})
it('can download project sources', () => {
cy.get('a').contains('Source').click()
+ const zipName = projectName.replaceAll('-', '_')
cy.task('readFileInZip', {
- pathToZip: `cypress/downloads/${projectName}.zip`,
+ pathToZip: `cypress/downloads/${zipName}.zip`,
fileToRead: 'main.tex',
}).should('contain', 'Your introduction goes here')
})
@@ -291,13 +175,6 @@ describe('editor', () => {
})
describe('layout selector', () => {
- let projectId: string
- beforeEach(() => {
- login('user@example.com')
- cy.visit(`/project`)
- createProject(`project-${uuid()}`, { type: 'Example Project' })
- })
-
it('show editor only and switch between editor and pdf', () => {
cy.get('.pdf-viewer').should('be.visible')
cy.get('.cm-editor').should('be.visible')
@@ -305,7 +182,7 @@ describe('editor', () => {
cy.findByText('Layout').click()
cy.findByText('Editor only').click()
- cy.get('.pdf-viewer').should('not.exist')
+ cy.get('.pdf-viewer').should('not.be.visible')
cy.get('.cm-editor').should('be.visible')
cy.findByText('Switch to PDF').click()
@@ -315,7 +192,7 @@ describe('editor', () => {
cy.findByText('Switch to editor').click()
- cy.get('.pdf-viewer').should('not.exist')
+ cy.get('.pdf-viewer').should('not.be.visible')
cy.get('.cm-editor').should('be.visible')
})
diff --git a/server-ce/test/external-auth.spec.ts b/server-ce/test/external-auth.spec.ts
index 7e71ab9777..f26947e8a8 100644
--- a/server-ce/test/external-auth.spec.ts
+++ b/server-ce/test/external-auth.spec.ts
@@ -32,6 +32,9 @@ describe('SAML', () => {
cy.get('button[type="submit"]').click()
})
+ cy.log('wait for login to finish')
+ cy.url().should('contain', '/project')
+
createProject('via SAML')
})
})
@@ -62,6 +65,9 @@ describe('LDAP', () => {
cy.get('input[name="password"]').type('fry')
cy.get('button[type="submit"]').click()
+ cy.log('wait for login to finish')
+ cy.url().should('contain', '/project')
+
createProject('via LDAP')
})
})
diff --git a/server-ce/test/filestore-migration.spec.ts b/server-ce/test/filestore-migration.spec.ts
new file mode 100644
index 0000000000..25875ad374
--- /dev/null
+++ b/server-ce/test/filestore-migration.spec.ts
@@ -0,0 +1,104 @@
+import { ensureUserExists, login } from './helpers/login'
+import {
+ createProject,
+ openProjectById,
+ prepareFileUploadTest,
+} from './helpers/project'
+import { isExcludedBySharding, startWith } from './helpers/config'
+import { prepareWaitForNextCompileSlot } from './helpers/compile'
+import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
+import { v4 as uuid } from 'uuid'
+import { purgeFilestoreData, runScript } from './helpers/hostAdminClient'
+
+describe('filestore migration', function () {
+ if (isExcludedBySharding('CE_CUSTOM_3')) return
+ startWith({ withDataDir: true, resetData: true, vars: {} })
+ ensureUserExists({ email: 'user@example.com' })
+
+ let projectName: string
+ let projectId: string
+ let waitForCompileRateLimitCoolOff: (fn: () => void) => void
+ const previousBinaryFiles: (() => void)[] = []
+ beforeWithReRunOnTestRetry(function () {
+ projectName = `project-${uuid()}`
+ login('user@example.com')
+ createProject(projectName, { type: 'Example project' }).then(
+ id => (projectId = id)
+ )
+ let queueReset
+ ;({ waitForCompileRateLimitCoolOff, queueReset } =
+ prepareWaitForNextCompileSlot())
+ queueReset()
+ previousBinaryFiles.push(prepareFileUploadTest(true))
+ })
+
+ beforeEach(() => {
+ login('user@example.com')
+ waitForCompileRateLimitCoolOff(() => {
+ openProjectById(projectId)
+ })
+ })
+
+ function checkFilesAreAccessible() {
+ it('can upload new binary file and read previous uploads', function () {
+ previousBinaryFiles.push(prepareFileUploadTest(true))
+ for (const check of previousBinaryFiles) {
+ check()
+ }
+ })
+
+ it('renders frog jpg', () => {
+ cy.findByTestId('file-tree').findByText('frog.jpg').click()
+ cy.get('[alt="frog.jpg"]')
+ .should('be.visible')
+ .and('have.prop', 'naturalWidth')
+ .should('be.greaterThan', 0)
+ })
+ }
+
+ describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL not set', function () {
+ startWith({ withDataDir: true, vars: {} })
+ checkFilesAreAccessible()
+ })
+
+ describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=0', function () {
+ startWith({
+ withDataDir: true,
+ vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '0' },
+ })
+ checkFilesAreAccessible()
+
+ describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=1', function () {
+ startWith({
+ withDataDir: true,
+ vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '1' },
+ })
+ checkFilesAreAccessible()
+
+ describe('OVERLEAF_FILESTORE_MIGRATION_LEVEL=2', function () {
+ startWith({
+ withDataDir: true,
+ vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '1' },
+ })
+ before(async function () {
+ await runScript({
+ cwd: 'services/history-v1',
+ script: 'storage/scripts/back_fill_file_hash.mjs',
+ })
+ })
+ startWith({
+ withDataDir: true,
+ vars: { OVERLEAF_FILESTORE_MIGRATION_LEVEL: '2' },
+ })
+ checkFilesAreAccessible()
+
+ describe('purge filestore data', function () {
+ before(async function () {
+ await purgeFilestoreData()
+ })
+ checkFilesAreAccessible()
+ })
+ })
+ })
+ })
+})
diff --git a/server-ce/test/git-bridge.spec.ts b/server-ce/test/git-bridge.spec.ts
index ee2aff41ed..1f114574ac 100644
--- a/server-ce/test/git-bridge.spec.ts
+++ b/server-ce/test/git-bridge.spec.ts
@@ -4,6 +4,8 @@ import { ensureUserExists, login } from './helpers/login'
import {
createProject,
enableLinkSharing,
+ openProjectByName,
+ openProjectViaLinkSharingAsUser,
shareProjectByEmailAndAcceptInviteViaDash,
} from './helpers/project'
@@ -20,7 +22,12 @@ describe('git-bridge', function () {
V1_HISTORY_URL: 'http://sharelatex:3100/api',
}
- const gitBridgePublicHost = new URL(Cypress.config().baseUrl!).host
+ function gitURL(projectId: string) {
+ const url = new URL(Cypress.config().baseUrl!)
+ url.username = 'git'
+ url.pathname = `/git/${projectId}`
+ return url
+ }
describe('enabled in Server Pro', function () {
if (isExcludedBySharding('PRO_CUSTOM_1')) return
@@ -39,7 +46,7 @@ describe('git-bridge', function () {
function maybeClearAllTokens() {
cy.visit('/user/settings')
- cy.findByText('Git Integration')
+ cy.findByText('Git integration')
cy.get('button')
.contains(/Generate token|Add another token/)
.then(btn => {
@@ -56,7 +63,7 @@ describe('git-bridge', function () {
it('should render the git-bridge UI in the settings', () => {
maybeClearAllTokens()
cy.visit('/user/settings')
- cy.findByText('Git Integration')
+ cy.findByText('Git integration')
cy.get('button').contains('Generate token').click()
cy.get('code')
.contains(/olp_[a-zA-Z0-9]{16}/)
@@ -77,19 +84,16 @@ describe('git-bridge', function () {
it('should render the git-bridge UI in the editor', function () {
maybeClearAllTokens()
- cy.visit('/project')
createProject('git').as('projectId')
cy.get('header').findByText('Menu').click()
cy.findByText('Sync')
cy.findByText('Git').click()
- cy.findByRole('dialog').within(() => {
+ cy.findByTestId('git-bridge-modal').within(() => {
cy.get('@projectId').then(id => {
- cy.get('code').contains(
- `git clone http://git@${gitBridgePublicHost}/git/${id}`
- )
+ cy.get('code').contains(`git clone ${gitURL(id.toString())}`)
})
cy.findByRole('button', {
- name: 'Generate token',
+ name: /generate token/i,
}).click()
cy.get('code').contains(/olp_[a-zA-Z0-9]{16}/)
})
@@ -98,14 +102,12 @@ describe('git-bridge', function () {
cy.url().then(url => cy.visit(url))
cy.get('header').findByText('Menu').click()
cy.findByText('Git').click()
- cy.findByRole('dialog').within(() => {
+ cy.findByTestId('git-bridge-modal').within(() => {
cy.get('@projectId').then(id => {
- cy.get('code').contains(
- `git clone http://git@${gitBridgePublicHost}/git/${id}`
- )
+ cy.get('code').contains(`git clone ${gitURL(id.toString())}`)
})
cy.findByText('Generate token').should('not.exist')
- cy.findByText(/generate a new one in Account Settings/)
+ cy.findByText(/generate a new one in Account settings/)
cy.findByText('Go to settings')
.should('have.attr', 'target', '_blank')
.and('have.attr', 'href', '/user/settings')
@@ -120,15 +122,13 @@ describe('git-bridge', function () {
let projectName: string
beforeEach(() => {
- cy.visit('/project')
projectName = uuid()
- createProject(projectName).as('projectId')
+ createProject(projectName, { open: false }).as('projectId')
})
it('should expose r/w interface to owner', () => {
maybeClearAllTokens()
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
checkGitAccess('readAndWrite')
})
@@ -136,11 +136,10 @@ describe('git-bridge', function () {
shareProjectByEmailAndAcceptInviteViaDash(
projectName,
'collaborator-rw@example.com',
- 'Can edit'
+ 'Editor'
)
maybeClearAllTokens()
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
checkGitAccess('readAndWrite')
})
@@ -148,32 +147,39 @@ describe('git-bridge', function () {
shareProjectByEmailAndAcceptInviteViaDash(
projectName,
'collaborator-ro@example.com',
- 'Read only'
+ 'Viewer'
)
maybeClearAllTokens()
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
checkGitAccess('readOnly')
})
it('should expose r/w interface to link-sharing r/w collaborator', () => {
+ openProjectByName(projectName)
enableLinkSharing().then(({ linkSharingReadAndWrite }) => {
- login('collaborator-link-rw@example.com')
+ const email = 'collaborator-link-rw@example.com'
+ login(email)
maybeClearAllTokens()
- cy.visit(linkSharingReadAndWrite)
- cy.findByText(projectName) // wait for lazy loading
- cy.findByText('Join Project').click()
+ openProjectViaLinkSharingAsUser(
+ linkSharingReadAndWrite,
+ projectName,
+ email
+ )
checkGitAccess('readAndWrite')
})
})
it('should expose r/o interface to link-sharing r/o collaborator', () => {
+ openProjectByName(projectName)
enableLinkSharing().then(({ linkSharingReadOnly }) => {
- login('collaborator-link-ro@example.com')
+ const email = 'collaborator-link-ro@example.com'
+ login(email)
maybeClearAllTokens()
- cy.visit(linkSharingReadOnly)
- cy.findByText(projectName) // wait for lazy loading
- cy.findByText('Join Project').click()
+ openProjectViaLinkSharingAsUser(
+ linkSharingReadOnly,
+ projectName,
+ email
+ )
checkGitAccess('readOnly')
})
})
@@ -186,13 +192,11 @@ describe('git-bridge', function () {
cy.findByText('Sync')
cy.findByText('Git').click()
cy.get('@projectId').then(projectId => {
- cy.findByRole('dialog').within(() => {
- cy.get('code').contains(
- `git clone http://git@${gitBridgePublicHost}/git/${projectId}`
- )
+ cy.findByTestId('git-bridge-modal').within(() => {
+ cy.get('code').contains(`git clone ${gitURL(projectId.toString())}`)
})
cy.findByRole('button', {
- name: 'Generate token',
+ name: /generate token/i,
}).click()
cy.get('code')
.contains(/olp_[a-zA-Z0-9]{16}/)
@@ -202,7 +206,7 @@ describe('git-bridge', function () {
// close Git modal
cy.findAllByText('Close').last().click()
// close editor menu
- cy.get('#left-menu-modal').click()
+ cy.get('.left-menu-modal-backdrop').click()
const fs = new LightningFS('fs')
const dir = `/${projectId}`
@@ -229,9 +233,11 @@ describe('git-bridge', function () {
dir,
fs,
}
+ const url = gitURL(projectId.toString())
+ url.username = '' // basic auth is specified separately.
const httpOptions = {
http,
- url: `http://sharelatex/git/${projectId}`,
+ url: url.toString(),
headers: {
Authorization: `Basic ${Buffer.from(`git:${token}`).toString('base64')}`,
},
@@ -359,11 +365,10 @@ Hello world
it('should not render the git-bridge UI in the settings', () => {
login('user@example.com')
cy.visit('/user/settings')
- cy.findByText('Git Integration').should('not.exist')
+ cy.findByText('Git integration').should('not.exist')
})
it('should not render the git-bridge UI in the editor', function () {
login('user@example.com')
- cy.visit('/project')
createProject('maybe git')
cy.get('header').findByText('Menu').click()
cy.findByText('Word Count') // wait for lazy loading
diff --git a/server-ce/test/graceful-shutdown.spec.ts b/server-ce/test/graceful-shutdown.spec.ts
index 8201b55b76..40dc144be9 100644
--- a/server-ce/test/graceful-shutdown.spec.ts
+++ b/server-ce/test/graceful-shutdown.spec.ts
@@ -31,8 +31,6 @@ describe('GracefulShutdown', function () {
it('should display banner and flush changes out of redis', () => {
bringServerProBackUp()
login(USER)
-
- cy.visit('/project')
createProject(PROJECT_NAME).then(id => {
projectId = id
})
diff --git a/server-ce/test/helpers/compile.ts b/server-ce/test/helpers/compile.ts
index e65b36f332..d41e43221f 100644
--- a/server-ce/test/helpers/compile.ts
+++ b/server-ce/test/helpers/compile.ts
@@ -4,22 +4,45 @@
* This helper takes into account that other UI interactions take time. We can deduce that latency from the fixed delay (3s minus other latency). This can bring down the effective waiting time to 0s.
*/
export function throttledRecompile() {
+ const { queueReset, recompile } = prepareWaitForNextCompileSlot()
+ queueReset()
+ return recompile
+}
+
+export function stopCompile(options: { delay?: number } = {}) {
+ const { delay = 0 } = options
+ cy.wait(delay)
+ cy.log('Stop compile')
+ cy.findByRole('button', { name: 'Toggle compile options menu' }).click()
+ cy.findByRole('menuitem', { name: 'Stop compilation' }).click()
+}
+
+export function prepareWaitForNextCompileSlot() {
let lastCompile = 0
function queueReset() {
cy.then(() => {
lastCompile = Date.now()
})
}
-
- queueReset()
- return () =>
+ function waitForCompileRateLimitCoolOff(triggerCompile: () => void) {
cy.then(() => {
- cy.log('Recompile without hitting rate-limit')
+ cy.log('Wait for recompile rate-limit to cool off')
const msSinceLastCompile = Date.now() - lastCompile
cy.wait(Math.max(0, 1_000 - msSinceLastCompile))
- cy.findByText('Recompile').click()
queueReset()
- cy.log('Wait for recompile to finish')
- cy.findByText('Recompile')
+ triggerCompile()
+ cy.log('Wait for compile to finish')
+ cy.findByText('Recompile').should('be.visible')
})
+ }
+ function recompile() {
+ waitForCompileRateLimitCoolOff(() => {
+ cy.findByText('Recompile').click()
+ })
+ }
+ return {
+ queueReset,
+ waitForCompileRateLimitCoolOff,
+ recompile,
+ }
}
diff --git a/server-ce/test/helpers/config.ts b/server-ce/test/helpers/config.ts
index 030e70ceb5..78e81be1f7 100644
--- a/server-ce/test/helpers/config.ts
+++ b/server-ce/test/helpers/config.ts
@@ -9,6 +9,7 @@ export function isExcludedBySharding(
| 'CE_DEFAULT'
| 'CE_CUSTOM_1'
| 'CE_CUSTOM_2'
+ | 'CE_CUSTOM_3'
| 'PRO_DEFAULT_1'
| 'PRO_DEFAULT_2'
| 'PRO_CUSTOM_1'
diff --git a/server-ce/test/helpers/hostAdminClient.ts b/server-ce/test/helpers/hostAdminClient.ts
index cafeaa2db6..dadfe2b059 100644
--- a/server-ce/test/helpers/hostAdminClient.ts
+++ b/server-ce/test/helpers/hostAdminClient.ts
@@ -85,6 +85,12 @@ export async function getRedisKeys() {
return stdout.split('\n')
}
+export async function purgeFilestoreData() {
+ await fetchJSON(`${hostAdminURL}/data/user_files`, {
+ method: 'DELETE',
+ })
+}
+
async function sleep(ms: number) {
return new Promise(resolve => {
setTimeout(resolve, ms)
diff --git a/server-ce/test/helpers/login.ts b/server-ce/test/helpers/login.ts
index 1883e6da09..fa95abec1d 100644
--- a/server-ce/test/helpers/login.ts
+++ b/server-ce/test/helpers/login.ts
@@ -68,7 +68,8 @@ export function login(username: string, password = DEFAULT_PASSWORD) {
{
cacheAcrossSpecs: true,
async validate() {
- cy.request({ url: '/project', followRedirect: false }).then(
+ // Hit a cheap endpoint that is behind AuthenticationController.requireLogin().
+ cy.request({ url: '/user/personal_info', followRedirect: false }).then(
response => {
expect(response.status).to.equal(200)
}
diff --git a/server-ce/test/helpers/project.ts b/server-ce/test/helpers/project.ts
index c4d885a57f..4b3197afed 100644
--- a/server-ce/test/helpers/project.ts
+++ b/server-ce/test/helpers/project.ts
@@ -1,67 +1,141 @@
import { login } from './login'
import { openEmail } from './email'
+import { v4 as uuid } from 'uuid'
export function createProject(
name: string,
{
- type = 'Blank Project',
+ type = 'Blank project',
newProjectButtonMatcher = /new project/i,
+ open = true,
}: {
- type?: 'Blank Project' | 'Example Project'
+ type?: 'Blank project' | 'Example project'
newProjectButtonMatcher?: RegExp
+ open?: boolean
} = {}
): Cypress.Chainable {
+ cy.url().then(url => {
+ if (!url.endsWith('/project')) {
+ cy.visit('/project')
+ }
+ })
+ const interceptId = uuid()
+ let projectId = ''
+ if (!open) {
+ cy.then(() => {
+ // Register intercept just before creating the project, otherwise we might
+ // intercept a request from a prior createProject invocation.
+ cy.intercept(
+ { method: 'GET', url: /\/project\/[a-fA-F0-9]{24}$/, times: 1 },
+ req => {
+ projectId = req.url.split('/').pop()!
+ // Redirect back to the project dashboard, effectively reload the page.
+ req.redirect('/project')
+ }
+ ).as(interceptId)
+ })
+ }
cy.findAllByRole('button').contains(newProjectButtonMatcher).click()
// FIXME: This should only look in the left menu
- cy.findAllByText(type).first().click()
+ // The upgrading tests create projects in older versions of Server Pro which used different casing of the project type. Use case-insensitive match.
+ cy.findAllByText(type, { exact: false }).first().click()
cy.findByRole('dialog').within(() => {
cy.get('input').type(name)
cy.findByText('Create').click()
})
- return cy
- .url()
- .should('match', /\/project\/[a-fA-F0-9]{24}/)
- .then(url => url.split('/').pop())
+ if (open) {
+ cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
+ waitForMainDocToLoad()
+ return cy
+ .url()
+ .should('match', /\/project\/[a-fA-F0-9]{24}/)
+ .then(url => url.split('/').pop())
+ } else {
+ const alias = `@${interceptId}` // IDEs do not like computed values in cy.wait().
+ cy.wait(alias)
+ return cy.then(() => projectId)
+ }
+}
+
+export function openProjectByName(projectName: string) {
+ cy.visit('/project')
+ cy.findByText(projectName).click()
+ waitForMainDocToLoad()
+}
+
+export function openProjectById(projectId: string) {
+ cy.visit(`/project/${projectId}`)
+ waitForMainDocToLoad()
+}
+
+export function openProjectViaLinkSharingAsAnon(url: string) {
+ cy.visit(url)
+ waitForMainDocToLoad()
+}
+
+export function openProjectViaLinkSharingAsUser(
+ url: string,
+ projectName: string,
+ email: string
+) {
+ cy.visit(url)
+ cy.findByText(projectName) // wait for lazy loading
+ cy.contains(`as ${email}`)
+ cy.findByText('OK, join project').click()
+ waitForMainDocToLoad()
+}
+
+export function openProjectViaInviteNotification(projectName: string) {
+ cy.visit('/project')
+ cy.findByText(projectName)
+ .parent()
+ .parent()
+ .within(() => {
+ cy.findByText('Join Project').click()
+ })
+ cy.findByText('Open Project').click()
+ cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
+ waitForMainDocToLoad()
}
function shareProjectByEmail(
projectName: string,
email: string,
- level: 'Read only' | 'Can edit'
+ level: 'Viewer' | 'Editor'
) {
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
cy.findByText('Share').click()
cy.findByRole('dialog').within(() => {
- cy.get('input').type(`${email},`)
- cy.get('input')
+ cy.findByLabelText('Add people', { selector: 'input' }).type(`${email},`)
+ cy.findByLabelText('Add people', { selector: 'input' })
.parents('form')
- .within(() => cy.findByText('Can edit').parent().select(level))
- cy.findByText('Share').click({ force: true })
+ .within(() => {
+ cy.findByTestId('add-collaborator-select')
+ .click()
+ .then(() => {
+ cy.findByText(level).click()
+ })
+ })
+ cy.findByText('Invite').click({ force: true })
+ cy.findByText('Invite not yet accepted.')
})
}
export function shareProjectByEmailAndAcceptInviteViaDash(
projectName: string,
email: string,
- level: 'Read only' | 'Can edit'
+ level: 'Viewer' | 'Editor'
) {
shareProjectByEmail(projectName, email, level)
login(email)
- cy.visit('/project')
- cy.findByText(new RegExp(projectName))
- .parent()
- .parent()
- .within(() => {
- cy.findByText('Join Project').click()
- })
+ openProjectViaInviteNotification(projectName)
}
export function shareProjectByEmailAndAcceptInviteViaEmail(
projectName: string,
email: string,
- level: 'Read only' | 'Can edit'
+ level: 'Viewer' | 'Editor'
) {
shareProjectByEmail(projectName, email, level)
@@ -79,23 +153,27 @@ export function shareProjectByEmailAndAcceptInviteViaEmail(
cy.findByText(/user would like you to join/)
cy.contains(new RegExp(`You are accepting this invite as ${email}`))
cy.findByText('Join Project').click()
+ waitForMainDocToLoad()
}
export function enableLinkSharing() {
let linkSharingReadOnly: string
let linkSharingReadAndWrite: string
+ const origin = new URL(Cypress.config().baseUrl!).origin
+
+ waitForMainDocToLoad()
cy.findByText('Share').click()
cy.findByText('Turn on link sharing').click()
cy.findByText('Anyone with this link can view this project')
.next()
- .should('contain.text', 'http://sharelatex/')
+ .should('contain.text', origin + '/read')
.then(el => {
linkSharingReadOnly = el.text()
})
cy.findByText('Anyone with this link can edit this project')
.next()
- .should('contain.text', 'http://sharelatex/')
+ .should('contain.text', origin + '/')
.then(el => {
linkSharingReadAndWrite = el.text()
})
@@ -104,3 +182,77 @@ export function enableLinkSharing() {
return { linkSharingReadOnly, linkSharingReadAndWrite }
})
}
+
+export function waitForMainDocToLoad() {
+ cy.log('Wait for main doc to load; it will steal the focus after loading')
+ cy.get('.cm-content').should('contain.text', 'Introduction')
+}
+
+export function openFile(fileName: string, waitFor: string) {
+ // force: The file-tree pane is too narrow to display the full name.
+ cy.findByTestId('file-tree').findByText(fileName).click({ force: true })
+
+ // wait until we've switched to the selected file
+ cy.findByText('Loading…').should('not.exist')
+ cy.findByText(waitFor)
+}
+
+export function createNewFile() {
+ const fileName = `${uuid()}.tex`
+
+ cy.log('create new project file')
+ cy.get('button').contains('New file').click({ force: true })
+ cy.findByRole('dialog').within(() => {
+ cy.get('input').clear()
+ cy.get('input').type(fileName)
+ cy.findByText('Create').click()
+ })
+ // force: The file-tree pane is too narrow to display the full name.
+ cy.findByTestId('file-tree').findByText(fileName).click({ force: true })
+
+ // wait until we've switched to the newly created empty file
+ cy.findByText('Loading…').should('not.exist')
+ cy.get('.cm-line').should('have.length', 1)
+
+ return fileName
+}
+
+export function prepareFileUploadTest(binary = false) {
+ const name = `${uuid()}.txt`
+ const content = `Test File Content ${name}${binary ? ' \x00' : ''}`
+ cy.get('button').contains('Upload').click({ force: true })
+ cy.get('input[type=file]')
+ .first()
+ .selectFile(
+ {
+ contents: Cypress.Buffer.from(content),
+ fileName: name,
+ lastModified: Date.now(),
+ },
+ { force: true }
+ )
+
+ // wait for the upload to finish
+ cy.findByRole('treeitem', { name })
+
+ return function check() {
+ cy.findByRole('treeitem', { name }).click()
+ if (binary) {
+ cy.findByText(content).should('not.have.class', 'cm-line')
+ } else {
+ cy.findByText(content).should('have.class', 'cm-line')
+ }
+ }
+}
+
+export function testNewFileUpload() {
+ it('can upload text file', () => {
+ const check = prepareFileUploadTest(false)
+ check()
+ })
+
+ it('can upload binary file', () => {
+ const check = prepareFileUploadTest(true)
+ check()
+ })
+}
diff --git a/server-ce/test/history.spec.ts b/server-ce/test/history.spec.ts
index cc1950f240..f0d7e74fb3 100644
--- a/server-ce/test/history.spec.ts
+++ b/server-ce/test/history.spec.ts
@@ -40,7 +40,6 @@ describe('History', function () {
const CLASS_DELETION = 'ol-cm-deletion-marker'
it('should support labels, comparison and download', () => {
- cy.visit('/project')
createProject('labels')
const recompile = throttledRecompile()
diff --git a/server-ce/test/host-admin.js b/server-ce/test/host-admin.js
index 9e4cd5d360..b3dcd72b1f 100644
--- a/server-ce/test/host-admin.js
+++ b/server-ce/test/host-admin.js
@@ -29,6 +29,17 @@ const IMAGES = {
PRO: process.env.IMAGE_TAG_PRO.replace(/:.+/, ''),
}
+function defaultDockerComposeOverride() {
+ return {
+ services: {
+ sharelatex: {
+ environment: {},
+ },
+ 'git-bridge': {},
+ },
+ }
+}
+
let previousConfig = ''
function readDockerComposeOverride() {
@@ -38,14 +49,7 @@ function readDockerComposeOverride() {
if (error.code !== 'ENOENT') {
throw error
}
- return {
- services: {
- sharelatex: {
- environment: {},
- },
- 'git-bridge': {},
- },
- }
+ return defaultDockerComposeOverride
}
}
@@ -77,12 +81,21 @@ app.use(bodyParser.json())
app.use((req, res, next) => {
// Basic access logs
console.log(req.method, req.url, req.body)
+ const json = res.json
+ res.json = body => {
+ console.log(req.method, req.url, req.body, '->', body)
+ json.call(res, body)
+ }
+ next()
+})
+app.use((req, res, next) => {
// Add CORS headers
const accessControlAllowOrigin =
process.env.ACCESS_CONTROL_ALLOW_ORIGIN || 'http://sharelatex'
res.setHeader('Access-Control-Allow-Origin', accessControlAllowOrigin)
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Access-Control-Max-Age', '3600')
+ res.setHeader('Access-Control-Allow-Methods', 'DELETE, GET, HEAD, POST, PUT')
next()
})
@@ -131,10 +144,9 @@ const allowedVars = Joi.object(
'GIT_BRIDGE_HOST',
'GIT_BRIDGE_PORT',
'V1_HISTORY_URL',
- 'DOCKER_RUNNER',
'SANDBOXED_COMPILES',
- 'SANDBOXED_COMPILES_SIBLING_CONTAINERS',
'ALL_TEX_LIVE_DOCKER_IMAGE_NAMES',
+ 'OVERLEAF_FILESTORE_MIGRATION_LEVEL',
'OVERLEAF_TEMPLATES_USER_ID',
'OVERLEAF_NEW_PROJECT_TEMPLATE_LINKS',
'OVERLEAF_ALLOW_PUBLIC_ACCESS',
@@ -196,10 +208,7 @@ function setVarsDockerCompose({ pro, vars, version, withDataDir }) {
)
}
- if (
- cfg.services.sharelatex.environment
- .SANDBOXED_COMPILES_SIBLING_CONTAINERS === 'true'
- ) {
+ if (cfg.services.sharelatex.environment.SANDBOXED_COMPILES === 'true') {
cfg.services.sharelatex.environment.SANDBOXED_COMPILES_HOST_DIR =
PATHS.SANDBOXED_COMPILES_HOST_DIR
cfg.services.sharelatex.environment.TEX_LIVE_DOCKER_IMAGE =
@@ -324,8 +333,19 @@ app.get('/redis/keys', (req, res) => {
)
})
+app.delete('/data/user_files', (req, res) => {
+ runDockerCompose(
+ 'exec',
+ ['sharelatex', 'rm', '-rf', '/var/lib/overleaf/data/user_files'],
+ (error, stdout, stderr) => {
+ res.json({ error, stdout, stderr })
+ }
+ )
+})
+
app.use(handleValidationErrors())
purgeDataDir()
+writeDockerComposeOverride(defaultDockerComposeOverride())
app.listen(80)
diff --git a/server-ce/test/package-lock.json b/server-ce/test/package-lock.json
index 6e84524ae0..05870284e8 100644
--- a/server-ce/test/package-lock.json
+++ b/server-ce/test/package-lock.json
@@ -12,10 +12,10 @@
"@types/pdf-parse": "^1.1.4",
"@types/uuid": "^9.0.8",
"adm-zip": "^0.5.12",
- "body-parser": "^1.20.2",
+ "body-parser": "^1.20.3",
"celebrate": "^15.0.3",
"cypress": "13.13.2",
- "express": "^4.19.2",
+ "express": "^4.21.2",
"isomorphic-git": "^1.25.10",
"js-yaml": "^4.1.0",
"pdf-parse": "^1.1.1",
@@ -609,9 +609,9 @@
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"node_modules/body-parser": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
- "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@@ -621,7 +621,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -645,11 +645,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/body-parser/node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -718,6 +718,33 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -891,9 +918,9 @@
}
},
"node_modules/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"engines": {
"node": ">= 0.6"
}
@@ -920,9 +947,9 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -1140,6 +1167,19 @@
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
"integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -1160,9 +1200,9 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"engines": {
"node": ">= 0.8"
}
@@ -1187,6 +1227,22 @@
"node": ">=8.6"
}
},
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/es-get-iterator": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -1206,6 +1262,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -1266,36 +1333,36 @@
}
},
"node_modules/express": {
- "version": "4.19.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
- "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.2",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.6.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -1304,6 +1371,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/debug": {
@@ -1320,11 +1391,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/express/node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -1393,12 +1464,12 @@
}
},
"node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dependencies": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -1498,19 +1569,40 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -1556,11 +1648,11 @@
}
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1598,21 +1690,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -1635,9 +1716,9 @@
}
},
"node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -2284,6 +2365,14 @@
"lz-string": "bin/bin.js"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -2293,9 +2382,12 @@
}
},
"node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -2405,9 +2497,12 @@
}
},
"node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -2526,9 +2621,9 @@
}
},
"node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
},
"node_modules/pdf-parse": {
"version": "1.1.1",
@@ -2807,9 +2902,9 @@
}
},
"node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -2842,20 +2937,28 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dependencies": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -2925,13 +3028,68 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
diff --git a/server-ce/test/package.json b/server-ce/test/package.json
index 674154dd39..36ba3df2dd 100644
--- a/server-ce/test/package.json
+++ b/server-ce/test/package.json
@@ -15,10 +15,10 @@
"@types/pdf-parse": "^1.1.4",
"@types/uuid": "^9.0.8",
"adm-zip": "^0.5.12",
- "body-parser": "^1.20.2",
+ "body-parser": "^1.20.3",
"celebrate": "^15.0.3",
"cypress": "13.13.2",
- "express": "^4.19.2",
+ "express": "^4.21.2",
"isomorphic-git": "^1.25.10",
"js-yaml": "^4.1.0",
"pdf-parse": "^1.1.1",
diff --git a/server-ce/test/project-list.spec.ts b/server-ce/test/project-list.spec.ts
index 9ee9ac9ca0..998fcf9ffb 100644
--- a/server-ce/test/project-list.spec.ts
+++ b/server-ce/test/project-list.spec.ts
@@ -18,11 +18,11 @@ describe('Project List', () => {
describe('user with no projects', () => {
ensureUserExists({ email: WITHOUT_PROJECTS_USER })
- it("'Import from Github' is not displayed in the welcome page", () => {
+ it("'Import from GitHub' is not displayed in the welcome page", () => {
login(WITHOUT_PROJECTS_USER)
cy.visit('/project')
cy.findByText('Create a new project').click()
- cy.findByText(/Import from Github/i).should('not.exist')
+ cy.findByText(/Import from GitHub/i).should('not.exist')
})
})
@@ -31,29 +31,27 @@ describe('Project List', () => {
ensureUserExists({ email: REGULAR_USER })
before(() => {
+ login(REGULAR_USER)
+ createProject(projectName, { type: 'Example project', open: false })
+ })
+ beforeEach(function () {
login(REGULAR_USER)
cy.visit('/project')
- createProject(projectName, { type: 'Example Project' })
})
it('Can download project sources', () => {
- login(REGULAR_USER)
- cy.visit('/project')
-
findProjectRow(projectName).within(() =>
cy.findByRole('button', { name: 'Download .zip file' }).click()
)
+ const zipName = projectName.replaceAll('-', '_')
cy.task('readFileInZip', {
- pathToZip: `cypress/downloads/${projectName}.zip`,
+ pathToZip: `cypress/downloads/${zipName}.zip`,
fileToRead: 'main.tex',
}).should('contain', 'Your introduction goes here')
})
it('Can download project PDF', () => {
- login(REGULAR_USER)
- cy.visit('/project')
-
findProjectRow(projectName).within(() =>
cy.findByRole('button', { name: 'Download PDF' }).click()
)
@@ -67,9 +65,6 @@ describe('Project List', () => {
it('can assign and remove tags to projects', () => {
const tagName = uuid().slice(0, 7) // long tag names are truncated in the UI, which affects selectors
- login(REGULAR_USER)
- cy.visit('/project')
-
cy.log('select project')
cy.get(`[aria-label="Select ${projectName}"]`).click()
@@ -90,9 +85,7 @@ describe('Project List', () => {
cy.log('create a separate project to filter')
const nonTaggedProjectName = `project-${uuid()}`
login(REGULAR_USER)
- cy.visit('/project')
- createProject(nonTaggedProjectName)
- cy.visit('/project')
+ createProject(nonTaggedProjectName, { open: false })
cy.log('select project')
cy.get(`[aria-label="Select ${projectName}"]`).click()
diff --git a/server-ce/test/project-sharing.spec.ts b/server-ce/test/project-sharing.spec.ts
index e14f36d778..4da2209332 100644
--- a/server-ce/test/project-sharing.spec.ts
+++ b/server-ce/test/project-sharing.spec.ts
@@ -4,6 +4,9 @@ import { ensureUserExists, login } from './helpers/login'
import {
createProject,
enableLinkSharing,
+ openProjectByName,
+ openProjectViaLinkSharingAsAnon,
+ openProjectViaLinkSharingAsUser,
shareProjectByEmailAndAcceptInviteViaDash,
shareProjectByEmailAndAcceptInviteViaEmail,
} from './helpers/project'
@@ -31,7 +34,6 @@ describe('Project Sharing', function () {
function setupTestProject() {
login('user@example.com')
- cy.visit('/project')
createProject(projectName)
// Add chat message
@@ -53,8 +55,15 @@ describe('Project Sharing', function () {
function expectContentReadOnlyAccess() {
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
- cy.get('.cm-content').should('contain.text', '\\maketitle')
- cy.get('.cm-content').should('have.attr', 'contenteditable', 'false')
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ '\\maketitle'
+ )
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'have.attr',
+ 'contenteditable',
+ 'false'
+ )
}
function expectContentWriteAccess() {
@@ -62,13 +71,23 @@ describe('Project Sharing', function () {
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
const recompile = throttledRecompile()
// wait for the editor to finish loading
- cy.get('.cm-content').should('contain.text', '\\maketitle')
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ '\\maketitle'
+ )
// the editor should be writable
- cy.get('.cm-content').should('have.attr', 'contenteditable', 'true')
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'have.attr',
+ 'contenteditable',
+ 'true'
+ )
cy.findByText('\\maketitle').parent().click()
cy.findByText('\\maketitle').parent().type(`\n\\section{{}${section}}`)
// should have written
- cy.get('.cm-content').should('contain.text', `\\section{${section}}`)
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).should(
+ 'contain.text',
+ `\\section{${section}}`
+ )
// check PDF
recompile()
cy.get('.pdf-viewer').should('contain.text', projectName)
@@ -152,16 +171,10 @@ describe('Project Sharing', function () {
beforeEach(function () {
login('user@example.com')
- shareProjectByEmailAndAcceptInviteViaEmail(
- projectName,
- email,
- 'Read only'
- )
+ shareProjectByEmailAndAcceptInviteViaEmail(projectName, email, 'Viewer')
})
it('should grant the collaborator read access', () => {
- cy.visit('/project')
- cy.findByText(projectName).click()
expectFullReadOnlyAccess()
expectProjectDashboardEntry()
})
@@ -173,13 +186,12 @@ describe('Project Sharing', function () {
beforeWithReRunOnTestRetry(function () {
login('user@example.com')
- shareProjectByEmailAndAcceptInviteViaDash(projectName, email, 'Read only')
+ shareProjectByEmailAndAcceptInviteViaDash(projectName, email, 'Viewer')
})
it('should grant the collaborator read access', () => {
login(email)
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
expectFullReadOnlyAccess()
expectProjectDashboardEntry()
})
@@ -191,13 +203,12 @@ describe('Project Sharing', function () {
beforeWithReRunOnTestRetry(function () {
login('user@example.com')
- shareProjectByEmailAndAcceptInviteViaDash(projectName, email, 'Can edit')
+ shareProjectByEmailAndAcceptInviteViaDash(projectName, email, 'Editor')
})
it('should grant the collaborator write access', () => {
login(email)
- cy.visit('/project')
- cy.findByText(projectName).click()
+ openProjectByName(projectName)
expectReadAndWriteAccess()
expectEditAuthoredAs('You')
expectProjectDashboardEntry()
@@ -212,9 +223,11 @@ describe('Project Sharing', function () {
it('should grant restricted read access', () => {
login(email)
- cy.visit(linkSharingReadOnly)
- cy.findByText(projectName) // wait for lazy loading
- cy.findByText('Join Project').click()
+ openProjectViaLinkSharingAsUser(
+ linkSharingReadOnly,
+ projectName,
+ email
+ )
expectRestrictedReadOnlyAccess()
expectProjectDashboardEntry()
})
@@ -226,9 +239,11 @@ describe('Project Sharing', function () {
it('should grant full write access', () => {
login(email)
- cy.visit(linkSharingReadAndWrite)
- cy.findByText(projectName) // wait for lazy loading
- cy.findByText('Join Project').click()
+ openProjectViaLinkSharingAsUser(
+ linkSharingReadAndWrite,
+ projectName,
+ email
+ )
expectReadAndWriteAccess()
expectEditAuthoredAs('You')
expectProjectDashboardEntry()
@@ -272,7 +287,7 @@ describe('Project Sharing', function () {
withDataDir: true,
})
it('should grant read access with read link', () => {
- cy.visit(linkSharingReadOnly)
+ openProjectViaLinkSharingAsAnon(linkSharingReadOnly)
expectRestrictedReadOnlyAccess()
})
@@ -292,12 +307,12 @@ describe('Project Sharing', function () {
})
it('should grant read access with read link', () => {
- cy.visit(linkSharingReadOnly)
+ openProjectViaLinkSharingAsAnon(linkSharingReadOnly)
expectRestrictedReadOnlyAccess()
})
it('should grant write access with write link', () => {
- cy.visit(linkSharingReadAndWrite)
+ openProjectViaLinkSharingAsAnon(linkSharingReadAndWrite)
expectReadAndWriteAccess()
expectEditAuthoredAs('Anonymous')
})
diff --git a/server-ce/test/sandboxed-compiles.spec.ts b/server-ce/test/sandboxed-compiles.spec.ts
index e50aa36283..71f5b43392 100644
--- a/server-ce/test/sandboxed-compiles.spec.ts
+++ b/server-ce/test/sandboxed-compiles.spec.ts
@@ -1,7 +1,7 @@
import { ensureUserExists, login } from './helpers/login'
import { createProject } from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
-import { throttledRecompile } from './helpers/compile'
+import { throttledRecompile, stopCompile } from './helpers/compile'
import { v4 as uuid } from 'uuid'
import { waitUntilScrollingFinished } from './helpers/waitUntilScrollingFinished'
import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
@@ -10,9 +10,7 @@ const LABEL_TEX_LIVE_VERSION = 'TeX Live version'
describe('SandboxedCompiles', function () {
const enabledVars = {
- DOCKER_RUNNER: 'true',
SANDBOXED_COMPILES: 'true',
- SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true',
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES: '2023,2022',
}
@@ -29,7 +27,6 @@ describe('SandboxedCompiles', function () {
})
it('should offer TexLive images and switch the compiler', function () {
- cy.visit('/project')
createProject('sandboxed')
const recompile = throttledRecompile()
cy.log('wait for compile')
@@ -46,7 +43,7 @@ describe('SandboxedCompiles', function () {
.findByText('2023')
.parent()
.select('2022')
- cy.get('#left-menu-modal').click()
+ cy.get('.left-menu-modal-backdrop').click()
cy.log('Trigger compile with other TeX Live version')
recompile()
@@ -59,14 +56,47 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
+ checkStopCompile()
})
+ function checkStopCompile() {
+ it('users can stop a running compile', function () {
+ login('user@example.com')
+ createProject('test-project')
+ // create an infinite loop in the main document
+ // this will cause the compile to run indefinitely
+ cy.findByText('\\maketitle').parent().click()
+ cy.findByText('\\maketitle')
+ .parent()
+ .type('\n\\def\\x{{}Hello!\\par\\x}\\x')
+ cy.log('Start compile')
+ // We need to start the compile manually because we do not want to wait for it to finish
+ cy.findByText('Recompile').click()
+ // Now stop the compile and kill the latex process
+ stopCompile({ delay: 1000 })
+ cy.get('.logs-pane')
+ .invoke('text')
+ .should('match', /PDF Rendering Error|Compilation cancelled/)
+ // Check that the previous compile is not running in the background by
+ // disabling the infinite loop and recompiling
+ cy.findByText('\\def').parent().click()
+ cy.findByText('\\def').parent().type('{home}disabled loop% ')
+ cy.findByText('Recompile').click()
+ cy.get('.pdf-viewer').should('contain.text', 'disabled loop')
+ cy.get('.logs-pane').should(
+ 'not.contain.text',
+ 'A previous compile is still running'
+ )
+ })
+ }
+
function checkSyncTeX() {
- describe('SyncTeX', function () {
+ // TODO(25342): re-enable
+ // eslint-disable-next-line mocha/no-skipped-tests
+ describe.skip('SyncTeX', function () {
let projectName: string
beforeEach(function () {
projectName = `Project ${uuid()}`
- cy.visit('/project')
createProject(projectName)
const recompile = throttledRecompile()
cy.findByText('\\maketitle').parent().click()
@@ -131,7 +161,9 @@ describe('SandboxedCompiles', function () {
})
cy.log('navigate to Section A')
- cy.get('.cm-content').within(() => cy.findByText('Section A').click())
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).within(
+ () => cy.findByText('Section A').click()
+ )
cy.get('[aria-label="Go to code location in PDF"]').click()
cy.get('@title').then((title: any) => {
waitUntilScrollingFinished('.pdfjs-viewer-inner', title)
@@ -140,7 +172,9 @@ describe('SandboxedCompiles', function () {
})
cy.log('navigate to Section B')
- cy.get('.cm-content').within(() => cy.findByText('Section B').click())
+ cy.findByRole('textbox', { name: /Source Editor editing/i }).within(
+ () => cy.findByText('Section B').click()
+ )
cy.get('[aria-label="Go to code location in PDF"]').click()
cy.get('@sectionA').then((title: any) => {
waitUntilScrollingFinished('.pdfjs-viewer-inner', title)
@@ -154,7 +188,6 @@ describe('SandboxedCompiles', function () {
function checkRecompilesAfterErrors() {
it('recompiles even if there are Latex errors', function () {
login('user@example.com')
- cy.visit('/project')
createProject('test-project')
const recompile = throttledRecompile()
cy.findByText('\\maketitle').parent().click()
@@ -170,7 +203,6 @@ describe('SandboxedCompiles', function () {
function checkXeTeX() {
it('should be able to use XeLaTeX', function () {
- cy.visit('/project')
createProject('XeLaTeX')
const recompile = throttledRecompile()
cy.log('wait for compile')
@@ -187,7 +219,7 @@ describe('SandboxedCompiles', function () {
.findByText('pdfLaTeX')
.parent()
.select('XeLaTeX')
- cy.get('#left-menu-modal').click()
+ cy.get('.left-menu-modal-backdrop').click()
cy.log('Trigger compile with other compiler')
recompile()
@@ -204,14 +236,13 @@ describe('SandboxedCompiles', function () {
})
it('should not offer TexLive images and use default compiler', function () {
- cy.visit('/project')
createProject('sandboxed')
cy.log('wait for compile')
cy.get('.pdf-viewer').should('contain.text', 'sandboxed')
- cy.log('Check which compiler version was used, expect 2024')
+ cy.log('Check which compiler version was used, expect 2025')
cy.get('[aria-label="View logs"]').click()
- cy.findByText(/This is pdfTeX, Version .+ \(TeX Live 2024\) /)
+ cy.findByText(/This is pdfTeX, Version .+ \(TeX Live 2025\) /)
cy.log('Check that there is no TeX Live version toggle')
cy.get('header').findByText('Menu').click()
@@ -232,6 +263,7 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
+ checkStopCompile()
})
describe.skip('unavailable in CE', function () {
@@ -246,5 +278,6 @@ describe('SandboxedCompiles', function () {
checkSyncTeX()
checkXeTeX()
checkRecompilesAfterErrors()
+ checkStopCompile()
})
})
diff --git a/server-ce/test/templates.spec.ts b/server-ce/test/templates.spec.ts
index b9cc3f87eb..4959e149fc 100644
--- a/server-ce/test/templates.spec.ts
+++ b/server-ce/test/templates.spec.ts
@@ -47,7 +47,9 @@ describe('Templates', () => {
cy.url().should('match', /\/templates$/)
})
- it('should have templates feature', () => {
+ // TODO(25342): re-enable
+ // eslint-disable-next-line mocha/no-skipped-tests
+ it.skip('should have templates feature', () => {
login(TEMPLATES_USER)
const name = `Template ${Date.now()}`
const description = `Template Description ${Date.now()}`
@@ -64,7 +66,7 @@ describe('Templates', () => {
.get('textarea')
.type(description)
cy.findByText('Publish').click()
- cy.findByText('Publishing…').should('be.disabled')
+ cy.findByText('Publishing…').parent().should('be.disabled')
cy.findByText('Publish').should('not.exist')
cy.findByText('Unpublish', { timeout: 10_000 })
cy.findByText('Republish')
@@ -96,12 +98,12 @@ describe('Templates', () => {
.parent()
.parent()
.within(() => cy.get('input[type="checkbox"]').first().check())
- cy.get('.project-list-sidebar-react').within(() => {
+ cy.get('.project-list-sidebar-scroll').within(() => {
cy.findAllByText('New Tag').first().click()
})
cy.focused().type(tagName)
cy.findByText('Create').click()
- cy.get('.project-list-sidebar-react').within(() => {
+ cy.get('.project-list-sidebar-scroll').within(() => {
cy.findByText(tagName)
.parent()
.within(() => cy.get('.name').should('have.text', `${tagName} (1)`))
@@ -203,6 +205,7 @@ describe('Templates', () => {
.click()
cy.findAllByText('All Templates')
.first()
+ .parent()
.should('have.attr', 'href', '/templates/all')
})
})
diff --git a/server-ce/test/upgrading.spec.ts b/server-ce/test/upgrading.spec.ts
index 86a3ea0cad..16e0320dcc 100644
--- a/server-ce/test/upgrading.spec.ts
+++ b/server-ce/test/upgrading.spec.ts
@@ -1,7 +1,7 @@
import { ensureUserExists, login } from './helpers/login'
import { isExcludedBySharding, startWith } from './helpers/config'
import { dockerCompose, runScript } from './helpers/hostAdminClient'
-import { createProject } from './helpers/project'
+import { createProject, openProjectByName } from './helpers/project'
import { throttledRecompile } from './helpers/compile'
import { v4 as uuid } from 'uuid'
@@ -38,8 +38,6 @@ describe('Upgrading', function () {
before(() => {
cy.log('Populate old instance')
login(USER)
-
- cy.visit('/project')
createProject(PROJECT_NAME, {
newProjectButtonMatcher: startOptions.newProjectButtonMatcher,
})
@@ -59,7 +57,7 @@ describe('Upgrading', function () {
recompile()
cy.get('header').findByText('Menu').click()
cy.findByText('Source').click()
- cy.get('#left-menu-modal').click()
+ cy.get('.left-menu-modal-backdrop').click({ force: true })
}
cy.log('Check compile and history')
@@ -115,8 +113,7 @@ describe('Upgrading', function () {
})
it('should open the old project', () => {
- cy.visit('/project')
- cy.findByText(PROJECT_NAME).click()
+ openProjectByName(PROJECT_NAME)
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
cy.findByRole('navigation').within(() => {
diff --git a/services/chat/.gitignore b/services/chat/.gitignore
deleted file mode 100644
index f0cf94b147..0000000000
--- a/services/chat/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-**.swp
-
-public/build/
-
-node_modules/
-
-plato/
-
-**/*.map
-
-# managed by dev-environment$ bin/update_build_scripts
-.npmrc
diff --git a/services/chat/.nvmrc b/services/chat/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/chat/.nvmrc
+++ b/services/chat/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/chat/Dockerfile b/services/chat/Dockerfile
index 242daa44c0..66a8bc3ded 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:18.20.2 AS base
+FROM node:22.17.0 AS base
WORKDIR /overleaf/services/chat
diff --git a/services/chat/Makefile b/services/chat/Makefile
index cbe59db223..792f5d2cd6 100644
--- a/services/chat/Makefile
+++ b/services/chat/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -98,13 +116,6 @@ test_acceptance_clean:
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down -v -t 0
test_acceptance_pre_run:
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) up -d mongo
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) exec -T mongo sh -c ' \
- while ! mongosh --eval "db.version()" > /dev/null; do \
- echo "Waiting for Mongo..."; \
- sleep 1; \
- done; \
- mongosh --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"mongo:27017\" } ] })"'
ifneq (,$(wildcard test/acceptance/js/scripts/pre-run))
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) run --rm test_acceptance test/acceptance/js/scripts/pre-run
endif
@@ -137,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/chat/app/js/Features/Messages/MessageHttpController.js b/services/chat/app/js/Features/Messages/MessageHttpController.js
index a20d005864..45208e2c03 100644
--- a/services/chat/app/js/Features/Messages/MessageHttpController.js
+++ b/services/chat/app/js/Features/Messages/MessageHttpController.js
@@ -74,6 +74,10 @@ export async function deleteMessage(context) {
return await callMessageHttpController(context, _deleteMessage)
}
+export async function deleteUserMessage(context) {
+ return await callMessageHttpController(context, _deleteUserMessage)
+}
+
export async function getResolvedThreadIds(context) {
return await callMessageHttpController(context, _getResolvedThreadIds)
}
@@ -190,6 +194,13 @@ const _deleteMessage = async (req, res) => {
res.status(204)
}
+const _deleteUserMessage = async (req, res) => {
+ const { projectId, threadId, userId, messageId } = req.params
+ const room = await ThreadManager.findOrCreateThread(projectId, threadId)
+ await MessageManager.deleteUserMessage(userId, room._id, messageId)
+ res.status(204)
+}
+
const _getResolvedThreadIds = async (req, res) => {
const { projectId } = req.params
const resolvedThreadIds = await ThreadManager.getResolvedThreadIds(projectId)
diff --git a/services/chat/app/js/Features/Messages/MessageManager.js b/services/chat/app/js/Features/Messages/MessageManager.js
index cb8818e3b6..efff22a2a4 100644
--- a/services/chat/app/js/Features/Messages/MessageManager.js
+++ b/services/chat/app/js/Features/Messages/MessageManager.js
@@ -77,6 +77,14 @@ export async function deleteMessage(roomId, messageId) {
await db.messages.deleteOne(query)
}
+export async function deleteUserMessage(userId, roomId, messageId) {
+ await db.messages.deleteOne({
+ _id: new ObjectId(messageId),
+ user_id: new ObjectId(userId),
+ room_id: new ObjectId(roomId),
+ })
+}
+
function _ensureIdsAreObjectIds(query) {
if (query.user_id && !(query.user_id instanceof ObjectId)) {
query.user_id = new ObjectId(query.user_id)
diff --git a/services/chat/app/js/server.js b/services/chat/app/js/server.js
index aa4ea42482..80970fc22e 100644
--- a/services/chat/app/js/server.js
+++ b/services/chat/app/js/server.js
@@ -1,10 +1,10 @@
-import http from 'http'
+import http from 'node:http'
import metrics from '@overleaf/metrics'
import logger from '@overleaf/logger'
import express from 'express'
import exegesisExpress from 'exegesis-express'
-import path from 'path'
-import { fileURLToPath } from 'url'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
import * as messagesController from './Features/Messages/MessageHttpController.js'
const __dirname = fileURLToPath(new URL('.', import.meta.url))
diff --git a/services/chat/buildscript.txt b/services/chat/buildscript.txt
index 8470e45e93..35114bd2a4 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=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/services/chat/chat.yaml b/services/chat/chat.yaml
index 3ccdf9bc30..35ed3d378d 100644
--- a/services/chat/chat.yaml
+++ b/services/chat/chat.yaml
@@ -177,6 +177,34 @@ paths:
'204':
description: No Content
description: 'Delete message with Message ID provided, from the Thread with ThreadID and ProjectID provided'
+ '/project/{projectId}/thread/{threadId}/user/{userId}/messages/{messageId}':
+ parameters:
+ - schema:
+ type: string
+ name: projectId
+ in: path
+ required: true
+ - schema:
+ type: string
+ name: threadId
+ in: path
+ required: true
+ - schema:
+ type: string
+ name: userId
+ in: path
+ required: true
+ - schema:
+ type: string
+ name: messageId
+ in: path
+ required: true
+ delete:
+ summary: Delete message written by a given user
+ operationId: deleteUserMessage
+ responses:
+ '204':
+ description: No Content
'/project/{projectId}/thread/{threadId}/resolve':
parameters:
- schema:
diff --git a/services/chat/config/settings.defaults.cjs b/services/chat/config/settings.defaults.cjs
index 48734ff11e..4b7dc293a9 100644
--- a/services/chat/config/settings.defaults.cjs
+++ b/services/chat/config/settings.defaults.cjs
@@ -1,3 +1,9 @@
+const http = require('node:http')
+const https = require('node:https')
+
+http.globalAgent.keepAlive = false
+https.globalAgent.keepAlive = false
+
module.exports = {
internal: {
chat: {
diff --git a/services/chat/docker-compose.ci.yml b/services/chat/docker-compose.ci.yml
index 6f1a608534..ca3303a079 100644
--- a/services/chat/docker-compose.ci.yml
+++ b/services/chat/docker-compose.ci.yml
@@ -24,10 +24,13 @@ services:
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
+ volumes:
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
user: node
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@@ -39,9 +42,14 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/chat/docker-compose.yml b/services/chat/docker-compose.yml
index 5474cc3574..e7b8ce7385 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:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
@@ -14,37 +14,45 @@ services:
working_dir: /overleaf/services/chat
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
user: node
test_acceptance:
- image: node:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/chat
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/chat
environment:
ELASTIC_SEARCH_DSN: es:9200
MONGO_HOST: mongo
POSTGRES_HOST: postgres
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
user: node
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/chat/package.json b/services/chat/package.json
index f6132b969c..f3d37eb6d3 100644
--- a/services/chat/package.json
+++ b/services/chat/package.json
@@ -12,8 +12,8 @@
"test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js",
"test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"lint:fix": "eslint --fix .",
"types:check": "tsc --noEmit"
},
@@ -24,15 +24,15 @@
"async": "^3.2.5",
"body-parser": "^1.20.3",
"exegesis-express": "^4.0.0",
- "express": "^4.21.0",
- "mongodb": "^6.1.0"
+ "express": "^4.21.2",
+ "mongodb": "6.12.0"
},
"devDependencies": {
"acorn": "^7.1.1",
"ajv": "^6.12.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"request": "^2.88.2",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
diff --git a/services/chat/test/acceptance/js/helpers/ChatApp.js b/services/chat/test/acceptance/js/helpers/ChatApp.js
index 7116ea36f6..3a0baf5ce0 100644
--- a/services/chat/test/acceptance/js/helpers/ChatApp.js
+++ b/services/chat/test/acceptance/js/helpers/ChatApp.js
@@ -1,5 +1,5 @@
import { createServer } from '../../../../app/js/server.js'
-import { promisify } from 'util'
+import { promisify } from 'node:util'
export { db } from '../../../../app/js/mongodb.js'
diff --git a/services/clsi/.gitignore b/services/clsi/.gitignore
index 360466227e..a85e6b757a 100644
--- a/services/clsi/.gitignore
+++ b/services/clsi/.gitignore
@@ -1,14 +1,3 @@
-**.swp
-node_modules
-test/acceptance/fixtures/tmp
compiles
output
-.DS_Store
-*~
cache
-.vagrant
-config/*
-npm-debug.log
-
-# managed by dev-environment$ bin/update_build_scripts
-.npmrc
diff --git a/services/clsi/.nvmrc b/services/clsi/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/clsi/.nvmrc
+++ b/services/clsi/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/clsi/Dockerfile b/services/clsi/Dockerfile
index dc776e4cea..77c26fab23 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:18.20.2 AS base
+FROM node:22.17.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 069c3c9426..e02697f4e9 100644
--- a/services/clsi/Makefile
+++ b/services/clsi/Makefile
@@ -24,7 +24,6 @@ DOCKER_COMPOSE_TEST_UNIT = \
clean:
-docker rmi ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER)
- -docker rmi gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER)
-docker rmi us-east1-docker.pkg.dev/overleaf-ops/ol-docker/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER)
-$(DOCKER_COMPOSE_TEST_UNIT) down --rmi local
-$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down --rmi local
@@ -33,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -64,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -111,11 +128,10 @@ build:
--pull \
--build-arg BUILDKIT_INLINE_CACHE=1 \
--tag ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \
- --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \
- --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME) \
- --cache-from gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME) \
- --cache-from gcr.io/overleaf-ops/$(PROJECT_NAME):main \
--tag us-east1-docker.pkg.dev/overleaf-ops/ol-docker/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \
+ --tag us-east1-docker.pkg.dev/overleaf-ops/ol-docker/$(PROJECT_NAME):$(BRANCH_NAME) \
+ --cache-from us-east1-docker.pkg.dev/overleaf-ops/ol-docker/$(PROJECT_NAME):$(BRANCH_NAME) \
+ --cache-from us-east1-docker.pkg.dev/overleaf-ops/ol-docker/$(PROJECT_NAME):main \
--file Dockerfile \
../..
@@ -132,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/clsi/README.md b/services/clsi/README.md
index 0626bb4cfe..f1cf927d3d 100644
--- a/services/clsi/README.md
+++ b/services/clsi/README.md
@@ -19,18 +19,18 @@ The CLSI can be configured through the following environment variables:
* `ALLOWED_IMAGES` - Space separated list of allowed Docker TeX Live images
* `CATCH_ERRORS` - Set to `true` to log uncaught exceptions
* `COMPILE_GROUP_DOCKER_CONFIGS` - JSON string of Docker configs for compile groups
-* `COMPILES_HOST_DIR` - Working directory for LaTeX compiles
+* `SANDBOXED_COMPILES` - Set to true to use sibling containers
+* `SANDBOXED_COMPILES_HOST_DIR_COMPILES` - Working directory for LaTeX compiles
+* `SANDBOXED_COMPILES_HOST_DIR_OUTPUT` - Output directory for LaTeX compiles
* `COMPILE_SIZE_LIMIT` - Sets the body-parser [limit](https://github.com/expressjs/body-parser#limit)
-* `DOCKER_RUNNER` - Set to true to use sibling containers
* `DOCKER_RUNTIME` -
* `FILESTORE_DOMAIN_OVERRIDE` - The url for the filestore service e.g.`http://$FILESTORE_HOST:3009`
* `FILESTORE_PARALLEL_FILE_DOWNLOADS` - Number of parallel file downloads
* `LISTEN_ADDRESS` - The address for the RESTful service to listen on. Set to `0.0.0.0` to listen on all network interfaces
* `PROCESS_LIFE_SPAN_LIMIT_MS` - Process life span limit in milliseconds
-* `SENTRY_DSN` - Sentry [Data Source Name](https://docs.sentry.io/product/sentry-basics/dsn-explainer/)
* `SMOKE_TEST` - Whether to run smoke tests
-* `TEXLIVE_IMAGE` - The TeX Live Docker image to use for sibling containers, e.g. `gcr.io/overleaf-ops/texlive-full:2017.1`
-* `TEX_LIVE_IMAGE_NAME_OVERRIDE` - The name of the registry for the Docker image e.g. `gcr.io/overleaf-ops`
+* `TEXLIVE_IMAGE` - The TeX Live Docker image to use for sibling containers, e.g. `us-east1-docker.pkg.dev/overleaf-ops/ol-docker/texlive-full:2017.1`
+* `TEX_LIVE_IMAGE_NAME_OVERRIDE` - The name of the registry for the Docker image e.g. `us-east1-docker.pkg.dev/overleaf-ops/ol-docker`
* `TEXLIVE_IMAGE_USER` - When using sibling containers, the user to run as in the TeX Live image. Defaults to `tex`
* `TEXLIVE_OPENOUT_ANY` - Sets the `openout_any` environment variable for TeX Live (see the `\openout` primitive [documentation](http://tug.org/texinfohtml/web2c.html#tex-invocation))
@@ -63,10 +63,10 @@ Then start the Docker container:
docker run --rm \
-p 127.0.0.1:3013:3013 \
-e LISTEN_ADDRESS=0.0.0.0 \
- -e DOCKER_RUNNER=true \
+ -e SANDBOXED_COMPILES=true \
-e TEXLIVE_IMAGE=texlive/texlive \
-e TEXLIVE_IMAGE_USER=root \
- -e COMPILES_HOST_DIR="$PWD/compiles" \
+ -e SANDBOXED_COMPILES_HOST_DIR_COMPILES="$PWD/compiles" \
-v "$PWD/compiles:/overleaf/services/clsi/compiles" \
-v "$PWD/cache:/overleaf/services/clsi/cache" \
-v /var/run/docker.sock:/var/run/docker.sock \
diff --git a/services/clsi/app.js b/services/clsi/app.js
index bcf89aaaf9..872f612d9c 100644
--- a/services/clsi/app.js
+++ b/services/clsi/app.js
@@ -6,9 +6,6 @@ const ContentController = require('./app/js/ContentController')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
logger.initialize('clsi')
-if (Settings.sentry.dsn != null) {
- logger.initializeErrorReporting(Settings.sentry.dsn)
-}
const Metrics = require('@overleaf/metrics')
const smokeTest = require('./test/smoke/js/SmokeTests')
@@ -16,7 +13,7 @@ const ContentTypeMapper = require('./app/js/ContentTypeMapper')
const Errors = require('./app/js/Errors')
const { createOutputZip } = require('./app/js/OutputController')
-const Path = require('path')
+const Path = require('node:path')
Metrics.open_sockets.monitor(true)
Metrics.memory.monitor(logger)
@@ -131,26 +128,6 @@ const ForbidSymlinks = require('./app/js/StaticServerForbidSymlinks')
// create a static server which does not allow access to any symlinks
// avoids possible mismatch of root directory between middleware check
// and serving the files
-const staticCompileServer = ForbidSymlinks(
- express.static,
- Settings.path.compilesDir,
- {
- setHeaders(res, path, stat) {
- if (Path.basename(path) === 'output.pdf') {
- // Calculate an etag in the same way as nginx
- // https://github.com/tj/send/issues/65
- const etag = (path, stat) =>
- `"${Math.ceil(+stat.mtime / 1000).toString(16)}` +
- '-' +
- Number(stat.size).toString(16) +
- '"'
- res.set('Etag', etag(path, stat))
- }
- res.set('Content-Type', ContentTypeMapper.map(path))
- },
- }
-)
-
const staticOutputServer = ForbidSymlinks(
express.static,
Settings.path.outputDir,
@@ -216,32 +193,6 @@ app.get(
}
)
-app.get(
- '/project/:project_id/user/:user_id/output/*',
- function (req, res, next) {
- // for specific user get the path to the top level file
- logger.warn(
- { url: req.url },
- 'direct request for file in compile directory'
- )
- req.url = `/${req.params.project_id}-${req.params.user_id}/${req.params[0]}`
- staticCompileServer(req, res, next)
- }
-)
-
-app.get('/project/:project_id/output/*', function (req, res, next) {
- logger.warn({ url: req.url }, 'direct request for file in compile directory')
- if (req.query?.build?.match(OutputCacheManager.BUILD_REGEX)) {
- // for specific build get the path from the OutputCacheManager (e.g. .clsi/buildId)
- req.url =
- `/${req.params.project_id}/` +
- OutputCacheManager.path(req.query.build, `/${req.params[0]}`)
- } else {
- req.url = `/${req.params.project_id}/${req.params[0]}`
- }
- staticCompileServer(req, res, next)
-})
-
app.get('/oops', function (req, res, next) {
logger.error({ err: 'hello' }, 'test error')
res.send('error\n')
@@ -298,6 +249,9 @@ app.get('/health_check', function (req, res) {
if (Settings.processTooOld) {
return res.status(500).json({ processTooOld: true })
}
+ if (ProjectPersistenceManager.isAnyDiskCriticalLow()) {
+ return res.status(500).json({ diskCritical: true })
+ }
smokeTest.sendLastResult(res)
})
@@ -307,6 +261,8 @@ app.use(function (error, req, res, next) {
if (error instanceof Errors.NotFoundError) {
logger.debug({ err: error, url: req.url }, 'not found error')
res.sendStatus(404)
+ } else if (error instanceof Errors.InvalidParameter) {
+ res.status(400).send(error.message)
} else if (error.code === 'EPIPE') {
// inspect container returns EPIPE when shutting down
res.sendStatus(503) // send 503 Unavailable response
@@ -316,8 +272,8 @@ app.use(function (error, req, res, next) {
}
})
-const net = require('net')
-const os = require('os')
+const net = require('node:net')
+const os = require('node:os')
let STATE = 'up'
@@ -343,10 +299,18 @@ const loadTcpServer = net.createServer(function (socket) {
}
const freeLoad = availableWorkingCpus - currentLoad
- const freeLoadPercentage = Math.round(
- (freeLoad / availableWorkingCpus) * 100
- )
- if (freeLoadPercentage <= 0) {
+ let freeLoadPercentage = Math.round((freeLoad / availableWorkingCpus) * 100)
+ if (ProjectPersistenceManager.isAnyDiskCriticalLow()) {
+ freeLoadPercentage = 0
+ }
+ if (ProjectPersistenceManager.isAnyDiskLow()) {
+ freeLoadPercentage = freeLoadPercentage / 2
+ }
+
+ if (
+ Settings.internal.load_balancer_agent.allow_maintenance &&
+ freeLoadPercentage <= 0
+ ) {
// When its 0 the server is set to drain implicitly.
// Drain will move new projects to different servers.
// Drain will keep existing projects assigned to the same server.
@@ -354,7 +318,11 @@ const loadTcpServer = net.createServer(function (socket) {
socket.write(`maint, 0%\n`, 'ASCII')
} else {
// Ready will cancel the maint state.
- socket.write(`up, ready, ${freeLoadPercentage}%\n`, 'ASCII')
+ socket.write(`up, ready, ${Math.max(freeLoadPercentage, 1)}%\n`, 'ASCII')
+ if (freeLoadPercentage <= 0) {
+ // This metric records how often we would have gone into maintenance mode.
+ Metrics.inc('clsi-prevented-maint')
+ }
}
socket.end()
} else {
diff --git a/services/clsi/app/js/CLSICacheHandler.js b/services/clsi/app/js/CLSICacheHandler.js
new file mode 100644
index 0000000000..26acd221f9
--- /dev/null
+++ b/services/clsi/app/js/CLSICacheHandler.js
@@ -0,0 +1,304 @@
+const crypto = require('node:crypto')
+const fs = require('node:fs')
+const Path = require('node:path')
+const { pipeline } = require('node:stream/promises')
+const { createGzip, createGunzip } = require('node:zlib')
+const tarFs = require('tar-fs')
+const _ = require('lodash')
+const {
+ fetchNothing,
+ fetchStream,
+ RequestFailedError,
+} = require('@overleaf/fetch-utils')
+const logger = require('@overleaf/logger')
+const Metrics = require('@overleaf/metrics')
+const Settings = require('@overleaf/settings')
+const { MeteredStream } = require('@overleaf/stream-utils')
+const { CACHE_SUBDIR } = require('./OutputCacheManager')
+const { isExtraneousFile } = require('./ResourceWriter')
+
+const TIMING_BUCKETS = [
+ 0, 10, 100, 1000, 2000, 5000, 10000, 15000, 20000, 30000,
+]
+const MAX_ENTRIES_IN_OUTPUT_TAR = 100
+const OBJECT_ID_REGEX = /^[0-9a-f]{24}$/
+
+/**
+ * @param {string} projectId
+ * @return {{shard: string, url: string}}
+ */
+function getShard(projectId) {
+ // [timestamp 4bytes][random per machine 5bytes][counter 3bytes]
+ // [32bit 4bytes]
+ const last4Bytes = Buffer.from(projectId, 'hex').subarray(8, 12)
+ const idx = last4Bytes.readUInt32BE() % Settings.apis.clsiCache.shards.length
+ return Settings.apis.clsiCache.shards[idx]
+}
+
+/**
+ * @param {string} projectId
+ * @param {string} userId
+ * @param {string} buildId
+ * @param {string} editorId
+ * @param {[{path: string}]} outputFiles
+ * @param {string} compileGroup
+ * @param {Record} options
+ * @return {string | undefined}
+ */
+function notifyCLSICacheAboutBuild({
+ projectId,
+ userId,
+ buildId,
+ editorId,
+ outputFiles,
+ compileGroup,
+ options,
+}) {
+ if (!Settings.apis.clsiCache.enabled) return undefined
+ if (!OBJECT_ID_REGEX.test(projectId)) return undefined
+ const { url, shard } = getShard(projectId)
+
+ /**
+ * @param {[{path: string}]} files
+ */
+ const enqueue = files => {
+ Metrics.count('clsi_cache_enqueue_files', files.length)
+ fetchNothing(`${url}/enqueue`, {
+ method: 'POST',
+ json: {
+ projectId,
+ userId,
+ buildId,
+ editorId,
+ files,
+ downloadHost: Settings.apis.clsi.downloadHost,
+ clsiServerId: Settings.apis.clsi.clsiServerId,
+ compileGroup,
+ options,
+ },
+ signal: AbortSignal.timeout(15_000),
+ }).catch(err => {
+ logger.warn(
+ { err, projectId, userId, buildId },
+ 'enqueue for clsi cache failed'
+ )
+ })
+ }
+
+ // PDF preview
+ enqueue(
+ outputFiles
+ .filter(
+ f =>
+ f.path === 'output.pdf' ||
+ f.path === 'output.log' ||
+ f.path === 'output.synctex.gz' ||
+ f.path.endsWith('.blg')
+ )
+ .map(f => {
+ if (f.path === 'output.pdf') {
+ return _.pick(f, 'path', 'size', 'contentId', 'ranges')
+ }
+ return _.pick(f, 'path')
+ })
+ )
+
+ // Compile Cache
+ buildTarball({ projectId, userId, buildId, outputFiles })
+ .then(() => {
+ enqueue([{ path: 'output.tar.gz' }])
+ })
+ .catch(err => {
+ logger.warn(
+ { err, projectId, userId, buildId },
+ 'build output.tar.gz for clsi cache failed'
+ )
+ })
+
+ return shard
+}
+
+/**
+ * @param {string} projectId
+ * @param {string} userId
+ * @param {string} buildId
+ * @param {[{path: string}]} outputFiles
+ * @return {Promise}
+ */
+async function buildTarball({ projectId, userId, buildId, outputFiles }) {
+ const timer = new Metrics.Timer('clsi_cache_build', 1, {}, TIMING_BUCKETS)
+ const outputDir = Path.join(
+ Settings.path.outputDir,
+ userId ? `${projectId}-${userId}` : projectId,
+ CACHE_SUBDIR,
+ buildId
+ )
+
+ const files = outputFiles.filter(f => !isExtraneousFile(f.path))
+ if (files.length > MAX_ENTRIES_IN_OUTPUT_TAR) {
+ Metrics.inc('clsi_cache_build_too_many_entries')
+ throw new Error('too many output files for output.tar.gz')
+ }
+ Metrics.count('clsi_cache_build_files', files.length)
+
+ const path = Path.join(outputDir, 'output.tar.gz')
+ try {
+ await pipeline(
+ tarFs.pack(outputDir, { entries: files.map(f => f.path) }),
+ createGzip(),
+ fs.createWriteStream(path)
+ )
+ } catch (err) {
+ try {
+ await fs.promises.unlink(path)
+ } catch (e) {}
+ throw err
+ } finally {
+ timer.done()
+ }
+}
+
+/**
+ * @param {string} projectId
+ * @param {string} userId
+ * @param {string} editorId
+ * @param {string} buildId
+ * @param {string} outputDir
+ * @return {Promise}
+ */
+async function downloadOutputDotSynctexFromCompileCache(
+ projectId,
+ userId,
+ editorId,
+ buildId,
+ outputDir
+) {
+ if (!Settings.apis.clsiCache.enabled) return false
+ if (!OBJECT_ID_REGEX.test(projectId)) return false
+
+ const timer = new Metrics.Timer(
+ 'clsi_cache_download',
+ 1,
+ { method: 'synctex' },
+ TIMING_BUCKETS
+ )
+ let stream
+ try {
+ stream = await fetchStream(
+ `${getShard(projectId).url}/project/${projectId}/${
+ userId ? `user/${userId}/` : ''
+ }build/${editorId}-${buildId}/search/output/output.synctex.gz`,
+ {
+ method: 'GET',
+ signal: AbortSignal.timeout(10_000),
+ }
+ )
+ } catch (err) {
+ if (err instanceof RequestFailedError && err.response.status === 404) {
+ timer.done({ status: 'not-found' })
+ return false
+ }
+ timer.done({ status: 'error' })
+ throw err
+ }
+ await fs.promises.mkdir(outputDir, { recursive: true })
+ const dst = Path.join(outputDir, 'output.synctex.gz')
+ const tmp = dst + crypto.randomUUID()
+ try {
+ await pipeline(
+ stream,
+ new MeteredStream(Metrics, 'clsi_cache_egress', {
+ path: 'output.synctex.gz',
+ }),
+ fs.createWriteStream(tmp)
+ )
+ await fs.promises.rename(tmp, dst)
+ } catch (err) {
+ try {
+ await fs.promises.unlink(tmp)
+ } catch {}
+ throw err
+ }
+ timer.done({ status: 'success' })
+ return true
+}
+
+/**
+ * @param {string} projectId
+ * @param {string} userId
+ * @param {string} compileDir
+ * @return {Promise}
+ */
+async function downloadLatestCompileCache(projectId, userId, compileDir) {
+ if (!Settings.apis.clsiCache.enabled) return false
+ if (!OBJECT_ID_REGEX.test(projectId)) return false
+
+ const url = `${getShard(projectId).url}/project/${projectId}/${
+ userId ? `user/${userId}/` : ''
+ }latest/output/output.tar.gz`
+ const timer = new Metrics.Timer(
+ 'clsi_cache_download',
+ 1,
+ { method: 'tar' },
+ TIMING_BUCKETS
+ )
+ let stream
+ try {
+ stream = await fetchStream(url, {
+ method: 'GET',
+ signal: AbortSignal.timeout(10_000),
+ })
+ } catch (err) {
+ if (err instanceof RequestFailedError && err.response.status === 404) {
+ timer.done({ status: 'not-found' })
+ return false
+ }
+ timer.done({ status: 'error' })
+ throw err
+ }
+ let n = 0
+ let abort = false
+ await pipeline(
+ stream,
+ new MeteredStream(Metrics, 'clsi_cache_egress', { path: 'output.tar.gz' }),
+ createGunzip(),
+ tarFs.extract(compileDir, {
+ // use ignore hook for counting entries (files+folders) and validation.
+ // Include folders as they incur mkdir calls.
+ ignore(_, header) {
+ if (abort) return true // log once
+ n++
+ if (n > MAX_ENTRIES_IN_OUTPUT_TAR) {
+ abort = true
+ logger.warn(
+ {
+ url,
+ compileDir,
+ },
+ 'too many entries in tar-ball from clsi-cache'
+ )
+ } else if (header.type !== 'file' && header.type !== 'directory') {
+ abort = true
+ logger.warn(
+ {
+ url,
+ compileDir,
+ entryType: header.type,
+ },
+ 'unexpected entry in tar-ball from clsi-cache'
+ )
+ }
+ return abort
+ },
+ })
+ )
+ Metrics.count('clsi_cache_download_entries', n)
+ timer.done({ status: 'success' })
+ return !abort
+}
+
+module.exports = {
+ notifyCLSICacheAboutBuild,
+ downloadLatestCompileCache,
+ downloadOutputDotSynctexFromCompileCache,
+}
diff --git a/services/clsi/app/js/CompileController.js b/services/clsi/app/js/CompileController.js
index 3da884eed7..b3343ee233 100644
--- a/services/clsi/app/js/CompileController.js
+++ b/services/clsi/app/js/CompileController.js
@@ -1,3 +1,4 @@
+const Path = require('node:path')
const RequestParser = require('./RequestParser')
const CompileManager = require('./CompileManager')
const Settings = require('@overleaf/settings')
@@ -5,6 +6,7 @@ const Metrics = require('./Metrics')
const ProjectPersistenceManager = require('./ProjectPersistenceManager')
const logger = require('@overleaf/logger')
const Errors = require('./Errors')
+const { notifyCLSICacheAboutBuild } = require('./CLSICacheHandler')
let lastSuccessfulCompileTimestamp = 0
@@ -29,101 +31,135 @@ function compile(req, res, next) {
if (error) {
return next(error)
}
- CompileManager.doCompileWithLock(request, (error, result) => {
- let { buildId, outputFiles, stats, timings } = result || {}
- let code, status
- if (outputFiles == null) {
- outputFiles = []
- }
- if (error instanceof Errors.AlreadyCompilingError) {
- code = 423 // Http 423 Locked
- status = 'compile-in-progress'
- } else if (error instanceof Errors.FilesOutOfSyncError) {
- code = 409 // Http 409 Conflict
- status = 'retry'
- logger.warn(
- {
+ const stats = {}
+ const timings = {}
+ CompileManager.doCompileWithLock(
+ request,
+ stats,
+ timings,
+ (error, result) => {
+ let { buildId, outputFiles } = result || {}
+ let code, status
+ if (outputFiles == null) {
+ outputFiles = []
+ }
+ if (error instanceof Errors.AlreadyCompilingError) {
+ code = 423 // Http 423 Locked
+ status = 'compile-in-progress'
+ } else if (error instanceof Errors.FilesOutOfSyncError) {
+ code = 409 // Http 409 Conflict
+ status = 'retry'
+ logger.warn(
+ {
+ projectId: request.project_id,
+ userId: request.user_id,
+ },
+ 'files out of sync, please retry'
+ )
+ } else if (
+ error?.code === 'EPIPE' ||
+ error instanceof Errors.TooManyCompileRequestsError
+ ) {
+ // docker returns EPIPE when shutting down
+ code = 503 // send 503 Unavailable response
+ status = 'unavailable'
+ } else if (error?.terminated) {
+ status = 'terminated'
+ } else if (error?.validate) {
+ status = `validation-${error.validate}`
+ } else if (error?.timedout) {
+ status = 'timedout'
+ logger.debug(
+ { err: error, projectId: request.project_id },
+ 'timeout running compile'
+ )
+ } else if (error) {
+ status = 'error'
+ code = 500
+ logger.error(
+ { err: error, projectId: request.project_id },
+ 'error running compile'
+ )
+ } else {
+ if (
+ outputFiles.some(
+ file => file.path === 'output.pdf' && file.size > 0
+ )
+ ) {
+ status = 'success'
+ lastSuccessfulCompileTimestamp = Date.now()
+ } else if (request.stopOnFirstError) {
+ status = 'stopped-on-first-error'
+ } else {
+ status = 'failure'
+ logger.warn(
+ { projectId: request.project_id, outputFiles },
+ 'project failed to compile successfully, no output.pdf generated'
+ )
+ }
+
+ // log an error if any core files are found
+ if (outputFiles.some(file => file.path === 'core')) {
+ logger.error(
+ { projectId: request.project_id, req, outputFiles },
+ 'core file found in output'
+ )
+ }
+ }
+
+ if (error) {
+ outputFiles = error.outputFiles || []
+ buildId = error.buildId
+ }
+
+ let clsiCacheShard
+ if (
+ status === 'success' &&
+ request.editorId &&
+ request.populateClsiCache
+ ) {
+ clsiCacheShard = notifyCLSICacheAboutBuild({
projectId: request.project_id,
userId: request.user_id,
+ buildId: outputFiles[0].build,
+ editorId: request.editorId,
+ outputFiles,
+ compileGroup: request.compileGroup,
+ options: {
+ compiler: request.compiler,
+ draft: request.draft,
+ imageName: request.imageName
+ ? request.imageName
+ : undefined,
+ rootResourcePath: request.rootResourcePath,
+ stopOnFirstError: request.stopOnFirstError,
+ },
+ })
+ }
+
+ timer.done()
+ res.status(code || 200).send({
+ compile: {
+ status,
+ error: error?.message || error,
+ stats,
+ timings,
+ buildId,
+ clsiCacheShard,
+ outputUrlPrefix: Settings.apis.clsi.outputUrlPrefix,
+ outputFiles: outputFiles.map(file => ({
+ url:
+ `${Settings.apis.clsi.url}/project/${request.project_id}` +
+ (request.user_id != null
+ ? `/user/${request.user_id}`
+ : '') +
+ `/build/${file.build}/output/${file.path}`,
+ ...file,
+ })),
},
- 'files out of sync, please retry'
- )
- } else if (
- error?.code === 'EPIPE' ||
- error instanceof Errors.TooManyCompileRequestsError
- ) {
- // docker returns EPIPE when shutting down
- code = 503 // send 503 Unavailable response
- status = 'unavailable'
- } else if (error?.terminated) {
- status = 'terminated'
- } else if (error?.validate) {
- status = `validation-${error.validate}`
- } else if (error?.timedout) {
- status = 'timedout'
- logger.debug(
- { err: error, projectId: request.project_id },
- 'timeout running compile'
- )
- } else if (error) {
- status = 'error'
- code = 500
- logger.error(
- { err: error, projectId: request.project_id },
- 'error running compile'
- )
- } else {
- if (
- outputFiles.some(
- file => file.path === 'output.pdf' && file.size > 0
- )
- ) {
- status = 'success'
- lastSuccessfulCompileTimestamp = Date.now()
- } else if (request.stopOnFirstError) {
- status = 'stopped-on-first-error'
- } else {
- status = 'failure'
- logger.warn(
- { projectId: request.project_id, outputFiles },
- 'project failed to compile successfully, no output.pdf generated'
- )
- }
-
- // log an error if any core files are found
- if (outputFiles.some(file => file.path === 'core')) {
- logger.error(
- { projectId: request.project_id, req, outputFiles },
- 'core file found in output'
- )
- }
+ })
}
-
- if (error) {
- outputFiles = error.outputFiles || []
- buildId = error.buildId
- }
-
- timer.done()
- res.status(code || 200).send({
- compile: {
- status,
- error: error?.message || error,
- stats,
- timings,
- buildId,
- outputUrlPrefix: Settings.apis.clsi.outputUrlPrefix,
- outputFiles: outputFiles.map(file => ({
- url:
- `${Settings.apis.clsi.url}/project/${request.project_id}` +
- (request.user_id != null ? `/user/${request.user_id}` : '') +
- (file.build != null ? `/build/${file.build}` : '') +
- `/output/${file.path}`,
- ...file,
- })),
- },
- })
- })
+ )
}
)
})
@@ -154,30 +190,27 @@ function clearCache(req, res, next) {
}
function syncFromCode(req, res, next) {
- const { file } = req.query
+ const { file, editorId, buildId } = req.query
+ const compileFromClsiCache = req.query.compileFromClsiCache === 'true'
const line = parseInt(req.query.line, 10)
const column = parseInt(req.query.column, 10)
const { imageName } = req.query
const projectId = req.params.project_id
const userId = req.params.user_id
-
- if (imageName && !_isImageNameAllowed(imageName)) {
- return res.status(400).send('invalid image')
- }
-
CompileManager.syncFromCode(
projectId,
userId,
file,
line,
column,
- imageName,
- function (error, pdfPositions) {
+ { imageName, editorId, buildId, compileFromClsiCache },
+ function (error, pdfPositions, downloadedFromCache) {
if (error) {
return next(error)
}
res.json({
pdf: pdfPositions,
+ downloadedFromCache,
})
}
)
@@ -187,26 +220,24 @@ function syncFromPdf(req, res, next) {
const page = parseInt(req.query.page, 10)
const h = parseFloat(req.query.h)
const v = parseFloat(req.query.v)
- const { imageName } = req.query
+ const { imageName, editorId, buildId } = req.query
+ const compileFromClsiCache = req.query.compileFromClsiCache === 'true'
const projectId = req.params.project_id
const userId = req.params.user_id
-
- if (imageName && !_isImageNameAllowed(imageName)) {
- return res.status(400).send('invalid image')
- }
CompileManager.syncFromPdf(
projectId,
userId,
page,
h,
v,
- imageName,
- function (error, codePositions) {
+ { imageName, editorId, buildId, compileFromClsiCache },
+ function (error, codePositions, downloadedFromCache) {
if (error) {
return next(error)
}
res.json({
code: codePositions,
+ downloadedFromCache,
})
}
)
@@ -217,9 +248,6 @@ function wordcount(req, res, next) {
const projectId = req.params.project_id
const userId = req.params.user_id
const { image } = req.query
- if (image && !_isImageNameAllowed(image)) {
- return res.status(400).send('invalid image')
- }
logger.debug({ image, file, projectId }, 'word count request')
CompileManager.wordcount(
@@ -242,12 +270,6 @@ function status(req, res, next) {
res.send('OK')
}
-function _isImageNameAllowed(imageName) {
- const ALLOWED_IMAGES =
- Settings.clsi && Settings.clsi.docker && Settings.clsi.docker.allowedImages
- return !ALLOWED_IMAGES || ALLOWED_IMAGES.includes(imageName)
-}
-
module.exports = {
compile,
stopCompile,
diff --git a/services/clsi/app/js/CompileManager.js b/services/clsi/app/js/CompileManager.js
index 9d1981263d..1b66927412 100644
--- a/services/clsi/app/js/CompileManager.js
+++ b/services/clsi/app/js/CompileManager.js
@@ -1,7 +1,7 @@
-const fsPromises = require('fs/promises')
-const os = require('os')
-const Path = require('path')
-const { callbackify } = require('util')
+const fsPromises = require('node:fs/promises')
+const os = require('node:os')
+const Path = require('node:path')
+const { callbackify } = require('node:util')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
@@ -19,6 +19,11 @@ const Errors = require('./Errors')
const CommandRunner = require('./CommandRunner')
const { emitPdfStats } = require('./ContentCacheMetrics')
const SynctexOutputParser = require('./SynctexOutputParser')
+const {
+ downloadLatestCompileCache,
+ downloadOutputDotSynctexFromCompileCache,
+} = require('./CLSICacheHandler')
+const { callbackifyMultiResult } = require('@overleaf/promise-utils')
const COMPILE_TIME_BUCKETS = [
// NOTE: These buckets are locked in per metric name.
@@ -42,22 +47,22 @@ function getOutputDir(projectId, userId) {
return Path.join(Settings.path.outputDir, getCompileName(projectId, userId))
}
-async function doCompileWithLock(request) {
+async function doCompileWithLock(request, stats, timings) {
const compileDir = getCompileDir(request.project_id, request.user_id)
- await fsPromises.mkdir(compileDir, { recursive: true })
+ request.isInitialCompile =
+ (await fsPromises.mkdir(compileDir, { recursive: true })) === compileDir
// prevent simultaneous compiles
const lock = LockManager.acquire(compileDir)
try {
- return await doCompile(request)
+ return await doCompile(request, stats, timings)
} finally {
lock.release()
}
}
-async function doCompile(request) {
+async function doCompile(request, stats, timings) {
+ const { project_id: projectId, user_id: userId } = request
const compileDir = getCompileDir(request.project_id, request.user_id)
- const stats = {}
- const timings = {}
const timerE2E = new Metrics.Timer(
'compile-e2e-v2',
@@ -65,6 +70,25 @@ async function doCompile(request) {
request.metricsOpts,
COMPILE_TIME_BUCKETS
)
+ if (request.isInitialCompile) {
+ stats.isInitialCompile = 1
+ request.metricsOpts.compile = 'initial'
+ if (request.compileFromClsiCache) {
+ try {
+ if (await downloadLatestCompileCache(projectId, userId, compileDir)) {
+ stats.restoredClsiCache = 1
+ request.metricsOpts.compile = 'from-clsi-cache'
+ }
+ } catch (err) {
+ logger.warn(
+ { err, projectId, userId },
+ 'failed to populate compile dir from cache'
+ )
+ }
+ }
+ } else {
+ request.metricsOpts.compile = 'recompile'
+ }
const writeToDiskTimer = new Metrics.Timer(
'write-to-disk',
1,
@@ -296,7 +320,7 @@ async function doCompile(request) {
emitPdfStats(stats, timings, request)
}
- return { outputFiles, stats, timings, buildId }
+ return { outputFiles, buildId }
}
async function _saveOutputFiles({
@@ -313,24 +337,16 @@ async function _saveOutputFiles({
)
const outputDir = getOutputDir(request.project_id, request.user_id)
- let { outputFiles, allEntries } =
+ const { outputFiles: rawOutputFiles, allEntries } =
await OutputFileFinder.promises.findOutputFiles(resourceList, compileDir)
- let buildId
-
- try {
- const saveResult = await OutputCacheManager.promises.saveOutputFiles(
+ const { buildId, outputFiles } =
+ await OutputCacheManager.promises.saveOutputFiles(
{ request, stats, timings },
- outputFiles,
+ rawOutputFiles,
compileDir,
outputDir
)
- buildId = saveResult.buildId
- outputFiles = saveResult.outputFiles
- } catch (err) {
- const { project_id: projectId, user_id: userId } = request
- logger.err({ projectId, userId, err }, 'failed to save output files')
- }
timings.output = timer.done()
return { outputFiles, allEntries, buildId }
@@ -416,14 +432,7 @@ async function _checkDirectory(compileDir) {
return true
}
-async function syncFromCode(
- projectId,
- userId,
- filename,
- line,
- column,
- imageName
-) {
+async function syncFromCode(projectId, userId, filename, line, column, opts) {
// If LaTeX was run in a virtual environment, the file path that synctex expects
// might not match the file path on the host. The .synctex.gz file however, will be accessed
// wherever it is on the host.
@@ -439,15 +448,23 @@ async function syncFromCode(
'-o',
outputFilePath,
]
- const stdout = await _runSynctex(projectId, userId, command, imageName)
+ const { stdout, downloadedFromCache } = await _runSynctex(
+ projectId,
+ userId,
+ command,
+ opts
+ )
logger.debug(
{ projectId, userId, filename, line, column, command, stdout },
'synctex code output'
)
- return SynctexOutputParser.parseViewOutput(stdout)
+ return {
+ codePositions: SynctexOutputParser.parseViewOutput(stdout),
+ downloadedFromCache,
+ }
}
-async function syncFromPdf(projectId, userId, page, h, v, imageName) {
+async function syncFromPdf(projectId, userId, page, h, v, opts) {
const compileName = getCompileName(projectId, userId)
const baseDir = Settings.path.synctexBaseDir(compileName)
const outputFilePath = `${baseDir}/output.pdf`
@@ -457,9 +474,17 @@ async function syncFromPdf(projectId, userId, page, h, v, imageName) {
'-o',
`${page}:${h}:${v}:${outputFilePath}`,
]
- const stdout = await _runSynctex(projectId, userId, command, imageName)
+ const { stdout, downloadedFromCache } = await _runSynctex(
+ projectId,
+ userId,
+ command,
+ opts
+ )
logger.debug({ projectId, userId, page, h, v, stdout }, 'synctex pdf output')
- return SynctexOutputParser.parseEditOutput(stdout, baseDir)
+ return {
+ pdfPositions: SynctexOutputParser.parseEditOutput(stdout, baseDir),
+ downloadedFromCache,
+ }
}
async function _checkFileExists(dir, filename) {
@@ -486,32 +511,90 @@ async function _checkFileExists(dir, filename) {
}
}
-async function _runSynctex(projectId, userId, command, imageName) {
- const directory = getCompileDir(projectId, userId)
+async function _runSynctex(projectId, userId, command, opts) {
+ const { imageName, editorId, buildId, compileFromClsiCache } = opts
+
+ if (imageName && !_isImageNameAllowed(imageName)) {
+ throw new Errors.InvalidParameter('invalid image')
+ }
+ if (editorId && !/^[a-f0-9-]+$/.test(editorId)) {
+ throw new Errors.InvalidParameter('invalid editorId')
+ }
+ if (buildId && !OutputCacheManager.BUILD_REGEX.test(buildId)) {
+ throw new Errors.InvalidParameter('invalid buildId')
+ }
+
+ const outputDir = getOutputDir(projectId, userId)
+ const runInOutputDir = buildId && CommandRunner.canRunSyncTeXInOutputDir()
+
+ const directory = runInOutputDir
+ ? Path.join(outputDir, OutputCacheManager.CACHE_SUBDIR, buildId)
+ : getCompileDir(projectId, userId)
const timeout = 60 * 1000 // increased to allow for large projects
const compileName = getCompileName(projectId, userId)
- const compileGroup = 'synctex'
+ const compileGroup = runInOutputDir ? 'synctex-output' : 'synctex'
const defaultImageName =
Settings.clsi && Settings.clsi.docker && Settings.clsi.docker.image
- await _checkFileExists(directory, 'output.synctex.gz')
- try {
- const output = await CommandRunner.promises.run(
- compileName,
- command,
- directory,
- imageName || defaultImageName,
- timeout,
- {},
- compileGroup
- )
- return output.stdout
- } catch (error) {
- throw OError.tag(error, 'error running synctex', {
- command,
- projectId,
- userId,
- })
- }
+ // eslint-disable-next-line @typescript-eslint/return-await
+ return await OutputCacheManager.promises.queueDirOperation(
+ outputDir,
+ /**
+ * @return {Promise<{stdout: string, downloadedFromCache: boolean}>}
+ */
+ async () => {
+ let downloadedFromCache = false
+ try {
+ await _checkFileExists(directory, 'output.synctex.gz')
+ } catch (err) {
+ if (
+ err instanceof Errors.NotFoundError &&
+ compileFromClsiCache &&
+ editorId &&
+ buildId
+ ) {
+ try {
+ downloadedFromCache =
+ await downloadOutputDotSynctexFromCompileCache(
+ projectId,
+ userId,
+ editorId,
+ buildId,
+ directory
+ )
+ } catch (err) {
+ logger.warn(
+ { err, projectId, userId, editorId, buildId },
+ 'failed to download output.synctex.gz from clsi-cache'
+ )
+ }
+ await _checkFileExists(directory, 'output.synctex.gz')
+ } else {
+ throw err
+ }
+ }
+ try {
+ const { stdout } = await CommandRunner.promises.run(
+ compileName,
+ command,
+ directory,
+ imageName || defaultImageName,
+ timeout,
+ {},
+ compileGroup
+ )
+ return {
+ stdout,
+ downloadedFromCache,
+ }
+ } catch (error) {
+ throw OError.tag(error, 'error running synctex', {
+ command,
+ projectId,
+ userId,
+ })
+ }
+ }
+ )
}
async function wordcount(projectId, userId, filename, image) {
@@ -523,6 +606,10 @@ async function wordcount(projectId, userId, filename, image) {
const compileName = getCompileName(projectId, userId)
const compileGroup = 'wordcount'
+ if (image && !_isImageNameAllowed(image)) {
+ throw new Errors.InvalidParameter('invalid image')
+ }
+
try {
await fsPromises.mkdir(compileDir, { recursive: true })
} catch (err) {
@@ -610,13 +697,25 @@ function _parseWordcountFromOutput(output) {
return results
}
+function _isImageNameAllowed(imageName) {
+ const ALLOWED_IMAGES =
+ Settings.clsi && Settings.clsi.docker && Settings.clsi.docker.allowedImages
+ return !ALLOWED_IMAGES || ALLOWED_IMAGES.includes(imageName)
+}
+
module.exports = {
doCompileWithLock: callbackify(doCompileWithLock),
stopCompile: callbackify(stopCompile),
clearProject: callbackify(clearProject),
clearExpiredProjects: callbackify(clearExpiredProjects),
- syncFromCode: callbackify(syncFromCode),
- syncFromPdf: callbackify(syncFromPdf),
+ syncFromCode: callbackifyMultiResult(syncFromCode, [
+ 'codePositions',
+ 'downloadedFromCache',
+ ]),
+ syncFromPdf: callbackifyMultiResult(syncFromPdf, [
+ 'pdfPositions',
+ 'downloadedFromCache',
+ ]),
wordcount: callbackify(wordcount),
promises: {
doCompileWithLock,
diff --git a/services/clsi/app/js/ContentCacheManager.js b/services/clsi/app/js/ContentCacheManager.js
index 016b264b86..5457c0dce0 100644
--- a/services/clsi/app/js/ContentCacheManager.js
+++ b/services/clsi/app/js/ContentCacheManager.js
@@ -2,10 +2,10 @@
* ContentCacheManager - maintains a cache of stream hashes from a PDF file
*/
-const { callbackify } = require('util')
-const fs = require('fs')
-const crypto = require('crypto')
-const Path = require('path')
+const { callbackify } = require('node:util')
+const fs = require('node:fs')
+const crypto = require('node:crypto')
+const Path = require('node:path')
const Settings = require('@overleaf/settings')
const OError = require('@overleaf/o-error')
const pLimit = require('p-limit')
diff --git a/services/clsi/app/js/ContentCacheMetrics.js b/services/clsi/app/js/ContentCacheMetrics.js
index 0337876feb..1e2b598286 100644
--- a/services/clsi/app/js/ContentCacheMetrics.js
+++ b/services/clsi/app/js/ContentCacheMetrics.js
@@ -1,6 +1,6 @@
const logger = require('@overleaf/logger')
const Metrics = require('./Metrics')
-const os = require('os')
+const os = require('node:os')
let CACHED_LOAD = {
expires: -1,
diff --git a/services/clsi/app/js/ContentController.js b/services/clsi/app/js/ContentController.js
index b154bea175..96eba613ed 100644
--- a/services/clsi/app/js/ContentController.js
+++ b/services/clsi/app/js/ContentController.js
@@ -1,4 +1,4 @@
-const Path = require('path')
+const Path = require('node:path')
const send = require('send')
const Settings = require('@overleaf/settings')
const OutputCacheManager = require('./OutputCacheManager')
diff --git a/services/clsi/app/js/ContentTypeMapper.js b/services/clsi/app/js/ContentTypeMapper.js
index 6301dce489..5bf0c31423 100644
--- a/services/clsi/app/js/ContentTypeMapper.js
+++ b/services/clsi/app/js/ContentTypeMapper.js
@@ -4,7 +4,7 @@
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
let ContentTypeMapper
-const Path = require('path')
+const Path = require('node:path')
// here we coerce html, css and js to text/plain,
// otherwise choose correct mime type based on file extension,
diff --git a/services/clsi/app/js/DockerRunner.js b/services/clsi/app/js/DockerRunner.js
index c1f08c26e7..97053c1875 100644
--- a/services/clsi/app/js/DockerRunner.js
+++ b/services/clsi/app/js/DockerRunner.js
@@ -1,26 +1,17 @@
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
const Docker = require('dockerode')
const dockerode = new Docker()
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const async = require('async')
const LockManager = require('./DockerLockManager')
-const fs = require('fs')
-const Path = require('path')
+const Path = require('node:path')
const _ = require('lodash')
const ONE_HOUR_IN_MS = 60 * 60 * 1000
logger.debug('using docker runner')
-function usingSiblingContainers() {
- return (
- Settings != null &&
- Settings.path != null &&
- Settings.path.sandboxedCompilesHostDir != null
- )
-}
-
let containerMonitorTimeout
let containerMonitorInterval
@@ -35,24 +26,6 @@ const DockerRunner = {
compileGroup,
callback
) {
- if (usingSiblingContainers()) {
- const _newPath = Settings.path.sandboxedCompilesHostDir
- logger.debug(
- { path: _newPath },
- 'altering bind path for sibling containers'
- )
- // Server Pro, example:
- // '/var/lib/overleaf/data/compiles/'
- // ... becomes ...
- // '/opt/overleaf_data/data/compiles/'
- directory = Path.join(
- Settings.path.sandboxedCompilesHostDir,
- Path.basename(directory)
- )
- }
-
- const volumes = { [directory]: '/compile' }
-
command = command.map(arg =>
arg.toString().replace('$COMPILE_DIR', '/compile')
)
@@ -72,7 +45,32 @@ const DockerRunner = {
image = `${Settings.texliveImageNameOveride}/${img[2]}`
}
- if (compileGroup === 'synctex' || compileGroup === 'wordcount') {
+ if (compileGroup === 'synctex-output') {
+ // In: directory = '/overleaf/services/clsi/output/projectId-userId/generated-files/buildId'
+ // directory.split('/').slice(-3) === 'projectId-userId/generated-files/buildId'
+ // sandboxedCompilesHostDirOutput = '/host/output'
+ // Out: directory = '/host/output/projectId-userId/generated-files/buildId'
+ directory = Path.join(
+ Settings.path.sandboxedCompilesHostDirOutput,
+ ...directory.split('/').slice(-3)
+ )
+ } else {
+ // In: directory = '/overleaf/services/clsi/compiles/projectId-userId'
+ // Path.basename(directory) === 'projectId-userId'
+ // sandboxedCompilesHostDirCompiles = '/host/compiles'
+ // Out: directory = '/host/compiles/projectId-userId'
+ directory = Path.join(
+ Settings.path.sandboxedCompilesHostDirCompiles,
+ Path.basename(directory)
+ )
+ }
+
+ const volumes = { [directory]: '/compile' }
+ if (
+ compileGroup === 'synctex' ||
+ compileGroup === 'synctex-output' ||
+ compileGroup === 'wordcount'
+ ) {
volumes[directory] += ':ro'
}
@@ -234,8 +232,8 @@ const DockerRunner = {
}
}
// set the path based on the image year
- const match = image.match(/:([0-9]+)\.[0-9]+/)
- const year = match ? match[1] : '2014'
+ const match = image.match(/:([0-9]+)\.[0-9]+|:TL([0-9]+)/)
+ const year = match ? match[1] || match[2] : '2014'
env.PATH = `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/texlive/${year}/bin/x86_64-linux/`
const options = {
Cmd: command,
@@ -309,50 +307,17 @@ const DockerRunner = {
LockManager.runWithLock(
options.name,
releaseLock =>
- // Check that volumes exist before starting the container.
- // When a container is started with volume pointing to a
- // non-existent directory then docker creates the directory but
- // with root ownership.
- DockerRunner._checkVolumes(options, volumes, err => {
- if (err != null) {
- return releaseLock(err)
- }
- DockerRunner._startContainer(
- options,
- volumes,
- attachStreamHandler,
- releaseLock
- )
- }),
-
+ DockerRunner._startContainer(
+ options,
+ volumes,
+ attachStreamHandler,
+ releaseLock
+ ),
callback
)
},
// Check that volumes exist and are directories
- _checkVolumes(options, volumes, callback) {
- if (usingSiblingContainers()) {
- // Server Pro, with sibling-containers active, skip checks
- return callback(null)
- }
-
- const checkVolume = (path, cb) =>
- fs.stat(path, (err, stats) => {
- if (err != null) {
- return cb(err)
- }
- if (!stats.isDirectory()) {
- return cb(new Error('not a directory'))
- }
- cb()
- })
- const jobs = []
- for (const vol in volumes) {
- jobs.push(cb => checkVolume(vol, cb))
- }
- async.series(jobs, callback)
- },
-
_startContainer(options, volumes, attachStreamHandler, callback) {
callback = _.once(callback)
const { name } = options
@@ -617,6 +582,10 @@ const DockerRunner = {
containerMonitorInterval = undefined
}
},
+
+ canRunSyncTeXInOutputDir() {
+ return Boolean(Settings.path.sandboxedCompilesHostDirOutput)
+ },
}
DockerRunner.startContainerMonitor()
diff --git a/services/clsi/app/js/DraftModeManager.js b/services/clsi/app/js/DraftModeManager.js
index a5b26348e6..cf8ababc47 100644
--- a/services/clsi/app/js/DraftModeManager.js
+++ b/services/clsi/app/js/DraftModeManager.js
@@ -1,5 +1,5 @@
-const fsPromises = require('fs/promises')
-const { callbackify } = require('util')
+const fsPromises = require('node:fs/promises')
+const { callbackify } = require('node:util')
const logger = require('@overleaf/logger')
async function injectDraftMode(filename) {
diff --git a/services/clsi/app/js/Errors.js b/services/clsi/app/js/Errors.js
index 5c5fd3745a..64c3c7b59a 100644
--- a/services/clsi/app/js/Errors.js
+++ b/services/clsi/app/js/Errors.js
@@ -35,6 +35,7 @@ class QueueLimitReachedError extends OError {}
class TimedOutError extends OError {}
class NoXrefTableError extends OError {}
class TooManyCompileRequestsError extends OError {}
+class InvalidParameter extends OError {}
module.exports = Errors = {
QueueLimitReachedError,
@@ -44,4 +45,5 @@ module.exports = Errors = {
AlreadyCompilingError,
NoXrefTableError,
TooManyCompileRequestsError,
+ InvalidParameter,
}
diff --git a/services/clsi/app/js/LatexRunner.js b/services/clsi/app/js/LatexRunner.js
index d956ee4949..beefa002ab 100644
--- a/services/clsi/app/js/LatexRunner.js
+++ b/services/clsi/app/js/LatexRunner.js
@@ -1,9 +1,9 @@
-const Path = require('path')
-const { promisify } = require('util')
+const Path = require('node:path')
+const { promisify } = require('node:util')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
const CommandRunner = require('./CommandRunner')
-const fs = require('fs')
+const fs = require('node:fs')
const ProcessTable = {} // table of currently running jobs (pids or docker container names)
diff --git a/services/clsi/app/js/LocalCommandRunner.js b/services/clsi/app/js/LocalCommandRunner.js
index d909ec601c..aa62825443 100644
--- a/services/clsi/app/js/LocalCommandRunner.js
+++ b/services/clsi/app/js/LocalCommandRunner.js
@@ -12,8 +12,8 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let CommandRunner
-const { spawn } = require('child_process')
-const { promisify } = require('util')
+const { spawn } = require('node:child_process')
+const { promisify } = require('node:util')
const _ = require('lodash')
const logger = require('@overleaf/logger')
@@ -54,6 +54,7 @@ module.exports = CommandRunner = {
cwd: directory,
env,
stdio: ['pipe', 'pipe', 'ignore'],
+ detached: true,
})
let stdout = ''
@@ -99,6 +100,10 @@ module.exports = CommandRunner = {
}
return callback()
},
+
+ canRunSyncTeXInOutputDir() {
+ return true
+ },
}
module.exports.promises = {
diff --git a/services/clsi/app/js/OutputCacheManager.js b/services/clsi/app/js/OutputCacheManager.js
index 13aad1bc74..a1a0a89aa7 100644
--- a/services/clsi/app/js/OutputCacheManager.js
+++ b/services/clsi/app/js/OutputCacheManager.js
@@ -1,12 +1,12 @@
let OutputCacheManager
-const { callbackify, promisify } = require('util')
+const { callbackify, promisify } = require('node:util')
const async = require('async')
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const logger = require('@overleaf/logger')
const _ = require('lodash')
const Settings = require('@overleaf/settings')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const Metrics = require('./Metrics')
const OutputFileOptimiser = require('./OutputFileOptimiser')
@@ -83,6 +83,13 @@ async function cleanupDirectory(dir, options) {
})
}
+/**
+ * @template T
+ *
+ * @param {string} dir
+ * @param {() => Promise} fn
+ * @return {Promise}
+ */
async function queueDirOperation(dir, fn) {
const pending = PENDING_PROJECT_ACTIONS.get(dir) || Promise.resolve()
const p = pending.then(fn, fn).finally(() => {
@@ -98,12 +105,11 @@ module.exports = OutputCacheManager = {
CONTENT_SUBDIR: 'content',
CACHE_SUBDIR: 'generated-files',
ARCHIVE_SUBDIR: 'archived-logs',
- // build id is HEXDATE-HEXRANDOM from Date.now()and RandomBytes
- // for backwards compatibility, make the randombytes part optional
- BUILD_REGEX: /^[0-9a-f]+(-[0-9a-f]+)?$/,
- CONTENT_REGEX: /^[0-9a-f]+(-[0-9a-f]+)?$/,
+ // build id is HEXDATE-HEXRANDOM from Date.now() and RandomBytes
+ BUILD_REGEX: /^[0-9a-f]+-[0-9a-f]+$/,
+ CONTENT_REGEX: /^[0-9a-f]+-[0-9a-f]+$/,
CACHE_LIMIT: 2, // maximum number of cache directories
- CACHE_AGE: 60 * 60 * 1000, // up to one hour old
+ CACHE_AGE: 90 * 60 * 1000, // up to 90 minutes old
init,
queueDirOperation: callbackify(queueDirOperation),
@@ -137,7 +143,11 @@ module.exports = OutputCacheManager = {
outputDir,
callback
) {
- OutputCacheManager.generateBuildId(function (err, buildId) {
+ const getBuildId = cb => {
+ if (request.buildId) return cb(null, request.buildId)
+ OutputCacheManager.generateBuildId(cb)
+ }
+ getBuildId(function (err, buildId) {
if (err) {
return callback(err)
}
@@ -245,7 +255,7 @@ module.exports = OutputCacheManager = {
{ err, directory: cacheDir },
'error creating cache directory'
)
- callback(err, outputFiles)
+ callback(err)
} else {
// copy all the output files into the new cache directory
const results = []
@@ -263,7 +273,6 @@ module.exports = OutputCacheManager = {
return cb()
}
// copy other files into cache directory if valid
- const newFile = _.clone(file)
const src = Path.join(compileDir, file.path)
const dst = Path.join(cacheDir, file.path)
OutputCacheManager._checkIfShouldCopy(
@@ -279,8 +288,8 @@ module.exports = OutputCacheManager = {
if (err) {
return cb(err)
}
- newFile.build = buildId // attach a build id if we cached the file
- results.push(newFile)
+ file.build = buildId
+ results.push(file)
cb()
})
}
@@ -288,8 +297,7 @@ module.exports = OutputCacheManager = {
},
function (err) {
if (err) {
- // pass back the original files if we encountered *any* error
- callback(err, outputFiles)
+ callback(err)
// clean up the directory we just created
fs.rm(cacheDir, { force: true, recursive: true }, function (err) {
if (err) {
@@ -301,7 +309,7 @@ module.exports = OutputCacheManager = {
})
} else {
// pass back the list of new files in the cache
- callback(err, results)
+ callback(null, results)
// let file expiry run in the background, expire all previous files if per-user
cleanupDirectory(outputDir, {
keep: buildId,
@@ -676,4 +684,5 @@ OutputCacheManager.promises = {
saveOutputFilesInBuildDir: promisify(
OutputCacheManager.saveOutputFilesInBuildDir
),
+ queueDirOperation,
}
diff --git a/services/clsi/app/js/OutputFileArchiveManager.js b/services/clsi/app/js/OutputFileArchiveManager.js
index 3c5a6c8197..64c5198392 100644
--- a/services/clsi/app/js/OutputFileArchiveManager.js
+++ b/services/clsi/app/js/OutputFileArchiveManager.js
@@ -7,7 +7,7 @@ const { NotFoundError } = require('./Errors')
const logger = require('@overleaf/logger')
// NOTE: Updating this list requires a corresponding change in
-// * services/web/frontend/js/features/pdf-preview/util/file-list.js
+// * services/web/frontend/js/features/pdf-preview/util/file-list.ts
const ignoreFiles = ['output.fls', 'output.fdb_latexmk']
function getContentDir(projectId, userId) {
@@ -93,8 +93,11 @@ module.exports = {
)
return outputFiles.filter(
- // Ignore the pdf and also ignore the files ignored by the frontend.
- ({ path }) => path !== 'output.pdf' && !ignoreFiles.includes(path)
+ // Ignore the pdf, clsi-cache tar-ball and also ignore the files ignored by the frontend.
+ ({ path }) =>
+ path !== 'output.pdf' &&
+ path !== 'output.tar.gz' &&
+ !ignoreFiles.includes(path)
)
} catch (error) {
if (
diff --git a/services/clsi/app/js/OutputFileFinder.js b/services/clsi/app/js/OutputFileFinder.js
index 8ca13183dc..e62038c614 100644
--- a/services/clsi/app/js/OutputFileFinder.js
+++ b/services/clsi/app/js/OutputFileFinder.js
@@ -1,5 +1,5 @@
-const Path = require('path')
-const fs = require('fs')
+const Path = require('node:path')
+const fs = require('node:fs')
const { callbackifyMultiResult } = require('@overleaf/promise-utils')
async function walkFolder(compileDir, d, files, allEntries) {
diff --git a/services/clsi/app/js/OutputFileOptimiser.js b/services/clsi/app/js/OutputFileOptimiser.js
index c97ef7ffdc..09ca98672d 100644
--- a/services/clsi/app/js/OutputFileOptimiser.js
+++ b/services/clsi/app/js/OutputFileOptimiser.js
@@ -13,9 +13,9 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let OutputFileOptimiser
-const fs = require('fs')
-const Path = require('path')
-const { spawn } = require('child_process')
+const fs = require('node:fs')
+const Path = require('node:path')
+const { spawn } = require('node:child_process')
const logger = require('@overleaf/logger')
const Metrics = require('./Metrics')
const _ = require('lodash')
@@ -74,9 +74,7 @@ module.exports = OutputFileOptimiser = {
logger.debug({ args }, 'running qpdf command')
const timer = new Metrics.Timer('qpdf')
- const proc = spawn('qpdf', args)
- let stdout = ''
- proc.stdout.setEncoding('utf8').on('data', chunk => (stdout += chunk))
+ const proc = spawn('qpdf', args, { stdio: 'ignore' })
callback = _.once(callback) // avoid double call back for error and close event
proc.on('error', function (err) {
logger.warn({ err, args }, 'qpdf failed')
diff --git a/services/clsi/app/js/ProjectPersistenceManager.js b/services/clsi/app/js/ProjectPersistenceManager.js
index 4dbe8b636e..41cdd07f4d 100644
--- a/services/clsi/app/js/ProjectPersistenceManager.js
+++ b/services/clsi/app/js/ProjectPersistenceManager.js
@@ -13,47 +13,90 @@ const CompileManager = require('./CompileManager')
const async = require('async')
const logger = require('@overleaf/logger')
const oneDay = 24 * 60 * 60 * 1000
+const Metrics = require('@overleaf/metrics')
const Settings = require('@overleaf/settings')
-const diskusage = require('diskusage')
-const { callbackify } = require('util')
-const Path = require('path')
-const fs = require('fs')
+const { callbackify } = require('node:util')
+const Path = require('node:path')
+const fs = require('node:fs')
// projectId -> timestamp mapping.
const LAST_ACCESS = new Map()
-async function refreshExpiryTimeout() {
+let ANY_DISK_LOW = false
+let ANY_DISK_CRITICAL_LOW = false
+
+async function collectDiskStats() {
const paths = [
Settings.path.compilesDir,
Settings.path.outputDir,
Settings.path.clsiCacheDir,
]
+
+ const diskStats = {}
+ let anyDiskLow = false
+ let anyDiskCriticalLow = false
for (const path of paths) {
try {
- const stats = await diskusage.check(path)
- const lowDisk = stats.available / stats.total < 0.1
-
- const lowerExpiry = ProjectPersistenceManager.EXPIRY_TIMEOUT * 0.9
- if (lowDisk && Settings.project_cache_length_ms / 2 < lowerExpiry) {
- logger.warn(
- {
- stats,
- newExpiryTimeoutInDays: (lowerExpiry / oneDay).toFixed(2),
- },
- 'disk running low on space, modifying EXPIRY_TIMEOUT'
- )
- ProjectPersistenceManager.EXPIRY_TIMEOUT = lowerExpiry
- break
+ const { blocks, bavail, bsize } = await fs.promises.statfs(path)
+ const stats = {
+ // Warning: these values will be wrong by a factor in Docker-for-Mac.
+ // See https://github.com/docker/for-mac/issues/2136
+ total: blocks * bsize, // Total size of the file system in bytes
+ available: bavail * bsize, // Free space available to unprivileged users.
}
+ const diskAvailablePercent = (stats.available / stats.total) * 100
+ Metrics.gauge('disk_available_percent', diskAvailablePercent, 1, {
+ path,
+ })
+ const lowDisk = diskAvailablePercent < 10
+ diskStats[path] = { stats, lowDisk }
+
+ const criticalLowDisk = diskAvailablePercent < 3
+ anyDiskLow = anyDiskLow || lowDisk
+ anyDiskCriticalLow = anyDiskCriticalLow || criticalLowDisk
} catch (err) {
logger.err({ err, path }, 'error getting disk usage')
}
}
+ ANY_DISK_LOW = anyDiskLow
+ ANY_DISK_CRITICAL_LOW = anyDiskCriticalLow
+ return diskStats
+}
+
+async function refreshExpiryTimeout() {
+ for (const [path, { stats, lowDisk }] of Object.entries(
+ await collectDiskStats()
+ )) {
+ const lowerExpiry = ProjectPersistenceManager.EXPIRY_TIMEOUT * 0.9
+ if (lowDisk && Settings.project_cache_length_ms / 2 < lowerExpiry) {
+ logger.warn(
+ {
+ path,
+ stats,
+ newExpiryTimeoutInDays: (lowerExpiry / oneDay).toFixed(2),
+ },
+ 'disk running low on space, modifying EXPIRY_TIMEOUT'
+ )
+ ProjectPersistenceManager.EXPIRY_TIMEOUT = lowerExpiry
+ break
+ }
+ }
+ Metrics.gauge(
+ 'project_persistence_expiry_timeout',
+ ProjectPersistenceManager.EXPIRY_TIMEOUT
+ )
}
module.exports = ProjectPersistenceManager = {
EXPIRY_TIMEOUT: Settings.project_cache_length_ms || oneDay * 2.5,
+ isAnyDiskLow() {
+ return ANY_DISK_LOW
+ },
+ isAnyDiskCriticalLow() {
+ return ANY_DISK_CRITICAL_LOW
+ },
+
promises: {
refreshExpiryTimeout,
},
@@ -103,6 +146,13 @@ module.exports = ProjectPersistenceManager = {
}
)
})
+
+ // Collect disk stats frequently to have them ready the next time /metrics is scraped (60s +- jitter) or every 5th scrape of the load agent (3s +- jitter).
+ setInterval(() => {
+ collectDiskStats().catch(err => {
+ logger.err({ err }, 'low level error collecting disk stats')
+ })
+ }, 15_000)
},
markProjectAsJustAccessed(projectId, callback) {
diff --git a/services/clsi/app/js/RequestParser.js b/services/clsi/app/js/RequestParser.js
index 61d3b9d229..4e9d722921 100644
--- a/services/clsi/app/js/RequestParser.js
+++ b/services/clsi/app/js/RequestParser.js
@@ -1,7 +1,9 @@
const settings = require('@overleaf/settings')
+const OutputCacheManager = require('./OutputCacheManager')
const VALID_COMPILERS = ['pdflatex', 'latex', 'xelatex', 'lualatex']
const MAX_TIMEOUT = 600
+const EDITOR_ID_REGEX = /^[a-f0-9-]{36}$/ // UUID
function parse(body, callback) {
const response = {}
@@ -27,12 +29,24 @@ function parse(body, callback) {
default: '',
type: 'string',
}),
+ // Will be populated later. Must always be populated for prom library.
+ compile: 'initial',
}
response.compiler = _parseAttribute('compiler', compile.options.compiler, {
validValues: VALID_COMPILERS,
default: 'pdflatex',
type: 'string',
})
+ response.compileFromClsiCache = _parseAttribute(
+ 'compileFromClsiCache',
+ compile.options.compileFromClsiCache,
+ { default: false, type: 'boolean' }
+ )
+ response.populateClsiCache = _parseAttribute(
+ 'populateClsiCache',
+ compile.options.populateClsiCache,
+ { default: false, type: 'boolean' }
+ )
response.enablePdfCaching = _parseAttribute(
'enablePdfCaching',
compile.options.enablePdfCaching,
@@ -135,6 +149,15 @@ function parse(body, callback) {
}
)
response.rootResourcePath = _checkPath(rootResourcePath)
+
+ response.editorId = _parseAttribute('editorId', compile.options.editorId, {
+ type: 'string',
+ regex: EDITOR_ID_REGEX,
+ })
+ response.buildId = _parseAttribute('buildId', compile.options.buildId, {
+ type: 'string',
+ regex: OutputCacheManager.BUILD_REGEX,
+ })
} catch (error1) {
const error = error1
return callback(error)
@@ -169,11 +192,15 @@ function _parseResource(resource) {
if (resource.url != null && typeof resource.url !== 'string') {
throw new Error('url attribute should be a string')
}
+ if (resource.fallbackURL && typeof resource.fallbackURL !== 'string') {
+ throw new Error('fallbackURL attribute should be a string')
+ }
return {
path: resource.path,
modified,
url: resource.url,
+ fallbackURL: resource.fallbackURL,
content: resource.content,
}
}
@@ -195,6 +222,13 @@ function _parseAttribute(name, attribute, options) {
throw new Error(`${name} attribute should be a ${options.type}`)
}
}
+ if (options.type === 'string' && options.regex instanceof RegExp) {
+ if (!options.regex.test(attribute)) {
+ throw new Error(
+ `${name} attribute does not match regex ${options.regex}`
+ )
+ }
+ }
} else {
if (options.default != null) {
return options.default
diff --git a/services/clsi/app/js/ResourceStateManager.js b/services/clsi/app/js/ResourceStateManager.js
index dbfb3c9fc4..a5f747e1cd 100644
--- a/services/clsi/app/js/ResourceStateManager.js
+++ b/services/clsi/app/js/ResourceStateManager.js
@@ -1,5 +1,5 @@
-const Path = require('path')
-const fs = require('fs')
+const Path = require('node:path')
+const fs = require('node:fs')
const logger = require('@overleaf/logger')
const Errors = require('./Errors')
const SafeReader = require('./SafeReader')
diff --git a/services/clsi/app/js/ResourceWriter.js b/services/clsi/app/js/ResourceWriter.js
index 11fb4500f4..bf88538746 100644
--- a/services/clsi/app/js/ResourceWriter.js
+++ b/services/clsi/app/js/ResourceWriter.js
@@ -13,10 +13,10 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let ResourceWriter
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const UrlCache = require('./UrlCache')
-const Path = require('path')
-const fs = require('fs')
+const Path = require('node:path')
+const fs = require('node:fs')
const async = require('async')
const OutputFileFinder = require('./OutputFileFinder')
const ResourceStateManager = require('./ResourceStateManager')
@@ -200,73 +200,22 @@ module.exports = ResourceWriter = {
return OutputFileFinder.findOutputFiles(
resources,
basePath,
- function (error, outputFiles, allFiles) {
+ (error, outputFiles, allFiles) => {
if (error != null) {
return callback(error)
}
const jobs = []
- for (const file of Array.from(outputFiles || [])) {
- ;(function (file) {
- const { path } = file
- let shouldDelete = true
- if (
- path.match(/^output\./) ||
- path.match(/\.aux$/) ||
- path.match(/^cache\//)
- ) {
- // knitr cache
- shouldDelete = false
- }
- if (path.match(/^output-.*/)) {
- // Tikz cached figures (default case)
- shouldDelete = false
- }
- if (path.match(/\.(pdf|dpth|md5)$/)) {
- // Tikz cached figures (by extension)
- shouldDelete = false
- }
- if (
- path.match(/\.(pygtex|pygstyle)$/) ||
- path.match(/(^|\/)_minted-[^\/]+\//)
- ) {
- // minted files/directory
- shouldDelete = false
- }
- if (
- path.match(/\.md\.tex$/) ||
- path.match(/(^|\/)_markdown_[^\/]+\//)
- ) {
- // markdown files/directory
- shouldDelete = false
- }
- if (path.match(/-eps-converted-to\.pdf$/)) {
- // Epstopdf generated files
- shouldDelete = false
- }
- if (
- path === 'output.pdf' ||
- path === 'output.dvi' ||
- path === 'output.log' ||
- path === 'output.xdv' ||
- path === 'output.stdout' ||
- path === 'output.stderr'
- ) {
- shouldDelete = true
- }
- if (path === 'output.tex') {
- // created by TikzManager if present in output files
- shouldDelete = true
- }
- if (shouldDelete) {
- return jobs.push(callback =>
- ResourceWriter._deleteFileIfNotDirectory(
- Path.join(basePath, path),
- callback
- )
+ for (const { path } of outputFiles || []) {
+ const shouldDelete = ResourceWriter.isExtraneousFile(path)
+ if (shouldDelete) {
+ jobs.push(callback =>
+ ResourceWriter._deleteFileIfNotDirectory(
+ Path.join(basePath, path),
+ callback
)
- }
- })(file)
+ )
+ }
}
return async.series(jobs, function (error) {
@@ -279,6 +228,59 @@ module.exports = ResourceWriter = {
)
},
+ isExtraneousFile(path) {
+ let shouldDelete = true
+ if (
+ path.match(/^output\./) ||
+ path.match(/\.aux$/) ||
+ path.match(/^cache\//)
+ ) {
+ // knitr cache
+ shouldDelete = false
+ }
+ if (path.match(/^output-.*/)) {
+ // Tikz cached figures (default case)
+ shouldDelete = false
+ }
+ if (path.match(/\.(pdf|dpth|md5)$/)) {
+ // Tikz cached figures (by extension)
+ shouldDelete = false
+ }
+ if (
+ path.match(/\.(pygtex|pygstyle)$/) ||
+ path.match(/(^|\/)_minted-[^\/]+\//)
+ ) {
+ // minted files/directory
+ shouldDelete = false
+ }
+ if (path.match(/\.md\.tex$/) || path.match(/(^|\/)_markdown_[^\/]+\//)) {
+ // markdown files/directory
+ shouldDelete = false
+ }
+ if (path.match(/-eps-converted-to\.pdf$/)) {
+ // Epstopdf generated files
+ shouldDelete = false
+ }
+ if (
+ path === 'output.tar.gz' ||
+ path === 'output.synctex.gz' ||
+ path === 'output.pdfxref' ||
+ path === 'output.pdf' ||
+ path === 'output.dvi' ||
+ path === 'output.log' ||
+ path === 'output.xdv' ||
+ path === 'output.stdout' ||
+ path === 'output.stderr'
+ ) {
+ shouldDelete = true
+ }
+ if (path === 'output.tex') {
+ // created by TikzManager if present in output files
+ shouldDelete = true
+ }
+ return shouldDelete
+ },
+
_deleteFileIfNotDirectory(path, callback) {
if (callback == null) {
callback = function () {}
@@ -333,6 +335,7 @@ module.exports = ResourceWriter = {
return UrlCache.downloadUrlToFile(
projectId,
resource.url,
+ resource.fallbackURL,
path,
resource.modified,
function (err) {
diff --git a/services/clsi/app/js/SafeReader.js b/services/clsi/app/js/SafeReader.js
index 756747af47..8b1b5abb54 100644
--- a/services/clsi/app/js/SafeReader.js
+++ b/services/clsi/app/js/SafeReader.js
@@ -12,7 +12,7 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let SafeReader
-const fs = require('fs')
+const fs = require('node:fs')
const logger = require('@overleaf/logger')
module.exports = SafeReader = {
diff --git a/services/clsi/app/js/StaticServerForbidSymlinks.js b/services/clsi/app/js/StaticServerForbidSymlinks.js
index 219408eb11..a5ec774396 100644
--- a/services/clsi/app/js/StaticServerForbidSymlinks.js
+++ b/services/clsi/app/js/StaticServerForbidSymlinks.js
@@ -13,8 +13,8 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let ForbidSymlinks
-const Path = require('path')
-const fs = require('fs')
+const Path = require('node:path')
+const fs = require('node:fs')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
diff --git a/services/clsi/app/js/SynctexOutputParser.js b/services/clsi/app/js/SynctexOutputParser.js
index e54add65ae..5b2d237825 100644
--- a/services/clsi/app/js/SynctexOutputParser.js
+++ b/services/clsi/app/js/SynctexOutputParser.js
@@ -1,4 +1,4 @@
-const Path = require('path')
+const Path = require('node:path')
/**
* Parse output from the `synctex view` command
diff --git a/services/clsi/app/js/TikzManager.js b/services/clsi/app/js/TikzManager.js
index 7d5f6c1b81..ca9db6b005 100644
--- a/services/clsi/app/js/TikzManager.js
+++ b/services/clsi/app/js/TikzManager.js
@@ -11,9 +11,9 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let TikzManager
-const fs = require('fs')
-const Path = require('path')
-const { promisify } = require('util')
+const fs = require('node:fs')
+const Path = require('node:path')
+const { promisify } = require('node:util')
const ResourceWriter = require('./ResourceWriter')
const SafeReader = require('./SafeReader')
const logger = require('@overleaf/logger')
diff --git a/services/clsi/app/js/UrlCache.js b/services/clsi/app/js/UrlCache.js
index ae8eae6b2a..36703e7091 100644
--- a/services/clsi/app/js/UrlCache.js
+++ b/services/clsi/app/js/UrlCache.js
@@ -12,9 +12,9 @@
*/
const UrlFetcher = require('./UrlFetcher')
const Settings = require('@overleaf/settings')
-const fs = require('fs')
-const Path = require('path')
-const { callbackify } = require('util')
+const fs = require('node:fs')
+const Path = require('node:path')
+const { callbackify } = require('node:util')
const Metrics = require('./Metrics')
const PENDING_DOWNLOADS = new Map()
@@ -47,14 +47,29 @@ async function createProjectDir(projectId) {
await fs.promises.mkdir(getProjectDir(projectId), { recursive: true })
}
-async function downloadUrlToFile(projectId, url, destPath, lastModified) {
+async function downloadUrlToFile(
+ projectId,
+ url,
+ fallbackURL,
+ destPath,
+ lastModified
+) {
const cachePath = getCachePath(projectId, url, lastModified)
try {
const timer = new Metrics.Timer('url_cache', {
status: 'cache-hit',
path: 'copy',
})
- await fs.promises.copyFile(cachePath, destPath)
+ try {
+ await fs.promises.copyFile(cachePath, destPath)
+ } catch (err) {
+ if (err.code === 'ENOENT' && fallbackURL) {
+ const fallbackPath = getCachePath(projectId, fallbackURL, lastModified)
+ await fs.promises.copyFile(fallbackPath, destPath)
+ } else {
+ throw err
+ }
+ }
// the metric is only updated if the file is present in the cache
timer.done()
return
@@ -70,7 +85,7 @@ async function downloadUrlToFile(projectId, url, destPath, lastModified) {
path: 'download',
})
try {
- await download(url, cachePath)
+ await download(url, fallbackURL, cachePath)
} finally {
timer.done()
}
@@ -86,13 +101,17 @@ async function downloadUrlToFile(projectId, url, destPath, lastModified) {
}
}
-async function download(url, cachePath) {
+async function download(url, fallbackURL, cachePath) {
let pending = PENDING_DOWNLOADS.get(cachePath)
if (pending) {
return pending
}
- pending = UrlFetcher.promises.pipeUrlToFileWithRetry(url, cachePath)
+ pending = UrlFetcher.promises.pipeUrlToFileWithRetry(
+ url,
+ fallbackURL,
+ cachePath
+ )
PENDING_DOWNLOADS.set(cachePath, pending)
try {
await pending
diff --git a/services/clsi/app/js/UrlFetcher.js b/services/clsi/app/js/UrlFetcher.js
index 8d604d267b..2c44f3a6dd 100644
--- a/services/clsi/app/js/UrlFetcher.js
+++ b/services/clsi/app/js/UrlFetcher.js
@@ -1,20 +1,21 @@
-const fs = require('fs')
+const fs = require('node:fs')
const logger = require('@overleaf/logger')
const Settings = require('@overleaf/settings')
const {
CustomHttpAgent,
CustomHttpsAgent,
fetchStream,
+ RequestFailedError,
} = require('@overleaf/fetch-utils')
-const { URL } = require('url')
-const { pipeline } = require('stream/promises')
+const { URL } = require('node:url')
+const { pipeline } = require('node:stream/promises')
const Metrics = require('./Metrics')
const MAX_CONNECT_TIME = 1000
const httpAgent = new CustomHttpAgent({ connectTimeout: MAX_CONNECT_TIME })
const httpsAgent = new CustomHttpsAgent({ connectTimeout: MAX_CONNECT_TIME })
-async function pipeUrlToFileWithRetry(url, filePath) {
+async function pipeUrlToFileWithRetry(url, fallbackURL, filePath) {
let remainingAttempts = 3
let lastErr
while (remainingAttempts-- > 0) {
@@ -22,7 +23,7 @@ async function pipeUrlToFileWithRetry(url, filePath) {
path: lastErr ? ' retry' : 'fetch',
})
try {
- await pipeUrlToFile(url, filePath)
+ await pipeUrlToFile(url, fallbackURL, filePath)
timer.done({ status: 'success' })
return
} catch (err) {
@@ -37,7 +38,7 @@ async function pipeUrlToFileWithRetry(url, filePath) {
throw lastErr
}
-async function pipeUrlToFile(url, filePath) {
+async function pipeUrlToFile(url, fallbackURL, filePath) {
const u = new URL(url)
if (
Settings.filestoreDomainOveride &&
@@ -45,21 +46,55 @@ async function pipeUrlToFile(url, filePath) {
) {
url = `${Settings.filestoreDomainOveride}${u.pathname}${u.search}`
}
+ if (fallbackURL) {
+ const u2 = new URL(fallbackURL)
+ if (
+ Settings.filestoreDomainOveride &&
+ u2.host !== Settings.apis.clsiPerf.host
+ ) {
+ fallbackURL = `${Settings.filestoreDomainOveride}${u2.pathname}${u2.search}`
+ }
+ }
- const stream = await fetchStream(url, {
- signal: AbortSignal.timeout(60 * 1000),
- // provide a function to get the agent for each request
- // as there may be multiple requests with different protocols
- // due to redirects.
- agent: _url => (_url.protocol === 'https:' ? httpsAgent : httpAgent),
- })
+ let stream
+ try {
+ stream = await fetchStream(url, {
+ signal: AbortSignal.timeout(60 * 1000),
+ // provide a function to get the agent for each request
+ // as there may be multiple requests with different protocols
+ // due to redirects.
+ agent: _url => (_url.protocol === 'https:' ? httpsAgent : httpAgent),
+ })
+ } catch (err) {
+ if (
+ fallbackURL &&
+ err instanceof RequestFailedError &&
+ err.response.status === 404
+ ) {
+ stream = await fetchStream(fallbackURL, {
+ signal: AbortSignal.timeout(60 * 1000),
+ // provide a function to get the agent for each request
+ // as there may be multiple requests with different protocols
+ // due to redirects.
+ agent: _url => (_url.protocol === 'https:' ? httpsAgent : httpAgent),
+ })
+ url = fallbackURL
+ } else {
+ throw err
+ }
+ }
+
+ const source = inferSource(url)
+ Metrics.inc('url_source', 1, { path: source })
const atomicWrite = filePath + '~'
try {
const output = fs.createWriteStream(atomicWrite)
await pipeline(stream, output)
await fs.promises.rename(atomicWrite, filePath)
- Metrics.count('UrlFetcher.downloaded_bytes', output.bytesWritten)
+ Metrics.count('UrlFetcher.downloaded_bytes', output.bytesWritten, {
+ path: source,
+ })
} catch (err) {
try {
await fs.promises.unlink(atomicWrite)
@@ -68,6 +103,20 @@ async function pipeUrlToFile(url, filePath) {
}
}
+const BUCKET_REGEX = /\/bucket\/([^/]+)\/key\//
+
+function inferSource(url) {
+ if (url.includes(Settings.apis.clsiPerf.host)) {
+ return 'clsi-perf'
+ } else if (url.includes('/project/') && url.includes('/file/')) {
+ return 'user-files'
+ } else if (url.includes('/key/')) {
+ const match = url.match(BUCKET_REGEX)
+ if (match) return match[1]
+ }
+ return 'unknown'
+}
+
module.exports.promises = {
pipeUrlToFileWithRetry,
}
diff --git a/services/clsi/app/js/XrefParser.js b/services/clsi/app/js/XrefParser.js
index 76636acfe9..5f2d154679 100644
--- a/services/clsi/app/js/XrefParser.js
+++ b/services/clsi/app/js/XrefParser.js
@@ -1,5 +1,5 @@
const { NoXrefTableError } = require('./Errors')
-const fs = require('fs')
+const fs = require('node:fs')
const { O_RDONLY, O_NOFOLLOW } = fs.constants
const MAX_XREF_FILE_SIZE = 1024 * 1024
diff --git a/services/clsi/buildscript.txt b/services/clsi/buildscript.txt
index 52113b47e0..09c21888df 100644
--- a/services/clsi/buildscript.txt
+++ b/services/clsi/buildscript.txt
@@ -1,11 +1,11 @@
clsi
--data-dirs=cache,compiles,output
--dependencies=
---docker-repos=gcr.io/overleaf-ops,us-east1-docker.pkg.dev/overleaf-ops/ol-docker
---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=gcr.io/overleaf-ops,TEXLIVE_IMAGE_USER="tex",DOCKER_RUNNER="true",COMPILES_HOST_DIR=$PWD/compiles
+--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
+--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",SANDBOXED_COMPILES="true",SANDBOXED_COMPILES_HOST_DIR_COMPILES=$PWD/compiles,SANDBOXED_COMPILES_HOST_DIR_OUTPUT=$PWD/output
--env-pass-through=
--esmock-loader=False
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=True
---script-version=4.5.0
+--script-version=4.7.0
--use-large-ci-runner=True
diff --git a/services/clsi/config/settings.defaults.js b/services/clsi/config/settings.defaults.js
index 934ef6d8c8..bd5614eb98 100644
--- a/services/clsi/config/settings.defaults.js
+++ b/services/clsi/config/settings.defaults.js
@@ -1,7 +1,8 @@
-const Path = require('path')
-const os = require('os')
+const Path = require('node:path')
+const os = require('node:os')
-const isPreEmptible = os.hostname().includes('pre-emp')
+const isPreEmptible = process.env.PREEMPTIBLE === 'TRUE'
+const CLSI_SERVER_ID = os.hostname().replace('-ctr', '')
module.exports = {
compileSizeLimit: process.env.COMPILE_SIZE_LIMIT || '7mb',
@@ -33,6 +34,10 @@ module.exports = {
report_load: process.env.LOAD_BALANCER_AGENT_REPORT_LOAD !== 'false',
load_port: 3048,
local_port: 3049,
+ allow_maintenance:
+ (
+ process.env.LOAD_BALANCER_AGENT_ALLOW_MAINTENANCE ?? ''
+ ).toLowerCase() !== 'false',
},
},
apis: {
@@ -41,12 +46,19 @@ module.exports = {
url: `http://${process.env.CLSI_HOST || '127.0.0.1'}:3013`,
// External url prefix for output files, e.g. for requests via load-balancers.
outputUrlPrefix: `${process.env.ZONE ? `/zone/${process.env.ZONE}` : ''}`,
+ clsiServerId: process.env.CLSI_SERVER_ID || CLSI_SERVER_ID,
+
+ downloadHost: process.env.DOWNLOAD_HOST || 'http://localhost:3013',
},
clsiPerf: {
host: `${process.env.CLSI_PERF_HOST || '127.0.0.1'}:${
process.env.CLSI_PERF_PORT || '3043'
}`,
},
+ clsiCache: {
+ enabled: !!process.env.CLSI_CACHE_SHARDS,
+ shards: JSON.parse(process.env.CLSI_CACHE_SHARDS || '[]'),
+ },
},
smokeTest: process.env.SMOKE_TEST || false,
@@ -56,10 +68,6 @@ module.exports = {
texliveImageNameOveride: process.env.TEX_LIVE_IMAGE_NAME_OVERRIDE,
texliveOpenoutAny: process.env.TEXLIVE_OPENOUT_ANY,
texliveMaxPrintLine: process.env.TEXLIVE_MAX_PRINT_LINE,
- sentry: {
- dsn: process.env.SENTRY_DSN,
- },
-
enablePdfCaching: process.env.ENABLE_PDF_CACHING === 'true',
enablePdfCachingDark: process.env.ENABLE_PDF_CACHING_DARK === 'true',
pdfCachingMinChunkSize:
@@ -85,20 +93,21 @@ if (process.env.ALLOWED_COMPILE_GROUPS) {
}
}
-if (process.env.DOCKER_RUNNER) {
- let seccompProfilePath
+if ((process.env.DOCKER_RUNNER || process.env.SANDBOXED_COMPILES) === 'true') {
module.exports.clsi = {
- dockerRunner: process.env.DOCKER_RUNNER === 'true',
+ dockerRunner: true,
docker: {
runtime: process.env.DOCKER_RUNTIME,
image:
- process.env.TEXLIVE_IMAGE || 'quay.io/sharelatex/texlive-full:2017.1',
+ process.env.TEXLIVE_IMAGE ||
+ process.env.TEX_LIVE_DOCKER_IMAGE ||
+ 'quay.io/sharelatex/texlive-full:2017.1',
env: {
HOME: '/tmp',
CLSI: 1,
},
socketPath: '/var/run/docker.sock',
- user: process.env.TEXLIVE_IMAGE_USER || 'tex',
+ user: process.env.TEXLIVE_IMAGE_USER || 'www-data',
},
optimiseInDocker: true,
expireProjectAfterIdleMs: 24 * 60 * 60 * 1000,
@@ -118,6 +127,7 @@ if (process.env.DOCKER_RUNNER) {
const defaultCompileGroupConfig = {
wordcount: { 'HostConfig.AutoRemove': true },
synctex: { 'HostConfig.AutoRemove': true },
+ 'synctex-output': { 'HostConfig.AutoRemove': true },
}
module.exports.clsi.docker.compileGroupConfig = Object.assign(
defaultCompileGroupConfig,
@@ -128,11 +138,14 @@ if (process.env.DOCKER_RUNNER) {
process.exit(1)
}
+ let seccompProfilePath
try {
seccompProfilePath = Path.resolve(__dirname, '../seccomp/clsi-profile.json')
- module.exports.clsi.docker.seccomp_profile = JSON.stringify(
- JSON.parse(require('fs').readFileSync(seccompProfilePath))
- )
+ module.exports.clsi.docker.seccomp_profile =
+ process.env.SECCOMP_PROFILE ||
+ JSON.stringify(
+ JSON.parse(require('node:fs').readFileSync(seccompProfilePath))
+ )
} catch (error) {
console.error(
error,
@@ -162,5 +175,23 @@ if (process.env.DOCKER_RUNNER) {
module.exports.path.synctexBaseDir = () => '/compile'
- module.exports.path.sandboxedCompilesHostDir = process.env.COMPILES_HOST_DIR
+ module.exports.path.sandboxedCompilesHostDirCompiles =
+ process.env.SANDBOXED_COMPILES_HOST_DIR_COMPILES ||
+ process.env.SANDBOXED_COMPILES_HOST_DIR ||
+ process.env.COMPILES_HOST_DIR
+ if (!module.exports.path.sandboxedCompilesHostDirCompiles) {
+ throw new Error(
+ 'SANDBOXED_COMPILES enabled, but SANDBOXED_COMPILES_HOST_DIR_COMPILES not set'
+ )
+ }
+
+ module.exports.path.sandboxedCompilesHostDirOutput =
+ process.env.SANDBOXED_COMPILES_HOST_DIR_OUTPUT ||
+ process.env.OUTPUT_HOST_DIR
+ if (!module.exports.path.sandboxedCompilesHostDirOutput) {
+ // TODO(das7pad): Enforce in a future major version of Server Pro.
+ // throw new Error(
+ // 'SANDBOXED_COMPILES enabled, but SANDBOXED_COMPILES_HOST_DIR_OUTPUT not set'
+ // )
+ }
}
diff --git a/services/clsi/docker-compose.ci.yml b/services/clsi/docker-compose.ci.yml
index 00f54c6e72..77a45615b7 100644
--- a/services/clsi/docker-compose.ci.yml
+++ b/services/clsi/docker-compose.ci.yml
@@ -27,10 +27,11 @@ services:
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: gcr.io/overleaf-ops
+ 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
+ SANDBOXED_COMPILES: "true"
+ SANDBOXED_COMPILES_HOST_DIR_COMPILES: $PWD/compiles
+ SANDBOXED_COMPILES_HOST_DIR_OUTPUT: $PWD/output
volumes:
- ./compiles:/overleaf/services/clsi/compiles
- /var/run/docker.sock:/var/run/docker.sock
diff --git a/services/clsi/docker-compose.yml b/services/clsi/docker-compose.yml
index c72fb8b2c4..b8112a8e17 100644
--- a/services/clsi/docker-compose.yml
+++ b/services/clsi/docker-compose.yml
@@ -17,6 +17,7 @@ services:
working_dir: /overleaf/services/clsi
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
@@ -37,16 +38,17 @@ services:
MONGO_HOST: mongo
POSTGRES_HOST: postgres
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
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: gcr.io/overleaf-ops
+ 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
+ SANDBOXED_COMPILES: "true"
+ SANDBOXED_COMPILES_HOST_DIR_COMPILES: $PWD/compiles
+ SANDBOXED_COMPILES_HOST_DIR_OUTPUT: $PWD/output
command: npm run --silent test:acceptance
diff --git a/services/clsi/entrypoint.sh b/services/clsi/entrypoint.sh
index 9446ab9e2d..b45899ab17 100755
--- a/services/clsi/entrypoint.sh
+++ b/services/clsi/entrypoint.sh
@@ -2,13 +2,12 @@
# add the node user to the docker group on the host
DOCKER_GROUP=$(stat -c '%g' /var/run/docker.sock)
-groupadd --non-unique --gid ${DOCKER_GROUP} dockeronhost
+groupadd --non-unique --gid "${DOCKER_GROUP}" dockeronhost
usermod -aG dockeronhost node
# compatibility: initial volume setup
mkdir -p /overleaf/services/clsi/cache && chown node:node /overleaf/services/clsi/cache
mkdir -p /overleaf/services/clsi/compiles && chown node:node /overleaf/services/clsi/compiles
-mkdir -p /overleaf/services/clsi/db && chown node:node /overleaf/services/clsi/db
mkdir -p /overleaf/services/clsi/output && chown node:node /overleaf/services/clsi/output
exec runuser -u node -- "$@"
diff --git a/services/clsi/kube.yaml b/services/clsi/kube.yaml
deleted file mode 100644
index d3fb04291e..0000000000
--- a/services/clsi/kube.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: clsi
- namespace: default
-spec:
- type: LoadBalancer
- ports:
- - port: 80
- protocol: TCP
- targetPort: 80
- selector:
- run: clsi
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
- name: clsi
- namespace: default
-spec:
- replicas: 2
- template:
- metadata:
- labels:
- run: clsi
- spec:
- containers:
- - name: clsi
- image: gcr.io/henry-terraform-admin/clsi
- imagePullPolicy: Always
- readinessProbe:
- httpGet:
- path: status
- port: 80
- periodSeconds: 5
- initialDelaySeconds: 0
- failureThreshold: 3
- successThreshold: 1
-
-
-
diff --git a/services/clsi/nginx.conf b/services/clsi/nginx.conf
index 2290aeb444..604eb93fbf 100644
--- a/services/clsi/nginx.conf
+++ b/services/clsi/nginx.conf
@@ -46,7 +46,7 @@ server {
}
# handle output files for specific users
- location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
if ($request_method = 'OPTIONS') {
# handle OPTIONS method for CORS requests
add_header 'Allow' 'GET,HEAD';
@@ -64,7 +64,7 @@ server {
alias /output/$1-$2/generated-files/$3/$4.blg;
}
# handle output files for anonymous users
- location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+ location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
if ($request_method = 'OPTIONS') {
# handle OPTIONS method for CORS requests
add_header 'Allow' 'GET,HEAD';
diff --git a/services/clsi/package.json b/services/clsi/package.json
index 8df44c7150..fe31c430bd 100644
--- a/services/clsi/package.json
+++ b/services/clsi/package.json
@@ -11,8 +11,8 @@
"test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
"nodemon": "node --watch app.js",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"lint:fix": "eslint --fix .",
"types:check": "tsc --noEmit"
},
@@ -23,24 +23,24 @@
"@overleaf/o-error": "*",
"@overleaf/promise-utils": "*",
"@overleaf/settings": "*",
+ "@overleaf/stream-utils": "*",
"archiver": "5.3.2",
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "diskusage": "^1.1.3",
- "dockerode": "^3.1.0",
- "express": "^4.21.0",
+ "dockerode": "^4.0.7",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
"p-limit": "^3.1.0",
"request": "^2.88.2",
"send": "^0.19.0",
+ "tar-fs": "^3.0.9",
"workerpool": "^6.1.5"
},
"devDependencies": {
- "@types/workerpool": "^6.1.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"mock-fs": "^5.1.2",
"node-fetch": "^2.7.0",
"sandboxed-module": "^2.0.4",
diff --git a/services/clsi/scripts/demo-pdfjs-Xref.js b/services/clsi/scripts/demo-pdfjs-Xref.js
index 149e55ee9e..1f55c571a7 100644
--- a/services/clsi/scripts/demo-pdfjs-Xref.js
+++ b/services/clsi/scripts/demo-pdfjs-Xref.js
@@ -1,4 +1,4 @@
-const fs = require('fs')
+const fs = require('node:fs')
const { parseXrefTable } = require('../app/lib/pdfjs/parseXrefTable')
const pdfPath = process.argv[2]
diff --git a/services/clsi/seccomp/clsi-profile.json b/services/clsi/seccomp/clsi-profile.json
index 084354b15c..ad95130f76 100644
--- a/services/clsi/seccomp/clsi-profile.json
+++ b/services/clsi/seccomp/clsi-profile.json
@@ -829,13 +829,19 @@
"args": []
},
{
- "name": "gettimeofday",
- "action": "SCMP_ACT_ALLOW",
- "args": []
- }, {
- "name": "epoll_pwait",
- "action": "SCMP_ACT_ALLOW",
- "args": []
+ "name": "gettimeofday",
+ "action": "SCMP_ACT_ALLOW",
+ "args": []
+ },
+ {
+ "name": "epoll_pwait",
+ "action": "SCMP_ACT_ALLOW",
+ "args": []
+ },
+ {
+ "name": "poll",
+ "action": "SCMP_ACT_ALLOW",
+ "args": []
}
]
-}
\ No newline at end of file
+}
diff --git a/services/clsi/test/acceptance/js/AllowedImageNamesTests.js b/services/clsi/test/acceptance/js/AllowedImageNamesTests.js
index 897f5d9c85..9cd7a65930 100644
--- a/services/clsi/test/acceptance/js/AllowedImageNamesTests.js
+++ b/services/clsi/test/acceptance/js/AllowedImageNamesTests.js
@@ -109,6 +109,7 @@ Hello world
width: 343.71106,
},
],
+ downloadedFromCache: false,
})
done()
}
@@ -146,6 +147,7 @@ Hello world
expect(error).to.not.exist
expect(result).to.deep.equal({
code: [{ file: 'main.tex', line: 3, column: -1 }],
+ downloadedFromCache: false,
})
done()
}
diff --git a/services/clsi/test/acceptance/js/BrokenLatexFileTests.js b/services/clsi/test/acceptance/js/BrokenLatexFileTests.js
index 71e9956c0d..46d07da092 100644
--- a/services/clsi/test/acceptance/js/BrokenLatexFileTests.js
+++ b/services/clsi/test/acceptance/js/BrokenLatexFileTests.js
@@ -11,6 +11,7 @@
const Client = require('./helpers/Client')
const request = require('request')
const ClsiApp = require('./helpers/ClsiApp')
+const { expect } = require('chai')
describe('Broken LaTeX file', function () {
before(function (done) {
@@ -58,9 +59,27 @@ Hello world
)
})
- return it('should return a failure status', function () {
+ it('should return a failure status', function () {
return this.body.compile.status.should.equal('failure')
})
+
+ it('should return isInitialCompile flag', function () {
+ expect(this.body.compile.stats.isInitialCompile).to.equal(1)
+ })
+
+ it('should return output files', function () {
+ // NOTE: No output.pdf file.
+ this.body.compile.outputFiles
+ .map(f => f.path)
+ .should.deep.equal([
+ 'output.aux',
+ 'output.fdb_latexmk',
+ 'output.fls',
+ 'output.log',
+ 'output.stderr',
+ 'output.stdout',
+ ])
+ })
})
return describe('on second run', function () {
@@ -80,8 +99,26 @@ Hello world
})
})
- return it('should return a failure status', function () {
+ it('should return a failure status', function () {
return this.body.compile.status.should.equal('failure')
})
+
+ it('should not return isInitialCompile flag', function () {
+ expect(this.body.compile.stats.isInitialCompile).to.not.exist
+ })
+
+ it('should return output files', function () {
+ // NOTE: No output.pdf file.
+ this.body.compile.outputFiles
+ .map(f => f.path)
+ .should.deep.equal([
+ 'output.aux',
+ 'output.fdb_latexmk',
+ 'output.fls',
+ 'output.log',
+ 'output.stderr',
+ 'output.stdout',
+ ])
+ })
})
})
diff --git a/services/clsi/test/acceptance/js/ExampleDocumentTests.js b/services/clsi/test/acceptance/js/ExampleDocumentTests.js
index 404f8c4e90..b463584501 100644
--- a/services/clsi/test/acceptance/js/ExampleDocumentTests.js
+++ b/services/clsi/test/acceptance/js/ExampleDocumentTests.js
@@ -14,19 +14,19 @@
*/
const Client = require('./helpers/Client')
const fetch = require('node-fetch')
-const { pipeline } = require('stream')
-const fs = require('fs')
-const ChildProcess = require('child_process')
+const { pipeline } = require('node:stream')
+const fs = require('node:fs')
+const ChildProcess = require('node:child_process')
const ClsiApp = require('./helpers/ClsiApp')
const logger = require('@overleaf/logger')
-const Path = require('path')
+const Path = require('node:path')
const fixturePath = path => {
if (path.slice(0, 3) === 'tmp') {
return '/tmp/clsi_acceptance_tests' + path.slice(3)
}
return Path.join(__dirname, '../fixtures/', path)
}
-const process = require('process')
+const process = require('node:process')
console.log(
process.pid,
process.ppid,
diff --git a/services/clsi/test/acceptance/js/StopCompile.js b/services/clsi/test/acceptance/js/StopCompile.js
new file mode 100644
index 0000000000..103a70f37d
--- /dev/null
+++ b/services/clsi/test/acceptance/js/StopCompile.js
@@ -0,0 +1,47 @@
+const Client = require('./helpers/Client')
+const ClsiApp = require('./helpers/ClsiApp')
+const { expect } = require('chai')
+
+describe('Stop compile', function () {
+ before(function (done) {
+ this.request = {
+ options: {
+ timeout: 100,
+ }, // seconds
+ resources: [
+ {
+ path: 'main.tex',
+ content: `\
+\\documentclass{article}
+\\begin{document}
+\\def\\x{Hello!\\par\\x}
+\\x
+\\end{document}\
+`,
+ },
+ ],
+ }
+ this.project_id = Client.randomId()
+ ClsiApp.ensureRunning(() => {
+ // start the compile in the background
+ Client.compile(this.project_id, this.request, (error, res, body) => {
+ this.compileResult = { error, res, body }
+ })
+ // wait for 1 second before stopping the compile
+ setTimeout(() => {
+ Client.stopCompile(this.project_id, (error, res, body) => {
+ this.stopResult = { error, res, body }
+ setTimeout(done, 1000) // allow time for the compile request to terminate
+ })
+ }, 1000)
+ })
+ })
+
+ it('should force a compile response with an error status', function () {
+ expect(this.stopResult.error).to.be.null
+ expect(this.stopResult.res.statusCode).to.equal(204)
+ expect(this.compileResult.res.statusCode).to.equal(200)
+ expect(this.compileResult.body.compile.status).to.equal('terminated')
+ expect(this.compileResult.body.compile.error).to.equal('terminated')
+ })
+})
diff --git a/services/clsi/test/acceptance/js/SynctexTests.js b/services/clsi/test/acceptance/js/SynctexTests.js
index 899898b5b2..049f260259 100644
--- a/services/clsi/test/acceptance/js/SynctexTests.js
+++ b/services/clsi/test/acceptance/js/SynctexTests.js
@@ -13,7 +13,7 @@ const Client = require('./helpers/Client')
const request = require('request')
const { expect } = require('chai')
const ClsiApp = require('./helpers/ClsiApp')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
describe('Syncing', function () {
before(function (done) {
@@ -67,6 +67,7 @@ Hello world
width: 343.71106,
},
],
+ downloadedFromCache: false,
})
return done()
}
@@ -87,6 +88,7 @@ Hello world
}
expect(codePositions).to.deep.equal({
code: [{ file: 'main.tex', line: 3, column: -1 }],
+ downloadedFromCache: false,
})
return done()
}
diff --git a/services/clsi/test/acceptance/js/TimeoutTests.js b/services/clsi/test/acceptance/js/TimeoutTests.js
index bca8ae71d2..e9175d223c 100644
--- a/services/clsi/test/acceptance/js/TimeoutTests.js
+++ b/services/clsi/test/acceptance/js/TimeoutTests.js
@@ -11,6 +11,7 @@
const Client = require('./helpers/Client')
const request = require('request')
const ClsiApp = require('./helpers/ClsiApp')
+const { expect } = require('chai')
describe('Timed out compile', function () {
before(function (done) {
@@ -54,6 +55,10 @@ describe('Timed out compile', function () {
return this.body.compile.status.should.equal('timedout')
})
+ it('should return isInitialCompile flag', function () {
+ expect(this.body.compile.stats.isInitialCompile).to.equal(1)
+ })
+
return it('should return the log output file name', function () {
const outputFilePaths = this.body.compile.outputFiles.map(x => x.path)
return outputFilePaths.should.include('output.log')
diff --git a/services/clsi/test/acceptance/js/UrlCachingTests.js b/services/clsi/test/acceptance/js/UrlCachingTests.js
index 424f1ad1b7..9fc9608204 100644
--- a/services/clsi/test/acceptance/js/UrlCachingTests.js
+++ b/services/clsi/test/acceptance/js/UrlCachingTests.js
@@ -10,10 +10,12 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const express = require('express')
-const Path = require('path')
+const Path = require('node:path')
const Client = require('./helpers/Client')
const sinon = require('sinon')
const ClsiApp = require('./helpers/ClsiApp')
+const request = require('request')
+const Settings = require('@overleaf/settings')
const Server = {
run() {
@@ -35,6 +37,21 @@ const Server = {
}
})
+ app.get('/not-found', (req, res, next) => {
+ this.getFile(req.url)
+ res.status(404).end()
+ })
+
+ app.get('/project/:projectId/file/:fileId', (req, res, next) => {
+ this.getFile(req.url)
+ return res.send(`${req.params.projectId}:${req.params.fileId}`)
+ })
+
+ app.get('/bucket/:bucket/key/*', (req, res, next) => {
+ this.getFile(req.url)
+ return res.send(`${req.params.bucket}:${req.params[0]}`)
+ })
+
app.get('/:random_id/*', (req, res, next) => {
this.getFile(req.url)
req.url = `/${req.params[0]}`
@@ -218,9 +235,24 @@ describe('Url Caching', function () {
return Server.getFile.restore()
})
- return it('should not download the image again', function () {
+ it('should not download the image again', function () {
return Server.getFile.called.should.equal(false)
})
+
+ it('should gather metrics', function (done) {
+ request.get(`${Settings.apis.clsi.url}/metrics`, (err, res, body) => {
+ if (err) return done(err)
+ body
+ .split('\n')
+ .some(line => {
+ return (
+ line.startsWith('url_source') && line.includes('path="unknown"')
+ )
+ })
+ .should.equal(true)
+ done()
+ })
+ })
})
describe('When an image is in the cache and the last modified date is advanced', function () {
@@ -391,7 +423,7 @@ describe('Url Caching', function () {
})
})
- return describe('After clearing the cache', function () {
+ describe('After clearing the cache', function () {
before(function (done) {
this.project_id = Client.randomId()
this.file = `${Server.randomId()}/lion.png`
@@ -446,4 +478,140 @@ describe('Url Caching', function () {
return Server.getFile.called.should.equal(true)
})
})
+
+ describe('fallbackURL', function () {
+ describe('when the primary resource is available', function () {
+ before(function (done) {
+ this.project_id = Client.randomId()
+ this.file = `/project/${Server.randomId()}/file/${Server.randomId()}`
+ this.fallback = `/bucket/project-blobs/key/ab/cd/${Server.randomId()}`
+ this.request = {
+ resources: [
+ {
+ path: 'main.tex',
+ content: `\
+\\documentclass{article}
+\\usepackage{graphicx}
+\\begin{document}
+\\includegraphics{lion.png}
+\\end{document}\
+`,
+ },
+ {
+ path: 'lion.png',
+ url: `http://filestore${this.file}`,
+ fallbackURL: `http://filestore${this.fallback}`,
+ },
+ ],
+ }
+
+ sinon.spy(Server, 'getFile')
+ return ClsiApp.ensureRunning(() => {
+ return Client.compile(
+ this.project_id,
+ this.request,
+ (error, res, body) => {
+ this.error = error
+ this.res = res
+ this.body = body
+ return done()
+ }
+ )
+ })
+ })
+
+ after(function () {
+ return Server.getFile.restore()
+ })
+
+ it('should download from the primary', function () {
+ Server.getFile.calledWith(this.file).should.equal(true)
+ })
+ it('should not download from the fallback', function () {
+ Server.getFile.calledWith(this.fallback).should.equal(false)
+ })
+
+ it('should gather metrics', function (done) {
+ request.get(`${Settings.apis.clsi.url}/metrics`, (err, res, body) => {
+ if (err) return done(err)
+ body
+ .split('\n')
+ .some(line => {
+ return (
+ line.startsWith('url_source') &&
+ line.includes('path="user-files"')
+ )
+ })
+ .should.equal(true)
+ done()
+ })
+ })
+ })
+
+ describe('when the primary resource is not available', function () {
+ before(function (done) {
+ this.project_id = Client.randomId()
+ this.file = `/project/${Server.randomId()}/file/${Server.randomId()}`
+ this.fallback = `/bucket/project-blobs/key/ab/cd/${Server.randomId()}`
+ this.request = {
+ resources: [
+ {
+ path: 'main.tex',
+ content: `\
+\\documentclass{article}
+\\usepackage{graphicx}
+\\begin{document}
+\\includegraphics{lion.png}
+\\end{document}\
+`,
+ },
+ {
+ path: 'lion.png',
+ url: `http://filestore/not-found`,
+ fallbackURL: `http://filestore${this.fallback}`,
+ },
+ ],
+ }
+
+ sinon.spy(Server, 'getFile')
+ return ClsiApp.ensureRunning(() => {
+ return Client.compile(
+ this.project_id,
+ this.request,
+ (error, res, body) => {
+ this.error = error
+ this.res = res
+ this.body = body
+ return done()
+ }
+ )
+ })
+ })
+
+ after(function () {
+ return Server.getFile.restore()
+ })
+
+ it('should download from the fallback', function () {
+ Server.getFile.calledWith(`/not-found`).should.equal(true)
+ Server.getFile.calledWith(this.fallback).should.equal(true)
+ })
+
+ it('should gather metrics', function (done) {
+ request.get(`${Settings.apis.clsi.url}/metrics`, (err, res, body) => {
+ if (err) return done(err)
+ body
+ .split('\n')
+ .some(line => {
+ return (
+ line.startsWith('url_source') &&
+ line.includes('path="project-blobs"')
+ )
+ })
+ .should.equal(true)
+ done()
+ })
+ })
+ })
+ })
})
diff --git a/services/clsi/test/acceptance/js/WordcountTests.js b/services/clsi/test/acceptance/js/WordcountTests.js
index d3fa7d2b94..626b5d7034 100644
--- a/services/clsi/test/acceptance/js/WordcountTests.js
+++ b/services/clsi/test/acceptance/js/WordcountTests.js
@@ -12,8 +12,8 @@
const Client = require('./helpers/Client')
const request = require('request')
const { expect } = require('chai')
-const path = require('path')
-const fs = require('fs')
+const path = require('node:path')
+const fs = require('node:fs')
const ClsiApp = require('./helpers/ClsiApp')
describe('Syncing', function () {
diff --git a/services/clsi/test/acceptance/js/helpers/Client.js b/services/clsi/test/acceptance/js/helpers/Client.js
index 389a26201e..49bf7390c6 100644
--- a/services/clsi/test/acceptance/js/helpers/Client.js
+++ b/services/clsi/test/acceptance/js/helpers/Client.js
@@ -13,7 +13,7 @@
let Client
const express = require('express')
const request = require('request')
-const fs = require('fs')
+const fs = require('node:fs')
const Settings = require('@overleaf/settings')
module.exports = Client = {
@@ -42,6 +42,16 @@ module.exports = Client = {
)
},
+ stopCompile(projectId, callback) {
+ if (callback == null) {
+ callback = function () {}
+ }
+ return request.post(
+ { url: `${this.host}/project/${projectId}/compile/stop` },
+ callback
+ )
+ },
+
clearCache(projectId, callback) {
if (callback == null) {
callback = function () {}
diff --git a/services/clsi/test/acceptance/js/helpers/ClsiApp.js b/services/clsi/test/acceptance/js/helpers/ClsiApp.js
index 4736315df8..38308e9129 100644
--- a/services/clsi/test/acceptance/js/helpers/ClsiApp.js
+++ b/services/clsi/test/acceptance/js/helpers/ClsiApp.js
@@ -10,8 +10,6 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const app = require('../../../../app')
-require('@overleaf/logger').logger.level('info')
-const logger = require('@overleaf/logger')
const Settings = require('@overleaf/settings')
module.exports = {
@@ -37,7 +35,6 @@ module.exports = {
throw error
}
this.running = true
- logger.info('clsi running in dev mode')
return (() => {
const result = []
diff --git a/services/clsi/test/bench/hashbench.js b/services/clsi/test/bench/hashbench.js
index 652ad39c7d..1e19af6a35 100644
--- a/services/clsi/test/bench/hashbench.js
+++ b/services/clsi/test/bench/hashbench.js
@@ -1,8 +1,8 @@
const ContentCacheManager = require('../../app/js/ContentCacheManager')
-const fs = require('fs')
-const crypto = require('crypto')
-const path = require('path')
-const os = require('os')
+const fs = require('node:fs')
+const crypto = require('node:crypto')
+const path = require('node:path')
+const os = require('node:os')
const async = require('async')
const _createHash = crypto.createHash
diff --git a/services/clsi/test/load/js/loadTest.js b/services/clsi/test/load/js/loadTest.js
index 196d8579ca..506b51bf6f 100644
--- a/services/clsi/test/load/js/loadTest.js
+++ b/services/clsi/test/load/js/loadTest.js
@@ -9,7 +9,7 @@
const request = require('request')
const Settings = require('@overleaf/settings')
const async = require('async')
-const fs = require('fs')
+const fs = require('node:fs')
const _ = require('lodash')
const concurentCompiles = 5
const totalCompiles = 50
diff --git a/services/clsi/test/setup.js b/services/clsi/test/setup.js
index 653a8a69b2..b17507bf92 100644
--- a/services/clsi/test/setup.js
+++ b/services/clsi/test/setup.js
@@ -20,5 +20,10 @@ SandboxedModule.configure({
err() {},
},
},
- globals: { Buffer, console, process, URL },
+ globals: { Buffer, console, process, URL, Math },
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
diff --git a/services/clsi/test/unit/js/CompileControllerTests.js b/services/clsi/test/unit/js/CompileControllerTests.js
index ac807d212e..2ac8d9c2d7 100644
--- a/services/clsi/test/unit/js/CompileControllerTests.js
+++ b/services/clsi/test/unit/js/CompileControllerTests.js
@@ -1,54 +1,11 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const { expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/CompileController'
)
const Errors = require('../../../app/js/Errors')
-function tryImageNameValidation(method, imageNameField) {
- describe('when allowedImages is set', function () {
- beforeEach(function () {
- this.Settings.clsi = { docker: {} }
- this.Settings.clsi.docker.allowedImages = [
- 'repo/image:tag1',
- 'repo/image:tag2',
- ]
- this.res.send = sinon.stub()
- this.res.status = sinon.stub().returns({ send: this.res.send })
-
- this.CompileManager[method].reset()
- })
-
- describe('with an invalid image', function () {
- beforeEach(function () {
- this.req.query[imageNameField] = 'something/evil:1337'
- this.CompileController[method](this.req, this.res, this.next)
- })
- it('should return a 400', function () {
- expect(this.res.status.calledWith(400)).to.equal(true)
- })
- it('should not run the query', function () {
- expect(this.CompileManager[method].called).to.equal(false)
- })
- })
-
- describe('with a valid image', function () {
- beforeEach(function () {
- this.req.query[imageNameField] = 'repo/image:tag1'
- this.CompileController[method](this.req, this.res, this.next)
- })
- it('should not return a 400', function () {
- expect(this.res.status.calledWith(400)).to.equal(false)
- })
- it('should run the query', function () {
- expect(this.CompileManager[method].called).to.equal(true)
- })
- })
- })
-}
-
describe('CompileController', function () {
beforeEach(function () {
this.buildId = 'build-id-123'
@@ -61,6 +18,11 @@ describe('CompileController', function () {
clsi: {
url: 'http://clsi.example.com',
outputUrlPrefix: '/zone/b',
+ downloadHost: 'http://localhost:3013',
+ },
+ clsiCache: {
+ enabled: false,
+ url: 'http://localhost:3044',
},
},
}),
@@ -68,6 +30,11 @@ describe('CompileController', function () {
Timer: sinon.stub().returns({ done: sinon.stub() }),
},
'./ProjectPersistenceManager': (this.ProjectPersistenceManager = {}),
+ './CLSICacheHandler': {
+ notifyCLSICacheAboutBuild: sinon.stub(),
+ downloadLatestCompileCache: sinon.stub().resolves(),
+ downloadOutputDotSynctexFromCompileCache: sinon.stub().resolves(),
+ },
'./Errors': (this.Erros = Errors),
},
})
@@ -113,16 +80,21 @@ describe('CompileController', function () {
this.timings = { bar: 2 }
this.res.status = sinon.stub().returnsThis()
this.res.send = sinon.stub()
+
+ this.CompileManager.doCompileWithLock = sinon
+ .stub()
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(null, {
+ outputFiles: this.output_files,
+ buildId: this.buildId,
+ })
+ })
})
describe('successfully', function () {
beforeEach(function () {
- this.CompileManager.doCompileWithLock = sinon.stub().yields(null, {
- outputFiles: this.output_files,
- stats: this.stats,
- timings: this.timings,
- buildId: this.buildId,
- })
this.CompileController.compile(this.req, this.res)
})
@@ -157,6 +129,7 @@ describe('CompileController', function () {
url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
...file,
})),
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -166,12 +139,6 @@ describe('CompileController', function () {
describe('without a outputUrlPrefix', function () {
beforeEach(function () {
this.Settings.apis.clsi.outputUrlPrefix = ''
- this.CompileManager.doCompileWithLock = sinon.stub().yields(null, {
- outputFiles: this.output_files,
- stats: this.stats,
- timings: this.timings,
- buildId: this.buildId,
- })
this.CompileController.compile(this.req, this.res)
})
@@ -190,6 +157,7 @@ describe('CompileController', function () {
url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
...file,
})),
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -210,33 +178,36 @@ describe('CompileController', function () {
build: 1234,
},
]
- this.CompileManager.doCompileWithLock = sinon.stub().yields(null, {
- outputFiles: this.output_files,
- stats: this.stats,
- timings: this.timings,
- buildId: this.buildId,
- })
+ this.CompileManager.doCompileWithLock = sinon
+ .stub()
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(null, {
+ outputFiles: this.output_files,
+ buildId: this.buildId,
+ })
+ })
this.CompileController.compile(this.req, this.res)
})
it('should return the JSON response with status failure', function () {
this.res.status.calledWith(200).should.equal(true)
- this.res.send
- .calledWith({
- compile: {
- status: 'failure',
- error: null,
- stats: this.stats,
- timings: this.timings,
- outputUrlPrefix: '/zone/b',
- buildId: this.buildId,
- outputFiles: this.output_files.map(file => ({
- url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
- ...file,
- })),
- },
- })
- .should.equal(true)
+ this.res.send.should.have.been.calledWith({
+ compile: {
+ status: 'failure',
+ error: null,
+ stats: this.stats,
+ timings: this.timings,
+ outputUrlPrefix: '/zone/b',
+ buildId: this.buildId,
+ outputFiles: this.output_files.map(file => ({
+ url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
+ ...file,
+ })),
+ clsiCacheShard: undefined,
+ },
+ })
})
})
@@ -255,33 +226,36 @@ describe('CompileController', function () {
build: 1234,
},
]
- this.CompileManager.doCompileWithLock = sinon.stub().yields(null, {
- outputFiles: this.output_files,
- stats: this.stats,
- timings: this.timings,
- buildId: this.buildId,
- })
+ this.CompileManager.doCompileWithLock = sinon
+ .stub()
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(null, {
+ outputFiles: this.output_files,
+ buildId: this.buildId,
+ })
+ })
this.CompileController.compile(this.req, this.res)
})
it('should return the JSON response with status failure', function () {
this.res.status.calledWith(200).should.equal(true)
- this.res.send
- .calledWith({
- compile: {
- status: 'failure',
- error: null,
- stats: this.stats,
- buildId: this.buildId,
- timings: this.timings,
- outputUrlPrefix: '/zone/b',
- outputFiles: this.output_files.map(file => ({
- url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
- ...file,
- })),
- },
- })
- .should.equal(true)
+ this.res.send.should.have.been.calledWith({
+ compile: {
+ status: 'failure',
+ error: null,
+ stats: this.stats,
+ buildId: this.buildId,
+ timings: this.timings,
+ outputUrlPrefix: '/zone/b',
+ outputFiles: this.output_files.map(file => ({
+ url: `${this.Settings.apis.clsi.url}/project/${this.project_id}/build/${file.build}/output/${file.path}`,
+ ...file,
+ })),
+ clsiCacheShard: undefined,
+ },
+ })
})
})
@@ -291,7 +265,11 @@ describe('CompileController', function () {
error.buildId = this.buildId
this.CompileManager.doCompileWithLock = sinon
.stub()
- .callsArgWith(1, error, null)
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(error)
+ })
this.CompileController.compile(this.req, this.res)
})
@@ -305,9 +283,9 @@ describe('CompileController', function () {
outputUrlPrefix: '/zone/b',
outputFiles: [],
buildId: this.buildId,
- // JSON.stringify will omit these
- stats: undefined,
- timings: undefined,
+ stats: this.stats,
+ timings: this.timings,
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -321,7 +299,11 @@ describe('CompileController', function () {
)
this.CompileManager.doCompileWithLock = sinon
.stub()
- .callsArgWith(1, error, null)
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(error)
+ })
this.CompileController.compile(this.req, this.res)
})
@@ -334,9 +316,11 @@ describe('CompileController', function () {
error: 'too many concurrent compile requests',
outputUrlPrefix: '/zone/b',
outputFiles: [],
+ stats: this.stats,
+ timings: this.timings,
+ // JSON.stringify will omit these undefined values
buildId: undefined,
- stats: undefined,
- timings: undefined,
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -349,7 +333,11 @@ describe('CompileController', function () {
this.error.timedout = true
this.CompileManager.doCompileWithLock = sinon
.stub()
- .callsArgWith(1, this.error, null)
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(this.error)
+ })
this.CompileController.compile(this.req, this.res)
})
@@ -362,10 +350,11 @@ describe('CompileController', function () {
error: this.message,
outputUrlPrefix: '/zone/b',
outputFiles: [],
- // JSON.stringify will omit these
+ stats: this.stats,
+ timings: this.timings,
+ // JSON.stringify will omit these undefined values
buildId: undefined,
- stats: undefined,
- timings: undefined,
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -376,7 +365,11 @@ describe('CompileController', function () {
beforeEach(function () {
this.CompileManager.doCompileWithLock = sinon
.stub()
- .callsArgWith(1, null, [])
+ .callsFake((_req, stats, timings, cb) => {
+ Object.assign(stats, this.stats)
+ Object.assign(timings, this.timings)
+ cb(null, {})
+ })
this.CompileController.compile(this.req, this.res)
})
@@ -389,10 +382,11 @@ describe('CompileController', function () {
status: 'failure',
outputUrlPrefix: '/zone/b',
outputFiles: [],
- // JSON.stringify will omit these
+ stats: this.stats,
+ timings: this.timings,
+ // JSON.stringify will omit these undefined values
buildId: undefined,
- stats: undefined,
- timings: undefined,
+ clsiCacheShard: undefined,
},
})
.should.equal(true)
@@ -416,7 +410,7 @@ describe('CompileController', function () {
this.CompileManager.syncFromCode = sinon
.stub()
- .yields(null, (this.pdfPositions = ['mock-positions']))
+ .yields(null, (this.pdfPositions = ['mock-positions']), true)
this.CompileController.syncFromCode(this.req, this.res, this.next)
})
@@ -436,11 +430,10 @@ describe('CompileController', function () {
this.res.json
.calledWith({
pdf: this.pdfPositions,
+ downloadedFromCache: true,
})
.should.equal(true)
})
-
- tryImageNameValidation('syncFromCode', 'imageName')
})
describe('syncFromPdf', function () {
@@ -459,7 +452,7 @@ describe('CompileController', function () {
this.CompileManager.syncFromPdf = sinon
.stub()
- .yields(null, (this.codePositions = ['mock-positions']))
+ .yields(null, (this.codePositions = ['mock-positions']), true)
this.CompileController.syncFromPdf(this.req, this.res, this.next)
})
@@ -473,11 +466,10 @@ describe('CompileController', function () {
this.res.json
.calledWith({
code: this.codePositions,
+ downloadedFromCache: true,
})
.should.equal(true)
})
-
- tryImageNameValidation('syncFromPdf', 'imageName')
})
describe('wordcount', function () {
@@ -511,7 +503,5 @@ describe('CompileController', function () {
})
.should.equal(true)
})
-
- tryImageNameValidation('wordcount', 'image')
})
})
diff --git a/services/clsi/test/unit/js/CompileManagerTests.js b/services/clsi/test/unit/js/CompileManagerTests.js
index 6f5b5baf64..30ef538ac3 100644
--- a/services/clsi/test/unit/js/CompileManagerTests.js
+++ b/services/clsi/test/unit/js/CompileManagerTests.js
@@ -1,9 +1,9 @@
-const Path = require('path')
+const Path = require('node:path')
const SandboxedModule = require('sandboxed-module')
const { expect } = require('chai')
const sinon = require('sinon')
-const MODULE_PATH = require('path').join(
+const MODULE_PATH = require('node:path').join(
__dirname,
'../../../app/js/CompileManager'
)
@@ -35,7 +35,7 @@ describe('CompileManager', function () {
build: 1234,
},
]
- this.buildId = 'build-id-123'
+ this.buildId = '00000000000-0000000000000000'
this.commandOutput = 'Dummy output'
this.compileBaseDir = '/compile/dir'
this.outputBaseDir = '/output/dir'
@@ -61,7 +61,10 @@ describe('CompileManager', function () {
},
}
this.OutputCacheManager = {
+ BUILD_REGEX: /^[0-9a-f]+-[0-9a-f]+$/,
+ CACHE_SUBDIR: 'generated-files',
promises: {
+ queueDirOperation: sinon.stub().callsArg(1),
saveOutputFiles: sinon
.stub()
.resolves({ outputFiles: this.buildFiles, buildId: this.buildId }),
@@ -87,9 +90,10 @@ describe('CompileManager', function () {
execFile: sinon.stub().yields(),
}
this.CommandRunner = {
+ canRunSyncTeXInOutputDir: sinon.stub().returns(false),
promises: {
run: sinon.stub().callsFake((_1, _2, _3, _4, _5, _6, compileGroup) => {
- if (compileGroup === 'synctex') {
+ if (compileGroup === 'synctex' || compileGroup === 'synctex-output') {
return Promise.resolve({ stdout: this.commandOutput })
} else {
return Promise.resolve({
@@ -140,6 +144,12 @@ describe('CompileManager', function () {
.withArgs(Path.join(this.compileDir, 'output.synctex.gz'))
.resolves(this.fileStats)
+ this.CLSICacheHandler = {
+ notifyCLSICacheAboutBuild: sinon.stub(),
+ downloadLatestCompileCache: sinon.stub().resolves(),
+ downloadOutputDotSynctexFromCompileCache: sinon.stub().resolves(),
+ }
+
this.CompileManager = SandboxedModule.require(MODULE_PATH, {
requires: {
'./LatexRunner': this.LatexRunner,
@@ -160,6 +170,7 @@ describe('CompileManager', function () {
'./LockManager': this.LockManager,
'./SynctexOutputParser': this.SynctexOutputParser,
'fs/promises': this.fsPromises,
+ './CLSICacheHandler': this.CLSICacheHandler,
},
})
})
@@ -177,6 +188,11 @@ describe('CompileManager', function () {
flags: (this.flags = ['-file-line-error']),
compileGroup: (this.compileGroup = 'compile-group'),
stopOnFirstError: false,
+ metricsOpts: {
+ path: 'clsi-perf',
+ method: 'minimal',
+ compile: 'initial',
+ },
}
this.env = {
OVERLEAF_PROJECT_ID: this.projectId,
@@ -188,7 +204,7 @@ describe('CompileManager', function () {
const error = new Error('locked')
this.LockManager.acquire.throws(error)
await expect(
- this.CompileManager.promises.doCompileWithLock(this.request)
+ this.CompileManager.promises.doCompileWithLock(this.request, {}, {})
).to.be.rejectedWith(error)
})
@@ -206,7 +222,9 @@ describe('CompileManager', function () {
describe('normally', function () {
beforeEach(async function () {
this.result = await this.CompileManager.promises.doCompileWithLock(
- this.request
+ this.request,
+ {},
+ {}
)
})
@@ -260,7 +278,11 @@ describe('CompileManager', function () {
describe('with draft mode', function () {
beforeEach(async function () {
this.request.draft = true
- await this.CompileManager.promises.doCompileWithLock(this.request)
+ await this.CompileManager.promises.doCompileWithLock(
+ this.request,
+ {},
+ {}
+ )
})
it('should inject the draft mode header', function () {
@@ -273,7 +295,11 @@ describe('CompileManager', function () {
describe('with a check option', function () {
beforeEach(async function () {
this.request.check = 'error'
- await this.CompileManager.promises.doCompileWithLock(this.request)
+ await this.CompileManager.promises.doCompileWithLock(
+ this.request,
+ {},
+ {}
+ )
})
it('should run chktex', function () {
@@ -305,7 +331,11 @@ describe('CompileManager', function () {
beforeEach(async function () {
this.request.rootResourcePath = 'main.Rtex'
this.request.check = 'error'
- await this.CompileManager.promises.doCompileWithLock(this.request)
+ await this.CompileManager.promises.doCompileWithLock(
+ this.request,
+ {},
+ {}
+ )
})
it('should not run chktex', function () {
@@ -334,7 +364,7 @@ describe('CompileManager', function () {
error.timedout = true
this.LatexRunner.promises.runLatex.rejects(error)
await expect(
- this.CompileManager.promises.doCompileWithLock(this.request)
+ this.CompileManager.promises.doCompileWithLock(this.request, {}, {})
).to.be.rejected
})
@@ -357,7 +387,7 @@ describe('CompileManager', function () {
error.terminated = true
this.LatexRunner.promises.runLatex.rejects(error)
await expect(
- this.CompileManager.promises.doCompileWithLock(this.request)
+ this.CompileManager.promises.doCompileWithLock(this.request, {}, {})
).to.be.rejected
})
@@ -437,12 +467,83 @@ describe('CompileManager', function () {
this.compileDir,
this.Settings.clsi.docker.image,
60000,
- {}
+ {},
+ 'synctex'
)
})
it('should return the parsed output', function () {
- expect(this.result).to.deep.equal(this.records)
+ expect(this.result).to.deep.equal({
+ codePositions: this.records,
+ downloadedFromCache: false,
+ })
+ })
+ })
+
+ describe('from cache in docker', function () {
+ beforeEach(async function () {
+ this.CommandRunner.canRunSyncTeXInOutputDir.returns(true)
+ this.Settings.path.synctexBaseDir
+ .withArgs(`${this.projectId}-${this.userId}`)
+ .returns('/compile')
+
+ const errNotFound = new Error()
+ errNotFound.code = 'ENOENT'
+ this.outputDir = `${this.outputBaseDir}/${this.projectId}-${this.userId}/${this.OutputCacheManager.CACHE_SUBDIR}/${this.buildId}`
+ const filename = Path.join(this.outputDir, 'output.synctex.gz')
+ this.fsPromises.stat
+ .withArgs(this.outputDir)
+ .onFirstCall()
+ .rejects(errNotFound)
+ this.fsPromises.stat
+ .withArgs(this.outputDir)
+ .onSecondCall()
+ .resolves(this.dirStats)
+ this.fsPromises.stat.withArgs(filename).resolves(this.fileStats)
+ this.CLSICacheHandler.downloadOutputDotSynctexFromCompileCache.resolves(
+ true
+ )
+ this.result = await this.CompileManager.promises.syncFromCode(
+ this.projectId,
+ this.userId,
+ this.filename,
+ this.line,
+ this.column,
+ {
+ imageName: 'image',
+ editorId: '00000000-0000-0000-0000-000000000000',
+ buildId: this.buildId,
+ compileFromClsiCache: true,
+ }
+ )
+ })
+
+ it('should run in output dir', function () {
+ const outputFilePath = '/compile/output.pdf'
+ const inputFilePath = `/compile/${this.filename}`
+ expect(this.CommandRunner.promises.run).to.have.been.calledWith(
+ `${this.projectId}-${this.userId}`,
+ [
+ 'synctex',
+ 'view',
+ '-i',
+ `${this.line}:${this.column}:${inputFilePath}`,
+ '-o',
+ outputFilePath,
+ ],
+ this.outputDir,
+ 'image',
+ 60000,
+ {},
+ 'synctex-output'
+ )
+ })
+
+ it('should return the parsed output', function () {
+ expect(this.result).to.deep.equal({
+ codePositions: this.records,
+ downloadedFromCache: true,
+ })
})
})
@@ -455,7 +556,7 @@ describe('CompileManager', function () {
this.filename,
this.line,
this.column,
- customImageName
+ { imageName: customImageName }
)
})
@@ -475,7 +576,8 @@ describe('CompileManager', function () {
this.compileDir,
customImageName,
60000,
- {}
+ {},
+ 'synctex'
)
})
})
@@ -497,7 +599,7 @@ describe('CompileManager', function () {
this.page,
this.h,
this.v,
- ''
+ { imageName: '' }
)
})
@@ -519,7 +621,10 @@ describe('CompileManager', function () {
})
it('should return the parsed output', function () {
- expect(this.result).to.deep.equal(this.records)
+ expect(this.result).to.deep.equal({
+ pdfPositions: this.records,
+ downloadedFromCache: false,
+ })
})
})
@@ -532,7 +637,7 @@ describe('CompileManager', function () {
this.page,
this.h,
this.v,
- customImageName
+ { imageName: customImageName }
)
})
diff --git a/services/clsi/test/unit/js/ContentCacheManagerTests.js b/services/clsi/test/unit/js/ContentCacheManagerTests.js
index be2d17039d..df3bce212b 100644
--- a/services/clsi/test/unit/js/ContentCacheManagerTests.js
+++ b/services/clsi/test/unit/js/ContentCacheManagerTests.js
@@ -1,5 +1,5 @@
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const { expect } = require('chai')
const MODULE_PATH = '../../../app/js/ContentCacheManager'
diff --git a/services/clsi/test/unit/js/ContentTypeMapperTests.js b/services/clsi/test/unit/js/ContentTypeMapperTests.js
index a80ef991ca..a413337153 100644
--- a/services/clsi/test/unit/js/ContentTypeMapperTests.js
+++ b/services/clsi/test/unit/js/ContentTypeMapperTests.js
@@ -11,7 +11,7 @@
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/ContentTypeMapper'
)
diff --git a/services/clsi/test/unit/js/DockerLockManagerTests.js b/services/clsi/test/unit/js/DockerLockManagerTests.js
index 5708faf292..f69179443c 100644
--- a/services/clsi/test/unit/js/DockerLockManagerTests.js
+++ b/services/clsi/test/unit/js/DockerLockManagerTests.js
@@ -11,12 +11,12 @@
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/DockerLockManager'
)
-describe('LockManager', function () {
+describe('DockerLockManager', function () {
beforeEach(function () {
return (this.LockManager = SandboxedModule.require(modulePath, {
requires: {
diff --git a/services/clsi/test/unit/js/DockerRunnerTests.js b/services/clsi/test/unit/js/DockerRunnerTests.js
index 8ff9c6107b..d70aab52c7 100644
--- a/services/clsi/test/unit/js/DockerRunnerTests.js
+++ b/services/clsi/test/unit/js/DockerRunnerTests.js
@@ -15,11 +15,11 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/DockerRunner'
)
-const Path = require('path')
+const Path = require('node:path')
describe('DockerRunner', function () {
beforeEach(function () {
@@ -76,8 +76,11 @@ describe('DockerRunner', function () {
this.env = {}
this.callback = sinon.stub()
this.project_id = 'project-id-123'
- this.volumes = { '/local/compile/directory': '/compile' }
+ this.volumes = { '/some/host/dir/compiles/directory': '/compile' }
this.Settings.clsi.docker.image = this.defaultImage = 'default-image'
+ this.Settings.path.sandboxedCompilesHostDirCompiles =
+ '/some/host/dir/compiles'
+ this.Settings.path.sandboxedCompilesHostDirOutput = '/some/host/dir/output'
this.compileGroup = 'compile-group'
return (this.Settings.clsi.docker.env = { PATH: 'mock-path' })
})
@@ -151,9 +154,8 @@ describe('DockerRunner', function () {
})
})
- describe('when path.sandboxedCompilesHostDir is set', function () {
+ describe('standard compile', function () {
beforeEach(function () {
- this.Settings.path.sandboxedCompilesHostDir = '/some/host/dir/compiles'
this.directory = '/var/lib/overleaf/data/compiles/xyz'
this.DockerRunner._runAndWaitForContainer = sinon
.stub()
@@ -183,6 +185,99 @@ describe('DockerRunner', function () {
})
})
+ describe('synctex-output', function () {
+ beforeEach(function () {
+ this.directory = '/var/lib/overleaf/data/output/xyz/generated-files/id'
+ this.DockerRunner._runAndWaitForContainer = sinon
+ .stub()
+ .callsArgWith(3, null, (this.output = 'mock-output'))
+ this.DockerRunner.run(
+ this.project_id,
+ this.command,
+ this.directory,
+ this.image,
+ this.timeout,
+ this.env,
+ 'synctex-output',
+ this.callback
+ )
+ })
+
+ it('should re-write the bind directory and set ro flag', function () {
+ const volumes =
+ this.DockerRunner._runAndWaitForContainer.lastCall.args[1]
+ expect(volumes).to.deep.equal({
+ '/some/host/dir/output/xyz/generated-files/id': '/compile:ro',
+ })
+ })
+
+ it('should call the callback', function () {
+ this.callback.calledWith(null, this.output).should.equal(true)
+ })
+ })
+
+ describe('synctex', function () {
+ beforeEach(function () {
+ this.directory = '/var/lib/overleaf/data/compile/xyz'
+ this.DockerRunner._runAndWaitForContainer = sinon
+ .stub()
+ .callsArgWith(3, null, (this.output = 'mock-output'))
+ this.DockerRunner.run(
+ this.project_id,
+ this.command,
+ this.directory,
+ this.image,
+ this.timeout,
+ this.env,
+ 'synctex',
+ this.callback
+ )
+ })
+
+ it('should re-write the bind directory', function () {
+ const volumes =
+ this.DockerRunner._runAndWaitForContainer.lastCall.args[1]
+ expect(volumes).to.deep.equal({
+ '/some/host/dir/compiles/xyz': '/compile:ro',
+ })
+ })
+
+ it('should call the callback', function () {
+ this.callback.calledWith(null, this.output).should.equal(true)
+ })
+ })
+
+ describe('wordcount', function () {
+ beforeEach(function () {
+ this.directory = '/var/lib/overleaf/data/compile/xyz'
+ this.DockerRunner._runAndWaitForContainer = sinon
+ .stub()
+ .callsArgWith(3, null, (this.output = 'mock-output'))
+ this.DockerRunner.run(
+ this.project_id,
+ this.command,
+ this.directory,
+ this.image,
+ this.timeout,
+ this.env,
+ 'wordcount',
+ this.callback
+ )
+ })
+
+ it('should re-write the bind directory', function () {
+ const volumes =
+ this.DockerRunner._runAndWaitForContainer.lastCall.args[1]
+ expect(volumes).to.deep.equal({
+ '/some/host/dir/compiles/xyz': '/compile:ro',
+ })
+ })
+
+ it('should call the callback', function () {
+ this.callback.calledWith(null, this.output).should.equal(true)
+ })
+ })
+
describe('when the run throws an error', function () {
beforeEach(function () {
let firstTime = true
@@ -390,7 +485,7 @@ describe('DockerRunner', function () {
const options =
this.DockerRunner._runAndWaitForContainer.lastCall.args[0]
return expect(options.HostConfig).to.deep.include({
- Binds: ['/local/compile/directory:/compile:rw'],
+ Binds: ['/some/host/dir/compiles/directory:/compile:rw'],
LogConfig: { Type: 'none', Config: {} },
CapDrop: 'ALL',
SecurityOpt: ['no-new-privileges'],
@@ -562,82 +657,6 @@ describe('DockerRunner', function () {
})
})
- describe('when a volume does not exist', function () {
- beforeEach(function () {
- this.fs.stat = sinon.stub().yields(new Error('no such path'))
- return this.DockerRunner.startContainer(
- this.options,
- this.volumes,
- this.attachStreamHandler,
- this.callback
- )
- })
-
- it('should not try to create the container', function () {
- return this.createContainer.called.should.equal(false)
- })
-
- it('should call the callback with an error', function () {
- this.callback.calledWith(sinon.match(Error)).should.equal(true)
- })
- })
-
- describe('when a volume exists but is not a directory', function () {
- beforeEach(function () {
- this.fs.stat = sinon.stub().yields(null, {
- isDirectory() {
- return false
- },
- })
- return this.DockerRunner.startContainer(
- this.options,
- this.volumes,
- this.attachStreamHandler,
- this.callback
- )
- })
-
- it('should not try to create the container', function () {
- return this.createContainer.called.should.equal(false)
- })
-
- it('should call the callback with an error', function () {
- this.callback.calledWith(sinon.match(Error)).should.equal(true)
- })
- })
-
- describe('when a volume does not exist, but sibling-containers are used', function () {
- beforeEach(function () {
- this.fs.stat = sinon.stub().yields(new Error('no such path'))
- this.Settings.path.sandboxedCompilesHostDir = '/some/path'
- this.container.start = sinon.stub().yields()
- return this.DockerRunner.startContainer(
- this.options,
- this.volumes,
- () => {},
- this.callback
- )
- })
-
- afterEach(function () {
- return delete this.Settings.path.sandboxedCompilesHostDir
- })
-
- it('should start the container with the given name', function () {
- this.getContainer.calledWith(this.options.name).should.equal(true)
- return this.container.start.called.should.equal(true)
- })
-
- it('should not try to create the container', function () {
- return this.createContainer.called.should.equal(false)
- })
-
- return it('should call the callback', function () {
- this.callback.called.should.equal(true)
- return this.callback.calledWith(new Error()).should.equal(false)
- })
- })
-
return describe('when the container tries to be created, but already has been (race condition)', function () {})
})
diff --git a/services/clsi/test/unit/js/DraftModeManagerTests.js b/services/clsi/test/unit/js/DraftModeManagerTests.js
index acaae0f10a..eda83380e7 100644
--- a/services/clsi/test/unit/js/DraftModeManagerTests.js
+++ b/services/clsi/test/unit/js/DraftModeManagerTests.js
@@ -1,5 +1,5 @@
-const Path = require('path')
-const fsPromises = require('fs/promises')
+const Path = require('node:path')
+const fsPromises = require('node:fs/promises')
const { expect } = require('chai')
const mockFs = require('mock-fs')
const SandboxedModule = require('sandboxed-module')
diff --git a/services/clsi/test/unit/js/LatexRunnerTests.js b/services/clsi/test/unit/js/LatexRunnerTests.js
index ca36d7308f..0d250dd517 100644
--- a/services/clsi/test/unit/js/LatexRunnerTests.js
+++ b/services/clsi/test/unit/js/LatexRunnerTests.js
@@ -2,7 +2,7 @@ const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const MODULE_PATH = require('path').join(
+const MODULE_PATH = require('node:path').join(
__dirname,
'../../../app/js/LatexRunner'
)
diff --git a/services/clsi/test/unit/js/LockManagerTests.js b/services/clsi/test/unit/js/LockManagerTests.js
index cd0d34cd4a..7005b3e5a3 100644
--- a/services/clsi/test/unit/js/LockManagerTests.js
+++ b/services/clsi/test/unit/js/LockManagerTests.js
@@ -1,7 +1,7 @@
const { expect } = require('chai')
const sinon = require('sinon')
const SandboxedModule = require('sandboxed-module')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/LockManager'
)
@@ -21,6 +21,7 @@ describe('LockManager', function () {
compileConcurrencyLimit: 5,
}),
'./Errors': (this.Erros = Errors),
+ './RequestParser': { MAX_TIMEOUT: 600 },
},
})
})
diff --git a/services/clsi/test/unit/js/OutputControllerTests.js b/services/clsi/test/unit/js/OutputControllerTests.js
index 33367af26a..ee5c9c2a7a 100644
--- a/services/clsi/test/unit/js/OutputControllerTests.js
+++ b/services/clsi/test/unit/js/OutputControllerTests.js
@@ -1,6 +1,6 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const MODULE_PATH = require('path').join(
+const MODULE_PATH = require('node:path').join(
__dirname,
'../../../app/js/OutputController'
)
@@ -19,7 +19,7 @@ describe('OutputController', function () {
'./OutputFileArchiveManager': {
archiveFilesForBuild: this.archiveFilesForBuild,
},
- 'node:stream/promises': {
+ 'stream/promises': {
pipeline: this.pipeline,
},
},
diff --git a/services/clsi/test/unit/js/OutputFileArchiveManagerTests.js b/services/clsi/test/unit/js/OutputFileArchiveManagerTests.js
index bd62b00825..d6817f3559 100644
--- a/services/clsi/test/unit/js/OutputFileArchiveManagerTests.js
+++ b/services/clsi/test/unit/js/OutputFileArchiveManagerTests.js
@@ -2,7 +2,7 @@ const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { assert, expect } = require('chai')
-const MODULE_PATH = require('path').join(
+const MODULE_PATH = require('node:path').join(
__dirname,
'../../../app/js/OutputFileArchiveManager'
)
@@ -50,7 +50,7 @@ describe('OutputFileArchiveManager', function () {
'./OutputFileFinder': this.OutputFileFinder,
'./OutputCacheManager': this.OutputCacheManger,
archiver: this.archiver,
- 'node:fs/promises': this.fs,
+ 'fs/promises': this.fs,
'@overleaf/settings': {
path: {
outputDir: this.outputDir,
diff --git a/services/clsi/test/unit/js/OutputFileFinderTests.js b/services/clsi/test/unit/js/OutputFileFinderTests.js
index cf596a6271..c9e1b443be 100644
--- a/services/clsi/test/unit/js/OutputFileFinderTests.js
+++ b/services/clsi/test/unit/js/OutputFileFinderTests.js
@@ -1,6 +1,6 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/OutputFileFinder'
)
diff --git a/services/clsi/test/unit/js/OutputFileOptimiserTests.js b/services/clsi/test/unit/js/OutputFileOptimiserTests.js
index d74c6a3534..1dd1a751b9 100644
--- a/services/clsi/test/unit/js/OutputFileOptimiserTests.js
+++ b/services/clsi/test/unit/js/OutputFileOptimiserTests.js
@@ -12,13 +12,13 @@
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/OutputFileOptimiser'
)
-const path = require('path')
+const path = require('node:path')
const { expect } = require('chai')
-const { EventEmitter } = require('events')
+const { EventEmitter } = require('node:events')
describe('OutputFileOptimiser', function () {
beforeEach(function () {
diff --git a/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js b/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js
index c5f30b1ea9..4f42411fba 100644
--- a/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js
+++ b/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js
@@ -13,7 +13,7 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const assert = require('chai').assert
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/ProjectPersistenceManager'
)
@@ -21,11 +21,16 @@ const tk = require('timekeeper')
describe('ProjectPersistenceManager', function () {
beforeEach(function () {
+ this.fsPromises = {
+ statfs: sinon.stub(),
+ }
+
this.ProjectPersistenceManager = SandboxedModule.require(modulePath, {
requires: {
+ '@overleaf/metrics': (this.Metrics = { gauge: sinon.stub() }),
'./UrlCache': (this.UrlCache = {}),
'./CompileManager': (this.CompileManager = {}),
- diskusage: (this.diskusage = { check: sinon.stub() }),
+ fs: { promises: this.fsPromises },
'@overleaf/settings': (this.settings = {
project_cache_length_ms: 1000,
path: {
@@ -43,12 +48,17 @@ describe('ProjectPersistenceManager', function () {
describe('refreshExpiryTimeout', function () {
it('should leave expiry alone if plenty of disk', function (done) {
- this.diskusage.check.resolves({
- available: 40,
- total: 100,
+ this.fsPromises.statfs.resolves({
+ blocks: 100,
+ bsize: 1,
+ bavail: 40,
})
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
+ this.Metrics.gauge.should.have.been.calledWith(
+ 'disk_available_percent',
+ 40
+ )
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(
this.settings.project_cache_length_ms
)
@@ -57,31 +67,41 @@ describe('ProjectPersistenceManager', function () {
})
it('should drop EXPIRY_TIMEOUT 10% if low disk usage', function (done) {
- this.diskusage.check.resolves({
- available: 5,
- total: 100,
+ this.fsPromises.statfs.resolves({
+ blocks: 100,
+ bsize: 1,
+ bavail: 5,
})
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
+ this.Metrics.gauge.should.have.been.calledWith(
+ 'disk_available_percent',
+ 5
+ )
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(900)
done()
})
})
it('should not drop EXPIRY_TIMEOUT to below 50% of project_cache_length_ms', function (done) {
- this.diskusage.check.resolves({
- available: 5,
- total: 100,
+ this.fsPromises.statfs.resolves({
+ blocks: 100,
+ bsize: 1,
+ bavail: 5,
})
this.ProjectPersistenceManager.EXPIRY_TIMEOUT = 500
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
+ this.Metrics.gauge.should.have.been.calledWith(
+ 'disk_available_percent',
+ 5
+ )
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(500)
done()
})
})
it('should not modify EXPIRY_TIMEOUT if there is an error getting disk values', function (done) {
- this.diskusage.check.throws(new Error())
+ this.fsPromises.statfs.rejects(new Error())
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(1000)
done()
diff --git a/services/clsi/test/unit/js/RequestParserTests.js b/services/clsi/test/unit/js/RequestParserTests.js
index 4cf31a2b37..437c3c4fbe 100644
--- a/services/clsi/test/unit/js/RequestParserTests.js
+++ b/services/clsi/test/unit/js/RequestParserTests.js
@@ -1,7 +1,7 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/RequestParser'
)
@@ -30,6 +30,7 @@ describe('RequestParser', function () {
this.RequestParser = SandboxedModule.require(modulePath, {
requires: {
'@overleaf/settings': (this.settings = {}),
+ './OutputCacheManager': { BUILD_REGEX: /^[0-9a-f]+-[0-9a-f]+$/ },
},
})
})
@@ -274,6 +275,37 @@ describe('RequestParser', function () {
})
})
+ describe('with a valid buildId', function () {
+ beforeEach(function (done) {
+ this.validRequest.compile.options.buildId = '195a4869176-a4ad60bee7bf35e4'
+ this.RequestParser.parse(this.validRequest, (error, data) => {
+ if (error) return done(error)
+ this.data = data
+ done()
+ })
+ })
+
+ it('should return an error', function () {
+ this.data.buildId.should.equal('195a4869176-a4ad60bee7bf35e4')
+ })
+ })
+
+ describe('with a bad buildId', function () {
+ beforeEach(function () {
+ this.validRequest.compile.options.buildId = 'foo/bar'
+ this.RequestParser.parse(this.validRequest, this.callback)
+ })
+
+ it('should return an error', function () {
+ this.callback
+ .calledWithMatch({
+ message:
+ 'buildId attribute does not match regex /^[0-9a-f]+-[0-9a-f]+$/',
+ })
+ .should.equal(true)
+ })
+ })
+
describe('with a resource with a valid date', function () {
beforeEach(function () {
this.date = '12:00 01/02/03'
diff --git a/services/clsi/test/unit/js/ResourceStateManagerTests.js b/services/clsi/test/unit/js/ResourceStateManagerTests.js
index 0a97d7b705..823c81616f 100644
--- a/services/clsi/test/unit/js/ResourceStateManagerTests.js
+++ b/services/clsi/test/unit/js/ResourceStateManagerTests.js
@@ -12,11 +12,11 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/ResourceStateManager'
)
-const Path = require('path')
+const Path = require('node:path')
const Errors = require('../../../app/js/Errors')
describe('ResourceStateManager', function () {
diff --git a/services/clsi/test/unit/js/ResourceWriterTests.js b/services/clsi/test/unit/js/ResourceWriterTests.js
index 3b18a3b195..c2e09ce9cf 100644
--- a/services/clsi/test/unit/js/ResourceWriterTests.js
+++ b/services/clsi/test/unit/js/ResourceWriterTests.js
@@ -13,11 +13,11 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/ResourceWriter'
)
-const path = require('path')
+const path = require('node:path')
describe('ResourceWriter', function () {
beforeEach(function () {
@@ -378,12 +378,13 @@ describe('ResourceWriter', function () {
this.fs.mkdir = sinon.stub().callsArg(2)
this.resource = {
path: 'main.tex',
- url: 'http://www.example.com/main.tex',
+ url: 'http://www.example.com/primary/main.tex',
+ fallbackURL: 'http://fallback.example.com/fallback/main.tex',
modified: Date.now(),
}
this.UrlCache.downloadUrlToFile = sinon
.stub()
- .callsArgWith(4, 'fake error downloading file')
+ .callsArgWith(5, 'fake error downloading file')
return this.ResourceWriter._writeResourceToDisk(
this.project_id,
this.resource,
@@ -405,6 +406,7 @@ describe('ResourceWriter', function () {
.calledWith(
this.project_id,
this.resource.url,
+ this.resource.fallbackURL,
path.join(this.basePath, this.resource.path),
this.resource.modified
)
diff --git a/services/clsi/test/unit/js/StaticServerForbidSymlinksTests.js b/services/clsi/test/unit/js/StaticServerForbidSymlinksTests.js
index 0a3806a1e6..53507fe3f2 100644
--- a/services/clsi/test/unit/js/StaticServerForbidSymlinksTests.js
+++ b/services/clsi/test/unit/js/StaticServerForbidSymlinksTests.js
@@ -10,8 +10,8 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const SandboxedModule = require('sandboxed-module')
-const assert = require('assert')
-const path = require('path')
+const assert = require('node:assert')
+const path = require('node:path')
const sinon = require('sinon')
const modulePath = path.join(
__dirname,
diff --git a/services/clsi/test/unit/js/SynctexOutputParserTests.js b/services/clsi/test/unit/js/SynctexOutputParserTests.js
index 19bf2f6d37..b999a6adb1 100644
--- a/services/clsi/test/unit/js/SynctexOutputParserTests.js
+++ b/services/clsi/test/unit/js/SynctexOutputParserTests.js
@@ -1,4 +1,4 @@
-const Path = require('path')
+const Path = require('node:path')
const SandboxedModule = require('sandboxed-module')
const { expect } = require('chai')
diff --git a/services/clsi/test/unit/js/TikzManager.js b/services/clsi/test/unit/js/TikzManager.js
index 8e01194955..ee651f6b1d 100644
--- a/services/clsi/test/unit/js/TikzManager.js
+++ b/services/clsi/test/unit/js/TikzManager.js
@@ -10,7 +10,7 @@
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/TikzManager'
)
diff --git a/services/clsi/test/unit/js/UrlCacheTests.js b/services/clsi/test/unit/js/UrlCacheTests.js
index a5c1e60c0a..a3dc2fac3c 100644
--- a/services/clsi/test/unit/js/UrlCacheTests.js
+++ b/services/clsi/test/unit/js/UrlCacheTests.js
@@ -13,13 +13,17 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(__dirname, '../../../app/js/UrlCache')
+const modulePath = require('node:path').join(
+ __dirname,
+ '../../../app/js/UrlCache'
+)
describe('UrlCache', function () {
beforeEach(function () {
this.callback = sinon.stub()
this.url =
'http://filestore/project/60b0dd39c418bc00598a0d22/file/60ae721ffb1d920027d3201f'
+ this.fallbackURL = 'http://filestore/bucket/project-blobs/key/ab/cd/ef'
this.project_id = '60b0dd39c418bc00598a0d22'
return (this.UrlCache = SandboxedModule.require(modulePath, {
requires: {
@@ -51,6 +55,29 @@ describe('UrlCache', function () {
this.UrlCache.downloadUrlToFile(
this.project_id,
this.url,
+ this.fallbackURL,
+ this.destPath,
+ this.lastModified,
+ error => {
+ expect(error).to.not.exist
+ expect(
+ this.UrlFetcher.promises.pipeUrlToFileWithRetry.called
+ ).to.equal(false)
+ done()
+ }
+ )
+ })
+
+ it('should not download on the semi-happy path', function (done) {
+ const codedError = new Error()
+ codedError.code = 'ENOENT'
+ this.fs.promises.copyFile.onCall(0).rejects(codedError)
+ this.fs.promises.copyFile.onCall(1).resolves()
+
+ this.UrlCache.downloadUrlToFile(
+ this.project_id,
+ this.url,
+ this.fallbackURL,
this.destPath,
this.lastModified,
error => {
@@ -67,11 +94,13 @@ describe('UrlCache', function () {
const codedError = new Error()
codedError.code = 'ENOENT'
this.fs.promises.copyFile.onCall(0).rejects(codedError)
- this.fs.promises.copyFile.onCall(1).resolves()
+ this.fs.promises.copyFile.onCall(1).rejects(codedError)
+ this.fs.promises.copyFile.onCall(2).resolves()
this.UrlCache.downloadUrlToFile(
this.project_id,
this.url,
+ this.fallbackURL,
this.destPath,
this.lastModified,
error => {
@@ -91,6 +120,7 @@ describe('UrlCache', function () {
this.UrlCache.downloadUrlToFile(
this.project_id,
this.url,
+ this.fallbackURL,
this.destPath,
this.lastModified,
error => {
diff --git a/services/clsi/test/unit/js/pdfjsTests.js b/services/clsi/test/unit/js/pdfjsTests.js
index ef85ccc704..bc8b775b43 100644
--- a/services/clsi/test/unit/js/pdfjsTests.js
+++ b/services/clsi/test/unit/js/pdfjsTests.js
@@ -1,5 +1,5 @@
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const { expect } = require('chai')
const { parseXrefTable } = require('../../../app/js/XrefParser')
const { NoXrefTableError } = require('../../../app/js/Errors')
diff --git a/services/contacts/.nvmrc b/services/contacts/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/contacts/.nvmrc
+++ b/services/contacts/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/contacts/Dockerfile b/services/contacts/Dockerfile
index 2b2d8dae61..b59cada7b3 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:18.20.2 AS base
+FROM node:22.17.0 AS base
WORKDIR /overleaf/services/contacts
diff --git a/services/contacts/Makefile b/services/contacts/Makefile
index 1f2b7a10fb..3309e298e8 100644
--- a/services/contacts/Makefile
+++ b/services/contacts/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -98,13 +116,6 @@ test_acceptance_clean:
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down -v -t 0
test_acceptance_pre_run:
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) up -d mongo
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) exec -T mongo sh -c ' \
- while ! mongosh --eval "db.version()" > /dev/null; do \
- echo "Waiting for Mongo..."; \
- sleep 1; \
- done; \
- mongosh --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"mongo:27017\" } ] })"'
ifneq (,$(wildcard test/acceptance/js/scripts/pre-run))
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) run --rm test_acceptance test/acceptance/js/scripts/pre-run
endif
@@ -137,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/contacts/buildscript.txt b/services/contacts/buildscript.txt
index cfbc56040e..b20764246c 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=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/services/contacts/config/settings.defaults.cjs b/services/contacts/config/settings.defaults.cjs
index fb716d1812..7ffdb83ce5 100644
--- a/services/contacts/config/settings.defaults.cjs
+++ b/services/contacts/config/settings.defaults.cjs
@@ -1,5 +1,9 @@
-const http = require('http')
+const http = require('node:http')
+const https = require('node:https')
+
http.globalAgent.maxSockets = 300
+http.globalAgent.keepAlive = false
+https.globalAgent.keepAlive = false
module.exports = {
internal: {
diff --git a/services/contacts/docker-compose.ci.yml b/services/contacts/docker-compose.ci.yml
index 6f1a608534..ca3303a079 100644
--- a/services/contacts/docker-compose.ci.yml
+++ b/services/contacts/docker-compose.ci.yml
@@ -24,10 +24,13 @@ services:
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
+ volumes:
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
user: node
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@@ -39,9 +42,14 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/contacts/docker-compose.yml b/services/contacts/docker-compose.yml
index 71a8aaa5f9..474ea224f8 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:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/contacts
- ../../node_modules:/overleaf/node_modules
@@ -14,37 +14,45 @@ services:
working_dir: /overleaf/services/contacts
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
user: node
test_acceptance:
- image: node:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/contacts
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/contacts
environment:
ELASTIC_SEARCH_DSN: es:9200
MONGO_HOST: mongo
POSTGRES_HOST: postgres
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
user: node
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/contacts/package.json b/services/contacts/package.json
index 7906016a77..db707e55c9 100644
--- a/services/contacts/package.json
+++ b/services/contacts/package.json
@@ -6,14 +6,14 @@
"main": "app.js",
"scripts": {
"start": "node app.js",
- "test:acceptance:_run": "LOG_LEVEL=fatal mocha --loader=esmock --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js",
+ "test:acceptance:_run": "mocha --loader=esmock --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js",
"test:acceptance": "npm run test:acceptance:_run -- --grep=$MOCHA_GREP",
- "test:unit:_run": "LOG_LEVEL=fatal mocha --loader=esmock --recursive --reporter spec $@ test/unit/js",
+ "test:unit:_run": "mocha --loader=esmock --recursive --reporter spec $@ test/unit/js",
"test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
"nodemon": "node --watch app.js",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"lint:fix": "eslint --fix .",
"types:check": "tsc --noEmit"
},
@@ -24,8 +24,8 @@
"async": "^3.2.5",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
- "mongodb": "^6.1.0",
+ "express": "^4.21.2",
+ "mongodb": "6.12.0",
"request": "~2.88.2",
"underscore": "~1.13.1"
},
@@ -33,7 +33,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"esmock": "^2.6.3",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sinon": "~9.0.1",
"sinon-chai": "^3.7.0",
"typescript": "^5.0.4"
diff --git a/services/docstore/.gitignore b/services/docstore/.gitignore
deleted file mode 100644
index 84bf300f7f..0000000000
--- a/services/docstore/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-node_modules
-forever
-
-# managed by dev-environment$ bin/update_build_scripts
-.npmrc
-
-# Jetbrains IDEs
-.idea
diff --git a/services/docstore/.nvmrc b/services/docstore/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/docstore/.nvmrc
+++ b/services/docstore/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/docstore/Dockerfile b/services/docstore/Dockerfile
index d1a661fc7b..f24f9ddaf7 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:18.20.2 AS base
+FROM node:22.17.0 AS base
WORKDIR /overleaf/services/docstore
diff --git a/services/docstore/Makefile b/services/docstore/Makefile
index 25068f95e6..2b3596b0b4 100644
--- a/services/docstore/Makefile
+++ b/services/docstore/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -98,13 +116,6 @@ test_acceptance_clean:
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down -v -t 0
test_acceptance_pre_run:
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) up -d mongo
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) exec -T mongo sh -c ' \
- while ! mongosh --eval "db.version()" > /dev/null; do \
- echo "Waiting for Mongo..."; \
- sleep 1; \
- done; \
- mongosh --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"mongo:27017\" } ] })"'
ifneq (,$(wildcard test/acceptance/js/scripts/pre-run))
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) run --rm test_acceptance test/acceptance/js/scripts/pre-run
endif
@@ -137,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/docstore/app.js b/services/docstore/app.js
index 51ad785065..ef755c4bb1 100644
--- a/services/docstore/app.js
+++ b/services/docstore/app.js
@@ -1,7 +1,7 @@
// Metrics must be initialized before importing anything else
require('@overleaf/metrics/initialize')
-const Events = require('events')
+const Events = require('node:events')
const Metrics = require('@overleaf/metrics')
const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
@@ -50,6 +50,14 @@ app.param('doc_id', function (req, res, next, docId) {
app.get('/project/:project_id/doc-deleted', HttpController.getAllDeletedDocs)
app.get('/project/:project_id/doc', HttpController.getAllDocs)
app.get('/project/:project_id/ranges', HttpController.getAllRanges)
+app.get(
+ '/project/:project_id/comment-thread-ids',
+ HttpController.getCommentThreadIds
+)
+app.get(
+ '/project/:project_id/tracked-changes-user-ids',
+ HttpController.getTrackedChangesUserIds
+)
app.get('/project/:project_id/has-ranges', HttpController.projectHasRanges)
app.get('/project/:project_id/doc/:doc_id', HttpController.getDoc)
app.get('/project/:project_id/doc/:doc_id/deleted', HttpController.isDocDeleted)
@@ -88,14 +96,17 @@ app.get('/status', (req, res) => res.send('docstore is alive'))
app.use(handleValidationErrors())
app.use(function (error, req, res, next) {
- logger.error({ err: error, req }, 'request errored')
if (error instanceof Errors.NotFoundError) {
+ logger.warn({ req }, 'not found')
res.sendStatus(404)
} else if (error instanceof Errors.DocModifiedError) {
+ logger.warn({ req }, 'conflict: doc modified')
res.sendStatus(409)
} else if (error instanceof Errors.DocVersionDecrementedError) {
+ logger.warn({ req }, 'conflict: doc version decremented')
res.sendStatus(409)
} else {
+ logger.error({ err: error, req }, 'request errored')
res.status(500).send('Oops, something went wrong')
}
})
diff --git a/services/docstore/app/js/DocArchiveManager.js b/services/docstore/app/js/DocArchiveManager.js
index 035448f4a1..d03ee161a8 100644
--- a/services/docstore/app/js/DocArchiveManager.js
+++ b/services/docstore/app/js/DocArchiveManager.js
@@ -1,35 +1,18 @@
-const { callbackify } = require('util')
-const MongoManager = require('./MongoManager').promises
+const MongoManager = require('./MongoManager')
const Errors = require('./Errors')
const logger = require('@overleaf/logger')
const Settings = require('@overleaf/settings')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const { ReadableString } = require('@overleaf/stream-utils')
const RangeManager = require('./RangeManager')
const PersistorManager = require('./PersistorManager')
const pMap = require('p-map')
+const { streamToBuffer } = require('./StreamToBuffer')
const { BSON } = require('mongodb-legacy')
const PARALLEL_JOBS = Settings.parallelArchiveJobs
const UN_ARCHIVE_BATCH_SIZE = Settings.unArchiveBatchSize
-module.exports = {
- archiveAllDocs: callbackify(archiveAllDocs),
- archiveDoc: callbackify(archiveDoc),
- unArchiveAllDocs: callbackify(unArchiveAllDocs),
- unarchiveDoc: callbackify(unarchiveDoc),
- destroyProject: callbackify(destroyProject),
- getDoc: callbackify(getDoc),
- promises: {
- archiveAllDocs,
- archiveDoc,
- unArchiveAllDocs,
- unarchiveDoc,
- destroyProject,
- getDoc,
- },
-}
-
async function archiveAllDocs(projectId) {
if (!_isArchivingEnabled()) {
return
@@ -61,6 +44,8 @@ async function archiveDoc(projectId, docId) {
throw new Error('doc has no lines')
}
+ RangeManager.fixCommentIds(doc)
+
// warn about any oversized docs already in mongo
const linesSize = BSON.calculateObjectSize(doc.lines || {})
const rangesSize = BSON.calculateObjectSize(doc.ranges || {})
@@ -136,7 +121,7 @@ async function getDoc(projectId, docId) {
key
)
stream.resume()
- const buffer = await _streamToBuffer(projectId, docId, stream)
+ const buffer = await streamToBuffer(projectId, docId, stream)
const md5 = crypto.createHash('md5').update(buffer).digest('hex')
if (sourceMd5 !== md5) {
throw new Errors.Md5MismatchError('md5 mismatch when downloading doc', {
@@ -187,34 +172,6 @@ async function destroyProject(projectId) {
await Promise.all(tasks)
}
-async function _streamToBuffer(projectId, docId, stream) {
- const chunks = []
- let size = 0
- let logged = false
- const logIfTooLarge = finishedReading => {
- if (size <= Settings.max_doc_length) return
- // Log progress once and then again at the end.
- if (logged && !finishedReading) return
- logger.warn(
- { projectId, docId, size, finishedReading },
- 'potentially large doc pulled down from gcs'
- )
- logged = true
- }
- return await new Promise((resolve, reject) => {
- stream.on('data', chunk => {
- size += chunk.byteLength
- logIfTooLarge(false)
- chunks.push(chunk)
- })
- stream.on('error', reject)
- stream.on('end', () => {
- logIfTooLarge(true)
- resolve(Buffer.concat(chunks))
- })
- })
-}
-
function _deserializeArchivedDoc(buffer) {
const doc = JSON.parse(buffer)
@@ -252,3 +209,12 @@ function _isArchivingEnabled() {
return true
}
+
+module.exports = {
+ archiveAllDocs,
+ archiveDoc,
+ unArchiveAllDocs,
+ unarchiveDoc,
+ destroyProject,
+ getDoc,
+}
diff --git a/services/docstore/app/js/DocManager.js b/services/docstore/app/js/DocManager.js
index 80e8ae4527..c9e8dadc2c 100644
--- a/services/docstore/app/js/DocManager.js
+++ b/services/docstore/app/js/DocManager.js
@@ -5,8 +5,7 @@ const _ = require('lodash')
const DocArchive = require('./DocArchiveManager')
const RangeManager = require('./RangeManager')
const Settings = require('@overleaf/settings')
-const { callbackifyAll } = require('@overleaf/promise-utils')
-const { setTimeout } = require('timers/promises')
+const { setTimeout } = require('node:timers/promises')
/**
* @import { Document } from 'mongodb'
@@ -29,7 +28,7 @@ const DocManager = {
throw new Error('must include inS3 when getting doc')
}
- const doc = await MongoManager.promises.findDoc(projectId, docId, filter)
+ const doc = await MongoManager.findDoc(projectId, docId, filter)
if (doc == null) {
throw new Errors.NotFoundError(
@@ -38,15 +37,19 @@ const DocManager = {
}
if (doc.inS3) {
- await DocArchive.promises.unarchiveDoc(projectId, docId)
+ await DocArchive.unarchiveDoc(projectId, docId)
return await DocManager._getDoc(projectId, docId, filter)
}
+ if (filter.ranges) {
+ RangeManager.fixCommentIds(doc)
+ }
+
return doc
},
async isDocDeleted(projectId, docId) {
- const doc = await MongoManager.promises.findDoc(projectId, docId, {
+ const doc = await MongoManager.findDoc(projectId, docId, {
deleted: true,
})
@@ -74,7 +77,7 @@ const DocManager = {
// returns the doc without any version information
async _peekRawDoc(projectId, docId) {
- const doc = await MongoManager.promises.findDoc(projectId, docId, {
+ const doc = await MongoManager.findDoc(projectId, docId, {
lines: true,
rev: true,
deleted: true,
@@ -91,7 +94,7 @@ const DocManager = {
if (doc.inS3) {
// skip the unarchiving to mongo when getting a doc
- const archivedDoc = await DocArchive.promises.getDoc(projectId, docId)
+ const archivedDoc = await DocArchive.getDoc(projectId, docId)
Object.assign(doc, archivedDoc)
}
@@ -102,7 +105,7 @@ const DocManager = {
// without unarchiving it (avoids unnecessary writes to mongo)
async peekDoc(projectId, docId) {
const doc = await DocManager._peekRawDoc(projectId, docId)
- await MongoManager.promises.checkRevUnchanged(doc)
+ await MongoManager.checkRevUnchanged(doc)
return doc
},
@@ -111,16 +114,18 @@ const DocManager = {
lines: true,
inS3: true,
})
- return doc
+ if (!doc) throw new Errors.NotFoundError()
+ if (!Array.isArray(doc.lines)) throw new Errors.DocWithoutLinesError()
+ return doc.lines.join('\n')
},
async getAllDeletedDocs(projectId, filter) {
- return await MongoManager.promises.getProjectsDeletedDocs(projectId, filter)
+ return await MongoManager.getProjectsDeletedDocs(projectId, filter)
},
async getAllNonDeletedDocs(projectId, filter) {
- await DocArchive.promises.unArchiveAllDocs(projectId)
- const docs = await MongoManager.promises.getProjectsDocs(
+ await DocArchive.unArchiveAllDocs(projectId)
+ const docs = await MongoManager.getProjectsDocs(
projectId,
{ include_deleted: false },
filter
@@ -128,15 +133,46 @@ const DocManager = {
if (docs == null) {
throw new Errors.NotFoundError(`No docs for project ${projectId}`)
}
+ if (filter.ranges) {
+ for (const doc of docs) {
+ RangeManager.fixCommentIds(doc)
+ }
+ }
return docs
},
+ async getCommentThreadIds(projectId) {
+ const docs = await DocManager.getAllNonDeletedDocs(projectId, {
+ _id: true,
+ ranges: true,
+ })
+ const byDoc = new Map()
+ for (const doc of docs) {
+ const ids = new Set()
+ for (const comment of doc.ranges?.comments || []) {
+ ids.add(comment.op.t)
+ }
+ if (ids.size > 0) byDoc.set(doc._id.toString(), Array.from(ids))
+ }
+ return Object.fromEntries(byDoc.entries())
+ },
+
+ async getTrackedChangesUserIds(projectId) {
+ const docs = await DocManager.getAllNonDeletedDocs(projectId, {
+ ranges: true,
+ })
+ const userIds = new Set()
+ for (const doc of docs) {
+ for (const change of doc.ranges?.changes || []) {
+ if (change.metadata.user_id === 'anonymous-user') continue
+ userIds.add(change.metadata.user_id)
+ }
+ }
+ return Array.from(userIds)
+ },
+
async projectHasRanges(projectId) {
- const docs = await MongoManager.promises.getProjectsDocs(
- projectId,
- {},
- { _id: 1 }
- )
+ const docs = await MongoManager.getProjectsDocs(projectId, {}, { _id: 1 })
const docIds = docs.map(doc => doc._id)
for (const docId of docIds) {
const doc = await DocManager.peekDoc(projectId, docId)
@@ -247,7 +283,7 @@ const DocManager = {
}
modified = true
- await MongoManager.promises.upsertIntoDocCollection(
+ await MongoManager.upsertIntoDocCollection(
projectId,
docId,
doc?.rev,
@@ -262,11 +298,7 @@ const DocManager = {
async patchDoc(projectId, docId, meta) {
const projection = { _id: 1, deleted: true }
- const doc = await MongoManager.promises.findDoc(
- projectId,
- docId,
- projection
- )
+ const doc = await MongoManager.findDoc(projectId, docId, projection)
if (!doc) {
throw new Errors.NotFoundError(
`No such project/doc to delete: ${projectId}/${docId}`
@@ -275,7 +307,7 @@ const DocManager = {
if (meta.deleted && Settings.docstore.archiveOnSoftDelete) {
// The user will not read this doc anytime soon. Flush it out of mongo.
- DocArchive.promises.archiveDoc(projectId, docId).catch(err => {
+ DocArchive.archiveDoc(projectId, docId).catch(err => {
logger.warn(
{ projectId, docId, err },
'archiving a single doc in the background failed'
@@ -283,15 +315,8 @@ const DocManager = {
})
}
- await MongoManager.promises.patchDoc(projectId, docId, meta)
+ await MongoManager.patchDoc(projectId, docId, meta)
},
}
-module.exports = {
- ...callbackifyAll(DocManager, {
- multiResult: {
- updateDoc: ['modified', 'rev'],
- },
- }),
- promises: DocManager,
-}
+module.exports = DocManager
diff --git a/services/docstore/app/js/Errors.js b/services/docstore/app/js/Errors.js
index bbdbe75c08..7b150cc0db 100644
--- a/services/docstore/app/js/Errors.js
+++ b/services/docstore/app/js/Errors.js
@@ -10,10 +10,13 @@ class DocRevValueError extends OError {}
class DocVersionDecrementedError extends OError {}
+class DocWithoutLinesError extends OError {}
+
module.exports = {
Md5MismatchError,
DocModifiedError,
DocRevValueError,
DocVersionDecrementedError,
+ DocWithoutLinesError,
...Errors,
}
diff --git a/services/docstore/app/js/HealthChecker.js b/services/docstore/app/js/HealthChecker.js
index 65dc92cbba..a5b7ad7e9a 100644
--- a/services/docstore/app/js/HealthChecker.js
+++ b/services/docstore/app/js/HealthChecker.js
@@ -1,67 +1,35 @@
-// TODO: This file was created by bulk-decaffeinate.
-// Fix any style issues and re-enable lint.
-/*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS207: Consider shorter variations of null checks
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
const { db, ObjectId } = require('./mongodb')
-const request = require('request')
-const async = require('async')
const _ = require('lodash')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const settings = require('@overleaf/settings')
const { port } = settings.internal.docstore
const logger = require('@overleaf/logger')
+const { fetchNothing, fetchJson } = require('@overleaf/fetch-utils')
-module.exports = {
- check(callback) {
- const docId = new ObjectId()
- const projectId = new ObjectId(settings.docstore.healthCheck.project_id)
- const url = `http://127.0.0.1:${port}/project/${projectId}/doc/${docId}`
- const lines = [
- 'smoke test - delete me',
- `${crypto.randomBytes(32).toString('hex')}`,
- ]
- const getOpts = () => ({
- url,
- timeout: 3000,
+async function check() {
+ const docId = new ObjectId()
+ const projectId = new ObjectId(settings.docstore.healthCheck.project_id)
+ const url = `http://127.0.0.1:${port}/project/${projectId}/doc/${docId}`
+ const lines = [
+ 'smoke test - delete me',
+ `${crypto.randomBytes(32).toString('hex')}`,
+ ]
+ logger.debug({ lines, url, docId, projectId }, 'running health check')
+ let body
+ try {
+ await fetchNothing(url, {
+ method: 'POST',
+ json: { lines, version: 42, ranges: {} },
+ signal: AbortSignal.timeout(3_000),
})
- logger.debug({ lines, url, docId, projectId }, 'running health check')
- const jobs = [
- function (cb) {
- const opts = getOpts()
- opts.json = { lines, version: 42, ranges: {} }
- return request.post(opts, cb)
- },
- function (cb) {
- const opts = getOpts()
- opts.json = true
- return request.get(opts, function (err, res, body) {
- if (err != null) {
- logger.err({ err }, 'docstore returned a error in health check get')
- return cb(err)
- } else if (res == null) {
- return cb(new Error('no response from docstore with get check'))
- } else if ((res != null ? res.statusCode : undefined) !== 200) {
- return cb(new Error(`status code not 200, its ${res.statusCode}`))
- } else if (
- _.isEqual(body != null ? body.lines : undefined, lines) &&
- (body != null ? body._id : undefined) === docId.toString()
- ) {
- return cb()
- } else {
- return cb(
- new Error(
- `health check lines not equal ${body.lines} != ${lines}`
- )
- )
- }
- })
- },
- cb => db.docs.deleteOne({ _id: docId, project_id: projectId }, cb),
- ]
- return async.series(jobs, callback)
- },
+ body = await fetchJson(url, { signal: AbortSignal.timeout(3_000) })
+ } finally {
+ await db.docs.deleteOne({ _id: docId, project_id: projectId })
+ }
+ if (!_.isEqual(body?.lines, lines)) {
+ throw new Error(`health check lines not equal ${body.lines} != ${lines}`)
+ }
+}
+module.exports = {
+ check,
}
diff --git a/services/docstore/app/js/HttpController.js b/services/docstore/app/js/HttpController.js
index 1c4e137033..50c4302aeb 100644
--- a/services/docstore/app/js/HttpController.js
+++ b/services/docstore/app/js/HttpController.js
@@ -4,143 +4,104 @@ const DocArchive = require('./DocArchiveManager')
const HealthChecker = require('./HealthChecker')
const Errors = require('./Errors')
const Settings = require('@overleaf/settings')
+const { expressify } = require('@overleaf/promise-utils')
-function getDoc(req, res, next) {
+async function getDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
const includeDeleted = req.query.include_deleted === 'true'
logger.debug({ projectId, docId }, 'getting doc')
- DocManager.getFullDoc(projectId, docId, function (error, doc) {
- if (error) {
- return next(error)
- }
- logger.debug({ docId, projectId }, 'got doc')
- if (doc == null) {
- res.sendStatus(404)
- } else if (doc.deleted && !includeDeleted) {
- res.sendStatus(404)
- } else {
- res.json(_buildDocView(doc))
- }
- })
+ const doc = await DocManager.getFullDoc(projectId, docId)
+ logger.debug({ docId, projectId }, 'got doc')
+ if (doc.deleted && !includeDeleted) {
+ res.sendStatus(404)
+ } else {
+ res.json(_buildDocView(doc))
+ }
}
-function peekDoc(req, res, next) {
+async function peekDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
logger.debug({ projectId, docId }, 'peeking doc')
- DocManager.peekDoc(projectId, docId, function (error, doc) {
- if (error) {
- return next(error)
- }
- if (doc == null) {
- res.sendStatus(404)
- } else {
- res.setHeader('x-doc-status', doc.inS3 ? 'archived' : 'active')
- res.json(_buildDocView(doc))
- }
- })
+ const doc = await DocManager.peekDoc(projectId, docId)
+ res.setHeader('x-doc-status', doc.inS3 ? 'archived' : 'active')
+ res.json(_buildDocView(doc))
}
-function isDocDeleted(req, res, next) {
+async function isDocDeleted(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
- DocManager.isDocDeleted(projectId, docId, function (error, deleted) {
- if (error) {
- return next(error)
- }
- res.json({ deleted })
- })
+ const deleted = await DocManager.isDocDeleted(projectId, docId)
+ res.json({ deleted })
}
-function getRawDoc(req, res, next) {
+async function getRawDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
logger.debug({ projectId, docId }, 'getting raw doc')
- DocManager.getDocLines(projectId, docId, function (error, doc) {
- if (error) {
- return next(error)
- }
- if (doc == null) {
- res.sendStatus(404)
- } else {
- res.setHeader('content-type', 'text/plain')
- res.send(_buildRawDocView(doc))
- }
- })
+ const content = await DocManager.getDocLines(projectId, docId)
+ res.setHeader('content-type', 'text/plain')
+ res.send(content)
}
-function getAllDocs(req, res, next) {
+async function getAllDocs(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'getting all docs')
- DocManager.getAllNonDeletedDocs(
- projectId,
- { lines: true, rev: true },
- function (error, docs) {
- if (docs == null) {
- docs = []
- }
- if (error) {
- return next(error)
- }
- const docViews = _buildDocsArrayView(projectId, docs)
- for (const docView of docViews) {
- if (!docView.lines) {
- logger.warn({ projectId, docId: docView._id }, 'missing doc lines')
- docView.lines = []
- }
- }
- res.json(docViews)
+ const docs = await DocManager.getAllNonDeletedDocs(projectId, {
+ lines: true,
+ rev: true,
+ })
+ const docViews = _buildDocsArrayView(projectId, docs)
+ for (const docView of docViews) {
+ if (!docView.lines) {
+ logger.warn({ projectId, docId: docView._id }, 'missing doc lines')
+ docView.lines = []
}
- )
+ }
+ res.json(docViews)
}
-function getAllDeletedDocs(req, res, next) {
+async function getAllDeletedDocs(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'getting all deleted docs')
- DocManager.getAllDeletedDocs(
- projectId,
- { name: true, deletedAt: true },
- function (error, docs) {
- if (error) {
- return next(error)
- }
- res.json(
- docs.map(doc => ({
- _id: doc._id.toString(),
- name: doc.name,
- deletedAt: doc.deletedAt,
- }))
- )
- }
+ const docs = await DocManager.getAllDeletedDocs(projectId, {
+ name: true,
+ deletedAt: true,
+ })
+ res.json(
+ docs.map(doc => ({
+ _id: doc._id.toString(),
+ name: doc.name,
+ deletedAt: doc.deletedAt,
+ }))
)
}
-function getAllRanges(req, res, next) {
+async function getAllRanges(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'getting all ranges')
- DocManager.getAllNonDeletedDocs(
- projectId,
- { ranges: true },
- function (error, docs) {
- if (docs == null) {
- docs = []
- }
- if (error) {
- return next(error)
- }
- res.json(_buildDocsArrayView(projectId, docs))
- }
- )
-}
-
-function projectHasRanges(req, res, next) {
- const { project_id: projectId } = req.params
- DocManager.projectHasRanges(projectId, (err, projectHasRanges) => {
- if (err) {
- return next(err)
- }
- res.json({ projectHasRanges })
+ const docs = await DocManager.getAllNonDeletedDocs(projectId, {
+ ranges: true,
})
+ res.json(_buildDocsArrayView(projectId, docs))
}
-function updateDoc(req, res, next) {
+async function getCommentThreadIds(req, res) {
+ const { project_id: projectId } = req.params
+ const threadIds = await DocManager.getCommentThreadIds(projectId)
+ res.json(threadIds)
+}
+
+async function getTrackedChangesUserIds(req, res) {
+ const { project_id: projectId } = req.params
+ const userIds = await DocManager.getTrackedChangesUserIds(projectId)
+ res.json(userIds)
+}
+
+async function projectHasRanges(req, res) {
+ const { project_id: projectId } = req.params
+ const projectHasRanges = await DocManager.projectHasRanges(projectId)
+ res.json({ projectHasRanges })
+}
+
+async function updateDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
const lines = req.body?.lines
const version = req.body?.version
@@ -172,25 +133,20 @@ function updateDoc(req, res, next) {
}
logger.debug({ projectId, docId }, 'got http request to update doc')
- DocManager.updateDoc(
+ const { modified, rev } = await DocManager.updateDoc(
projectId,
docId,
lines,
version,
- ranges,
- function (error, modified, rev) {
- if (error) {
- return next(error)
- }
- res.json({
- modified,
- rev,
- })
- }
+ ranges
)
+ res.json({
+ modified,
+ rev,
+ })
}
-function patchDoc(req, res, next) {
+async function patchDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
logger.debug({ projectId, docId }, 'patching doc')
@@ -203,12 +159,8 @@ function patchDoc(req, res, next) {
logger.fatal({ field }, 'joi validation for pathDoc is broken')
}
})
- DocManager.patchDoc(projectId, docId, meta, function (error) {
- if (error) {
- return next(error)
- }
- res.sendStatus(204)
- })
+ await DocManager.patchDoc(projectId, docId, meta)
+ res.sendStatus(204)
}
function _buildDocView(doc) {
@@ -221,10 +173,6 @@ function _buildDocView(doc) {
return docView
}
-function _buildRawDocView(doc) {
- return (doc?.lines ?? []).join('\n')
-}
-
function _buildDocsArrayView(projectId, docs) {
const docViews = []
for (const doc of docs) {
@@ -241,79 +189,69 @@ function _buildDocsArrayView(projectId, docs) {
return docViews
}
-function archiveAllDocs(req, res, next) {
+async function archiveAllDocs(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'archiving all docs')
- DocArchive.archiveAllDocs(projectId, function (error) {
- if (error) {
- return next(error)
- }
- res.sendStatus(204)
- })
+ await DocArchive.archiveAllDocs(projectId)
+ res.sendStatus(204)
}
-function archiveDoc(req, res, next) {
+async function archiveDoc(req, res) {
const { doc_id: docId, project_id: projectId } = req.params
logger.debug({ projectId, docId }, 'archiving a doc')
- DocArchive.archiveDoc(projectId, docId, function (error) {
- if (error) {
- return next(error)
- }
- res.sendStatus(204)
- })
+ await DocArchive.archiveDoc(projectId, docId)
+ res.sendStatus(204)
}
-function unArchiveAllDocs(req, res, next) {
+async function unArchiveAllDocs(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'unarchiving all docs')
- DocArchive.unArchiveAllDocs(projectId, function (err) {
- if (err) {
- if (err instanceof Errors.DocRevValueError) {
- logger.warn({ err }, 'Failed to unarchive doc')
- return res.sendStatus(409)
- }
- return next(err)
+ try {
+ await DocArchive.unArchiveAllDocs(projectId)
+ } catch (err) {
+ if (err instanceof Errors.DocRevValueError) {
+ logger.warn({ err }, 'Failed to unarchive doc')
+ return res.sendStatus(409)
}
- res.sendStatus(200)
- })
+ throw err
+ }
+ res.sendStatus(200)
}
-function destroyProject(req, res, next) {
+async function destroyProject(req, res) {
const { project_id: projectId } = req.params
logger.debug({ projectId }, 'destroying all docs')
- DocArchive.destroyProject(projectId, function (error) {
- if (error) {
- return next(error)
- }
- res.sendStatus(204)
- })
+ await DocArchive.destroyProject(projectId)
+ res.sendStatus(204)
}
-function healthCheck(req, res) {
- HealthChecker.check(function (err) {
- if (err) {
- logger.err({ err }, 'error performing health check')
- res.sendStatus(500)
- } else {
- res.sendStatus(200)
- }
- })
+async function healthCheck(req, res) {
+ try {
+ await HealthChecker.check()
+ } catch (err) {
+ logger.err({ err }, 'error performing health check')
+ res.sendStatus(500)
+ return
+ }
+ res.sendStatus(200)
}
module.exports = {
- getDoc,
- peekDoc,
- isDocDeleted,
- getRawDoc,
- getAllDocs,
- getAllDeletedDocs,
- getAllRanges,
- projectHasRanges,
- updateDoc,
- patchDoc,
- archiveAllDocs,
- archiveDoc,
- unArchiveAllDocs,
- destroyProject,
- healthCheck,
+ getDoc: expressify(getDoc),
+ peekDoc: expressify(peekDoc),
+ isDocDeleted: expressify(isDocDeleted),
+ getRawDoc: expressify(getRawDoc),
+ getAllDocs: expressify(getAllDocs),
+ getAllDeletedDocs: expressify(getAllDeletedDocs),
+ getAllRanges: expressify(getAllRanges),
+ getTrackedChangesUserIds: expressify(getTrackedChangesUserIds),
+ getCommentThreadIds: expressify(getCommentThreadIds),
+ projectHasRanges: expressify(projectHasRanges),
+ updateDoc: expressify(updateDoc),
+ patchDoc: expressify(patchDoc),
+ archiveAllDocs: expressify(archiveAllDocs),
+ archiveDoc: expressify(archiveDoc),
+ unArchiveAllDocs: expressify(unArchiveAllDocs),
+ destroyProject: expressify(destroyProject),
+ healthCheck: expressify(healthCheck),
}
diff --git a/services/docstore/app/js/MongoManager.js b/services/docstore/app/js/MongoManager.js
index 87d8af8a1b..ef101f91c0 100644
--- a/services/docstore/app/js/MongoManager.js
+++ b/services/docstore/app/js/MongoManager.js
@@ -1,7 +1,6 @@
const { db, ObjectId } = require('./mongodb')
const Settings = require('@overleaf/settings')
const Errors = require('./Errors')
-const { callbackify } = require('util')
const ARCHIVING_LOCK_DURATION_MS = Settings.archivingLockDurationMs
@@ -241,34 +240,17 @@ async function destroyProject(projectId) {
}
module.exports = {
- findDoc: callbackify(findDoc),
- getProjectsDeletedDocs: callbackify(getProjectsDeletedDocs),
- getProjectsDocs: callbackify(getProjectsDocs),
- getArchivedProjectDocs: callbackify(getArchivedProjectDocs),
- getNonArchivedProjectDocIds: callbackify(getNonArchivedProjectDocIds),
- getNonDeletedArchivedProjectDocs: callbackify(
- getNonDeletedArchivedProjectDocs
- ),
- upsertIntoDocCollection: callbackify(upsertIntoDocCollection),
- restoreArchivedDoc: callbackify(restoreArchivedDoc),
- patchDoc: callbackify(patchDoc),
- getDocForArchiving: callbackify(getDocForArchiving),
- markDocAsArchived: callbackify(markDocAsArchived),
- checkRevUnchanged: callbackify(checkRevUnchanged),
- destroyProject: callbackify(destroyProject),
- promises: {
- findDoc,
- getProjectsDeletedDocs,
- getProjectsDocs,
- getArchivedProjectDocs,
- getNonArchivedProjectDocIds,
- getNonDeletedArchivedProjectDocs,
- upsertIntoDocCollection,
- restoreArchivedDoc,
- patchDoc,
- getDocForArchiving,
- markDocAsArchived,
- checkRevUnchanged,
- destroyProject,
- },
+ findDoc,
+ getProjectsDeletedDocs,
+ getProjectsDocs,
+ getArchivedProjectDocs,
+ getNonArchivedProjectDocIds,
+ getNonDeletedArchivedProjectDocs,
+ upsertIntoDocCollection,
+ restoreArchivedDoc,
+ patchDoc,
+ getDocForArchiving,
+ markDocAsArchived,
+ checkRevUnchanged,
+ destroyProject,
}
diff --git a/services/docstore/app/js/RangeManager.js b/services/docstore/app/js/RangeManager.js
index f36f68fe35..2fbadf9468 100644
--- a/services/docstore/app/js/RangeManager.js
+++ b/services/docstore/app/js/RangeManager.js
@@ -49,15 +49,25 @@ module.exports = RangeManager = {
updateMetadata(change.metadata)
}
for (const comment of Array.from(ranges.comments || [])) {
- comment.id = RangeManager._safeObjectId(comment.id)
- if ((comment.op != null ? comment.op.t : undefined) != null) {
- comment.op.t = RangeManager._safeObjectId(comment.op.t)
- }
+ // Two bugs resulted in mismatched ids, prefer the thread id from the op: https://github.com/overleaf/internal/issues/23272
+ comment.id = RangeManager._safeObjectId(comment.op?.t || comment.id)
+ if (comment.op) comment.op.t = comment.id
+
+ // resolved property is added to comments when they are obtained from history, but this state doesn't belong in mongo docs collection
+ // more info: https://github.com/overleaf/internal/issues/24371#issuecomment-2913095174
+ delete comment.op?.resolved
updateMetadata(comment.metadata)
}
return ranges
},
+ fixCommentIds(doc) {
+ for (const comment of doc?.ranges?.comments || []) {
+ // Two bugs resulted in mismatched ids, prefer the thread id from the op: https://github.com/overleaf/internal/issues/23272
+ if (comment.op?.t) comment.id = comment.op.t
+ }
+ },
+
_safeObjectId(data) {
try {
return new ObjectId(data)
diff --git a/services/docstore/app/js/StreamToBuffer.js b/services/docstore/app/js/StreamToBuffer.js
new file mode 100644
index 0000000000..09215a7367
--- /dev/null
+++ b/services/docstore/app/js/StreamToBuffer.js
@@ -0,0 +1,24 @@
+const { LoggerStream, WritableBuffer } = require('@overleaf/stream-utils')
+const Settings = require('@overleaf/settings')
+const logger = require('@overleaf/logger/logging-manager')
+const { pipeline } = require('node:stream/promises')
+
+module.exports = {
+ streamToBuffer,
+}
+
+async function streamToBuffer(projectId, docId, stream) {
+ const loggerTransform = new LoggerStream(
+ Settings.max_doc_length,
+ (size, isFlush) => {
+ logger.warn(
+ { projectId, docId, size, finishedReading: isFlush },
+ 'potentially large doc pulled down from gcs'
+ )
+ }
+ )
+
+ const buffer = new WritableBuffer()
+ await pipeline(stream, loggerTransform, buffer)
+ return buffer.contents()
+}
diff --git a/services/docstore/buildscript.txt b/services/docstore/buildscript.txt
index be2a937cd7..4526aa959c 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=18.20.2
+--node-version=22.17.0
--public-repo=True
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/services/docstore/config/settings.defaults.js b/services/docstore/config/settings.defaults.js
index b91cdc87ec..9ad506a9bd 100644
--- a/services/docstore/config/settings.defaults.js
+++ b/services/docstore/config/settings.defaults.js
@@ -1,5 +1,9 @@
-const http = require('http')
+const http = require('node:http')
+const https = require('node:https')
+
http.globalAgent.maxSockets = 300
+http.globalAgent.keepAlive = false
+https.globalAgent.keepAlive = false
const Settings = {
internal: {
diff --git a/services/docstore/docker-compose.ci.yml b/services/docstore/docker-compose.ci.yml
index a8847e8996..cdb4783c5a 100644
--- a/services/docstore/docker-compose.ci.yml
+++ b/services/docstore/docker-compose.ci.yml
@@ -27,12 +27,15 @@ services:
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
+ volumes:
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
gcs:
condition: service_healthy
user: node
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@@ -44,12 +47,17 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
gcs:
image: fsouza/fake-gcs-server:1.45.2
command: ["--port=9090", "--scheme=http"]
diff --git a/services/docstore/docker-compose.yml b/services/docstore/docker-compose.yml
index 4555d6ed54..a9099c7e7b 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:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/docstore
- ../../node_modules:/overleaf/node_modules
@@ -14,17 +14,19 @@ services:
working_dir: /overleaf/services/docstore
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
user: node
test_acceptance:
- image: node:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/docstore
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/docstore
environment:
ELASTIC_SEARCH_DSN: es:9200
@@ -34,24 +36,30 @@ services:
GCS_PROJECT_ID: fake
STORAGE_EMULATOR_HOST: http://gcs:9090/storage/v1
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
user: node
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
gcs:
condition: service_healthy
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
gcs:
image: fsouza/fake-gcs-server:1.45.2
diff --git a/services/docstore/package.json b/services/docstore/package.json
index 5ffd892f09..bf5857fd49 100644
--- a/services/docstore/package.json
+++ b/services/docstore/package.json
@@ -11,12 +11,13 @@
"test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
"nodemon": "node --watch app.js",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"lint:fix": "eslint --fix .",
"types:check": "tsc --noEmit"
},
"dependencies": {
+ "@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
"@overleaf/o-error": "*",
@@ -28,9 +29,9 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"celebrate": "^15.0.3",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
"p-map": "^4.0.0",
"request": "^2.88.2"
},
@@ -38,7 +39,7 @@
"@google-cloud/storage": "^6.10.1",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "~2.0.4",
"sinon": "~9.0.2",
"sinon-chai": "^3.7.0",
diff --git a/services/docstore/test/acceptance/deps/healthcheck.sh b/services/docstore/test/acceptance/deps/healthcheck.sh
index cd19cea637..675c205be6 100644
--- a/services/docstore/test/acceptance/deps/healthcheck.sh
+++ b/services/docstore/test/acceptance/deps/healthcheck.sh
@@ -1,9 +1,9 @@
#!/bin/sh
# health check to allow 404 status code as valid
-STATUSCODE=$(curl --silent --output /dev/null --write-out "%{http_code}" $1)
+STATUSCODE=$(curl --silent --output /dev/null --write-out "%{http_code}" "$1")
# will be 000 on non-http error (e.g. connection failure)
-if test $STATUSCODE -ge 500 || test $STATUSCODE -lt 200; then
+if test "$STATUSCODE" -ge 500 || test "$STATUSCODE" -lt 200; then
exit 1
fi
exit 0
diff --git a/services/docstore/test/acceptance/js/ArchiveDocsTests.js b/services/docstore/test/acceptance/js/ArchiveDocsTests.js
index f85b845a18..7e254c7e84 100644
--- a/services/docstore/test/acceptance/js/ArchiveDocsTests.js
+++ b/services/docstore/test/acceptance/js/ArchiveDocsTests.js
@@ -399,7 +399,7 @@ describe('Archiving', function () {
this.project_id = new ObjectId()
this.timeout(1000 * 30)
const quarterMegInBytes = 250000
- const bigLine = require('crypto')
+ const bigLine = require('node:crypto')
.randomBytes(quarterMegInBytes)
.toString('hex')
this.doc = {
@@ -1001,6 +1001,15 @@ describe('Archiving', function () {
},
version: 2,
}
+ this.fixedRanges = {
+ ...this.doc.ranges,
+ comments: [
+ {
+ ...this.doc.ranges.comments[0],
+ id: this.doc.ranges.comments[0].op.t,
+ },
+ ],
+ }
return DocstoreClient.createDoc(
this.project_id,
this.doc._id,
@@ -1048,7 +1057,7 @@ describe('Archiving', function () {
throw error
}
s3Doc.lines.should.deep.equal(this.doc.lines)
- const ranges = JSON.parse(JSON.stringify(this.doc.ranges)) // ObjectId -> String
+ const ranges = JSON.parse(JSON.stringify(this.fixedRanges)) // ObjectId -> String
s3Doc.ranges.should.deep.equal(ranges)
return done()
}
@@ -1075,7 +1084,7 @@ describe('Archiving', function () {
throw error
}
doc.lines.should.deep.equal(this.doc.lines)
- doc.ranges.should.deep.equal(this.doc.ranges)
+ doc.ranges.should.deep.equal(this.fixedRanges)
expect(doc.inS3).not.to.exist
return done()
})
diff --git a/services/docstore/test/acceptance/js/GettingAllDocsTests.js b/services/docstore/test/acceptance/js/GettingAllDocsTests.js
index 8fe5e7d91b..57851b2c3b 100644
--- a/services/docstore/test/acceptance/js/GettingAllDocsTests.js
+++ b/services/docstore/test/acceptance/js/GettingAllDocsTests.js
@@ -20,30 +20,73 @@ const DocstoreClient = require('./helpers/DocstoreClient')
describe('Getting all docs', function () {
beforeEach(function (done) {
this.project_id = new ObjectId()
+ this.threadId1 = new ObjectId().toString()
+ this.threadId2 = new ObjectId().toString()
this.docs = [
{
_id: new ObjectId(),
lines: ['one', 'two', 'three'],
- ranges: { mock: 'one' },
+ ranges: {
+ comments: [
+ { id: new ObjectId().toString(), op: { t: this.threadId1 } },
+ ],
+ changes: [
+ {
+ id: new ObjectId().toString(),
+ metadata: { user_id: 'user-id-1' },
+ },
+ ],
+ },
rev: 2,
},
{
_id: new ObjectId(),
lines: ['aaa', 'bbb', 'ccc'],
- ranges: { mock: 'two' },
+ ranges: {
+ changes: [
+ {
+ id: new ObjectId().toString(),
+ metadata: { user_id: 'user-id-2' },
+ },
+ ],
+ },
rev: 4,
},
{
_id: new ObjectId(),
lines: ['111', '222', '333'],
- ranges: { mock: 'three' },
+ ranges: {
+ comments: [
+ { id: new ObjectId().toString(), op: { t: this.threadId2 } },
+ ],
+ changes: [
+ {
+ id: new ObjectId().toString(),
+ metadata: { user_id: 'anonymous-user' },
+ },
+ ],
+ },
rev: 6,
},
]
+ this.fixedRanges = this.docs.map(doc => {
+ if (!doc.ranges?.comments?.length) return doc.ranges
+ return {
+ ...doc.ranges,
+ comments: [
+ { ...doc.ranges.comments[0], id: doc.ranges.comments[0].op.t },
+ ],
+ }
+ })
this.deleted_doc = {
_id: new ObjectId(),
lines: ['deleted'],
- ranges: { mock: 'four' },
+ ranges: {
+ comments: [{ id: new ObjectId().toString(), op: { t: 'thread-id-3' } }],
+ changes: [
+ { id: new ObjectId().toString(), metadata: { user_id: 'user-id-3' } },
+ ],
+ },
rev: 8,
}
const version = 42
@@ -96,7 +139,7 @@ describe('Getting all docs', function () {
})
})
- return it('getAllRanges should return all the (non-deleted) doc ranges', function (done) {
+ it('getAllRanges should return all the (non-deleted) doc ranges', function (done) {
return DocstoreClient.getAllRanges(this.project_id, (error, res, docs) => {
if (error != null) {
throw error
@@ -104,9 +147,38 @@ describe('Getting all docs', function () {
docs.length.should.equal(this.docs.length)
for (let i = 0; i < docs.length; i++) {
const doc = docs[i]
- doc.ranges.should.deep.equal(this.docs[i].ranges)
+ doc.ranges.should.deep.equal(this.fixedRanges[i])
}
return done()
})
})
+
+ it('getTrackedChangesUserIds should return all the user ids from (non-deleted) ranges', function (done) {
+ DocstoreClient.getTrackedChangesUserIds(
+ this.project_id,
+ (error, res, userIds) => {
+ if (error != null) {
+ throw error
+ }
+ userIds.should.deep.equal(['user-id-1', 'user-id-2'])
+ done()
+ }
+ )
+ })
+
+ it('getCommentThreadIds should return all the thread ids from (non-deleted) ranges', function (done) {
+ DocstoreClient.getCommentThreadIds(
+ this.project_id,
+ (error, res, threadIds) => {
+ if (error != null) {
+ throw error
+ }
+ threadIds.should.deep.equal({
+ [this.docs[0]._id.toString()]: [this.threadId1],
+ [this.docs[2]._id.toString()]: [this.threadId2],
+ })
+ done()
+ }
+ )
+ })
})
diff --git a/services/docstore/test/acceptance/js/GettingDocsTests.js b/services/docstore/test/acceptance/js/GettingDocsTests.js
index 121b3c1e24..1cfc53c5c6 100644
--- a/services/docstore/test/acceptance/js/GettingDocsTests.js
+++ b/services/docstore/test/acceptance/js/GettingDocsTests.js
@@ -28,10 +28,26 @@ describe('Getting a doc', function () {
op: { i: 'foo', p: 3 },
meta: {
user_id: new ObjectId().toString(),
- ts: new Date().toString(),
+ ts: new Date().toJSON(),
},
},
],
+ comments: [
+ {
+ id: new ObjectId().toString(),
+ op: { c: 'comment', p: 1, t: new ObjectId().toString() },
+ metadata: {
+ user_id: new ObjectId().toString(),
+ ts: new Date().toJSON(),
+ },
+ },
+ ],
+ }
+ this.fixedRanges = {
+ ...this.ranges,
+ comments: [
+ { ...this.ranges.comments[0], id: this.ranges.comments[0].op.t },
+ ],
}
return DocstoreApp.ensureRunning(() => {
return DocstoreClient.createDoc(
@@ -60,7 +76,7 @@ describe('Getting a doc', function () {
if (error) return done(error)
doc.lines.should.deep.equal(this.lines)
doc.version.should.equal(this.version)
- doc.ranges.should.deep.equal(this.ranges)
+ doc.ranges.should.deep.equal(this.fixedRanges)
return done()
}
)
@@ -114,7 +130,7 @@ describe('Getting a doc', function () {
if (error) return done(error)
doc.lines.should.deep.equal(this.lines)
doc.version.should.equal(this.version)
- doc.ranges.should.deep.equal(this.ranges)
+ doc.ranges.should.deep.equal(this.fixedRanges)
doc.deleted.should.equal(true)
return done()
}
diff --git a/services/docstore/test/acceptance/js/HealthCheckerTest.js b/services/docstore/test/acceptance/js/HealthCheckerTest.js
new file mode 100644
index 0000000000..b25a45312b
--- /dev/null
+++ b/services/docstore/test/acceptance/js/HealthCheckerTest.js
@@ -0,0 +1,28 @@
+const { db } = require('../../../app/js/mongodb')
+const DocstoreApp = require('./helpers/DocstoreApp')
+const DocstoreClient = require('./helpers/DocstoreClient')
+const { expect } = require('chai')
+
+describe('HealthChecker', function () {
+ beforeEach('start', function (done) {
+ DocstoreApp.ensureRunning(done)
+ })
+ beforeEach('clear docs collection', async function () {
+ await db.docs.deleteMany({})
+ })
+ let res
+ beforeEach('run health check', function (done) {
+ DocstoreClient.healthCheck((err, _res) => {
+ res = _res
+ done(err)
+ })
+ })
+
+ it('should return 200', function () {
+ res.statusCode.should.equal(200)
+ })
+
+ it('should not leave any cruft behind', async function () {
+ expect(await db.docs.find({}).toArray()).to.deep.equal([])
+ })
+})
diff --git a/services/docstore/test/acceptance/js/helpers/DocstoreApp.js b/services/docstore/test/acceptance/js/helpers/DocstoreApp.js
index 03db0ea322..5e837b1277 100644
--- a/services/docstore/test/acceptance/js/helpers/DocstoreApp.js
+++ b/services/docstore/test/acceptance/js/helpers/DocstoreApp.js
@@ -1,5 +1,4 @@
const app = require('../../../../app')
-require('@overleaf/logger').logger.level('error')
const settings = require('@overleaf/settings')
module.exports = {
diff --git a/services/docstore/test/acceptance/js/helpers/DocstoreClient.js b/services/docstore/test/acceptance/js/helpers/DocstoreClient.js
index 790ec8f237..cb8bce2579 100644
--- a/services/docstore/test/acceptance/js/helpers/DocstoreClient.js
+++ b/services/docstore/test/acceptance/js/helpers/DocstoreClient.js
@@ -100,6 +100,26 @@ module.exports = DocstoreClient = {
)
},
+ getCommentThreadIds(projectId, callback) {
+ request.get(
+ {
+ url: `http://127.0.0.1:${settings.internal.docstore.port}/project/${projectId}/comment-thread-ids`,
+ json: true,
+ },
+ callback
+ )
+ },
+
+ getTrackedChangesUserIds(projectId, callback) {
+ request.get(
+ {
+ url: `http://127.0.0.1:${settings.internal.docstore.port}/project/${projectId}/tracked-changes-user-ids`,
+ json: true,
+ },
+ callback
+ )
+ },
+
updateDoc(projectId, docId, lines, version, ranges, callback) {
return request.post(
{
@@ -181,6 +201,13 @@ module.exports = DocstoreClient = {
)
},
+ healthCheck(callback) {
+ request.get(
+ `http://127.0.0.1:${settings.internal.docstore.port}/health_check`,
+ callback
+ )
+ },
+
getS3Doc(projectId, docId, callback) {
getStringFromPersistor(
Persistor,
diff --git a/services/docstore/test/setup.js b/services/docstore/test/setup.js
index 809624a2ee..92b86c9384 100644
--- a/services/docstore/test/setup.js
+++ b/services/docstore/test/setup.js
@@ -3,7 +3,7 @@ const sinon = require('sinon')
const sinonChai = require('sinon-chai')
const chaiAsPromised = require('chai-as-promised')
const SandboxedModule = require('sandboxed-module')
-const timersPromises = require('timers/promises')
+const timersPromises = require('node:timers/promises')
// ensure every ObjectId has the id string as a property for correct comparisons
require('mongodb-legacy').ObjectId.cacheHexString = true
@@ -37,6 +37,11 @@ SandboxedModule.configure({
'mongodb-legacy': require('mongodb-legacy'),
},
globals: { Buffer, JSON, Math, console, process },
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
exports.mochaHooks = {
diff --git a/services/docstore/test/unit/js/DocArchiveManagerTests.js b/services/docstore/test/unit/js/DocArchiveManagerTests.js
index 13046d86fc..2ec1cb2016 100644
--- a/services/docstore/test/unit/js/DocArchiveManagerTests.js
+++ b/services/docstore/test/unit/js/DocArchiveManagerTests.js
@@ -4,6 +4,7 @@ const modulePath = '../../../app/js/DocArchiveManager.js'
const SandboxedModule = require('sandboxed-module')
const { ObjectId } = require('mongodb-legacy')
const Errors = require('../../../app/js/Errors')
+const StreamToBuffer = require('../../../app/js/StreamToBuffer')
describe('DocArchiveManager', function () {
let DocArchiveManager,
@@ -22,13 +23,15 @@ describe('DocArchiveManager', function () {
md5Sum,
projectId,
readStream,
- stream
+ stream,
+ streamToBuffer
beforeEach(function () {
md5Sum = 'decafbad'
RangeManager = {
jsonRangesToMongo: sinon.stub().returns({ mongo: 'ranges' }),
+ fixCommentIds: sinon.stub(),
}
Settings = {
docstore: {
@@ -140,17 +143,33 @@ describe('DocArchiveManager', function () {
}
MongoManager = {
- promises: {
- markDocAsArchived: sinon.stub().resolves(),
- restoreArchivedDoc: sinon.stub().resolves(),
- upsertIntoDocCollection: sinon.stub().resolves(),
- getProjectsDocs: sinon.stub().resolves(mongoDocs),
- getNonDeletedArchivedProjectDocs: getArchivedProjectDocs,
- getNonArchivedProjectDocIds,
- getArchivedProjectDocs,
- findDoc: sinon.stub().callsFake(fakeGetDoc),
- getDocForArchiving: sinon.stub().callsFake(fakeGetDoc),
- destroyProject: sinon.stub().resolves(),
+ markDocAsArchived: sinon.stub().resolves(),
+ restoreArchivedDoc: sinon.stub().resolves(),
+ upsertIntoDocCollection: sinon.stub().resolves(),
+ getProjectsDocs: sinon.stub().resolves(mongoDocs),
+ getNonDeletedArchivedProjectDocs: getArchivedProjectDocs,
+ getNonArchivedProjectDocIds,
+ getArchivedProjectDocs,
+ findDoc: sinon.stub().callsFake(fakeGetDoc),
+ getDocForArchiving: sinon.stub().callsFake(fakeGetDoc),
+ destroyProject: sinon.stub().resolves(),
+ }
+
+ // Wrap streamToBuffer so that we can pass in something that it expects (in
+ // this case, a Promise) rather than a stubbed stream object
+ streamToBuffer = {
+ streamToBuffer: async () => {
+ const inputStream = new Promise(resolve => {
+ stream.on('data', data => resolve(data))
+ })
+
+ const value = await StreamToBuffer.streamToBuffer(
+ 'testProjectId',
+ 'testDocId',
+ inputStream
+ )
+
+ return value
},
}
@@ -163,15 +182,20 @@ describe('DocArchiveManager', function () {
'./RangeManager': RangeManager,
'./PersistorManager': PersistorManager,
'./Errors': Errors,
+ './StreamToBuffer': streamToBuffer,
},
})
})
describe('archiveDoc', function () {
it('should resolve when passed a valid document', async function () {
- await expect(
- DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
- ).to.eventually.be.fulfilled
+ await expect(DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)).to
+ .eventually.be.fulfilled
+ })
+
+ it('should fix comment ids', async function () {
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[1]._id)
+ expect(RangeManager.fixCommentIds).to.have.been.called
})
it('should throw an error if the doc has no lines', async function () {
@@ -179,26 +203,26 @@ describe('DocArchiveManager', function () {
doc.lines = null
await expect(
- DocArchiveManager.promises.archiveDoc(projectId, doc._id)
+ DocArchiveManager.archiveDoc(projectId, doc._id)
).to.eventually.be.rejectedWith('doc has no lines')
})
it('should add the schema version', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[1]._id)
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[1]._id)
expect(StreamUtils.ReadableString).to.have.been.calledWith(
sinon.match(/"schema_v":1/)
)
})
it('should calculate the hex md5 sum of the content', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
expect(Crypto.createHash).to.have.been.calledWith('md5')
expect(HashUpdate).to.have.been.calledWith(archivedDocJson)
expect(HashDigest).to.have.been.calledWith('hex')
})
it('should pass the md5 hash to the object persistor for verification', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
expect(PersistorManager.sendStream).to.have.been.calledWith(
sinon.match.any,
@@ -209,7 +233,7 @@ describe('DocArchiveManager', function () {
})
it('should pass the correct bucket and key to the persistor', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
expect(PersistorManager.sendStream).to.have.been.calledWith(
Settings.docstore.bucket,
@@ -218,7 +242,7 @@ describe('DocArchiveManager', function () {
})
it('should create a stream from the encoded json and send it', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
expect(StreamUtils.ReadableString).to.have.been.calledWith(
archivedDocJson
)
@@ -230,8 +254,8 @@ describe('DocArchiveManager', function () {
})
it('should mark the doc as archived', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
- expect(MongoManager.promises.markDocAsArchived).to.have.been.calledWith(
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
+ expect(MongoManager.markDocAsArchived).to.have.been.calledWith(
projectId,
mongoDocs[0]._id,
mongoDocs[0].rev
@@ -244,8 +268,8 @@ describe('DocArchiveManager', function () {
})
it('should bail out early', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
- expect(MongoManager.promises.getDocForArchiving).to.not.have.been.called
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
+ expect(MongoManager.getDocForArchiving).to.not.have.been.called
})
})
@@ -262,7 +286,7 @@ describe('DocArchiveManager', function () {
it('should return an error', async function () {
await expect(
- DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
+ DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
).to.eventually.be.rejectedWith('null bytes detected')
})
})
@@ -273,21 +297,19 @@ describe('DocArchiveManager', function () {
describe('when the doc is in S3', function () {
beforeEach(function () {
- MongoManager.promises.findDoc = sinon
- .stub()
- .resolves({ inS3: true, rev })
+ MongoManager.findDoc = sinon.stub().resolves({ inS3: true, rev })
docId = mongoDocs[0]._id
lines = ['doc', 'lines']
rev = 123
})
it('should resolve when passed a valid document', async function () {
- await expect(DocArchiveManager.promises.unarchiveDoc(projectId, docId))
- .to.eventually.be.fulfilled
+ await expect(DocArchiveManager.unarchiveDoc(projectId, docId)).to
+ .eventually.be.fulfilled
})
it('should test md5 validity with the raw buffer', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
expect(HashUpdate).to.have.been.calledWith(
sinon.match.instanceOf(Buffer)
)
@@ -296,15 +318,17 @@ describe('DocArchiveManager', function () {
it('should throw an error if the md5 does not match', async function () {
PersistorManager.getObjectMd5Hash.resolves('badf00d')
await expect(
- DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ DocArchiveManager.unarchiveDoc(projectId, docId)
).to.eventually.be.rejected.and.be.instanceof(Errors.Md5MismatchError)
})
it('should restore the doc in Mongo', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
- expect(
- MongoManager.promises.restoreArchivedDoc
- ).to.have.been.calledWith(projectId, docId, archivedDoc)
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
+ expect(MongoManager.restoreArchivedDoc).to.have.been.calledWith(
+ projectId,
+ docId,
+ archivedDoc
+ )
})
describe('when archiving is not configured', function () {
@@ -314,15 +338,15 @@ describe('DocArchiveManager', function () {
it('should error out on archived doc', async function () {
await expect(
- DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ DocArchiveManager.unarchiveDoc(projectId, docId)
).to.eventually.be.rejected.and.match(
/found archived doc, but archiving backend is not configured/
)
})
it('should return early on non-archived doc', async function () {
- MongoManager.promises.findDoc = sinon.stub().resolves({ rev })
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ MongoManager.findDoc = sinon.stub().resolves({ rev })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
expect(PersistorManager.getObjectMd5Hash).to.not.have.been.called
})
})
@@ -340,10 +364,12 @@ describe('DocArchiveManager', function () {
})
it('should return the docs lines', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
- expect(
- MongoManager.promises.restoreArchivedDoc
- ).to.have.been.calledWith(projectId, docId, { lines, rev })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
+ expect(MongoManager.restoreArchivedDoc).to.have.been.calledWith(
+ projectId,
+ docId,
+ { lines, rev }
+ )
})
})
@@ -362,14 +388,16 @@ describe('DocArchiveManager', function () {
})
it('should return the doc lines and ranges', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
- expect(
- MongoManager.promises.restoreArchivedDoc
- ).to.have.been.calledWith(projectId, docId, {
- lines,
- ranges: { mongo: 'ranges' },
- rev: 456,
- })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
+ expect(MongoManager.restoreArchivedDoc).to.have.been.calledWith(
+ projectId,
+ docId,
+ {
+ lines,
+ ranges: { mongo: 'ranges' },
+ rev: 456,
+ }
+ )
})
})
@@ -383,10 +411,12 @@ describe('DocArchiveManager', function () {
})
it('should return only the doc lines', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
- expect(
- MongoManager.promises.restoreArchivedDoc
- ).to.have.been.calledWith(projectId, docId, { lines, rev: 456 })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
+ expect(MongoManager.restoreArchivedDoc).to.have.been.calledWith(
+ projectId,
+ docId,
+ { lines, rev: 456 }
+ )
})
})
@@ -400,10 +430,12 @@ describe('DocArchiveManager', function () {
})
it('should use the rev obtained from Mongo', async function () {
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
- expect(
- MongoManager.promises.restoreArchivedDoc
- ).to.have.been.calledWith(projectId, docId, { lines, rev })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
+ expect(MongoManager.restoreArchivedDoc).to.have.been.calledWith(
+ projectId,
+ docId,
+ { lines, rev }
+ )
})
})
@@ -418,7 +450,7 @@ describe('DocArchiveManager', function () {
it('should throw an error', async function () {
await expect(
- DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ DocArchiveManager.unarchiveDoc(projectId, docId)
).to.eventually.be.rejectedWith(
"I don't understand the doc format in s3"
)
@@ -428,8 +460,8 @@ describe('DocArchiveManager', function () {
})
it('should not do anything if the file is already unarchived', async function () {
- MongoManager.promises.findDoc.resolves({ inS3: false })
- await DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ MongoManager.findDoc.resolves({ inS3: false })
+ await DocArchiveManager.unarchiveDoc(projectId, docId)
expect(PersistorManager.getObjectStream).not.to.have.been.called
})
@@ -438,7 +470,7 @@ describe('DocArchiveManager', function () {
.stub()
.rejects(new Errors.NotFoundError())
await expect(
- DocArchiveManager.promises.unarchiveDoc(projectId, docId)
+ DocArchiveManager.unarchiveDoc(projectId, docId)
).to.eventually.be.rejected.and.be.instanceof(Errors.NotFoundError)
})
})
@@ -446,13 +478,11 @@ describe('DocArchiveManager', function () {
describe('destroyProject', function () {
describe('when archiving is enabled', function () {
beforeEach(async function () {
- await DocArchiveManager.promises.destroyProject(projectId)
+ await DocArchiveManager.destroyProject(projectId)
})
it('should delete the project in Mongo', function () {
- expect(MongoManager.promises.destroyProject).to.have.been.calledWith(
- projectId
- )
+ expect(MongoManager.destroyProject).to.have.been.calledWith(projectId)
})
it('should delete the project in the persistor', function () {
@@ -466,13 +496,11 @@ describe('DocArchiveManager', function () {
describe('when archiving is disabled', function () {
beforeEach(async function () {
Settings.docstore.backend = ''
- await DocArchiveManager.promises.destroyProject(projectId)
+ await DocArchiveManager.destroyProject(projectId)
})
it('should delete the project in Mongo', function () {
- expect(MongoManager.promises.destroyProject).to.have.been.calledWith(
- projectId
- )
+ expect(MongoManager.destroyProject).to.have.been.calledWith(projectId)
})
it('should not delete the project in the persistor', function () {
@@ -483,33 +511,35 @@ describe('DocArchiveManager', function () {
describe('archiveAllDocs', function () {
it('should resolve with valid arguments', async function () {
- await expect(DocArchiveManager.promises.archiveAllDocs(projectId)).to
- .eventually.be.fulfilled
+ await expect(DocArchiveManager.archiveAllDocs(projectId)).to.eventually.be
+ .fulfilled
})
it('should archive all project docs which are not in s3', async function () {
- await DocArchiveManager.promises.archiveAllDocs(projectId)
+ await DocArchiveManager.archiveAllDocs(projectId)
// not inS3
- expect(MongoManager.promises.markDocAsArchived).to.have.been.calledWith(
+ expect(MongoManager.markDocAsArchived).to.have.been.calledWith(
projectId,
mongoDocs[0]._id
)
- expect(MongoManager.promises.markDocAsArchived).to.have.been.calledWith(
+ expect(MongoManager.markDocAsArchived).to.have.been.calledWith(
projectId,
mongoDocs[1]._id
)
- expect(MongoManager.promises.markDocAsArchived).to.have.been.calledWith(
+ expect(MongoManager.markDocAsArchived).to.have.been.calledWith(
projectId,
mongoDocs[4]._id
)
// inS3
- expect(
- MongoManager.promises.markDocAsArchived
- ).not.to.have.been.calledWith(projectId, mongoDocs[2]._id)
- expect(
- MongoManager.promises.markDocAsArchived
- ).not.to.have.been.calledWith(projectId, mongoDocs[3]._id)
+ expect(MongoManager.markDocAsArchived).not.to.have.been.calledWith(
+ projectId,
+ mongoDocs[2]._id
+ )
+ expect(MongoManager.markDocAsArchived).not.to.have.been.calledWith(
+ projectId,
+ mongoDocs[3]._id
+ )
})
describe('when archiving is not configured', function () {
@@ -518,21 +548,20 @@ describe('DocArchiveManager', function () {
})
it('should bail out early', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
- expect(MongoManager.promises.getNonArchivedProjectDocIds).to.not.have
- .been.called
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
+ expect(MongoManager.getNonArchivedProjectDocIds).to.not.have.been.called
})
})
})
describe('unArchiveAllDocs', function () {
it('should resolve with valid arguments', async function () {
- await expect(DocArchiveManager.promises.unArchiveAllDocs(projectId)).to
- .eventually.be.fulfilled
+ await expect(DocArchiveManager.unArchiveAllDocs(projectId)).to.eventually
+ .be.fulfilled
})
it('should unarchive all inS3 docs', async function () {
- await DocArchiveManager.promises.unArchiveAllDocs(projectId)
+ await DocArchiveManager.unArchiveAllDocs(projectId)
for (const doc of archivedDocs) {
expect(PersistorManager.getObjectStream).to.have.been.calledWith(
@@ -548,9 +577,9 @@ describe('DocArchiveManager', function () {
})
it('should bail out early', async function () {
- await DocArchiveManager.promises.archiveDoc(projectId, mongoDocs[0]._id)
- expect(MongoManager.promises.getNonDeletedArchivedProjectDocs).to.not
- .have.been.called
+ await DocArchiveManager.archiveDoc(projectId, mongoDocs[0]._id)
+ expect(MongoManager.getNonDeletedArchivedProjectDocs).to.not.have.been
+ .called
})
})
})
diff --git a/services/docstore/test/unit/js/DocManagerTests.js b/services/docstore/test/unit/js/DocManagerTests.js
index be833f4b3f..67a2f26547 100644
--- a/services/docstore/test/unit/js/DocManagerTests.js
+++ b/services/docstore/test/unit/js/DocManagerTests.js
@@ -1,7 +1,10 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { expect } = require('chai')
-const modulePath = require('path').join(__dirname, '../../../app/js/DocManager')
+const modulePath = require('node:path').join(
+ __dirname,
+ '../../../app/js/DocManager'
+)
const { ObjectId } = require('mongodb-legacy')
const Errors = require('../../../app/js/Errors')
@@ -14,25 +17,22 @@ describe('DocManager', function () {
this.version = 42
this.MongoManager = {
- promises: {
- findDoc: sinon.stub(),
- getProjectsDocs: sinon.stub(),
- patchDoc: sinon.stub().resolves(),
- upsertIntoDocCollection: sinon.stub().resolves(),
- },
+ findDoc: sinon.stub(),
+ getProjectsDocs: sinon.stub(),
+ patchDoc: sinon.stub().resolves(),
+ upsertIntoDocCollection: sinon.stub().resolves(),
}
this.DocArchiveManager = {
- promises: {
- unarchiveDoc: sinon.stub(),
- unArchiveAllDocs: sinon.stub(),
- archiveDoc: sinon.stub().resolves(),
- },
+ unarchiveDoc: sinon.stub(),
+ unArchiveAllDocs: sinon.stub(),
+ archiveDoc: sinon.stub().resolves(),
}
this.RangeManager = {
jsonRangesToMongo(r) {
return r
},
shouldUpdateRanges: sinon.stub().returns(false),
+ fixCommentIds: sinon.stub(),
}
this.settings = { docstore: {} }
@@ -49,7 +49,7 @@ describe('DocManager', function () {
describe('getFullDoc', function () {
beforeEach(function () {
- this.DocManager.promises._getDoc = sinon.stub()
+ this.DocManager._getDoc = sinon.stub()
this.doc = {
_id: this.doc_id,
lines: ['2134'],
@@ -57,13 +57,10 @@ describe('DocManager', function () {
})
it('should call get doc with a quick filter', async function () {
- this.DocManager.promises._getDoc.resolves(this.doc)
- const doc = await this.DocManager.promises.getFullDoc(
- this.project_id,
- this.doc_id
- )
+ this.DocManager._getDoc.resolves(this.doc)
+ const doc = await this.DocManager.getFullDoc(this.project_id, this.doc_id)
doc.should.equal(this.doc)
- this.DocManager.promises._getDoc
+ this.DocManager._getDoc
.calledWith(this.project_id, this.doc_id, {
lines: true,
rev: true,
@@ -76,27 +73,27 @@ describe('DocManager', function () {
})
it('should return error when get doc errors', async function () {
- this.DocManager.promises._getDoc.rejects(this.stubbedError)
+ this.DocManager._getDoc.rejects(this.stubbedError)
await expect(
- this.DocManager.promises.getFullDoc(this.project_id, this.doc_id)
+ this.DocManager.getFullDoc(this.project_id, this.doc_id)
).to.be.rejectedWith(this.stubbedError)
})
})
describe('getRawDoc', function () {
beforeEach(function () {
- this.DocManager.promises._getDoc = sinon.stub()
+ this.DocManager._getDoc = sinon.stub()
this.doc = { lines: ['2134'] }
})
it('should call get doc with a quick filter', async function () {
- this.DocManager.promises._getDoc.resolves(this.doc)
- const doc = await this.DocManager.promises.getDocLines(
+ this.DocManager._getDoc.resolves(this.doc)
+ const content = await this.DocManager.getDocLines(
this.project_id,
this.doc_id
)
- doc.should.equal(this.doc)
- this.DocManager.promises._getDoc
+ content.should.equal(this.doc.lines.join('\n'))
+ this.DocManager._getDoc
.calledWith(this.project_id, this.doc_id, {
lines: true,
inS3: true,
@@ -105,11 +102,46 @@ describe('DocManager', function () {
})
it('should return error when get doc errors', async function () {
- this.DocManager.promises._getDoc.rejects(this.stubbedError)
+ this.DocManager._getDoc.rejects(this.stubbedError)
await expect(
- this.DocManager.promises.getDocLines(this.project_id, this.doc_id)
+ this.DocManager.getDocLines(this.project_id, this.doc_id)
).to.be.rejectedWith(this.stubbedError)
})
+
+ it('should return error when get doc does not exist', async function () {
+ this.DocManager._getDoc.resolves(null)
+ await expect(
+ this.DocManager.getDocLines(this.project_id, this.doc_id)
+ ).to.be.rejectedWith(Errors.NotFoundError)
+ })
+
+ it('should return error when get doc has no lines', async function () {
+ this.DocManager._getDoc.resolves({})
+ await expect(
+ this.DocManager.getDocLines(this.project_id, this.doc_id)
+ ).to.be.rejectedWith(Errors.DocWithoutLinesError)
+ })
+ })
+
+ describe('_getDoc', function () {
+ it('should return error when get doc does not exist', async function () {
+ this.MongoManager.findDoc.resolves(null)
+ await expect(
+ this.DocManager._getDoc(this.project_id, this.doc_id, { inS3: true })
+ ).to.be.rejectedWith(Errors.NotFoundError)
+ })
+
+ it('should fix comment ids', async function () {
+ this.MongoManager.findDoc.resolves({
+ _id: this.doc_id,
+ ranges: {},
+ })
+ await this.DocManager._getDoc(this.project_id, this.doc_id, {
+ inS3: true,
+ ranges: true,
+ })
+ expect(this.RangeManager.fixCommentIds).to.have.been.called
+ })
})
describe('getDoc', function () {
@@ -125,26 +157,25 @@ describe('DocManager', function () {
describe('when using a filter', function () {
beforeEach(function () {
- this.MongoManager.promises.findDoc.resolves(this.doc)
+ this.MongoManager.findDoc.resolves(this.doc)
})
it('should error if inS3 is not set to true', async function () {
await expect(
- this.DocManager.promises._getDoc(this.project_id, this.doc_id, {
+ this.DocManager._getDoc(this.project_id, this.doc_id, {
inS3: false,
})
).to.be.rejected
})
it('should always get inS3 even when no filter is passed', async function () {
- await expect(
- this.DocManager.promises._getDoc(this.project_id, this.doc_id)
- ).to.be.rejected
- this.MongoManager.promises.findDoc.called.should.equal(false)
+ await expect(this.DocManager._getDoc(this.project_id, this.doc_id)).to
+ .be.rejected
+ this.MongoManager.findDoc.called.should.equal(false)
})
it('should not error if inS3 is set to true', async function () {
- await this.DocManager.promises._getDoc(this.project_id, this.doc_id, {
+ await this.DocManager._getDoc(this.project_id, this.doc_id, {
inS3: true,
})
})
@@ -152,8 +183,8 @@ describe('DocManager', function () {
describe('when the doc is in the doc collection', function () {
beforeEach(async function () {
- this.MongoManager.promises.findDoc.resolves(this.doc)
- this.result = await this.DocManager.promises._getDoc(
+ this.MongoManager.findDoc.resolves(this.doc)
+ this.result = await this.DocManager._getDoc(
this.project_id,
this.doc_id,
{ version: true, inS3: true }
@@ -161,7 +192,7 @@ describe('DocManager', function () {
})
it('should get the doc from the doc collection', function () {
- this.MongoManager.promises.findDoc
+ this.MongoManager.findDoc
.calledWith(this.project_id, this.doc_id)
.should.equal(true)
})
@@ -174,9 +205,9 @@ describe('DocManager', function () {
describe('when MongoManager.findDoc errors', function () {
it('should return the error', async function () {
- this.MongoManager.promises.findDoc.rejects(this.stubbedError)
+ this.MongoManager.findDoc.rejects(this.stubbedError)
await expect(
- this.DocManager.promises._getDoc(this.project_id, this.doc_id, {
+ this.DocManager._getDoc(this.project_id, this.doc_id, {
version: true,
inS3: true,
})
@@ -199,15 +230,15 @@ describe('DocManager', function () {
version: 2,
inS3: false,
}
- this.MongoManager.promises.findDoc.resolves(this.doc)
- this.DocArchiveManager.promises.unarchiveDoc.callsFake(
+ this.MongoManager.findDoc.resolves(this.doc)
+ this.DocArchiveManager.unarchiveDoc.callsFake(
async (projectId, docId) => {
- this.MongoManager.promises.findDoc.resolves({
+ this.MongoManager.findDoc.resolves({
...this.unarchivedDoc,
})
}
)
- this.result = await this.DocManager.promises._getDoc(
+ this.result = await this.DocManager._getDoc(
this.project_id,
this.doc_id,
{
@@ -218,13 +249,13 @@ describe('DocManager', function () {
})
it('should call the DocArchive to unarchive the doc', function () {
- this.DocArchiveManager.promises.unarchiveDoc
+ this.DocArchiveManager.unarchiveDoc
.calledWith(this.project_id, this.doc_id)
.should.equal(true)
})
it('should look up the doc twice', function () {
- this.MongoManager.promises.findDoc.calledTwice.should.equal(true)
+ this.MongoManager.findDoc.calledTwice.should.equal(true)
})
it('should return the doc', function () {
@@ -236,9 +267,9 @@ describe('DocManager', function () {
describe('when the doc does not exist in the docs collection', function () {
it('should return a NotFoundError', async function () {
- this.MongoManager.promises.findDoc.resolves(null)
+ this.MongoManager.findDoc.resolves(null)
await expect(
- this.DocManager.promises._getDoc(this.project_id, this.doc_id, {
+ this.DocManager._getDoc(this.project_id, this.doc_id, {
version: true,
inS3: true,
})
@@ -259,23 +290,27 @@ describe('DocManager', function () {
lines: ['mock-lines'],
},
]
- this.MongoManager.promises.getProjectsDocs.resolves(this.docs)
- this.DocArchiveManager.promises.unArchiveAllDocs.resolves(this.docs)
- this.filter = { lines: true }
- this.result = await this.DocManager.promises.getAllNonDeletedDocs(
+ this.MongoManager.getProjectsDocs.resolves(this.docs)
+ this.DocArchiveManager.unArchiveAllDocs.resolves(this.docs)
+ this.filter = { lines: true, ranges: true }
+ this.result = await this.DocManager.getAllNonDeletedDocs(
this.project_id,
this.filter
)
})
it('should get the project from the database', function () {
- this.MongoManager.promises.getProjectsDocs.should.have.been.calledWith(
+ this.MongoManager.getProjectsDocs.should.have.been.calledWith(
this.project_id,
{ include_deleted: false },
this.filter
)
})
+ it('should fix comment ids', async function () {
+ expect(this.RangeManager.fixCommentIds).to.have.been.called
+ })
+
it('should return the docs', function () {
expect(this.result).to.deep.equal(this.docs)
})
@@ -283,13 +318,10 @@ describe('DocManager', function () {
describe('when there are no docs for the project', function () {
it('should return a NotFoundError', async function () {
- this.MongoManager.promises.getProjectsDocs.resolves(null)
- this.DocArchiveManager.promises.unArchiveAllDocs.resolves(null)
+ this.MongoManager.getProjectsDocs.resolves(null)
+ this.DocArchiveManager.unArchiveAllDocs.resolves(null)
await expect(
- this.DocManager.promises.getAllNonDeletedDocs(
- this.project_id,
- this.filter
- )
+ this.DocManager.getAllNonDeletedDocs(this.project_id, this.filter)
).to.be.rejectedWith(`No docs for project ${this.project_id}`)
})
})
@@ -300,7 +332,7 @@ describe('DocManager', function () {
beforeEach(function () {
this.lines = ['mock', 'doc', 'lines']
this.rev = 77
- this.MongoManager.promises.findDoc.resolves({
+ this.MongoManager.findDoc.resolves({
_id: new ObjectId(this.doc_id),
})
this.meta = {}
@@ -308,7 +340,7 @@ describe('DocManager', function () {
describe('standard path', function () {
beforeEach(async function () {
- await this.DocManager.promises.patchDoc(
+ await this.DocManager.patchDoc(
this.project_id,
this.doc_id,
this.meta
@@ -316,14 +348,14 @@ describe('DocManager', function () {
})
it('should get the doc', function () {
- expect(this.MongoManager.promises.findDoc).to.have.been.calledWith(
+ expect(this.MongoManager.findDoc).to.have.been.calledWith(
this.project_id,
this.doc_id
)
})
it('should persist the meta', function () {
- expect(this.MongoManager.promises.patchDoc).to.have.been.calledWith(
+ expect(this.MongoManager.patchDoc).to.have.been.calledWith(
this.project_id,
this.doc_id,
this.meta
@@ -336,7 +368,7 @@ describe('DocManager', function () {
this.settings.docstore.archiveOnSoftDelete = false
this.meta.deleted = true
- await this.DocManager.promises.patchDoc(
+ await this.DocManager.patchDoc(
this.project_id,
this.doc_id,
this.meta
@@ -344,8 +376,7 @@ describe('DocManager', function () {
})
it('should not flush the doc out of mongo', function () {
- expect(this.DocArchiveManager.promises.archiveDoc).to.not.have.been
- .called
+ expect(this.DocArchiveManager.archiveDoc).to.not.have.been.called
})
})
@@ -353,7 +384,7 @@ describe('DocManager', function () {
beforeEach(async function () {
this.settings.docstore.archiveOnSoftDelete = false
this.meta.deleted = false
- await this.DocManager.promises.patchDoc(
+ await this.DocManager.patchDoc(
this.project_id,
this.doc_id,
this.meta
@@ -361,8 +392,7 @@ describe('DocManager', function () {
})
it('should not flush the doc out of mongo', function () {
- expect(this.DocArchiveManager.promises.archiveDoc).to.not.have.been
- .called
+ expect(this.DocArchiveManager.archiveDoc).to.not.have.been.called
})
})
@@ -374,7 +404,7 @@ describe('DocManager', function () {
describe('when the background flush succeeds', function () {
beforeEach(async function () {
- await this.DocManager.promises.patchDoc(
+ await this.DocManager.patchDoc(
this.project_id,
this.doc_id,
this.meta
@@ -386,17 +416,18 @@ describe('DocManager', function () {
})
it('should flush the doc out of mongo', function () {
- expect(
- this.DocArchiveManager.promises.archiveDoc
- ).to.have.been.calledWith(this.project_id, this.doc_id)
+ expect(this.DocArchiveManager.archiveDoc).to.have.been.calledWith(
+ this.project_id,
+ this.doc_id
+ )
})
})
describe('when the background flush fails', function () {
beforeEach(async function () {
this.err = new Error('foo')
- this.DocArchiveManager.promises.archiveDoc.rejects(this.err)
- await this.DocManager.promises.patchDoc(
+ this.DocArchiveManager.archiveDoc.rejects(this.err)
+ await this.DocManager.patchDoc(
this.project_id,
this.doc_id,
this.meta
@@ -419,9 +450,9 @@ describe('DocManager', function () {
describe('when the doc does not exist', function () {
it('should return a NotFoundError', async function () {
- this.MongoManager.promises.findDoc.resolves(null)
+ this.MongoManager.findDoc.resolves(null)
await expect(
- this.DocManager.promises.patchDoc(this.project_id, this.doc_id, {})
+ this.DocManager.patchDoc(this.project_id, this.doc_id, {})
).to.be.rejectedWith(
`No such project/doc to delete: ${this.project_id}/${this.doc_id}`
)
@@ -467,13 +498,13 @@ describe('DocManager', function () {
ranges: this.originalRanges,
}
- this.DocManager.promises._getDoc = sinon.stub()
+ this.DocManager._getDoc = sinon.stub()
})
describe('when only the doc lines have changed', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
- this.result = await this.DocManager.promises.updateDoc(
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -483,7 +514,7 @@ describe('DocManager', function () {
})
it('should get the existing doc', function () {
- this.DocManager.promises._getDoc
+ this.DocManager._getDoc
.calledWith(this.project_id, this.doc_id, {
version: true,
rev: true,
@@ -495,7 +526,7 @@ describe('DocManager', function () {
})
it('should upsert the document to the doc collection', function () {
- this.MongoManager.promises.upsertIntoDocCollection
+ this.MongoManager.upsertIntoDocCollection
.calledWith(this.project_id, this.doc_id, this.rev, {
lines: this.newDocLines,
})
@@ -509,9 +540,9 @@ describe('DocManager', function () {
describe('when the doc ranges have changed', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
this.RangeManager.shouldUpdateRanges.returns(true)
- this.result = await this.DocManager.promises.updateDoc(
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.oldDocLines,
@@ -521,7 +552,7 @@ describe('DocManager', function () {
})
it('should upsert the ranges', function () {
- this.MongoManager.promises.upsertIntoDocCollection
+ this.MongoManager.upsertIntoDocCollection
.calledWith(this.project_id, this.doc_id, this.rev, {
ranges: this.newRanges,
})
@@ -535,8 +566,8 @@ describe('DocManager', function () {
describe('when only the version has changed', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
- this.result = await this.DocManager.promises.updateDoc(
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.oldDocLines,
@@ -546,7 +577,7 @@ describe('DocManager', function () {
})
it('should update the version', function () {
- this.MongoManager.promises.upsertIntoDocCollection.should.have.been.calledWith(
+ this.MongoManager.upsertIntoDocCollection.should.have.been.calledWith(
this.project_id,
this.doc_id,
this.rev,
@@ -561,8 +592,8 @@ describe('DocManager', function () {
describe('when the doc has not changed at all', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
- this.result = await this.DocManager.promises.updateDoc(
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.oldDocLines,
@@ -572,9 +603,7 @@ describe('DocManager', function () {
})
it('should not update the ranges or lines or version', function () {
- this.MongoManager.promises.upsertIntoDocCollection.called.should.equal(
- false
- )
+ this.MongoManager.upsertIntoDocCollection.called.should.equal(false)
})
it('should return the old rev and modified == false', function () {
@@ -585,7 +614,7 @@ describe('DocManager', function () {
describe('when the version is null', function () {
it('should return an error', async function () {
await expect(
- this.DocManager.promises.updateDoc(
+ this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -599,7 +628,7 @@ describe('DocManager', function () {
describe('when the lines are null', function () {
it('should return an error', async function () {
await expect(
- this.DocManager.promises.updateDoc(
+ this.DocManager.updateDoc(
this.project_id,
this.doc_id,
null,
@@ -613,7 +642,7 @@ describe('DocManager', function () {
describe('when the ranges are null', function () {
it('should return an error', async function () {
await expect(
- this.DocManager.promises.updateDoc(
+ this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -627,9 +656,9 @@ describe('DocManager', function () {
describe('when there is a generic error getting the doc', function () {
beforeEach(async function () {
this.error = new Error('doc could not be found')
- this.DocManager.promises._getDoc = sinon.stub().rejects(this.error)
+ this.DocManager._getDoc = sinon.stub().rejects(this.error)
await expect(
- this.DocManager.promises.updateDoc(
+ this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -640,16 +669,15 @@ describe('DocManager', function () {
})
it('should not upsert the document to the doc collection', function () {
- this.MongoManager.promises.upsertIntoDocCollection.should.not.have.been
- .called
+ this.MongoManager.upsertIntoDocCollection.should.not.have.been.called
})
})
describe('when the version was decremented', function () {
it('should return an error', async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
await expect(
- this.DocManager.promises.updateDoc(
+ this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -662,8 +690,8 @@ describe('DocManager', function () {
describe('when the doc lines have not changed', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
- this.result = await this.DocManager.promises.updateDoc(
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.oldDocLines.slice(),
@@ -673,9 +701,7 @@ describe('DocManager', function () {
})
it('should not update the doc', function () {
- this.MongoManager.promises.upsertIntoDocCollection.called.should.equal(
- false
- )
+ this.MongoManager.upsertIntoDocCollection.called.should.equal(false)
})
it('should return the existing rev', function () {
@@ -685,8 +711,8 @@ describe('DocManager', function () {
describe('when the doc does not exist', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(null)
- this.result = await this.DocManager.promises.updateDoc(
+ this.DocManager._getDoc = sinon.stub().resolves(null)
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -696,7 +722,7 @@ describe('DocManager', function () {
})
it('should upsert the document to the doc collection', function () {
- this.MongoManager.promises.upsertIntoDocCollection.should.have.been.calledWith(
+ this.MongoManager.upsertIntoDocCollection.should.have.been.calledWith(
this.project_id,
this.doc_id,
undefined,
@@ -715,12 +741,12 @@ describe('DocManager', function () {
describe('when another update is racing', function () {
beforeEach(async function () {
- this.DocManager.promises._getDoc = sinon.stub().resolves(this.doc)
- this.MongoManager.promises.upsertIntoDocCollection
+ this.DocManager._getDoc = sinon.stub().resolves(this.doc)
+ this.MongoManager.upsertIntoDocCollection
.onFirstCall()
.rejects(new Errors.DocRevValueError())
this.RangeManager.shouldUpdateRanges.returns(true)
- this.result = await this.DocManager.promises.updateDoc(
+ this.result = await this.DocManager.updateDoc(
this.project_id,
this.doc_id,
this.newDocLines,
@@ -730,7 +756,7 @@ describe('DocManager', function () {
})
it('should upsert the doc twice', function () {
- this.MongoManager.promises.upsertIntoDocCollection.should.have.been.calledWith(
+ this.MongoManager.upsertIntoDocCollection.should.have.been.calledWith(
this.project_id,
this.doc_id,
this.rev,
@@ -740,8 +766,7 @@ describe('DocManager', function () {
version: this.version + 1,
}
)
- this.MongoManager.promises.upsertIntoDocCollection.should.have.been
- .calledTwice
+ this.MongoManager.upsertIntoDocCollection.should.have.been.calledTwice
})
it('should return the new rev', function () {
diff --git a/services/docstore/test/unit/js/HttpControllerTests.js b/services/docstore/test/unit/js/HttpControllerTests.js
index 2ed46a9d70..ab491ec150 100644
--- a/services/docstore/test/unit/js/HttpControllerTests.js
+++ b/services/docstore/test/unit/js/HttpControllerTests.js
@@ -1,7 +1,7 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { assert, expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/HttpController'
)
@@ -14,7 +14,7 @@ describe('HttpController', function () {
max_doc_length: 2 * 1024 * 1024,
}
this.DocArchiveManager = {
- unArchiveAllDocs: sinon.stub().yields(),
+ unArchiveAllDocs: sinon.stub().returns(),
}
this.DocManager = {}
this.HttpController = SandboxedModule.require(modulePath, {
@@ -54,15 +54,13 @@ describe('HttpController', function () {
describe('getDoc', function () {
describe('without deleted docs', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = {
project_id: this.projectId,
doc_id: this.docId,
}
- this.DocManager.getFullDoc = sinon
- .stub()
- .callsArgWith(2, null, this.doc)
- this.HttpController.getDoc(this.req, this.res, this.next)
+ this.DocManager.getFullDoc = sinon.stub().resolves(this.doc)
+ await this.HttpController.getDoc(this.req, this.res, this.next)
})
it('should get the document with the version (including deleted)', function () {
@@ -89,26 +87,24 @@ describe('HttpController', function () {
project_id: this.projectId,
doc_id: this.docId,
}
- this.DocManager.getFullDoc = sinon
- .stub()
- .callsArgWith(2, null, this.deletedDoc)
+ this.DocManager.getFullDoc = sinon.stub().resolves(this.deletedDoc)
})
- it('should get the doc from the doc manager', function () {
- this.HttpController.getDoc(this.req, this.res, this.next)
+ it('should get the doc from the doc manager', async function () {
+ await this.HttpController.getDoc(this.req, this.res, this.next)
this.DocManager.getFullDoc
.calledWith(this.projectId, this.docId)
.should.equal(true)
})
- it('should return 404 if the query string delete is not set ', function () {
- this.HttpController.getDoc(this.req, this.res, this.next)
+ it('should return 404 if the query string delete is not set ', async function () {
+ await this.HttpController.getDoc(this.req, this.res, this.next)
this.res.sendStatus.calledWith(404).should.equal(true)
})
- it('should return the doc as JSON if include_deleted is set to true', function () {
+ it('should return the doc as JSON if include_deleted is set to true', async function () {
this.req.query.include_deleted = 'true'
- this.HttpController.getDoc(this.req, this.res, this.next)
+ await this.HttpController.getDoc(this.req, this.res, this.next)
this.res.json
.calledWith({
_id: this.docId,
@@ -123,13 +119,15 @@ describe('HttpController', function () {
})
describe('getRawDoc', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = {
project_id: this.projectId,
doc_id: this.docId,
}
- this.DocManager.getDocLines = sinon.stub().callsArgWith(2, null, this.doc)
- this.HttpController.getRawDoc(this.req, this.res, this.next)
+ this.DocManager.getDocLines = sinon
+ .stub()
+ .resolves(this.doc.lines.join('\n'))
+ await this.HttpController.getRawDoc(this.req, this.res, this.next)
})
it('should get the document without the version', function () {
@@ -154,7 +152,7 @@ describe('HttpController', function () {
describe('getAllDocs', function () {
describe('normally', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
this.docs = [
{
@@ -168,10 +166,8 @@ describe('HttpController', function () {
rev: 4,
},
]
- this.DocManager.getAllNonDeletedDocs = sinon
- .stub()
- .callsArgWith(2, null, this.docs)
- this.HttpController.getAllDocs(this.req, this.res, this.next)
+ this.DocManager.getAllNonDeletedDocs = sinon.stub().resolves(this.docs)
+ await this.HttpController.getAllDocs(this.req, this.res, this.next)
})
it('should get all the (non-deleted) docs', function () {
@@ -199,7 +195,7 @@ describe('HttpController', function () {
})
describe('with null lines', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
this.docs = [
{
@@ -213,10 +209,8 @@ describe('HttpController', function () {
rev: 4,
},
]
- this.DocManager.getAllNonDeletedDocs = sinon
- .stub()
- .callsArgWith(2, null, this.docs)
- this.HttpController.getAllDocs(this.req, this.res, this.next)
+ this.DocManager.getAllNonDeletedDocs = sinon.stub().resolves(this.docs)
+ await this.HttpController.getAllDocs(this.req, this.res, this.next)
})
it('should return the doc with fallback lines', function () {
@@ -238,7 +232,7 @@ describe('HttpController', function () {
})
describe('with a null doc', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
this.docs = [
{
@@ -253,10 +247,8 @@ describe('HttpController', function () {
rev: 4,
},
]
- this.DocManager.getAllNonDeletedDocs = sinon
- .stub()
- .callsArgWith(2, null, this.docs)
- this.HttpController.getAllDocs(this.req, this.res, this.next)
+ this.DocManager.getAllNonDeletedDocs = sinon.stub().resolves(this.docs)
+ await this.HttpController.getAllDocs(this.req, this.res, this.next)
})
it('should return the non null docs as JSON', function () {
@@ -292,7 +284,7 @@ describe('HttpController', function () {
describe('getAllRanges', function () {
describe('normally', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
this.docs = [
{
@@ -304,10 +296,8 @@ describe('HttpController', function () {
ranges: { mock_ranges: 'two' },
},
]
- this.DocManager.getAllNonDeletedDocs = sinon
- .stub()
- .callsArgWith(2, null, this.docs)
- this.HttpController.getAllRanges(this.req, this.res, this.next)
+ this.DocManager.getAllNonDeletedDocs = sinon.stub().resolves(this.docs)
+ await this.HttpController.getAllRanges(this.req, this.res, this.next)
})
it('should get all the (non-deleted) doc ranges', function () {
@@ -342,16 +332,17 @@ describe('HttpController', function () {
})
describe('when the doc lines exist and were updated', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = {
lines: (this.lines = ['hello', 'world']),
version: (this.version = 42),
ranges: (this.ranges = { changes: 'mock' }),
}
+ this.rev = 5
this.DocManager.updateDoc = sinon
.stub()
- .yields(null, true, (this.rev = 5))
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ .resolves({ modified: true, rev: this.rev })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
})
it('should update the document', function () {
@@ -374,16 +365,17 @@ describe('HttpController', function () {
})
describe('when the doc lines exist and were not updated', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = {
lines: (this.lines = ['hello', 'world']),
version: (this.version = 42),
ranges: {},
}
+ this.rev = 5
this.DocManager.updateDoc = sinon
.stub()
- .yields(null, false, (this.rev = 5))
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ .resolves({ modified: false, rev: this.rev })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
})
it('should return a modified status', function () {
@@ -394,10 +386,12 @@ describe('HttpController', function () {
})
describe('when the doc lines are not provided', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = { version: 42, ranges: {} }
- this.DocManager.updateDoc = sinon.stub().yields(null, false)
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ this.DocManager.updateDoc = sinon
+ .stub()
+ .resolves({ modified: false, rev: 0 })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
})
it('should not update the document', function () {
@@ -410,10 +404,12 @@ describe('HttpController', function () {
})
describe('when the doc version are not provided', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = { version: 42, lines: ['hello world'] }
- this.DocManager.updateDoc = sinon.stub().yields(null, false)
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ this.DocManager.updateDoc = sinon
+ .stub()
+ .resolves({ modified: false, rev: 0 })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
})
it('should not update the document', function () {
@@ -426,10 +422,12 @@ describe('HttpController', function () {
})
describe('when the doc ranges is not provided', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = { lines: ['foo'], version: 42 }
- this.DocManager.updateDoc = sinon.stub().yields(null, false)
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ this.DocManager.updateDoc = sinon
+ .stub()
+ .resolves({ modified: false, rev: 0 })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
})
it('should not update the document', function () {
@@ -442,13 +440,20 @@ describe('HttpController', function () {
})
describe('when the doc body is too large', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = {
lines: (this.lines = Array(2049).fill('a'.repeat(1024))),
version: (this.version = 42),
ranges: (this.ranges = { changes: 'mock' }),
}
- this.HttpController.updateDoc(this.req, this.res, this.next)
+ this.DocManager.updateDoc = sinon
+ .stub()
+ .resolves({ modified: false, rev: 0 })
+ await this.HttpController.updateDoc(this.req, this.res, this.next)
+ })
+
+ it('should not update the document', function () {
+ this.DocManager.updateDoc.called.should.equal(false)
})
it('should return a 413 (too large) response', function () {
@@ -462,14 +467,14 @@ describe('HttpController', function () {
})
describe('patchDoc', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = {
project_id: this.projectId,
doc_id: this.docId,
}
this.req.body = { name: 'foo.tex' }
- this.DocManager.patchDoc = sinon.stub().yields(null)
- this.HttpController.patchDoc(this.req, this.res, this.next)
+ this.DocManager.patchDoc = sinon.stub().resolves()
+ await this.HttpController.patchDoc(this.req, this.res, this.next)
})
it('should delete the document', function () {
@@ -484,11 +489,11 @@ describe('HttpController', function () {
})
describe('with an invalid payload', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.body = { cannot: 'happen' }
- this.DocManager.patchDoc = sinon.stub().yields(null)
- this.HttpController.patchDoc(this.req, this.res, this.next)
+ this.DocManager.patchDoc = sinon.stub().resolves()
+ await this.HttpController.patchDoc(this.req, this.res, this.next)
})
it('should log a message', function () {
@@ -509,10 +514,10 @@ describe('HttpController', function () {
})
describe('archiveAllDocs', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
- this.DocArchiveManager.archiveAllDocs = sinon.stub().callsArg(1)
- this.HttpController.archiveAllDocs(this.req, this.res, this.next)
+ this.DocArchiveManager.archiveAllDocs = sinon.stub().resolves()
+ await this.HttpController.archiveAllDocs(this.req, this.res, this.next)
})
it('should archive the project', function () {
@@ -532,9 +537,12 @@ describe('HttpController', function () {
})
describe('on success', function () {
- beforeEach(function (done) {
- this.res.sendStatus.callsFake(() => done())
- this.HttpController.unArchiveAllDocs(this.req, this.res, this.next)
+ beforeEach(async function () {
+ await this.HttpController.unArchiveAllDocs(
+ this.req,
+ this.res,
+ this.next
+ )
})
it('returns a 200', function () {
@@ -543,12 +551,15 @@ describe('HttpController', function () {
})
describe("when the archived rev doesn't match", function () {
- beforeEach(function (done) {
- this.res.sendStatus.callsFake(() => done())
- this.DocArchiveManager.unArchiveAllDocs.yields(
+ beforeEach(async function () {
+ this.DocArchiveManager.unArchiveAllDocs.rejects(
new Errors.DocRevValueError('bad rev')
)
- this.HttpController.unArchiveAllDocs(this.req, this.res, this.next)
+ await this.HttpController.unArchiveAllDocs(
+ this.req,
+ this.res,
+ this.next
+ )
})
it('returns a 409', function () {
@@ -558,10 +569,10 @@ describe('HttpController', function () {
})
describe('destroyProject', function () {
- beforeEach(function () {
+ beforeEach(async function () {
this.req.params = { project_id: this.projectId }
- this.DocArchiveManager.destroyProject = sinon.stub().callsArg(1)
- this.HttpController.destroyProject(this.req, this.res, this.next)
+ this.DocArchiveManager.destroyProject = sinon.stub().resolves()
+ await this.HttpController.destroyProject(this.req, this.res, this.next)
})
it('should destroy the docs', function () {
diff --git a/services/docstore/test/unit/js/MongoManagerTests.js b/services/docstore/test/unit/js/MongoManagerTests.js
index da8f59ae07..b96b661df4 100644
--- a/services/docstore/test/unit/js/MongoManagerTests.js
+++ b/services/docstore/test/unit/js/MongoManagerTests.js
@@ -1,6 +1,6 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/MongoManager'
)
@@ -41,7 +41,7 @@ describe('MongoManager', function () {
this.doc = { name: 'mock-doc' }
this.db.docs.findOne = sinon.stub().resolves(this.doc)
this.filter = { lines: true }
- this.result = await this.MongoManager.promises.findDoc(
+ this.result = await this.MongoManager.findDoc(
this.projectId,
this.docId,
this.filter
@@ -70,11 +70,7 @@ describe('MongoManager', function () {
describe('patchDoc', function () {
beforeEach(async function () {
this.meta = { name: 'foo.tex' }
- await this.MongoManager.promises.patchDoc(
- this.projectId,
- this.docId,
- this.meta
- )
+ await this.MongoManager.patchDoc(this.projectId, this.docId, this.meta)
})
it('should pass the parameter along', function () {
@@ -104,7 +100,7 @@ describe('MongoManager', function () {
describe('with included_deleted = false', function () {
beforeEach(async function () {
- this.result = await this.MongoManager.promises.getProjectsDocs(
+ this.result = await this.MongoManager.getProjectsDocs(
this.projectId,
{ include_deleted: false },
this.filter
@@ -132,7 +128,7 @@ describe('MongoManager', function () {
describe('with included_deleted = true', function () {
beforeEach(async function () {
- this.result = await this.MongoManager.promises.getProjectsDocs(
+ this.result = await this.MongoManager.getProjectsDocs(
this.projectId,
{ include_deleted: true },
this.filter
@@ -167,7 +163,7 @@ describe('MongoManager', function () {
this.db.docs.find = sinon.stub().returns({
toArray: sinon.stub().resolves([this.doc1, this.doc2, this.doc3]),
})
- this.result = await this.MongoManager.promises.getProjectsDeletedDocs(
+ this.result = await this.MongoManager.getProjectsDeletedDocs(
this.projectId,
this.filter
)
@@ -203,7 +199,7 @@ describe('MongoManager', function () {
})
it('should upsert the document', async function () {
- await this.MongoManager.promises.upsertIntoDocCollection(
+ await this.MongoManager.upsertIntoDocCollection(
this.projectId,
this.docId,
this.oldRev,
@@ -223,7 +219,7 @@ describe('MongoManager', function () {
it('should handle update error', async function () {
this.db.docs.updateOne.rejects(this.stubbedErr)
await expect(
- this.MongoManager.promises.upsertIntoDocCollection(
+ this.MongoManager.upsertIntoDocCollection(
this.projectId,
this.docId,
this.rev,
@@ -235,7 +231,7 @@ describe('MongoManager', function () {
})
it('should insert without a previous rev', async function () {
- await this.MongoManager.promises.upsertIntoDocCollection(
+ await this.MongoManager.upsertIntoDocCollection(
this.projectId,
this.docId,
null,
@@ -254,7 +250,7 @@ describe('MongoManager', function () {
it('should handle generic insert error', async function () {
this.db.docs.insertOne.rejects(this.stubbedErr)
await expect(
- this.MongoManager.promises.upsertIntoDocCollection(
+ this.MongoManager.upsertIntoDocCollection(
this.projectId,
this.docId,
null,
@@ -266,7 +262,7 @@ describe('MongoManager', function () {
it('should handle duplicate insert error', async function () {
this.db.docs.insertOne.rejects({ code: 11000 })
await expect(
- this.MongoManager.promises.upsertIntoDocCollection(
+ this.MongoManager.upsertIntoDocCollection(
this.projectId,
this.docId,
null,
@@ -280,7 +276,7 @@ describe('MongoManager', function () {
beforeEach(async function () {
this.projectId = new ObjectId()
this.db.docs.deleteMany = sinon.stub().resolves()
- await this.MongoManager.promises.destroyProject(this.projectId)
+ await this.MongoManager.destroyProject(this.projectId)
})
it('should destroy all docs', function () {
@@ -297,13 +293,13 @@ describe('MongoManager', function () {
it('should not error when the rev has not changed', async function () {
this.db.docs.findOne = sinon.stub().resolves({ rev: 1 })
- await this.MongoManager.promises.checkRevUnchanged(this.doc)
+ await this.MongoManager.checkRevUnchanged(this.doc)
})
it('should return an error when the rev has changed', async function () {
this.db.docs.findOne = sinon.stub().resolves({ rev: 2 })
await expect(
- this.MongoManager.promises.checkRevUnchanged(this.doc)
+ this.MongoManager.checkRevUnchanged(this.doc)
).to.be.rejectedWith(Errors.DocModifiedError)
})
@@ -311,14 +307,14 @@ describe('MongoManager', function () {
this.db.docs.findOne = sinon.stub().resolves({ rev: 2 })
this.doc = { _id: new ObjectId(), name: 'mock-doc', rev: NaN }
await expect(
- this.MongoManager.promises.checkRevUnchanged(this.doc)
+ this.MongoManager.checkRevUnchanged(this.doc)
).to.be.rejectedWith(Errors.DocRevValueError)
})
it('should return a value error if checked doc rev is NaN', async function () {
this.db.docs.findOne = sinon.stub().resolves({ rev: NaN })
await expect(
- this.MongoManager.promises.checkRevUnchanged(this.doc)
+ this.MongoManager.checkRevUnchanged(this.doc)
).to.be.rejectedWith(Errors.DocRevValueError)
})
})
@@ -334,7 +330,7 @@ describe('MongoManager', function () {
describe('complete doc', function () {
beforeEach(async function () {
- await this.MongoManager.promises.restoreArchivedDoc(
+ await this.MongoManager.restoreArchivedDoc(
this.projectId,
this.docId,
this.archivedDoc
@@ -364,7 +360,7 @@ describe('MongoManager', function () {
describe('without ranges', function () {
beforeEach(async function () {
delete this.archivedDoc.ranges
- await this.MongoManager.promises.restoreArchivedDoc(
+ await this.MongoManager.restoreArchivedDoc(
this.projectId,
this.docId,
this.archivedDoc
@@ -395,7 +391,7 @@ describe('MongoManager', function () {
it('throws a DocRevValueError', async function () {
this.db.docs.updateOne.resolves({ matchedCount: 0 })
await expect(
- this.MongoManager.promises.restoreArchivedDoc(
+ this.MongoManager.restoreArchivedDoc(
this.projectId,
this.docId,
this.archivedDoc
diff --git a/services/docstore/test/unit/js/RangeManagerTests.js b/services/docstore/test/unit/js/RangeManagerTests.js
index 0d2a353558..ba99280a7a 100644
--- a/services/docstore/test/unit/js/RangeManagerTests.js
+++ b/services/docstore/test/unit/js/RangeManagerTests.js
@@ -12,7 +12,7 @@
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
const { assert, expect } = require('chai')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../app/js/RangeManager'
)
@@ -30,7 +30,7 @@ describe('RangeManager', function () {
})
describe('jsonRangesToMongo', function () {
- it('should convert ObjectIds and dates to proper objects', function () {
+ it('should convert ObjectIds and dates to proper objects and fix comment id', function () {
const changeId = new ObjectId().toString()
const commentId = new ObjectId().toString()
const userId = new ObjectId().toString()
@@ -66,7 +66,7 @@ describe('RangeManager', function () {
],
comments: [
{
- id: new ObjectId(commentId),
+ id: new ObjectId(threadId),
op: { c: 'foo', p: 3, t: new ObjectId(threadId) },
},
],
@@ -110,7 +110,6 @@ describe('RangeManager', function () {
return it('should be consistent when transformed through json -> mongo -> json', function () {
const changeId = new ObjectId().toString()
- const commentId = new ObjectId().toString()
const userId = new ObjectId().toString()
const threadId = new ObjectId().toString()
const ts = new Date().toJSON()
@@ -127,7 +126,7 @@ describe('RangeManager', function () {
],
comments: [
{
- id: commentId,
+ id: threadId,
op: { c: 'foo', p: 3, t: threadId },
},
],
@@ -142,6 +141,7 @@ describe('RangeManager', function () {
return describe('shouldUpdateRanges', function () {
beforeEach(function () {
+ const threadId = new ObjectId()
this.ranges = {
changes: [
{
@@ -155,8 +155,8 @@ describe('RangeManager', function () {
],
comments: [
{
- id: new ObjectId(),
- op: { c: 'foo', p: 3, t: new ObjectId() },
+ id: threadId,
+ op: { c: 'foo', p: 3, t: threadId },
},
],
}
diff --git a/services/document-updater/.gitignore b/services/document-updater/.gitignore
deleted file mode 100644
index 624e78f096..0000000000
--- a/services/document-updater/.gitignore
+++ /dev/null
@@ -1,52 +0,0 @@
-compileFolder
-
-Compiled source #
-###################
-*.com
-*.class
-*.dll
-*.exe
-*.o
-*.so
-
-# Packages #
-############
-# it's better to unpack these files and commit the raw source
-# git has its own built in compression methods
-*.7z
-*.dmg
-*.gz
-*.iso
-*.jar
-*.rar
-*.tar
-*.zip
-
-# Logs and databases #
-######################
-*.log
-*.sql
-*.sqlite
-
-# OS generated files #
-######################
-.DS_Store?
-ehthumbs.db
-Icon?
-Thumbs.db
-
-/node_modules/*
-
-
-
-forever/
-
-**.swp
-
-# Redis cluster
-**/appendonly.aof
-**/dump.rdb
-**/nodes.conf
-
-# managed by dev-environment$ bin/update_build_scripts
-.npmrc
diff --git a/services/document-updater/.nvmrc b/services/document-updater/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/document-updater/.nvmrc
+++ b/services/document-updater/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/document-updater/Dockerfile b/services/document-updater/Dockerfile
index 06c1610c66..720b619c41 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:18.20.2 AS base
+FROM node:22.17.0 AS base
WORKDIR /overleaf/services/document-updater
diff --git a/services/document-updater/Makefile b/services/document-updater/Makefile
index de0cf0eabe..46dfced5c9 100644
--- a/services/document-updater/Makefile
+++ b/services/document-updater/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -98,13 +116,6 @@ test_acceptance_clean:
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down -v -t 0
test_acceptance_pre_run:
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) up -d mongo
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) exec -T mongo sh -c ' \
- while ! mongosh --eval "db.version()" > /dev/null; do \
- echo "Waiting for Mongo..."; \
- sleep 1; \
- done; \
- mongosh --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"mongo:27017\" } ] })"'
ifneq (,$(wildcard test/acceptance/js/scripts/pre-run))
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) run --rm test_acceptance test/acceptance/js/scripts/pre-run
endif
@@ -137,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/document-updater/app.js b/services/document-updater/app.js
index fab33150c3..65c9895377 100644
--- a/services/document-updater/app.js
+++ b/services/document-updater/app.js
@@ -9,10 +9,6 @@ logger.initialize('document-updater')
logger.logger.addSerializers(require('./app/js/LoggerSerializers'))
-if (Settings.sentry != null && Settings.sentry.dsn != null) {
- logger.initializeErrorReporting(Settings.sentry.dsn)
-}
-
const RedisManager = require('./app/js/RedisManager')
const DispatchManager = require('./app/js/DispatchManager')
const DeleteQueueManager = require('./app/js/DeleteQueueManager')
@@ -139,6 +135,10 @@ app.use((req, res, next) => {
})
app.get('/project/:project_id/doc/:doc_id', HttpController.getDoc)
+app.get(
+ '/project/:project_id/doc/:doc_id/comment/:comment_id',
+ HttpController.getComment
+)
app.get('/project/:project_id/doc/:doc_id/peek', HttpController.peekDoc)
// temporarily keep the GET method for backwards compatibility
app.get('/project/:project_id/doc', HttpController.getProjectDocsAndFlushIfOld)
@@ -147,8 +147,13 @@ app.post(
'/project/:project_id/get_and_flush_if_old',
HttpController.getProjectDocsAndFlushIfOld
)
+app.get(
+ '/project/:project_id/last_updated_at',
+ HttpController.getProjectLastUpdatedAt
+)
app.post('/project/:project_id/clearState', HttpController.clearProjectState)
app.post('/project/:project_id/doc/:doc_id', HttpController.setDoc)
+app.post('/project/:project_id/doc/:doc_id/append', HttpController.appendToDoc)
app.post(
'/project/:project_id/doc/:doc_id/flush',
HttpController.flushDocIfLoaded
diff --git a/services/document-updater/app/js/DiffCodec.js b/services/document-updater/app/js/DiffCodec.js
index 245903ca13..17da409386 100644
--- a/services/document-updater/app/js/DiffCodec.js
+++ b/services/document-updater/app/js/DiffCodec.js
@@ -1,4 +1,6 @@
+const OError = require('@overleaf/o-error')
const DMP = require('diff-match-patch')
+const { TextOperation } = require('overleaf-editor-core')
const dmp = new DMP()
// Do not attempt to produce a diff for more than 100ms
@@ -16,8 +18,7 @@ module.exports = {
const ops = []
let position = 0
for (const diff of diffs) {
- const type = diff[0]
- const content = diff[1]
+ const [type, content] = diff
if (type === this.ADDED) {
ops.push({
i: content,
@@ -37,4 +38,63 @@ module.exports = {
}
return ops
},
+
+ /**
+ * @param {import("overleaf-editor-core").StringFileData} file
+ * @param {string} after
+ * @return {TextOperation}
+ */
+ diffAsHistoryOTEditOperation(file, after) {
+ const beforeWithoutTrackedDeletes = file.getContent({
+ filterTrackedDeletes: true,
+ })
+ const diffs = dmp.diff_main(beforeWithoutTrackedDeletes, after)
+ dmp.diff_cleanupSemantic(diffs)
+
+ const trackedChanges = file.trackedChanges.asSorted()
+ let nextTc = trackedChanges.shift()
+
+ const op = new TextOperation()
+ for (const diff of diffs) {
+ let [type, content] = diff
+ if (type === this.ADDED) {
+ op.insert(content)
+ } else if (type === this.REMOVED || type === this.UNCHANGED) {
+ while (op.baseLength + content.length > nextTc?.range.start) {
+ if (nextTc.tracking.type === 'delete') {
+ const untilRange = nextTc.range.start - op.baseLength
+ if (type === this.REMOVED) {
+ op.remove(untilRange)
+ } else if (type === this.UNCHANGED) {
+ op.retain(untilRange)
+ }
+ op.retain(nextTc.range.end - nextTc.range.start)
+ content = content.slice(untilRange)
+ }
+ nextTc = trackedChanges.shift()
+ }
+ if (type === this.REMOVED) {
+ op.remove(content.length)
+ } else if (type === this.UNCHANGED) {
+ op.retain(content.length)
+ }
+ } else {
+ throw new Error('Unknown type')
+ }
+ }
+ while (nextTc) {
+ if (
+ nextTc.tracking.type !== 'delete' ||
+ nextTc.range.start !== op.baseLength
+ ) {
+ throw new OError(
+ 'StringFileData.trackedChanges out of sync: unexpected range after end of diff',
+ { nextTc, baseLength: op.baseLength }
+ )
+ }
+ op.retain(nextTc.range.end - nextTc.range.start)
+ nextTc = trackedChanges.shift()
+ }
+ return op
+ },
}
diff --git a/services/document-updater/app/js/DocumentManager.js b/services/document-updater/app/js/DocumentManager.js
index 157a99ccf6..3fb3d10a6e 100644
--- a/services/document-updater/app/js/DocumentManager.js
+++ b/services/document-updater/app/js/DocumentManager.js
@@ -9,10 +9,18 @@ const HistoryManager = require('./HistoryManager')
const Errors = require('./Errors')
const RangesManager = require('./RangesManager')
const { extractOriginOrSource } = require('./Utils')
+const { getTotalSizeOfLines } = require('./Limits')
+const Settings = require('@overleaf/settings')
+const { StringFileData } = require('overleaf-editor-core')
const MAX_UNFLUSHED_AGE = 300 * 1000 // 5 mins, document should be flushed to mongo this time after a change
const DocumentManager = {
+ /**
+ * @param {string} projectId
+ * @param {string} docId
+ * @return {Promise<{lines: (string[] | StringFileRawData), version: number, ranges: Ranges, resolvedCommentIds: any[], pathname: string, projectHistoryId: string, unflushedTime: any, alreadyLoaded: boolean, historyRangesSupport: boolean, type: OTType}>}
+ */
async getDoc(projectId, docId) {
const {
lines,
@@ -73,6 +81,7 @@ const DocumentManager = {
unflushedTime: null,
alreadyLoaded: false,
historyRangesSupport,
+ type: Array.isArray(lines) ? 'sharejs-text-ot' : 'history-ot',
}
} else {
return {
@@ -85,16 +94,25 @@ const DocumentManager = {
unflushedTime,
alreadyLoaded: true,
historyRangesSupport,
+ type: Array.isArray(lines) ? 'sharejs-text-ot' : 'history-ot',
}
}
},
async getDocAndRecentOps(projectId, docId, fromVersion) {
- const { lines, version, ranges, pathname, projectHistoryId } =
+ const { lines, version, ranges, pathname, projectHistoryId, type } =
await DocumentManager.getDoc(projectId, docId)
if (fromVersion === -1) {
- return { lines, version, ops: [], ranges, pathname, projectHistoryId }
+ return {
+ lines,
+ version,
+ ops: [],
+ ranges,
+ pathname,
+ projectHistoryId,
+ type,
+ }
} else {
const ops = await RedisManager.promises.getPreviousDocOps(
docId,
@@ -108,39 +126,90 @@ const DocumentManager = {
ranges,
pathname,
projectHistoryId,
+ type,
}
}
},
- async setDoc(projectId, docId, newLines, originOrSource, userId, undoing) {
+ async appendToDoc(projectId, docId, linesToAppend, originOrSource, userId) {
+ let { lines: currentLines, type } = await DocumentManager.getDoc(
+ projectId,
+ docId
+ )
+ if (type === 'history-ot') {
+ const file = StringFileData.fromRaw(currentLines)
+ // TODO(24596): tc support for history-ot
+ currentLines = file.getLines()
+ }
+ const currentLineSize = getTotalSizeOfLines(currentLines)
+ const addedSize = getTotalSizeOfLines(linesToAppend)
+ const newlineSize = '\n'.length
+
+ if (currentLineSize + newlineSize + addedSize > Settings.max_doc_length) {
+ throw new Errors.FileTooLargeError(
+ 'doc would become too large if appending this text'
+ )
+ }
+
+ return await DocumentManager.setDoc(
+ projectId,
+ docId,
+ currentLines.concat(linesToAppend),
+ originOrSource,
+ userId,
+ false,
+ false
+ )
+ },
+
+ async setDoc(
+ projectId,
+ docId,
+ newLines,
+ originOrSource,
+ userId,
+ undoing,
+ external
+ ) {
if (newLines == null) {
throw new Error('No lines were provided to setDoc')
}
+ // Circular dependencies. Import at runtime.
+ const HistoryOTUpdateManager = require('./HistoryOTUpdateManager')
const UpdateManager = require('./UpdateManager')
+
const {
lines: oldLines,
version,
alreadyLoaded,
+ type,
} = await DocumentManager.getDoc(projectId, docId)
- if (oldLines != null && oldLines.length > 0 && oldLines[0].text != null) {
- logger.debug(
- { docId, projectId, oldLines, newLines },
- 'document is JSON so not updating'
- )
- return
- }
-
logger.debug(
{ docId, projectId, oldLines, newLines },
'setting a document via http'
)
- const op = DiffCodec.diffAsShareJsOp(oldLines, newLines)
- if (undoing) {
- for (const o of op || []) {
- o.u = true
- } // Turn on undo flag for each op for track changes
+
+ let op
+ if (type === 'history-ot') {
+ const file = StringFileData.fromRaw(oldLines)
+ const operation = DiffCodec.diffAsHistoryOTEditOperation(
+ file,
+ newLines.join('\n')
+ )
+ if (operation.isNoop()) {
+ op = []
+ } else {
+ op = [operation.toJSON()]
+ }
+ } else {
+ op = DiffCodec.diffAsShareJsOp(oldLines, newLines)
+ if (undoing) {
+ for (const o of op || []) {
+ o.u = true
+ } // Turn on undo flag for each op for track changes
+ }
}
const { origin, source } = extractOriginOrSource(originOrSource)
@@ -150,10 +219,12 @@ const DocumentManager = {
op,
v: version,
meta: {
- type: 'external',
user_id: userId,
},
}
+ if (external) {
+ update.meta.type = 'external'
+ }
if (origin) {
update.meta.origin = origin
} else if (source) {
@@ -173,7 +244,11 @@ const DocumentManager = {
// this update, otherwise the doc would never be
// removed from redis.
if (op.length > 0) {
- await UpdateManager.promises.applyUpdate(projectId, docId, update)
+ if (type === 'history-ot') {
+ await HistoryOTUpdateManager.applyUpdate(projectId, docId, update)
+ } else {
+ await UpdateManager.promises.applyUpdate(projectId, docId, update)
+ }
}
// If the document was loaded already, then someone has it open
@@ -194,7 +269,7 @@ const DocumentManager = {
},
async flushDocIfLoaded(projectId, docId) {
- const {
+ let {
lines,
version,
ranges,
@@ -215,6 +290,11 @@ const DocumentManager = {
logger.debug({ projectId, docId, version }, 'flushing doc')
Metrics.inc('flush-doc-if-loaded', 1, { status: 'modified' })
+ if (!Array.isArray(lines)) {
+ const file = StringFileData.fromRaw(lines)
+ // TODO(24596): tc support for history-ot
+ lines = file.getLines()
+ }
const result = await PersistenceManager.promises.setDoc(
projectId,
docId,
@@ -264,7 +344,14 @@ const DocumentManager = {
throw new Errors.NotFoundError(`document not found: ${docId}`)
}
- const newRanges = RangesManager.acceptChanges(changeIds, ranges)
+ // TODO(24596): tc support for history-ot
+ const newRanges = RangesManager.acceptChanges(
+ projectId,
+ docId,
+ changeIds,
+ ranges,
+ lines
+ )
await RedisManager.promises.updateDocument(
projectId,
@@ -323,6 +410,22 @@ const DocumentManager = {
}
},
+ async getComment(projectId, docId, commentId) {
+ // TODO(24596): tc support for history-ot
+ const { ranges } = await DocumentManager.getDoc(projectId, docId)
+
+ const comment = ranges?.comments?.find(comment => comment.id === commentId)
+
+ if (!comment) {
+ throw new Errors.NotFoundError({
+ message: 'comment not found',
+ info: { commentId },
+ })
+ }
+
+ return { comment }
+ },
+
async deleteComment(projectId, docId, commentId, userId) {
const { lines, version, ranges, pathname, historyRangesSupport } =
await DocumentManager.getDoc(projectId, docId)
@@ -330,6 +433,7 @@ const DocumentManager = {
throw new Errors.NotFoundError(`document not found: ${docId}`)
}
+ // TODO(24596): tc support for history-ot
const newRanges = RangesManager.deleteComment(commentId, ranges)
await RedisManager.promises.updateDocument(
@@ -369,7 +473,7 @@ const DocumentManager = {
},
async getDocAndFlushIfOld(projectId, docId) {
- const { lines, version, unflushedTime, alreadyLoaded } =
+ let { lines, version, unflushedTime, alreadyLoaded } =
await DocumentManager.getDoc(projectId, docId)
// if doc was already loaded see if it needs to be flushed
@@ -381,6 +485,12 @@ const DocumentManager = {
await DocumentManager.flushDocIfLoaded(projectId, docId)
}
+ if (!Array.isArray(lines)) {
+ const file = StringFileData.fromRaw(lines)
+ // TODO(24596): tc support for history-ot
+ lines = file.getLines()
+ }
+
return { lines, version }
},
@@ -456,6 +566,16 @@ const DocumentManager = {
)
},
+ async getCommentWithLock(projectId, docId, commentId) {
+ const UpdateManager = require('./UpdateManager')
+ return await UpdateManager.promises.lockUpdatesAndDo(
+ DocumentManager.getComment,
+ projectId,
+ docId,
+ commentId
+ )
+ },
+
async getDocAndRecentOpsWithLock(projectId, docId, fromVersion) {
const UpdateManager = require('./UpdateManager')
return await UpdateManager.promises.lockUpdatesAndDo(
@@ -475,7 +595,15 @@ const DocumentManager = {
)
},
- async setDocWithLock(projectId, docId, lines, source, userId, undoing) {
+ async setDocWithLock(
+ projectId,
+ docId,
+ lines,
+ source,
+ userId,
+ undoing,
+ external
+ ) {
const UpdateManager = require('./UpdateManager')
return await UpdateManager.promises.lockUpdatesAndDo(
DocumentManager.setDoc,
@@ -484,7 +612,20 @@ const DocumentManager = {
lines,
source,
userId,
- undoing
+ undoing,
+ external
+ )
+ },
+
+ async appendToDocWithLock(projectId, docId, lines, source, userId) {
+ const UpdateManager = require('./UpdateManager')
+ return await UpdateManager.promises.lockUpdatesAndDo(
+ DocumentManager.appendToDoc,
+ projectId,
+ docId,
+ lines,
+ source,
+ userId
)
},
@@ -602,6 +743,7 @@ module.exports = {
'ranges',
'pathname',
'projectHistoryId',
+ 'type',
],
getDocAndRecentOpsWithLock: [
'lines',
@@ -610,7 +752,9 @@ module.exports = {
'ranges',
'pathname',
'projectHistoryId',
+ 'type',
],
+ getCommentWithLock: ['comment'],
},
}),
promises: DocumentManager,
diff --git a/services/document-updater/app/js/Errors.js b/services/document-updater/app/js/Errors.js
index a43f69ad35..ac1f5875fa 100644
--- a/services/document-updater/app/js/Errors.js
+++ b/services/document-updater/app/js/Errors.js
@@ -5,6 +5,15 @@ class OpRangeNotAvailableError extends OError {}
class ProjectStateChangedError extends OError {}
class DeleteMismatchError extends OError {}
class FileTooLargeError extends OError {}
+class OTTypeMismatchError extends OError {
+ /**
+ * @param {OTType} got
+ * @param {OTType} want
+ */
+ constructor(got, want) {
+ super('ot type mismatch', { got, want })
+ }
+}
module.exports = {
NotFoundError,
@@ -12,4 +21,5 @@ module.exports = {
ProjectStateChangedError,
DeleteMismatchError,
FileTooLargeError,
+ OTTypeMismatchError,
}
diff --git a/services/document-updater/app/js/HistoryManager.js b/services/document-updater/app/js/HistoryManager.js
index 3a91b29cb8..d9a8459525 100644
--- a/services/document-updater/app/js/HistoryManager.js
+++ b/services/document-updater/app/js/HistoryManager.js
@@ -62,6 +62,7 @@ const HistoryManager = {
// record updates for project history
if (
HistoryManager.shouldFlushHistoryOps(
+ projectId,
projectOpsLength,
ops.length,
HistoryManager.FLUSH_PROJECT_EVERY_N_OPS
@@ -77,7 +78,8 @@ const HistoryManager = {
}
},
- shouldFlushHistoryOps(length, opsLength, threshold) {
+ shouldFlushHistoryOps(projectId, length, opsLength, threshold) {
+ if (Settings.shortHistoryQueues.includes(projectId)) return true
if (!length) {
return false
} // don't flush unless we know the length
@@ -106,10 +108,12 @@ const HistoryManager = {
projectHistoryId,
docs,
files,
+ opts,
function (error) {
if (error) {
return callback(error)
}
+ if (opts.resyncProjectStructureOnly) return callback()
const DocumentManager = require('./DocumentManager')
const resyncDoc = (doc, cb) => {
DocumentManager.resyncDocContentsWithLock(
diff --git a/services/document-updater/app/js/HistoryOTUpdateManager.js b/services/document-updater/app/js/HistoryOTUpdateManager.js
new file mode 100644
index 0000000000..5a8b92099e
--- /dev/null
+++ b/services/document-updater/app/js/HistoryOTUpdateManager.js
@@ -0,0 +1,158 @@
+// @ts-check
+
+const Profiler = require('./Profiler')
+const DocumentManager = require('./DocumentManager')
+const Errors = require('./Errors')
+const RedisManager = require('./RedisManager')
+const {
+ EditOperationBuilder,
+ StringFileData,
+ EditOperationTransformer,
+} = require('overleaf-editor-core')
+const Metrics = require('./Metrics')
+const ProjectHistoryRedisManager = require('./ProjectHistoryRedisManager')
+const HistoryManager = require('./HistoryManager')
+const RealTimeRedisManager = require('./RealTimeRedisManager')
+
+/**
+ * @typedef {import("./types").Update} Update
+ * @typedef {import("./types").HistoryOTEditOperationUpdate} HistoryOTEditOperationUpdate
+ */
+
+/**
+ * @param {Update} update
+ * @return {update is HistoryOTEditOperationUpdate}
+ */
+function isHistoryOTEditOperationUpdate(update) {
+ return (
+ update &&
+ 'doc' in update &&
+ 'op' in update &&
+ 'v' in update &&
+ Array.isArray(update.op) &&
+ EditOperationBuilder.isValid(update.op[0])
+ )
+}
+
+/**
+ * Try to apply an update to the given document
+ *
+ * @param {string} projectId
+ * @param {string} docId
+ * @param {HistoryOTEditOperationUpdate} update
+ * @param {Profiler} profiler
+ */
+async function tryApplyUpdate(projectId, docId, update, profiler) {
+ let { lines, version, pathname, type } =
+ await DocumentManager.promises.getDoc(projectId, docId)
+ profiler.log('getDoc')
+
+ if (lines == null || version == null) {
+ throw new Errors.NotFoundError(`document not found: ${docId}`)
+ }
+ if (type !== 'history-ot') {
+ throw new Errors.OTTypeMismatchError(type, 'history-ot')
+ }
+
+ let op = EditOperationBuilder.fromJSON(update.op[0])
+ if (version !== update.v) {
+ const transformUpdates = await RedisManager.promises.getPreviousDocOps(
+ docId,
+ update.v,
+ version
+ )
+ for (const transformUpdate of transformUpdates) {
+ if (!isHistoryOTEditOperationUpdate(transformUpdate)) {
+ throw new Errors.OTTypeMismatchError('sharejs-text-ot', 'history-ot')
+ }
+
+ if (
+ transformUpdate.meta.source &&
+ update.dupIfSource?.includes(transformUpdate.meta.source)
+ ) {
+ update.dup = true
+ break
+ }
+ const other = EditOperationBuilder.fromJSON(transformUpdate.op[0])
+ op = EditOperationTransformer.transform(op, other)[0]
+ }
+ update.op = [op.toJSON()]
+ }
+
+ if (!update.dup) {
+ const file = StringFileData.fromRaw(lines)
+ file.edit(op)
+ version += 1
+ update.meta.ts = Date.now()
+ await RedisManager.promises.updateDocument(
+ projectId,
+ docId,
+ file.toRaw(),
+ version,
+ [update],
+ {},
+ update.meta
+ )
+
+ Metrics.inc('history-queue', 1, { status: 'project-history' })
+ try {
+ const projectOpsLength =
+ await ProjectHistoryRedisManager.promises.queueOps(projectId, [
+ JSON.stringify({
+ ...update,
+ meta: {
+ ...update.meta,
+ pathname,
+ },
+ }),
+ ])
+ HistoryManager.recordAndFlushHistoryOps(
+ projectId,
+ [update],
+ projectOpsLength
+ )
+ profiler.log('recordAndFlushHistoryOps')
+ } catch (err) {
+ // The full project history can re-sync a project in case
+ // updates went missing.
+ // Just record the error here and acknowledge the write-op.
+ Metrics.inc('history-queue-error')
+ }
+ }
+ RealTimeRedisManager.sendData({
+ project_id: projectId,
+ doc_id: docId,
+ op: update,
+ })
+}
+
+/**
+ * Apply an update to the given document
+ *
+ * @param {string} projectId
+ * @param {string} docId
+ * @param {HistoryOTEditOperationUpdate} update
+ */
+async function applyUpdate(projectId, docId, update) {
+ const profiler = new Profiler('applyUpdate', {
+ project_id: projectId,
+ doc_id: docId,
+ type: 'history-ot',
+ })
+
+ try {
+ await tryApplyUpdate(projectId, docId, update, profiler)
+ } catch (error) {
+ RealTimeRedisManager.sendData({
+ project_id: projectId,
+ doc_id: docId,
+ error: error instanceof Error ? error.message : error,
+ })
+ profiler.log('sendData')
+ throw error
+ } finally {
+ profiler.end()
+ }
+}
+
+module.exports = { isHistoryOTEditOperationUpdate, applyUpdate }
diff --git a/services/document-updater/app/js/HttpController.js b/services/document-updater/app/js/HttpController.js
index a3c7b6cd44..0a6ae3b2b4 100644
--- a/services/document-updater/app/js/HttpController.js
+++ b/services/document-updater/app/js/HttpController.js
@@ -9,6 +9,7 @@ const Metrics = require('./Metrics')
const DeleteQueueManager = require('./DeleteQueueManager')
const { getTotalSizeOfLines } = require('./Limits')
const async = require('async')
+const { StringFileData } = require('overleaf-editor-core')
function getDoc(req, res, next) {
let fromVersion
@@ -27,7 +28,7 @@ function getDoc(req, res, next) {
projectId,
docId,
fromVersion,
- (error, lines, version, ops, ranges, pathname) => {
+ (error, lines, version, ops, ranges, pathname, _projectHistoryId, type) => {
timer.done()
if (error) {
return next(error)
@@ -36,6 +37,11 @@ function getDoc(req, res, next) {
if (lines == null || version == null) {
return next(new Errors.NotFoundError('document not found'))
}
+ if (!Array.isArray(lines) && req.query.historyOTSupport !== 'true') {
+ const file = StringFileData.fromRaw(lines)
+ // TODO(24596): tc support for history-ot
+ lines = file.getLines()
+ }
res.json({
id: docId,
lines,
@@ -44,11 +50,35 @@ function getDoc(req, res, next) {
ranges,
pathname,
ttlInS: RedisManager.DOC_OPS_TTL,
+ type,
})
}
)
}
+function getComment(req, res, next) {
+ const docId = req.params.doc_id
+ const projectId = req.params.project_id
+ const commentId = req.params.comment_id
+
+ logger.debug({ projectId, docId, commentId }, 'getting comment via http')
+
+ DocumentManager.getCommentWithLock(
+ projectId,
+ docId,
+ commentId,
+ (error, comment) => {
+ if (error) {
+ return next(error)
+ }
+ if (comment == null) {
+ return next(new Errors.NotFoundError('comment not found'))
+ }
+ res.json(comment)
+ }
+ )
+}
+
// return the doc from redis if present, but don't load it from mongo
function peekDoc(req, res, next) {
const docId = req.params.doc_id
@@ -61,6 +91,11 @@ function peekDoc(req, res, next) {
if (lines == null || version == null) {
return next(new Errors.NotFoundError('document not found'))
}
+ if (!Array.isArray(lines) && req.query.historyOTSupport !== 'true') {
+ const file = StringFileData.fromRaw(lines)
+ // TODO(24596): tc support for history-ot
+ lines = file.getLines()
+ }
res.json({ id: docId, lines, version })
})
}
@@ -106,6 +141,22 @@ function getProjectDocsAndFlushIfOld(req, res, next) {
)
}
+function getProjectLastUpdatedAt(req, res, next) {
+ const projectId = req.params.project_id
+ ProjectManager.getProjectDocsTimestamps(projectId, (err, timestamps) => {
+ if (err) return next(err)
+
+ // Filter out nulls. This can happen when
+ // - docs get flushed between the listing and getting the individual docs ts
+ // - a doc flush failed half way (doc keys removed, project tracking not updated)
+ timestamps = timestamps.filter(ts => !!ts)
+
+ timestamps = timestamps.map(ts => parseInt(ts, 10))
+ timestamps.sort((a, b) => (a > b ? 1 : -1))
+ res.json({ lastUpdatedAt: timestamps.pop() })
+ })
+}
+
function clearProjectState(req, res, next) {
const projectId = req.params.project_id
const timer = new Metrics.Timer('http.clearProjectState')
@@ -144,6 +195,7 @@ function setDoc(req, res, next) {
source,
userId,
undoing,
+ true,
(error, result) => {
timer.done()
if (error) {
@@ -155,6 +207,35 @@ function setDoc(req, res, next) {
)
}
+function appendToDoc(req, res, next) {
+ const docId = req.params.doc_id
+ const projectId = req.params.project_id
+ const { lines, source, user_id: userId } = req.body
+ const timer = new Metrics.Timer('http.appendToDoc')
+ DocumentManager.appendToDocWithLock(
+ projectId,
+ docId,
+ lines,
+ source,
+ userId,
+ (error, result) => {
+ timer.done()
+ if (error instanceof Errors.FileTooLargeError) {
+ logger.warn('refusing to append to file, it would become too large')
+ return res.sendStatus(422)
+ }
+ if (error) {
+ return next(error)
+ }
+ logger.debug(
+ { projectId, docId, lines, source, userId },
+ 'appending to doc via http'
+ )
+ res.json(result)
+ }
+ )
+}
+
function flushDocIfLoaded(req, res, next) {
const docId = req.params.doc_id
const projectId = req.params.project_id
@@ -380,7 +461,13 @@ function updateProject(req, res, next) {
function resyncProjectHistory(req, res, next) {
const projectId = req.params.project_id
- const { projectHistoryId, docs, files, historyRangesMigration } = req.body
+ const {
+ projectHistoryId,
+ docs,
+ files,
+ historyRangesMigration,
+ resyncProjectStructureOnly,
+ } = req.body
logger.debug(
{ projectId, docs, files },
@@ -391,6 +478,9 @@ function resyncProjectHistory(req, res, next) {
if (historyRangesMigration) {
opts.historyRangesMigration = historyRangesMigration
}
+ if (resyncProjectStructureOnly) {
+ opts.resyncProjectStructureOnly = resyncProjectStructureOnly
+ }
HistoryManager.resyncProjectHistory(
projectId,
@@ -459,7 +549,9 @@ module.exports = {
getDoc,
peekDoc,
getProjectDocsAndFlushIfOld,
+ getProjectLastUpdatedAt,
clearProjectState,
+ appendToDoc,
setDoc,
flushDocIfLoaded,
deleteDoc,
@@ -475,4 +567,5 @@ module.exports = {
flushQueuedProjects,
blockProject,
unblockProject,
+ getComment,
}
diff --git a/services/document-updater/app/js/Limits.js b/services/document-updater/app/js/Limits.js
index 268ccd3f9b..cbd9293042 100644
--- a/services/document-updater/app/js/Limits.js
+++ b/services/document-updater/app/js/Limits.js
@@ -28,4 +28,19 @@ module.exports = {
// since we didn't hit the limit in the loop, the document is within the allowed length
return false
},
+
+ /**
+ * @param {StringFileRawData} raw
+ * @param {number} maxDocLength
+ */
+ stringFileDataContentIsTooLarge(raw, maxDocLength) {
+ let n = raw.content.length
+ if (n <= maxDocLength) return false // definitely under the limit, no need to calculate the total size
+ for (const tc of raw.trackedChanges ?? []) {
+ if (tc.tracking.type !== 'delete') continue
+ n -= tc.range.length
+ if (n <= maxDocLength) return false // under the limit now, no need to calculate the exact size
+ }
+ return true
+ },
}
diff --git a/services/document-updater/app/js/PersistenceManager.js b/services/document-updater/app/js/PersistenceManager.js
index 484b9bab2a..6e832f9aa7 100644
--- a/services/document-updater/app/js/PersistenceManager.js
+++ b/services/document-updater/app/js/PersistenceManager.js
@@ -1,4 +1,4 @@
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const { promisifyMultiResult } = require('@overleaf/promise-utils')
const Settings = require('@overleaf/settings')
const Errors = require('./Errors')
@@ -95,6 +95,13 @@ function getDoc(projectId, docId, options = {}, _callback) {
status: body.pathname === '' ? 'zero-length' : 'undefined',
})
}
+
+ if (body.otMigrationStage > 0) {
+ // Use history-ot
+ body.lines = { content: body.lines.join('\n') }
+ body.ranges = {}
+ }
+
callback(
null,
body.lines,
diff --git a/services/document-updater/app/js/Profiler.js b/services/document-updater/app/js/Profiler.js
index 8daac4ca41..aac8a9706e 100644
--- a/services/document-updater/app/js/Profiler.js
+++ b/services/document-updater/app/js/Profiler.js
@@ -1,68 +1,52 @@
-/* eslint-disable
- no-unused-vars,
-*/
-// TODO: This file was created by bulk-decaffeinate.
-// Fix any style issues and re-enable lint.
-/*
- * decaffeinate suggestions:
- * DS206: Consider reworking classes to avoid initClass
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
-let Profiler
-const Settings = require('@overleaf/settings')
const logger = require('@overleaf/logger')
-const deltaMs = function (ta, tb) {
+function deltaMs(ta, tb) {
const nanoSeconds = (ta[0] - tb[0]) * 1e9 + (ta[1] - tb[1])
const milliSeconds = Math.floor(nanoSeconds * 1e-6)
return milliSeconds
}
-module.exports = Profiler = (function () {
- Profiler = class Profiler {
- static initClass() {
- this.prototype.LOG_CUTOFF_TIME = 15 * 1000
- this.prototype.LOG_SYNC_CUTOFF_TIME = 1000
- }
+class Profiler {
+ LOG_CUTOFF_TIME = 15 * 1000
+ LOG_SYNC_CUTOFF_TIME = 1000
- constructor(name, args) {
- this.name = name
- this.args = args
- this.t0 = this.t = process.hrtime()
- this.start = new Date()
- this.updateTimes = []
- this.totalSyncTime = 0
- }
-
- log(label, options = {}) {
- const t1 = process.hrtime()
- const dtMilliSec = deltaMs(t1, this.t)
- this.t = t1
- this.totalSyncTime += options.sync ? dtMilliSec : 0
- this.updateTimes.push([label, dtMilliSec]) // timings in ms
- return this // make it chainable
- }
-
- end(message) {
- const totalTime = deltaMs(this.t, this.t0)
- const exceedsCutoff = totalTime > this.LOG_CUTOFF_TIME
- const exceedsSyncCutoff = this.totalSyncTime > this.LOG_SYNC_CUTOFF_TIME
- if (exceedsCutoff || exceedsSyncCutoff) {
- // log anything greater than cutoffs
- const args = {}
- for (const k in this.args) {
- const v = this.args[k]
- args[k] = v
- }
- args.updateTimes = this.updateTimes
- args.start = this.start
- args.end = new Date()
- args.status = { exceedsCutoff, exceedsSyncCutoff }
- logger.warn(args, this.name)
- }
- return totalTime
- }
+ constructor(name, args) {
+ this.name = name
+ this.args = args
+ this.t0 = this.t = process.hrtime()
+ this.start = new Date()
+ this.updateTimes = []
+ this.totalSyncTime = 0
}
- Profiler.initClass()
- return Profiler
-})()
+
+ log(label, options = {}) {
+ const t1 = process.hrtime()
+ const dtMilliSec = deltaMs(t1, this.t)
+ this.t = t1
+ this.totalSyncTime += options.sync ? dtMilliSec : 0
+ this.updateTimes.push([label, dtMilliSec]) // timings in ms
+ return this // make it chainable
+ }
+
+ end() {
+ const totalTime = deltaMs(this.t, this.t0)
+ const exceedsCutoff = totalTime > this.LOG_CUTOFF_TIME
+ const exceedsSyncCutoff = this.totalSyncTime > this.LOG_SYNC_CUTOFF_TIME
+ if (exceedsCutoff || exceedsSyncCutoff) {
+ // log anything greater than cutoffs
+ const args = {}
+ for (const k in this.args) {
+ const v = this.args[k]
+ args[k] = v
+ }
+ args.updateTimes = this.updateTimes
+ args.start = this.start
+ args.end = new Date()
+ args.status = { exceedsCutoff, exceedsSyncCutoff }
+ logger.warn(args, this.name)
+ }
+ return totalTime
+ }
+}
+
+module.exports = Profiler
diff --git a/services/document-updater/app/js/ProjectHistoryRedisManager.js b/services/document-updater/app/js/ProjectHistoryRedisManager.js
index b84edfe74a..78e9c2ea4c 100644
--- a/services/document-updater/app/js/ProjectHistoryRedisManager.js
+++ b/services/document-updater/app/js/ProjectHistoryRedisManager.js
@@ -8,13 +8,14 @@ const rclient = require('@overleaf/redis-wrapper').createClient(
)
const logger = require('@overleaf/logger')
const metrics = require('./Metrics')
-const { docIsTooLarge } = require('./Limits')
+const { docIsTooLarge, stringFileDataContentIsTooLarge } = require('./Limits')
const { addTrackedDeletesToContent, extractOriginOrSource } = require('./Utils')
const HistoryConversions = require('./HistoryConversions')
const OError = require('@overleaf/o-error')
/**
* @import { Ranges } from './types'
+ * @import { StringFileRawData } from 'overleaf-editor-core/lib/types'
*/
const ProjectHistoryRedisManager = {
@@ -122,6 +123,7 @@ const ProjectHistoryRedisManager = {
hash: projectUpdate.hash,
metadata: projectUpdate.metadata,
projectHistoryId,
+ createdBlob: projectUpdate.createdBlob ?? false,
}
if (ranges) {
projectUpdate.ranges = ranges
@@ -151,7 +153,13 @@ const ProjectHistoryRedisManager = {
return await ProjectHistoryRedisManager.queueOps(projectId, jsonUpdate)
},
- async queueResyncProjectStructure(projectId, projectHistoryId, docs, files) {
+ async queueResyncProjectStructure(
+ projectId,
+ projectHistoryId,
+ docs,
+ files,
+ opts
+ ) {
logger.debug({ projectId, docs, files }, 'queue project structure resync')
const projectUpdate = {
resyncProjectStructure: { docs, files },
@@ -160,6 +168,9 @@ const ProjectHistoryRedisManager = {
ts: new Date(),
},
}
+ if (opts.resyncProjectStructureOnly) {
+ projectUpdate.resyncProjectStructureOnly = opts.resyncProjectStructureOnly
+ }
const jsonUpdate = JSON.stringify(projectUpdate)
return await ProjectHistoryRedisManager.queueOps(projectId, jsonUpdate)
},
@@ -170,7 +181,7 @@ const ProjectHistoryRedisManager = {
* @param {string} projectId
* @param {string} projectHistoryId
* @param {string} docId
- * @param {string[]} lines
+ * @param {string[] | StringFileRawData} lines
* @param {Ranges} ranges
* @param {string[]} resolvedCommentIds
* @param {number} version
@@ -194,13 +205,8 @@ const ProjectHistoryRedisManager = {
'queue doc content resync'
)
- let content = lines.join('\n')
- if (historyRangesSupport) {
- content = addTrackedDeletesToContent(content, ranges.changes ?? [])
- }
-
const projectUpdate = {
- resyncDocContent: { content, version },
+ resyncDocContent: { version },
projectHistoryId,
path: pathname,
doc: docId,
@@ -209,17 +215,38 @@ const ProjectHistoryRedisManager = {
},
}
- if (historyRangesSupport) {
- projectUpdate.resyncDocContent.ranges =
- HistoryConversions.toHistoryRanges(ranges)
- projectUpdate.resyncDocContent.resolvedCommentIds = resolvedCommentIds
+ let content = ''
+ if (Array.isArray(lines)) {
+ content = lines.join('\n')
+ if (historyRangesSupport) {
+ content = addTrackedDeletesToContent(content, ranges.changes ?? [])
+ projectUpdate.resyncDocContent.ranges =
+ HistoryConversions.toHistoryRanges(ranges)
+ projectUpdate.resyncDocContent.resolvedCommentIds = resolvedCommentIds
+ }
+ } else {
+ content = lines.content
+ projectUpdate.resyncDocContent.historyOTRanges = {
+ comments: lines.comments,
+ trackedChanges: lines.trackedChanges,
+ }
}
+ projectUpdate.resyncDocContent.content = content
const jsonUpdate = JSON.stringify(projectUpdate)
// Do an optimised size check on the docLines using the serialised
// project update length as an upper bound
const sizeBound = jsonUpdate.length
- if (docIsTooLarge(sizeBound, lines, Settings.max_doc_length)) {
+ if (Array.isArray(lines)) {
+ if (docIsTooLarge(sizeBound, lines, Settings.max_doc_length)) {
+ throw new OError(
+ 'blocking resync doc content insert into project history queue: doc is too large',
+ { projectId, docId, docSize: sizeBound }
+ )
+ }
+ } else if (
+ stringFileDataContentIsTooLarge(lines, Settings.max_doc_length)
+ ) {
throw new OError(
'blocking resync doc content insert into project history queue: doc is too large',
{ projectId, docId, docSize: sizeBound }
diff --git a/services/document-updater/app/js/ProjectManager.js b/services/document-updater/app/js/ProjectManager.js
index 781ed0e168..cdd4c11482 100644
--- a/services/document-updater/app/js/ProjectManager.js
+++ b/services/document-updater/app/js/ProjectManager.js
@@ -317,6 +317,7 @@ function updateProjectWithLocks(
}
if (
HistoryManager.shouldFlushHistoryOps(
+ projectId,
projectOpsLength,
updates.length,
HistoryManager.FLUSH_PROJECT_EVERY_N_OPS
diff --git a/services/document-updater/app/js/RangesManager.js b/services/document-updater/app/js/RangesManager.js
index 7dfa462ce4..c146afda60 100644
--- a/services/document-updater/app/js/RangesManager.js
+++ b/services/document-updater/app/js/RangesManager.js
@@ -127,7 +127,7 @@ const RangesManager = {
return { newRanges, rangesWereCollapsed, historyUpdates }
},
- acceptChanges(changeIds, ranges) {
+ acceptChanges(projectId, docId, changeIds, ranges, lines) {
const { changes, comments } = ranges
logger.debug(`accepting ${changeIds.length} changes in ranges`)
const rangesTracker = new RangesTracker(changes, comments)
@@ -339,6 +339,12 @@ function getHistoryOpForInsert(op, comments, changes) {
}
}
+ // If it's determined that the op is a tracked delete rejection, we have to
+ // calculate its proper history position. If multiple tracked deletes are
+ // found at the same position as the insert, the tracked deletes that come
+ // before the tracked delete that was actually rejected offset the history
+ // position.
+ let trackedDeleteRejectionOffset = 0
for (const change of changes) {
if (!isDelete(change.op)) {
// We're only interested in tracked deletes
@@ -349,14 +355,25 @@ function getHistoryOpForInsert(op, comments, changes) {
// Tracked delete is before the op. Move the op forward.
hpos += change.op.d.length
} else if (change.op.p === op.p) {
- // Tracked delete is at the same position as the op. The insert comes before
- // the tracked delete so it doesn't move.
+ // Tracked delete is at the same position as the op.
if (op.u && change.op.d.startsWith(op.i)) {
// We're undoing and the insert matches the start of the tracked
// delete. RangesManager treats this as a tracked delete rejection. We
// will note this in the op so that project-history can take the
// appropriate action.
trackedDeleteRejection = true
+
+ // The history must be updated to take into account all preceding
+ // tracked deletes at the same position
+ hpos += trackedDeleteRejectionOffset
+
+ // No need to continue. All subsequent tracked deletes are after the
+ // insert.
+ break
+ } else {
+ // This tracked delete does not match the insert. Note its length in
+ // case we find a tracked delete that matches later.
+ trackedDeleteRejectionOffset += change.op.d.length
}
} else {
// Tracked delete is after the insert. Tracked deletes are ordered, so
diff --git a/services/document-updater/app/js/RealTimeRedisManager.js b/services/document-updater/app/js/RealTimeRedisManager.js
index 9f7465acb8..2b67971c5c 100644
--- a/services/document-updater/app/js/RealTimeRedisManager.js
+++ b/services/document-updater/app/js/RealTimeRedisManager.js
@@ -20,8 +20,8 @@ const pubsubClient = require('@overleaf/redis-wrapper').createClient(
)
const Keys = Settings.redis.documentupdater.key_schema
const logger = require('@overleaf/logger')
-const os = require('os')
-const crypto = require('crypto')
+const os = require('node:os')
+const crypto = require('node:crypto')
const metrics = require('./Metrics')
const HOST = os.hostname()
@@ -49,7 +49,7 @@ const RealTimeRedisManager = {
MAX_OPS_PER_ITERATION,
-1
)
- return multi.exec(function (error, replys) {
+ multi.exec(function (error, replys) {
if (error != null) {
return callback(error)
}
@@ -80,7 +80,7 @@ const RealTimeRedisManager = {
},
getUpdatesLength(docId, callback) {
- return rclient.llen(Keys.pendingUpdates({ doc_id: docId }), callback)
+ rclient.llen(Keys.pendingUpdates({ doc_id: docId }), callback)
},
sendCanaryAppliedOp({ projectId, docId, op }) {
@@ -132,5 +132,5 @@ const RealTimeRedisManager = {
module.exports = RealTimeRedisManager
module.exports.promises = promisifyAll(RealTimeRedisManager, {
- without: ['sendData'],
+ without: ['sendCanaryAppliedOp', 'sendData'],
})
diff --git a/services/document-updater/app/js/RedisManager.js b/services/document-updater/app/js/RedisManager.js
index 0d2dad1047..7f86036427 100644
--- a/services/document-updater/app/js/RedisManager.js
+++ b/services/document-updater/app/js/RedisManager.js
@@ -7,7 +7,7 @@ const OError = require('@overleaf/o-error')
const { promisifyAll } = require('@overleaf/promise-utils')
const metrics = require('./Metrics')
const Errors = require('./Errors')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const async = require('async')
const { docIsTooLarge } = require('./Limits')
@@ -48,6 +48,7 @@ const RedisManager = {
timer.done()
_callback(error)
}
+ const shareJSTextOT = Array.isArray(docLines)
const docLinesArray = docLines
docLines = JSON.stringify(docLines)
if (docLines.indexOf('\u0000') !== -1) {
@@ -60,7 +61,10 @@ const RedisManager = {
// Do an optimised size check on the docLines using the serialised
// length as an upper bound
const sizeBound = docLines.length
- if (docIsTooLarge(sizeBound, docLinesArray, Settings.max_doc_length)) {
+ if (
+ shareJSTextOT && // editor-core has a size check in TextOperation.apply and TextOperation.applyToLength.
+ docIsTooLarge(sizeBound, docLinesArray, Settings.max_doc_length)
+ ) {
const docSize = docLines.length
const err = new Error('blocking doc insert into redis: doc is too large')
logger.error({ projectId, docId, err, docSize }, err.message)
@@ -461,6 +465,7 @@ const RedisManager = {
if (appliedOps == null) {
appliedOps = []
}
+ const shareJSTextOT = Array.isArray(docLines)
RedisManager.getDocVersion(docId, (error, currentVersion) => {
if (error) {
return callback(error)
@@ -500,7 +505,10 @@ const RedisManager = {
// Do an optimised size check on the docLines using the serialised
// length as an upper bound
const sizeBound = newDocLines.length
- if (docIsTooLarge(sizeBound, docLines, Settings.max_doc_length)) {
+ if (
+ shareJSTextOT && // editor-core has a size check in TextOperation.apply and TextOperation.applyToLength.
+ docIsTooLarge(sizeBound, docLines, Settings.max_doc_length)
+ ) {
const err = new Error('blocking doc update: doc is too large')
const docSize = newDocLines.length
logger.error({ projectId, docId, err, docSize }, err.message)
diff --git a/services/document-updater/app/js/ShareJsUpdateManager.js b/services/document-updater/app/js/ShareJsUpdateManager.js
index edac3700b7..933ded1ce1 100644
--- a/services/document-updater/app/js/ShareJsUpdateManager.js
+++ b/services/document-updater/app/js/ShareJsUpdateManager.js
@@ -16,10 +16,10 @@ const logger = require('@overleaf/logger')
const Settings = require('@overleaf/settings')
const { promisifyAll } = require('@overleaf/promise-utils')
const Keys = require('./UpdateKeys')
-const { EventEmitter } = require('events')
-const util = require('util')
+const { EventEmitter } = require('node:events')
+const util = require('node:util')
const RealTimeRedisManager = require('./RealTimeRedisManager')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const metrics = require('./Metrics')
const Errors = require('./Errors')
diff --git a/services/document-updater/app/js/UpdateManager.js b/services/document-updater/app/js/UpdateManager.js
index b23522a2cb..e5df48575e 100644
--- a/services/document-updater/app/js/UpdateManager.js
+++ b/services/document-updater/app/js/UpdateManager.js
@@ -14,10 +14,11 @@ const DocumentManager = require('./DocumentManager')
const RangesManager = require('./RangesManager')
const SnapshotManager = require('./SnapshotManager')
const Profiler = require('./Profiler')
-const { isInsert, isDelete, getDocLength } = require('./Utils')
+const { isInsert, isDelete, getDocLength, computeDocHash } = require('./Utils')
+const HistoryOTUpdateManager = require('./HistoryOTUpdateManager')
/**
- * @import { DeleteOp, InsertOp, Op, Ranges, Update, HistoryUpdate } from "./types"
+ * @import { Ranges, Update, HistoryUpdate } from "./types"
*/
const UpdateManager = {
@@ -80,7 +81,11 @@ const UpdateManager = {
profile.log('getPendingUpdatesForDoc')
for (const update of updates) {
- await UpdateManager.applyUpdate(projectId, docId, update)
+ if (HistoryOTUpdateManager.isHistoryOTEditOperationUpdate(update)) {
+ await HistoryOTUpdateManager.applyUpdate(projectId, docId, update)
+ } else {
+ await UpdateManager.applyUpdate(projectId, docId, update)
+ }
profile.log('applyUpdate')
}
profile.log('async done').end()
@@ -110,12 +115,16 @@ const UpdateManager = {
pathname,
projectHistoryId,
historyRangesSupport,
+ type,
} = await DocumentManager.promises.getDoc(projectId, docId)
profile.log('getDoc')
if (lines == null || version == null) {
throw new Errors.NotFoundError(`document not found: ${docId}`)
}
+ if (type !== 'sharejs-text-ot') {
+ throw new Errors.OTTypeMismatchError(type, 'sharejs-text-ot')
+ }
const previousVersion = version
const incomingUpdateVersion = update.v
@@ -162,6 +171,7 @@ const UpdateManager = {
projectHistoryId,
lines,
ranges,
+ updatedDocLines,
historyRangesSupport
)
@@ -290,8 +300,9 @@ const UpdateManager = {
* @param {HistoryUpdate[]} updates
* @param {string} pathname
* @param {string} projectHistoryId
- * @param {string[]} lines
- * @param {Ranges} ranges
+ * @param {string[]} lines - document lines before updates were applied
+ * @param {Ranges} ranges - ranges before updates were applied
+ * @param {string[]} newLines - document lines after updates were applied
* @param {boolean} historyRangesSupport
*/
_adjustHistoryUpdatesMetadata(
@@ -300,6 +311,7 @@ const UpdateManager = {
projectHistoryId,
lines,
ranges,
+ newLines,
historyRangesSupport
) {
let docLength = getDocLength(lines)
@@ -363,6 +375,12 @@ const UpdateManager = {
delete update.meta.tc
}
}
+
+ if (historyRangesSupport && updates.length > 0) {
+ const lastUpdate = updates[updates.length - 1]
+ lastUpdate.meta ??= {}
+ lastUpdate.meta.doc_hash = computeDocHash(newLines)
+ }
},
}
diff --git a/services/document-updater/app/js/Utils.js b/services/document-updater/app/js/Utils.js
index 4e9e60ba06..a632cf32eb 100644
--- a/services/document-updater/app/js/Utils.js
+++ b/services/document-updater/app/js/Utils.js
@@ -1,4 +1,5 @@
// @ts-check
+const { createHash } = require('node:crypto')
const _ = require('lodash')
/**
@@ -79,6 +80,27 @@ function addTrackedDeletesToContent(content, trackedChanges) {
return result
}
+/**
+ * Compute the content hash for a doc
+ *
+ * This hash is sent to the history to validate updates.
+ *
+ * @param {string[]} lines
+ * @return {string} the doc hash
+ */
+function computeDocHash(lines) {
+ const hash = createHash('sha1')
+ if (lines.length > 0) {
+ for (const line of lines.slice(0, lines.length - 1)) {
+ hash.update(line)
+ hash.update('\n')
+ }
+ // The last line doesn't end with a newline
+ hash.update(lines[lines.length - 1])
+ }
+ return hash.digest('hex')
+}
+
/**
* checks if the given originOrSource should be treated as a source or origin
* TODO: remove this hack and remove all "source" references
@@ -102,5 +124,6 @@ module.exports = {
isComment,
addTrackedDeletesToContent,
getDocLength,
+ computeDocHash,
extractOriginOrSource,
}
diff --git a/services/document-updater/app/js/mongodb.js b/services/document-updater/app/js/mongodb.js
index 6c4415adcc..6e38993bc4 100644
--- a/services/document-updater/app/js/mongodb.js
+++ b/services/document-updater/app/js/mongodb.js
@@ -24,5 +24,5 @@ module.exports = {
db,
ObjectId,
mongoClient,
- healthCheck: require('util').callbackify(healthCheck),
+ healthCheck: require('node:util').callbackify(healthCheck),
}
diff --git a/services/document-updater/app/js/sharejs/server/model.js b/services/document-updater/app/js/sharejs/server/model.js
index 370208cc37..a646b22492 100644
--- a/services/document-updater/app/js/sharejs/server/model.js
+++ b/services/document-updater/app/js/sharejs/server/model.js
@@ -22,7 +22,7 @@
// Actual storage is handled by the database wrappers in db/*, wrapped by DocCache
let Model
-const { EventEmitter } = require('events')
+const { EventEmitter } = require('node:events')
const queue = require('./syncqueue')
const types = require('../types')
diff --git a/services/document-updater/app/js/sharejs/types/model.js b/services/document-updater/app/js/sharejs/types/model.js
index d927811895..af9fd0ad18 100644
--- a/services/document-updater/app/js/sharejs/types/model.js
+++ b/services/document-updater/app/js/sharejs/types/model.js
@@ -22,7 +22,7 @@
// Actual storage is handled by the database wrappers in db/*, wrapped by DocCache
let Model
-const { EventEmitter } = require('events')
+const { EventEmitter } = require('node:events')
const queue = require('./syncqueue')
const types = require('../types')
diff --git a/services/document-updater/app/js/types.ts b/services/document-updater/app/js/types.ts
index d635ab31ca..851e62d8c8 100644
--- a/services/document-updater/app/js/types.ts
+++ b/services/document-updater/app/js/types.ts
@@ -1,12 +1,17 @@
import {
TrackingPropsRawData,
ClearTrackingPropsRawData,
+ RawEditOperation,
} from 'overleaf-editor-core/lib/types'
+export type OTType = 'sharejs-text-ot' | 'history-ot'
+
/**
* An update coming from the editor
*/
export type Update = {
+ dup?: boolean
+ dupIfSource?: string[]
doc: string
op: Op[]
v: number
@@ -18,6 +23,11 @@ export type Update = {
projectHistoryId?: string
}
+export type HistoryOTEditOperationUpdate = Omit & {
+ op: RawEditOperation[]
+ meta: Update['meta'] & { source: string }
+}
+
export type Op = InsertOp | DeleteOp | CommentOp | RetainOp
export type InsertOp = {
@@ -84,6 +94,7 @@ export type HistoryUpdate = {
pathname?: string
doc_length?: number
history_doc_length?: number
+ doc_hash?: string
tc?: boolean
user_id?: string
}
diff --git a/services/document-updater/buildscript.txt b/services/document-updater/buildscript.txt
index 3221114171..98d10a8e55 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=18.20.2
+--node-version=22.17.0
--public-repo=True
---script-version=4.5.0
+--script-version=4.7.0
diff --git a/services/document-updater/config/settings.defaults.js b/services/document-updater/config/settings.defaults.js
index d8c2ada6d3..9ed59de6c4 100755
--- a/services/document-updater/config/settings.defaults.js
+++ b/services/document-updater/config/settings.defaults.js
@@ -1,3 +1,9 @@
+const http = require('node:http')
+const https = require('node:https')
+
+http.globalAgent.keepAlive = false
+https.globalAgent.keepAlive = false
+
module.exports = {
internal: {
documentupdater: {
@@ -170,10 +176,6 @@ module.exports = {
},
},
- sentry: {
- dsn: process.env.SENTRY_DSN,
- },
-
publishOnIndividualChannels:
process.env.PUBLISH_ON_INDIVIDUAL_CHANNELS === 'true',
@@ -182,4 +184,8 @@ module.exports = {
smoothingOffset: process.env.SMOOTHING_OFFSET || 1000, // milliseconds
gracefulShutdownDelayInMs:
parseInt(process.env.GRACEFUL_SHUTDOWN_DELAY_SECONDS ?? '10', 10) * 1000,
+
+ shortHistoryQueues: (process.env.SHORT_HISTORY_QUEUES || '')
+ .split(',')
+ .filter(s => !!s),
}
diff --git a/services/document-updater/docker-compose.ci.yml b/services/document-updater/docker-compose.ci.yml
index 332a9710ca..c6ec24a84b 100644
--- a/services/document-updater/docker-compose.ci.yml
+++ b/services/document-updater/docker-compose.ci.yml
@@ -21,18 +21,22 @@ services:
ELASTIC_SEARCH_DSN: es:9200
REDIS_HOST: redis
QUEUES_REDIS_HOST: redis
+ HISTORY_REDIS_HOST: redis
ANALYTICS_QUEUES_REDIS_HOST: redis
MONGO_HOST: mongo
POSTGRES_HOST: postgres
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
+ volumes:
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
redis:
condition: service_healthy
user: node
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@@ -44,16 +48,21 @@ services:
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
redis:
- image: redis
+ image: redis:7.4.3
healthcheck:
test: ping="$$(redis-cli ping)" && [ "$$ping" = 'PONG' ]
interval: 1s
retries: 20
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/document-updater/docker-compose.yml b/services/document-updater/docker-compose.yml
index 83f5d2efcc..c1b23c11c5 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:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/document-updater
- ../../node_modules:/overleaf/node_modules
@@ -14,49 +14,58 @@ services:
working_dir: /overleaf/services/document-updater
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
user: node
test_acceptance:
- image: node:18.20.2
+ image: node:22.17.0
volumes:
- .:/overleaf/services/document-updater
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/document-updater
environment:
ELASTIC_SEARCH_DSN: es:9200
REDIS_HOST: redis
+ HISTORY_REDIS_HOST: redis
QUEUES_REDIS_HOST: redis
ANALYTICS_QUEUES_REDIS_HOST: redis
MONGO_HOST: mongo
POSTGRES_HOST: postgres
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
user: node
depends_on:
mongo:
- condition: service_healthy
+ condition: service_started
redis:
condition: service_healthy
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
redis:
- image: redis
+ image: redis:7.4.3
healthcheck:
test: ping=$$(redis-cli ping) && [ "$$ping" = 'PONG' ]
interval: 1s
retries: 20
mongo:
- image: mongo:6.0.13
+ image: mongo:8.0.11
command: --replSet overleaf
- healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
- interval: 1s
- retries: 20
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
diff --git a/services/document-updater/package.json b/services/document-updater/package.json
index bf49f53b21..7d892689e9 100644
--- a/services/document-updater/package.json
+++ b/services/document-updater/package.json
@@ -12,8 +12,8 @@
"nodemon": "node --watch app.js",
"benchmark:apply": "node benchmarks/apply",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"lint:fix": "eslint --fix .",
"types:check": "tsc --noEmit"
},
@@ -30,10 +30,11 @@
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
"diff-match-patch": "overleaf/diff-match-patch#89805f9c671a77a263fc53461acd62aa7498f688",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"lodash": "^4.17.21",
"minimist": "^1.2.8",
- "mongodb-legacy": "^6.0.1",
+ "mongodb-legacy": "6.1.3",
+ "overleaf-editor-core": "*",
"request": "^2.88.2",
"requestretry": "^7.1.0"
},
@@ -41,7 +42,7 @@
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"cluster-key-slot": "^1.0.5",
- "mocha": "^10.2.0",
+ "mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
diff --git a/services/document-updater/scripts/check_redis_mongo_sync_state.js b/services/document-updater/scripts/check_redis_mongo_sync_state.js
index 0ca2bb4e8b..51db47af4d 100644
--- a/services/document-updater/scripts/check_redis_mongo_sync_state.js
+++ b/services/document-updater/scripts/check_redis_mongo_sync_state.js
@@ -1,5 +1,5 @@
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const _ = require('lodash')
const logger = require('@overleaf/logger')
const OError = require('@overleaf/o-error')
@@ -15,6 +15,7 @@ const request = require('requestretry').defaults({
retryDelay: 10,
})
+const ONLY_PROJECT_ID = process.env.ONLY_PROJECT_ID
const AUTO_FIX_VERSION_MISMATCH =
process.env.AUTO_FIX_VERSION_MISMATCH === 'true'
const AUTO_FIX_PARTIALLY_DELETED_DOC_METADATA =
@@ -319,10 +320,12 @@ async function processProject(projectId) {
* @return {Promise<{perIterationOutOfSync: number, done: boolean}>}
*/
async function scanOnce(processed, outOfSync) {
- const projectIds = await ProjectFlusher.promises.flushAllProjects({
- limit: LIMIT,
- dryRun: true,
- })
+ const projectIds = ONLY_PROJECT_ID
+ ? [ONLY_PROJECT_ID]
+ : await ProjectFlusher.promises.flushAllProjects({
+ limit: LIMIT,
+ dryRun: true,
+ })
let perIterationOutOfSync = 0
for (const projectId of projectIds) {
diff --git a/services/document-updater/scripts/fix_docs_with_empty_pathnames.js b/services/document-updater/scripts/fix_docs_with_empty_pathnames.js
index abbfb01ba7..e3e034157b 100644
--- a/services/document-updater/scripts/fix_docs_with_empty_pathnames.js
+++ b/services/document-updater/scripts/fix_docs_with_empty_pathnames.js
@@ -6,7 +6,7 @@ const rclient = require('@overleaf/redis-wrapper').createClient(
const keys = Settings.redis.documentupdater.key_schema
const ProjectFlusher = require('app/js/ProjectFlusher')
const DocumentManager = require('app/js/DocumentManager')
-const util = require('util')
+const util = require('node:util')
const flushAndDeleteDocWithLock = util.promisify(
DocumentManager.flushAndDeleteDocWithLock
)
diff --git a/services/document-updater/scripts/fix_docs_with_missing_project.js b/services/document-updater/scripts/fix_docs_with_missing_project.js
index 0a9a05eaaa..d3022127b3 100644
--- a/services/document-updater/scripts/fix_docs_with_missing_project.js
+++ b/services/document-updater/scripts/fix_docs_with_missing_project.js
@@ -7,7 +7,7 @@ const keys = Settings.redis.documentupdater.key_schema
const ProjectFlusher = require('../app/js/ProjectFlusher')
const DocumentManager = require('../app/js/DocumentManager')
const { mongoClient, db, ObjectId } = require('../app/js/mongodb')
-const util = require('util')
+const util = require('node:util')
const flushAndDeleteDocWithLock = util.promisify(
DocumentManager.flushAndDeleteDocWithLock
)
diff --git a/services/document-updater/scripts/flush_projects_with_no_history_id.js b/services/document-updater/scripts/flush_projects_with_no_history_id.js
new file mode 100644
index 0000000000..aa912b4b66
--- /dev/null
+++ b/services/document-updater/scripts/flush_projects_with_no_history_id.js
@@ -0,0 +1,211 @@
+// @ts-check
+
+const Settings = require('@overleaf/settings')
+const logger = require('@overleaf/logger')
+const RedisManager = require('../app/js/RedisManager')
+const minimist = require('minimist')
+const { db, ObjectId } = require('../app/js/mongodb')
+const ProjectManager = require('../app/js/ProjectManager')
+const OError = require('@overleaf/o-error')
+
+const docUpdaterKeys = Settings.redis.documentupdater.key_schema
+
+const rclient = RedisManager.rclient
+
+const { verbose, commit, ...args } = minimist(process.argv.slice(2), {
+ boolean: ['verbose', 'commit'],
+ string: ['batchSize'],
+ default: {
+ batchSize: '1000',
+ },
+})
+
+logger.logger.level(verbose ? 'debug' : 'warn')
+
+const batchSize = parseInt(args.batchSize, 10)
+
+/**
+ * @typedef {import('ioredis').Redis} Redis
+ */
+
+/**
+ *
+ * @param {string} key
+ * @return {string|void}
+ */
+function extractDocId(key) {
+ const matches = key.match(/ProjectHistoryId:\{(.*?)\}/)
+ if (matches) {
+ return matches[1]
+ }
+}
+
+/**
+ *
+ * @param {string} docId
+ * @return {Promise<{projectId: string, historyId: string}>}
+ */
+async function getHistoryId(docId) {
+ const doc = await db.docs.findOne(
+ { _id: new ObjectId(docId) },
+ { projection: { project_id: 1 }, readPreference: 'secondaryPreferred' }
+ )
+
+ if (!doc) {
+ throw new OError('Doc not present in mongo', { docId })
+ }
+
+ const project = await db.projects.findOne(
+ { _id: doc.project_id },
+ {
+ projection: { 'overleaf.history': 1 },
+ readPreference: 'secondaryPreferred',
+ }
+ )
+
+ if (!project?.overleaf?.history?.id) {
+ throw new OError('Project not present in mongo (or has no history id)', {
+ docId,
+ project,
+ doc,
+ })
+ }
+
+ return {
+ historyId: project?.overleaf?.history?.id,
+ projectId: doc.project_id.toString(),
+ }
+}
+
+/**
+ * @typedef {Object} UpdateableDoc
+ * @property {string} docId
+ * @property {string} projectId
+ * @property {string} historyId
+ */
+
+/**
+ *
+ * @param {Redis} node
+ * @param {Array} docIds
+ * @return {Promise>}
+ */
+async function findDocsWithMissingHistoryIds(node, docIds) {
+ const historyIds = await node.mget(
+ docIds.map(docId => docUpdaterKeys.projectHistoryId({ doc_id: docId }))
+ )
+
+ const results = []
+
+ for (const index in docIds) {
+ const historyId = historyIds[index]
+ const docId = docIds[index]
+ if (!historyId) {
+ try {
+ const { projectId, historyId } = await getHistoryId(docId)
+ results.push({ projectId, historyId, docId })
+ } catch (error) {
+ logger.warn(
+ { error },
+ 'Error gathering data for doc with missing history id'
+ )
+ }
+ }
+ }
+ return results
+}
+
+/**
+ *
+ * @param {Array} updates
+ * @return {Promise}
+ */
+async function fixAndFlushProjects(updates) {
+ for (const update of updates) {
+ if (commit) {
+ try {
+ await rclient.set(
+ docUpdaterKeys.projectHistoryId({ doc_id: update.docId }),
+ update.historyId
+ )
+ logger.debug({ ...update }, 'Set history id in redis')
+ await ProjectManager.promises.flushAndDeleteProjectWithLocks(
+ update.projectId,
+ {}
+ )
+ logger.debug({ ...update }, 'Flushed project')
+ } catch (err) {
+ logger.error({ err, ...update }, 'Error fixing and flushing project')
+ }
+ } else {
+ logger.debug(
+ { ...update },
+ 'Would have set history id in redis and flushed'
+ )
+ }
+ }
+}
+
+/**
+ *
+ * @param {Array} nodes
+ * @param {number} batchSize
+ * @return {Promise}
+ */
+async function scanNodes(nodes, batchSize = 1000) {
+ let scanned = 0
+
+ for (const node of nodes) {
+ const stream = node.scanStream({
+ match: docUpdaterKeys.projectHistoryId({ doc_id: '*' }),
+ count: batchSize,
+ })
+
+ for await (const docKeys of stream) {
+ if (docKeys.length === 0) {
+ continue
+ }
+ stream.pause()
+ scanned += docKeys.length
+
+ const docIds = docKeys
+ .map((/** @type {string} */ docKey) => extractDocId(docKey))
+ .filter(Boolean)
+
+ try {
+ const updates = await findDocsWithMissingHistoryIds(node, docIds)
+ if (updates.length > 0) {
+ logger.info({ updates }, 'Found doc(s) with missing history ids')
+ await fixAndFlushProjects(updates)
+ }
+ } catch (error) {
+ logger.error({ docKeys }, 'Error processing batch')
+ } finally {
+ stream.resume()
+ }
+ }
+
+ logger.info({ scanned, server: node.serverInfo.role }, 'Scanned node')
+ }
+}
+
+async function main({ batchSize }) {
+ const nodes = (typeof rclient.nodes === 'function'
+ ? rclient.nodes('master')
+ : undefined) || [rclient]
+ await scanNodes(nodes, batchSize)
+}
+
+let code = 0
+
+main({ batchSize })
+ .then(() => {
+ logger.info({}, 'done')
+ })
+ .catch(error => {
+ logger.error({ error }, 'error')
+ code = 1
+ })
+ .finally(() => {
+ rclient.quit().then(() => process.exit(code))
+ })
diff --git a/services/document-updater/scripts/remove_deleted_docs.js b/services/document-updater/scripts/remove_deleted_docs.js
index 1d0844872e..a69807119f 100644
--- a/services/document-updater/scripts/remove_deleted_docs.js
+++ b/services/document-updater/scripts/remove_deleted_docs.js
@@ -7,7 +7,7 @@ const keys = Settings.redis.documentupdater.key_schema
const ProjectFlusher = require('../app/js/ProjectFlusher')
const RedisManager = require('../app/js/RedisManager')
const { mongoClient, db, ObjectId } = require('../app/js/mongodb')
-const util = require('util')
+const util = require('node:util')
const getDoc = util.promisify((projectId, docId, cb) =>
RedisManager.getDoc(projectId, docId, (err, ...args) => cb(err, args))
)
diff --git a/services/document-updater/test/acceptance/js/ApplyingUpdatesToADocTests.js b/services/document-updater/test/acceptance/js/ApplyingUpdatesToADocTests.js
index 8de7f091a8..39ec6c2ac7 100644
--- a/services/document-updater/test/acceptance/js/ApplyingUpdatesToADocTests.js
+++ b/services/document-updater/test/acceptance/js/ApplyingUpdatesToADocTests.js
@@ -16,27 +16,36 @@ const DocUpdaterClient = require('./helpers/DocUpdaterClient')
const DocUpdaterApp = require('./helpers/DocUpdaterApp')
describe('Applying updates to a doc', function () {
- before(function (done) {
+ beforeEach(function (done) {
+ sinon.spy(MockWebApi, 'getDocument')
this.lines = ['one', 'two', 'three']
this.version = 42
this.op = {
i: 'one and a half\n',
p: 4,
}
+ this.project_id = DocUpdaterClient.randomId()
+ this.doc_id = DocUpdaterClient.randomId()
this.update = {
doc: this.doc_id,
op: [this.op],
v: this.version,
}
+ this.historyOTUpdate = {
+ doc: this.doc_id,
+ op: [{ textOperation: [4, 'one and a half\n', 9] }],
+ v: this.version,
+ meta: { source: 'random-publicId' },
+ }
this.result = ['one', 'one and a half', 'two', 'three']
DocUpdaterApp.ensureRunning(done)
})
+ afterEach(function () {
+ sinon.restore()
+ })
describe('when the document is not loaded', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
- sinon.spy(MockWebApi, 'getDocument')
+ beforeEach(function (done) {
this.startTime = Date.now()
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines: this.lines,
@@ -50,15 +59,25 @@ describe('Applying updates to a doc', function () {
if (error != null) {
throw error
}
- setTimeout(done, 200)
+ setTimeout(() => {
+ rclientProjectHistory.get(
+ ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
+ project_id: this.project_id,
+ }),
+ (error, result) => {
+ if (error != null) {
+ throw error
+ }
+ result = parseInt(result, 10)
+ this.firstOpTimestamp = result
+ done()
+ }
+ )
+ }, 200)
}
)
})
- after(function () {
- MockWebApi.getDocument.restore()
- })
-
it('should load the document from the web API', function () {
MockWebApi.getDocument
.calledWith(this.project_id, this.doc_id)
@@ -92,28 +111,44 @@ describe('Applying updates to a doc', function () {
)
})
- it('should set the first op timestamp', function (done) {
- rclientProjectHistory.get(
- ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
- project_id: this.project_id,
- }),
- (error, result) => {
+ it('should set the first op timestamp', function () {
+ this.firstOpTimestamp.should.be.within(this.startTime, Date.now())
+ })
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
if (error != null) {
throw error
}
- result = parseInt(result, 10)
- result.should.be.within(this.startTime, Date.now())
- this.firstOpTimestamp = result
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(this.startTime, Date.now())
+ done()
+ }
+ )
+ })
+
+ it('should yield no last updated time for another project', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ DocUpdaterClient.randomId(),
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.should.deep.equal({})
done()
}
)
})
describe('when sending another update', function () {
- before(function (done) {
- this.timeout = 10000
- this.second_update = Object.create(this.update)
+ beforeEach(function (done) {
+ this.timeout(10000)
+ this.second_update = Object.assign({}, this.update)
this.second_update.v = this.version + 1
+ this.secondStartTime = Date.now()
DocUpdaterClient.sendUpdate(
this.project_id,
this.doc_id,
@@ -127,6 +162,24 @@ describe('Applying updates to a doc', function () {
)
})
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) done(error)
+ doc.lines.should.deep.equal([
+ 'one',
+ 'one and a half',
+ 'one and a half',
+ 'two',
+ 'three',
+ ])
+ done()
+ }
+ )
+ })
+
it('should not change the first op timestamp', function (done) {
rclientProjectHistory.get(
ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
@@ -142,14 +195,357 @@ describe('Applying updates to a doc', function () {
}
)
})
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(
+ this.secondStartTime,
+ Date.now()
+ )
+ done()
+ }
+ )
+ })
+ })
+
+ describe('when another client is sending a concurrent update', function () {
+ beforeEach(function (done) {
+ this.timeout(10000)
+ this.otherUpdate = {
+ doc: this.doc_id,
+ op: [{ p: 8, i: 'two and a half\n' }],
+ v: this.version,
+ meta: { source: 'other-random-publicId' },
+ }
+ this.secondStartTime = Date.now()
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.otherUpdate,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) done(error)
+ doc.lines.should.deep.equal([
+ 'one',
+ 'one and a half',
+ 'two',
+ 'two and a half',
+ 'three',
+ ])
+ done()
+ }
+ )
+ })
+
+ it('should not change the first op timestamp', function (done) {
+ rclientProjectHistory.get(
+ ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
+ project_id: this.project_id,
+ }),
+ (error, result) => {
+ if (error != null) {
+ throw error
+ }
+ result = parseInt(result, 10)
+ result.should.equal(this.firstOpTimestamp)
+ done()
+ }
+ )
+ })
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(
+ this.secondStartTime,
+ Date.now()
+ )
+ done()
+ }
+ )
+ })
+ })
+ })
+
+ describe('when the document is not loaded (history-ot)', function () {
+ beforeEach(function (done) {
+ this.startTime = Date.now()
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.historyOTUpdate,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(() => {
+ rclientProjectHistory.get(
+ ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
+ project_id: this.project_id,
+ }),
+ (error, result) => {
+ if (error != null) {
+ throw error
+ }
+ result = parseInt(result, 10)
+ this.firstOpTimestamp = result
+ done()
+ }
+ )
+ }, 200)
+ }
+ )
+ })
+
+ it('should load the document from the web API', function () {
+ MockWebApi.getDocument
+ .calledWith(this.project_id, this.doc_id)
+ .should.equal(true)
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) done(error)
+ doc.lines.should.deep.equal(this.result)
+ done()
+ }
+ )
+ })
+
+ it('should push the applied updates to the project history changes api', function (done) {
+ rclientProjectHistory.lrange(
+ ProjectHistoryKeys.projectHistoryOps({ project_id: this.project_id }),
+ 0,
+ -1,
+ (error, updates) => {
+ if (error != null) {
+ throw error
+ }
+ JSON.parse(updates[0]).op.should.deep.equal(this.historyOTUpdate.op)
+ JSON.parse(updates[0]).meta.pathname.should.equal('/a/b/c.tex')
+
+ done()
+ }
+ )
+ })
+
+ it('should set the first op timestamp', function () {
+ this.firstOpTimestamp.should.be.within(this.startTime, Date.now())
+ })
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(this.startTime, Date.now())
+ done()
+ }
+ )
+ })
+
+ it('should yield no last updated time for another project', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ DocUpdaterClient.randomId(),
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.should.deep.equal({})
+ done()
+ }
+ )
+ })
+
+ describe('when sending another update', function () {
+ beforeEach(function (done) {
+ this.timeout(10000)
+ this.second_update = Object.assign({}, this.historyOTUpdate)
+ this.second_update.op = [
+ {
+ textOperation: [4, 'one and a half\n', 24],
+ },
+ ]
+ this.second_update.v = this.version + 1
+ this.secondStartTime = Date.now()
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.second_update,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) done(error)
+ doc.lines.should.deep.equal([
+ 'one',
+ 'one and a half',
+ 'one and a half',
+ 'two',
+ 'three',
+ ])
+ done()
+ }
+ )
+ })
+
+ it('should not change the first op timestamp', function (done) {
+ rclientProjectHistory.get(
+ ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
+ project_id: this.project_id,
+ }),
+ (error, result) => {
+ if (error != null) {
+ throw error
+ }
+ result = parseInt(result, 10)
+ result.should.equal(this.firstOpTimestamp)
+ done()
+ }
+ )
+ })
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(
+ this.secondStartTime,
+ Date.now()
+ )
+ done()
+ }
+ )
+ })
+ })
+
+ describe('when another client is sending a concurrent update', function () {
+ beforeEach(function (done) {
+ this.timeout(10000)
+ this.otherUpdate = {
+ doc: this.doc_id,
+ op: [{ textOperation: [8, 'two and a half\n', 5] }],
+ v: this.version,
+ meta: { source: 'other-random-publicId' },
+ }
+ this.secondStartTime = Date.now()
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.otherUpdate,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) done(error)
+ doc.lines.should.deep.equal([
+ 'one',
+ 'one and a half',
+ 'two',
+ 'two and a half',
+ 'three',
+ ])
+ done()
+ }
+ )
+ })
+
+ it('should not change the first op timestamp', function (done) {
+ rclientProjectHistory.get(
+ ProjectHistoryKeys.projectHistoryFirstOpTimestamp({
+ project_id: this.project_id,
+ }),
+ (error, result) => {
+ if (error != null) {
+ throw error
+ }
+ result = parseInt(result, 10)
+ result.should.equal(this.firstOpTimestamp)
+ done()
+ }
+ )
+ })
+
+ it('should yield last updated time', function (done) {
+ DocUpdaterClient.getProjectLastUpdatedAt(
+ this.project_id,
+ (error, res, body) => {
+ if (error != null) {
+ throw error
+ }
+ res.statusCode.should.equal(200)
+ body.lastUpdatedAt.should.be.within(
+ this.secondStartTime,
+ Date.now()
+ )
+ done()
+ }
+ )
+ })
})
})
describe('when the document is loaded', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
-
+ beforeEach(function (done) {
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines: this.lines,
version: this.version,
@@ -158,7 +554,7 @@ describe('Applying updates to a doc', function () {
if (error != null) {
throw error
}
- sinon.spy(MockWebApi, 'getDocument')
+ sinon.resetHistory()
DocUpdaterClient.sendUpdate(
this.project_id,
this.doc_id,
@@ -173,10 +569,6 @@ describe('Applying updates to a doc', function () {
})
})
- after(function () {
- MockWebApi.getDocument.restore()
- })
-
it('should not need to call the web api', function () {
MockWebApi.getDocument.called.should.equal(false)
})
@@ -208,10 +600,7 @@ describe('Applying updates to a doc', function () {
})
describe('when the document is loaded and is using project-history only', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
-
+ beforeEach(function (done) {
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines: this.lines,
version: this.version,
@@ -220,7 +609,7 @@ describe('Applying updates to a doc', function () {
if (error != null) {
throw error
}
- sinon.spy(MockWebApi, 'getDocument')
+ sinon.resetHistory()
DocUpdaterClient.sendUpdate(
this.project_id,
this.doc_id,
@@ -235,10 +624,6 @@ describe('Applying updates to a doc', function () {
})
})
- after(function () {
- MockWebApi.getDocument.restore()
- })
-
it('should update the doc', function (done) {
DocUpdaterClient.getDoc(
this.project_id,
@@ -265,11 +650,61 @@ describe('Applying updates to a doc', function () {
})
})
+ describe('when the document is loaded (history-ot)', function () {
+ beforeEach(function (done) {
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+ DocUpdaterClient.preloadDoc(this.project_id, this.doc_id, error => {
+ if (error != null) {
+ throw error
+ }
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.historyOTUpdate,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.result)
+ done()
+ }
+ )
+ })
+
+ it('should push the applied updates to the project history changes api', function (done) {
+ rclientProjectHistory.lrange(
+ ProjectHistoryKeys.projectHistoryOps({ project_id: this.project_id }),
+ 0,
+ -1,
+ (error, updates) => {
+ if (error) return done(error)
+ JSON.parse(updates[0]).op.should.deep.equal(this.historyOTUpdate.op)
+ JSON.parse(updates[0]).meta.pathname.should.equal('/a/b/c.tex')
+ done()
+ }
+ )
+ })
+ })
+
describe('when the document has been deleted', function () {
describe('when the ops come in a single linear order', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
const lines = ['', '', '']
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines,
@@ -289,54 +724,49 @@ describe('Applying updates to a doc', function () {
{ doc_id: this.doc_id, v: 10, op: [{ i: 'd', p: 10 }] },
]
this.my_result = ['hello world', '', '']
- done()
- })
-
- it('should be able to continue applying updates when the project has been deleted', function (done) {
- let update
const actions = []
- for (update of this.updates.slice(0, 6)) {
- ;(update => {
- actions.push(callback =>
- DocUpdaterClient.sendUpdate(
- this.project_id,
- this.doc_id,
- update,
- callback
- )
+ for (const update of this.updates.slice(0, 6)) {
+ actions.push(callback =>
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ update,
+ callback
)
- })(update)
+ )
}
actions.push(callback =>
DocUpdaterClient.deleteDoc(this.project_id, this.doc_id, callback)
)
- for (update of this.updates.slice(6)) {
- ;(update => {
- actions.push(callback =>
- DocUpdaterClient.sendUpdate(
- this.project_id,
- this.doc_id,
- update,
- callback
- )
+ for (const update of this.updates.slice(6)) {
+ actions.push(callback =>
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ update,
+ callback
)
- })(update)
+ )
}
- async.series(actions, error => {
- if (error != null) {
- throw error
+ // process updates
+ actions.push(cb =>
+ DocUpdaterClient.getDoc(this.project_id, this.doc_id, cb)
+ )
+
+ async.series(actions, done)
+ })
+
+ it('should be able to continue applying updates when the project has been deleted', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.my_result)
+ done()
}
- DocUpdaterClient.getDoc(
- this.project_id,
- this.doc_id,
- (error, res, doc) => {
- if (error) return done(error)
- doc.lines.should.deep.equal(this.my_result)
- done()
- }
- )
- })
+ )
})
it('should store the doc ops in the correct order', function (done) {
@@ -358,9 +788,7 @@ describe('Applying updates to a doc', function () {
})
describe('when older ops come in after the delete', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
const lines = ['', '', '']
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines,
@@ -428,11 +856,9 @@ describe('Applying updates to a doc', function () {
})
describe('with a broken update', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
this.broken_update = {
- doc_id: this.doc_id,
+ doc: this.doc_id,
v: this.version,
op: [{ d: 'not the correct content', p: 0 }],
}
@@ -482,10 +908,162 @@ describe('Applying updates to a doc', function () {
})
})
+ describe('with a broken update (history-ot)', function () {
+ beforeEach(function (done) {
+ this.broken_update = {
+ doc: this.doc_id,
+ v: this.version,
+ op: [{ textOperation: [99, -1] }],
+ meta: { source: '42' },
+ }
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+
+ DocUpdaterClient.subscribeToAppliedOps(
+ (this.messageCallback = sinon.stub())
+ )
+
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.broken_update,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should not update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.lines)
+ done()
+ }
+ )
+ })
+
+ it('should send a message with an error', function () {
+ this.messageCallback.called.should.equal(true)
+ const [channel, message] = this.messageCallback.args[0]
+ channel.should.equal('applied-ops')
+ JSON.parse(message).should.deep.include({
+ project_id: this.project_id,
+ doc_id: this.doc_id,
+ error:
+ "The operation's base length must be equal to the string's length.",
+ })
+ })
+ })
+
+ describe('when mixing ot types (sharejs-text-ot -> history-ot)', function () {
+ beforeEach(function (done) {
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 0,
+ })
+
+ DocUpdaterClient.subscribeToAppliedOps(
+ (this.messageCallback = sinon.stub())
+ )
+
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.historyOTUpdate,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should not update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.lines)
+ done()
+ }
+ )
+ })
+
+ it('should send a message with an error', function () {
+ this.messageCallback.called.should.equal(true)
+ const [channel, message] = this.messageCallback.args[0]
+ channel.should.equal('applied-ops')
+ JSON.parse(message).should.deep.include({
+ project_id: this.project_id,
+ doc_id: this.doc_id,
+ error: 'ot type mismatch',
+ })
+ })
+ })
+
+ describe('when mixing ot types (history-ot -> sharejs-text-ot)', function () {
+ beforeEach(function (done) {
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+
+ DocUpdaterClient.subscribeToAppliedOps(
+ (this.messageCallback = sinon.stub())
+ )
+
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.update,
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ })
+
+ it('should not update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.lines)
+ done()
+ }
+ )
+ })
+
+ it('should send a message with an error', function () {
+ this.messageCallback.called.should.equal(true)
+ const [channel, message] = this.messageCallback.args[0]
+ channel.should.equal('applied-ops')
+ JSON.parse(message).should.deep.include({
+ project_id: this.project_id,
+ doc_id: this.doc_id,
+ error: 'ot type mismatch',
+ })
+ })
+ })
+
describe('when there is no version in Mongo', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines: this.lines,
})
@@ -522,9 +1100,7 @@ describe('Applying updates to a doc', function () {
})
describe('when the sending duplicate ops', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
MockWebApi.insertDoc(this.project_id, this.doc_id, {
lines: this.lines,
version: this.version,
@@ -606,12 +1182,88 @@ describe('Applying updates to a doc', function () {
})
})
+ describe('when sending duplicate ops (history-ot)', function () {
+ beforeEach(function (done) {
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+
+ DocUpdaterClient.subscribeToAppliedOps(
+ (this.messageCallback = sinon.stub())
+ )
+
+ // One user delete 'one', the next turns it into 'once'. The second becomes a NOP.
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ {
+ doc: this.doc_id,
+ op: [{ textOperation: [4, 'one and a half\n', 9] }],
+ v: this.version,
+ meta: {
+ source: 'ikHceq3yfAdQYzBo4-xZ',
+ },
+ },
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(() => {
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ {
+ doc: this.doc_id,
+ op: [
+ {
+ textOperation: [4, 'one and a half\n', 9],
+ },
+ ],
+ v: this.version,
+ dupIfSource: ['ikHceq3yfAdQYzBo4-xZ'],
+ meta: {
+ source: 'ikHceq3yfAdQYzBo4-xZ',
+ },
+ },
+ error => {
+ if (error != null) {
+ throw error
+ }
+ setTimeout(done, 200)
+ }
+ )
+ }, 200)
+ }
+ )
+ })
+
+ it('should update the doc', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) return done(error)
+ doc.lines.should.deep.equal(this.result)
+ done()
+ }
+ )
+ })
+
+ it('should return a message about duplicate ops', function () {
+ this.messageCallback.calledTwice.should.equal(true)
+ this.messageCallback.args[0][0].should.equal('applied-ops')
+ expect(JSON.parse(this.messageCallback.args[0][1]).op.dup).to.be.undefined
+ this.messageCallback.args[1][0].should.equal('applied-ops')
+ expect(JSON.parse(this.messageCallback.args[1][1]).op.dup).to.equal(true)
+ })
+ })
+
describe('when sending updates for a non-existing doc id', function () {
- before(function (done) {
- this.project_id = DocUpdaterClient.randomId()
- this.doc_id = DocUpdaterClient.randomId()
+ beforeEach(function (done) {
this.non_existing = {
- doc_id: this.doc_id,
+ doc: this.doc_id,
v: this.version,
op: [{ d: 'content', p: 0 }],
}
diff --git a/services/document-updater/test/acceptance/js/CheckRedisMongoSyncStateTests.js b/services/document-updater/test/acceptance/js/CheckRedisMongoSyncStateTests.js
index cd4f07bde7..ebbc015a58 100644
--- a/services/document-updater/test/acceptance/js/CheckRedisMongoSyncStateTests.js
+++ b/services/document-updater/test/acceptance/js/CheckRedisMongoSyncStateTests.js
@@ -1,12 +1,12 @@
const MockWebApi = require('./helpers/MockWebApi')
const DocUpdaterClient = require('./helpers/DocUpdaterClient')
const DocUpdaterApp = require('./helpers/DocUpdaterApp')
-const { promisify } = require('util')
-const { exec } = require('child_process')
+const { promisify } = require('node:util')
+const { exec } = require('node:child_process')
const { expect } = require('chai')
const Settings = require('@overleaf/settings')
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
const MockDocstoreApi = require('./helpers/MockDocstoreApi')
const sinon = require('sinon')
diff --git a/services/document-updater/test/acceptance/js/SettingADocumentTests.js b/services/document-updater/test/acceptance/js/SettingADocumentTests.js
index 5b0c4ab281..e1bc54dc90 100644
--- a/services/document-updater/test/acceptance/js/SettingADocumentTests.js
+++ b/services/document-updater/test/acceptance/js/SettingADocumentTests.js
@@ -196,6 +196,167 @@ describe('Setting a document', function () {
})
})
+ describe('when the updated doc exists in the doc updater (history-ot)', function () {
+ before(function (done) {
+ numberOfReceivedUpdates = 0
+ this.project_id = DocUpdaterClient.randomId()
+ this.doc_id = DocUpdaterClient.randomId()
+ this.historyOTUpdate = {
+ doc: this.doc_id,
+ op: [{ textOperation: [4, 'one and a half\n', 9] }],
+ v: this.version,
+ meta: { source: 'random-publicId' },
+ }
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines: this.lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+ DocUpdaterClient.preloadDoc(this.project_id, this.doc_id, error => {
+ if (error) {
+ throw error
+ }
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.historyOTUpdate,
+ error => {
+ if (error) {
+ throw error
+ }
+ setTimeout(() => {
+ DocUpdaterClient.setDocLines(
+ this.project_id,
+ this.doc_id,
+ this.newLines,
+ this.source,
+ this.user_id,
+ false,
+ (error, res, body) => {
+ if (error) {
+ return done(error)
+ }
+ this.statusCode = res.statusCode
+ this.body = body
+ done()
+ }
+ )
+ }, 200)
+ }
+ )
+ })
+ })
+
+ after(function () {
+ MockProjectHistoryApi.flushProject.resetHistory()
+ MockWebApi.setDocument.resetHistory()
+ })
+
+ it('should return a 200 status code', function () {
+ this.statusCode.should.equal(200)
+ })
+
+ it('should emit two updates (from sendUpdate and setDocLines)', function () {
+ expect(numberOfReceivedUpdates).to.equal(2)
+ })
+
+ it('should send the updated doc lines and version to the web api', function () {
+ MockWebApi.setDocument
+ .calledWith(this.project_id, this.doc_id, this.newLines)
+ .should.equal(true)
+ })
+
+ it('should update the lines in the doc updater', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) {
+ return done(error)
+ }
+ doc.lines.should.deep.equal(this.newLines)
+ done()
+ }
+ )
+ })
+
+ it('should bump the version in the doc updater', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) {
+ return done(error)
+ }
+ doc.version.should.equal(this.version + 2)
+ done()
+ }
+ )
+ })
+
+ it('should leave the document in redis', function (done) {
+ docUpdaterRedis.get(
+ Keys.docLines({ doc_id: this.doc_id }),
+ (error, lines) => {
+ if (error) {
+ throw error
+ }
+ expect(JSON.parse(lines)).to.deep.equal({
+ content: this.newLines.join('\n'),
+ })
+ done()
+ }
+ )
+ })
+
+ it('should return the mongo rev in the json response', function () {
+ this.body.should.deep.equal({ rev: '123' })
+ })
+
+ describe('when doc has the same contents', function () {
+ beforeEach(function (done) {
+ numberOfReceivedUpdates = 0
+ DocUpdaterClient.setDocLines(
+ this.project_id,
+ this.doc_id,
+ this.newLines,
+ this.source,
+ this.user_id,
+ false,
+ (error, res, body) => {
+ if (error) {
+ return done(error)
+ }
+ this.statusCode = res.statusCode
+ this.body = body
+ done()
+ }
+ )
+ })
+
+ it('should not bump the version in doc updater', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, doc) => {
+ if (error) {
+ return done(error)
+ }
+ doc.version.should.equal(this.version + 2)
+ done()
+ }
+ )
+ })
+
+ it('should not emit any updates', function (done) {
+ setTimeout(() => {
+ expect(numberOfReceivedUpdates).to.equal(0)
+ done()
+ }, 100) // delay by 100ms: make sure we do not check too early!
+ })
+ })
+ })
+
describe('when the updated doc does not exist in the doc updater', function () {
before(function (done) {
this.project_id = DocUpdaterClient.randomId()
@@ -525,4 +686,285 @@ describe('Setting a document', function () {
})
})
})
+
+ describe('with track changes (history-ot)', function () {
+ const lines = ['one', 'one and a half', 'two', 'three']
+ const userId = DocUpdaterClient.randomId()
+ const ts = new Date().toISOString()
+ beforeEach(function (done) {
+ numberOfReceivedUpdates = 0
+ this.newLines = ['one', 'two', 'three']
+ this.project_id = DocUpdaterClient.randomId()
+ this.doc_id = DocUpdaterClient.randomId()
+ this.historyOTUpdate = {
+ doc: this.doc_id,
+ op: [
+ {
+ textOperation: [
+ 4,
+ {
+ r: 'one and a half\n'.length,
+ tracking: {
+ type: 'delete',
+ userId,
+ ts,
+ },
+ },
+ 9,
+ ],
+ },
+ ],
+ v: this.version,
+ meta: { source: 'random-publicId' },
+ }
+ MockWebApi.insertDoc(this.project_id, this.doc_id, {
+ lines,
+ version: this.version,
+ otMigrationStage: 1,
+ })
+ DocUpdaterClient.preloadDoc(this.project_id, this.doc_id, error => {
+ if (error) {
+ throw error
+ }
+ DocUpdaterClient.sendUpdate(
+ this.project_id,
+ this.doc_id,
+ this.historyOTUpdate,
+ error => {
+ if (error) {
+ throw error
+ }
+ DocUpdaterClient.waitForPendingUpdates(
+ this.project_id,
+ this.doc_id,
+ done
+ )
+ }
+ )
+ })
+ })
+
+ afterEach(function () {
+ MockProjectHistoryApi.flushProject.resetHistory()
+ MockWebApi.setDocument.resetHistory()
+ })
+ it('should record tracked changes', function (done) {
+ docUpdaterRedis.get(
+ Keys.docLines({ doc_id: this.doc_id }),
+ (error, data) => {
+ if (error) {
+ throw error
+ }
+ expect(JSON.parse(data)).to.deep.equal({
+ content: lines.join('\n'),
+ trackedChanges: [
+ {
+ range: {
+ pos: 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ })
+ done()
+ }
+ )
+ })
+
+ it('should apply the change', function (done) {
+ DocUpdaterClient.getDoc(
+ this.project_id,
+ this.doc_id,
+ (error, res, data) => {
+ if (error) {
+ throw error
+ }
+ expect(data.lines).to.deep.equal(this.newLines)
+ done()
+ }
+ )
+ })
+ const cases = [
+ {
+ name: 'when resetting the content',
+ lines,
+ want: {
+ content: 'one\none and a half\none and a half\ntwo\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 'one and a half\n'.length + 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when adding content before a tracked delete',
+ lines: ['one', 'INSERT', 'two', 'three'],
+ want: {
+ content: 'one\nINSERT\none and a half\ntwo\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 'INSERT\n'.length + 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when adding content after a tracked delete',
+ lines: ['one', 'two', 'INSERT', 'three'],
+ want: {
+ content: 'one\none and a half\ntwo\nINSERT\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when deleting content before a tracked delete',
+ lines: ['two', 'three'],
+ want: {
+ content: 'one and a half\ntwo\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 0,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when deleting content after a tracked delete',
+ lines: ['one', 'two'],
+ want: {
+ content: 'one\none and a half\ntwo',
+ trackedChanges: [
+ {
+ range: {
+ pos: 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when deleting content immediately after a tracked delete',
+ lines: ['one', 'three'],
+ want: {
+ content: 'one\none and a half\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 4,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ {
+ name: 'when deleting content across a tracked delete',
+ lines: ['onethree'],
+ want: {
+ content: 'oneone and a half\nthree',
+ trackedChanges: [
+ {
+ range: {
+ pos: 3,
+ length: 15,
+ },
+ tracking: {
+ ts,
+ type: 'delete',
+ userId,
+ },
+ },
+ ],
+ },
+ },
+ ]
+
+ for (const { name, lines, want } of cases) {
+ describe(name, function () {
+ beforeEach(function (done) {
+ DocUpdaterClient.setDocLines(
+ this.project_id,
+ this.doc_id,
+ lines,
+ this.source,
+ userId,
+ false,
+ (error, res, body) => {
+ if (error) {
+ return done(error)
+ }
+ this.statusCode = res.statusCode
+ this.body = body
+ done()
+ }
+ )
+ })
+ it('should update accordingly', function (done) {
+ docUpdaterRedis.get(
+ Keys.docLines({ doc_id: this.doc_id }),
+ (error, data) => {
+ if (error) {
+ throw error
+ }
+ expect(JSON.parse(data)).to.deep.equal(want)
+ done()
+ }
+ )
+ })
+ })
+ }
+ })
})
diff --git a/services/document-updater/test/acceptance/js/helpers/DocUpdaterApp.js b/services/document-updater/test/acceptance/js/helpers/DocUpdaterApp.js
index 33c6882138..d34996ca7c 100644
--- a/services/document-updater/test/acceptance/js/helpers/DocUpdaterApp.js
+++ b/services/document-updater/test/acceptance/js/helpers/DocUpdaterApp.js
@@ -9,7 +9,6 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const app = require('../../../../app')
-require('@overleaf/logger').logger.level('fatal')
module.exports = {
running: false,
diff --git a/services/document-updater/test/acceptance/js/helpers/DocUpdaterClient.js b/services/document-updater/test/acceptance/js/helpers/DocUpdaterClient.js
index 4ed4f929de..0a4ec8922e 100644
--- a/services/document-updater/test/acceptance/js/helpers/DocUpdaterClient.js
+++ b/services/document-updater/test/acceptance/js/helpers/DocUpdaterClient.js
@@ -119,6 +119,18 @@ module.exports = DocUpdaterClient = {
)
},
+ getProjectLastUpdatedAt(projectId, callback) {
+ request.get(
+ `http://127.0.0.1:3003/project/${projectId}/last_updated_at`,
+ (error, res, body) => {
+ if (body != null && res.statusCode >= 200 && res.statusCode < 300) {
+ body = JSON.parse(body)
+ }
+ callback(error, res, body)
+ }
+ )
+ },
+
preloadDoc(projectId, docId, callback) {
DocUpdaterClient.getDoc(projectId, docId, callback)
},
diff --git a/services/document-updater/test/setup.js b/services/document-updater/test/setup.js
index f7d47e7b75..8ba17d922f 100644
--- a/services/document-updater/test/setup.js
+++ b/services/document-updater/test/setup.js
@@ -31,8 +31,14 @@ SandboxedModule.configure({
requires: {
'@overleaf/logger': stubs.logger,
'mongodb-legacy': require('mongodb-legacy'), // for ObjectId comparisons
+ 'overleaf-editor-core': require('overleaf-editor-core'), // does not play nice with sandbox
},
globals: { Buffer, JSON, Math, console, process },
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
// Mocha hooks
diff --git a/services/document-updater/test/stress/js/run.js b/services/document-updater/test/stress/js/run.js
index 4d2614eac4..1bda73c1aa 100644
--- a/services/document-updater/test/stress/js/run.js
+++ b/services/document-updater/test/stress/js/run.js
@@ -15,7 +15,7 @@
*/
const DocUpdaterClient = require('../../acceptance/js/helpers/DocUpdaterClient')
// MockWebApi = require "../../acceptance/js/helpers/MockWebApi"
-const assert = require('assert')
+const assert = require('node:assert')
const async = require('async')
const insert = function (string, pos, content) {
diff --git a/services/document-updater/test/unit/js/DocumentManager/DocumentManagerTests.js b/services/document-updater/test/unit/js/DocumentManager/DocumentManagerTests.js
index a0c379a5be..1816579103 100644
--- a/services/document-updater/test/unit/js/DocumentManager/DocumentManagerTests.js
+++ b/services/document-updater/test/unit/js/DocumentManager/DocumentManagerTests.js
@@ -49,10 +49,16 @@ describe('DocumentManager', function () {
applyUpdate: sinon.stub().resolves(),
},
}
+ this.HistoryOTUpdateManager = {
+ applyUpdate: sinon.stub().resolves(),
+ }
this.RangesManager = {
acceptChanges: sinon.stub(),
deleteComment: sinon.stub(),
}
+ this.Settings = {
+ max_doc_length: 2 * 1024 * 1024, // 2mb
+ }
this.DocumentManager = SandboxedModule.require(modulePath, {
requires: {
@@ -63,8 +69,10 @@ describe('DocumentManager', function () {
'./Metrics': this.Metrics,
'./DiffCodec': this.DiffCodec,
'./UpdateManager': this.UpdateManager,
+ './HistoryOTUpdateManager': this.HistoryOTUpdateManager,
'./RangesManager': this.RangesManager,
'./Errors': Errors,
+ '@overleaf/settings': this.Settings,
},
})
this.project_id = 'project-id-123'
@@ -218,6 +226,7 @@ describe('DocumentManager', function () {
ranges: this.ranges,
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
+ type: 'sharejs-text-ot',
})
this.RedisManager.promises.getPreviousDocOps.resolves(this.ops)
this.result = await this.DocumentManager.promises.getDocAndRecentOps(
@@ -247,6 +256,7 @@ describe('DocumentManager', function () {
ranges: this.ranges,
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
+ type: 'sharejs-text-ot',
})
})
})
@@ -259,6 +269,7 @@ describe('DocumentManager', function () {
ranges: this.ranges,
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
+ type: 'sharejs-text-ot',
})
this.RedisManager.promises.getPreviousDocOps.resolves(this.ops)
this.result = await this.DocumentManager.promises.getDocAndRecentOps(
@@ -286,6 +297,7 @@ describe('DocumentManager', function () {
ranges: this.ranges,
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
+ type: 'sharejs-text-ot',
})
})
})
@@ -329,6 +341,7 @@ describe('DocumentManager', function () {
unflushedTime: this.unflushedTime,
alreadyLoaded: true,
historyRangesSupport: this.historyRangesSupport,
+ type: 'sharejs-text-ot',
})
})
})
@@ -396,6 +409,7 @@ describe('DocumentManager', function () {
unflushedTime: null,
alreadyLoaded: false,
historyRangesSupport: this.historyRangesSupport,
+ type: 'sharejs-text-ot',
})
})
})
@@ -446,7 +460,8 @@ describe('DocumentManager', function () {
this.beforeLines,
this.source,
this.user_id,
- false
+ false,
+ true
)
})
@@ -480,7 +495,8 @@ describe('DocumentManager', function () {
this.beforeLines,
this.source,
this.user_id,
- false
+ false,
+ true
)
})
@@ -513,7 +529,8 @@ describe('DocumentManager', function () {
this.afterLines,
this.source,
this.user_id,
- false
+ false,
+ true
)
})
@@ -582,7 +599,8 @@ describe('DocumentManager', function () {
this.afterLines,
this.source,
this.user_id,
- false
+ false,
+ true
)
})
@@ -618,7 +636,8 @@ describe('DocumentManager', function () {
null,
this.source,
this.user_id,
- false
+ false,
+ true
)
).to.be.rejectedWith('No lines were provided to setDoc')
})
@@ -642,6 +661,7 @@ describe('DocumentManager', function () {
this.afterLines,
this.source,
this.user_id,
+ true,
true
)
})
@@ -650,6 +670,77 @@ describe('DocumentManager', function () {
this.ops.map(op => op.u.should.equal(true))
})
})
+
+ describe('with the external flag', function () {
+ beforeEach(async function () {
+ this.undoing = false
+ // Copy ops so we don't interfere with other tests
+ this.ops = [
+ { i: 'foo', p: 4 },
+ { d: 'bar', p: 42 },
+ ]
+ this.DiffCodec.diffAsShareJsOp.returns(this.ops)
+ await this.DocumentManager.promises.setDoc(
+ this.project_id,
+ this.doc_id,
+ this.afterLines,
+ this.source,
+ this.user_id,
+ this.undoing,
+ true
+ )
+ })
+
+ it('should add the external type to update metadata', function () {
+ this.UpdateManager.promises.applyUpdate
+ .calledWith(this.project_id, this.doc_id, {
+ doc: this.doc_id,
+ v: this.version,
+ op: this.ops,
+ meta: {
+ type: 'external',
+ source: this.source,
+ user_id: this.user_id,
+ },
+ })
+ .should.equal(true)
+ })
+ })
+
+ describe('without the external flag', function () {
+ beforeEach(async function () {
+ this.undoing = false
+ // Copy ops so we don't interfere with other tests
+ this.ops = [
+ { i: 'foo', p: 4 },
+ { d: 'bar', p: 42 },
+ ]
+ this.DiffCodec.diffAsShareJsOp.returns(this.ops)
+ await this.DocumentManager.promises.setDoc(
+ this.project_id,
+ this.doc_id,
+ this.afterLines,
+ this.source,
+ this.user_id,
+ this.undoing,
+ false
+ )
+ })
+
+ it('should not add the external type to update metadata', function () {
+ this.UpdateManager.promises.applyUpdate
+ .calledWith(this.project_id, this.doc_id, {
+ doc: this.doc_id,
+ v: this.version,
+ op: this.ops,
+ meta: {
+ source: this.source,
+ user_id: this.user_id,
+ },
+ })
+ .should.equal(true)
+ })
+ })
})
})
@@ -691,6 +782,8 @@ describe('DocumentManager', function () {
it('should apply the accept change to the ranges', function () {
this.RangesManager.acceptChanges.should.have.been.calledWith(
+ this.project_id,
+ this.doc_id,
[this.change_id],
this.ranges
)
@@ -722,7 +815,12 @@ describe('DocumentManager', function () {
it('should apply the accept change to the ranges', function () {
this.RangesManager.acceptChanges
- .calledWith(this.change_ids, this.ranges)
+ .calledWith(
+ this.project_id,
+ this.doc_id,
+ this.change_ids,
+ this.ranges
+ )
.should.equal(true)
})
})
@@ -747,6 +845,77 @@ describe('DocumentManager', function () {
})
})
+ describe('getComment', function () {
+ beforeEach(function () {
+ this.ranges.comments = [
+ {
+ id: 'mock-comment-id-1',
+ },
+ {
+ id: 'mock-comment-id-2',
+ },
+ ]
+ this.DocumentManager.promises.getDoc = sinon.stub().resolves({
+ lines: this.lines,
+ version: this.version,
+ ranges: this.ranges,
+ })
+ })
+
+ describe('when comment exists', function () {
+ beforeEach(async function () {
+ await expect(
+ this.DocumentManager.promises.getComment(
+ this.project_id,
+ this.doc_id,
+ 'mock-comment-id-1'
+ )
+ ).to.eventually.deep.equal({
+ comment: { id: 'mock-comment-id-1' },
+ })
+ })
+
+ it("should get the document's current ranges", function () {
+ this.DocumentManager.promises.getDoc
+ .calledWith(this.project_id, this.doc_id)
+ .should.equal(true)
+ })
+ })
+
+ describe('when comment doesnt exists', function () {
+ beforeEach(async function () {
+ await expect(
+ this.DocumentManager.promises.getComment(
+ this.project_id,
+ this.doc_id,
+ 'mock-comment-id-x'
+ )
+ ).to.be.rejectedWith(Errors.NotFoundError)
+ })
+
+ it("should get the document's current ranges", function () {
+ this.DocumentManager.promises.getDoc
+ .calledWith(this.project_id, this.doc_id)
+ .should.equal(true)
+ })
+ })
+
+ describe('when the doc is not found', function () {
+ beforeEach(async function () {
+ this.DocumentManager.promises.getDoc = sinon
+ .stub()
+ .resolves({ lines: null, version: null, ranges: null })
+ await expect(
+ this.DocumentManager.promises.acceptChanges(
+ this.project_id,
+ this.doc_id,
+ [this.change_id]
+ )
+ ).to.be.rejectedWith(Errors.NotFoundError)
+ })
+ })
+ })
+
describe('deleteComment', function () {
beforeEach(function () {
this.comment_id = 'mock-comment-id'
@@ -1129,4 +1298,68 @@ describe('DocumentManager', function () {
})
})
})
+
+ describe('appendToDoc', function () {
+ describe('sucessfully', function () {
+ beforeEach(async function () {
+ this.lines = ['one', 'two', 'three']
+ this.DocumentManager.promises.setDoc = sinon
+ .stub()
+ .resolves({ rev: '123' })
+ this.DocumentManager.promises.getDoc = sinon.stub().resolves({
+ lines: this.lines,
+ })
+ this.result = await this.DocumentManager.promises.appendToDoc(
+ this.project_id,
+ this.doc_id,
+ ['four', 'five', 'six'],
+ this.source,
+ this.user_id
+ )
+ })
+
+ it('should call setDoc with concatenated lines', function () {
+ this.DocumentManager.promises.setDoc
+ .calledWith(
+ this.project_id,
+ this.doc_id,
+ ['one', 'two', 'three', 'four', 'five', 'six'],
+ this.source,
+ this.user_id,
+ false,
+ false
+ )
+ .should.equal(true)
+ })
+
+ it('should return output from setDoc', function () {
+ this.result.should.deep.equal({ rev: '123' })
+ })
+ })
+
+ describe('when doc would become too big', function () {
+ beforeEach(async function () {
+ this.Settings.max_doc_length = 100
+ this.lines = ['one', 'two', 'three']
+ this.DocumentManager.promises.setDoc = sinon
+ .stub()
+ .resolves({ rev: '123' })
+ this.DocumentManager.promises.getDoc = sinon.stub().resolves({
+ lines: this.lines,
+ })
+ })
+
+ it('should fail with FileTooLarge error', async function () {
+ expect(
+ this.DocumentManager.promises.appendToDoc(
+ this.project_id,
+ this.doc_id,
+ ['x'.repeat(1000)],
+ this.source,
+ this.user_id
+ )
+ ).to.eventually.be.rejectedWith(Errors.FileTooLargeError)
+ })
+ })
+ })
})
diff --git a/services/document-updater/test/unit/js/HistoryManager/HistoryManagerTests.js b/services/document-updater/test/unit/js/HistoryManager/HistoryManagerTests.js
index ce98c4eaa8..2a5fb29b6d 100644
--- a/services/document-updater/test/unit/js/HistoryManager/HistoryManagerTests.js
+++ b/services/document-updater/test/unit/js/HistoryManager/HistoryManagerTests.js
@@ -3,7 +3,7 @@
*/
const SandboxedModule = require('sandboxed-module')
const sinon = require('sinon')
-const modulePath = require('path').join(
+const modulePath = require('node:path').join(
__dirname,
'../../../../app/js/HistoryManager'
)
@@ -14,6 +14,7 @@ describe('HistoryManager', function () {
requires: {
request: (this.request = {}),
'@overleaf/settings': (this.Settings = {
+ shortHistoryQueues: [],
apis: {
project_history: {
url: 'http://project_history.example.com',
@@ -118,7 +119,7 @@ describe('HistoryManager', function () {
beforeEach(function () {
this.HistoryManager.shouldFlushHistoryOps = sinon.stub()
this.HistoryManager.shouldFlushHistoryOps
- .withArgs(this.project_ops_length)
+ .withArgs(this.project_id, this.project_ops_length)
.returns(true)
this.HistoryManager.recordAndFlushHistoryOps(
@@ -139,7 +140,7 @@ describe('HistoryManager', function () {
beforeEach(function () {
this.HistoryManager.shouldFlushHistoryOps = sinon.stub()
this.HistoryManager.shouldFlushHistoryOps
- .withArgs(this.project_ops_length)
+ .withArgs(this.project_id, this.project_ops_length)
.returns(false)
this.HistoryManager.recordAndFlushHistoryOps(
@@ -157,6 +158,7 @@ describe('HistoryManager', function () {
describe('shouldFlushHistoryOps', function () {
it('should return false if the number of ops is not known', function () {
this.HistoryManager.shouldFlushHistoryOps(
+ this.project_id,
null,
['a', 'b', 'c'].length,
1
@@ -168,6 +170,7 @@ describe('HistoryManager', function () {
// Previously we were on 11 ops
// We didn't pass over a multiple of 5
this.HistoryManager.shouldFlushHistoryOps(
+ this.project_id,
14,
['a', 'b', 'c'].length,
5
@@ -178,6 +181,7 @@ describe('HistoryManager', function () {
// Previously we were on 12 ops
// We've reached a new multiple of 5
this.HistoryManager.shouldFlushHistoryOps(
+ this.project_id,
15,
['a', 'b', 'c'].length,
5
@@ -189,11 +193,22 @@ describe('HistoryManager', function () {
// Previously we were on 16 ops
// We didn't pass over a multiple of 5
this.HistoryManager.shouldFlushHistoryOps(
+ this.project_id,
17,
['a', 'b', 'c'].length,
5
).should.equal(true)
})
+
+ it('should return true if the project has a short queue', function () {
+ this.Settings.shortHistoryQueues = [this.project_id]
+ this.HistoryManager.shouldFlushHistoryOps(
+ this.project_id,
+ 14,
+ ['a', 'b', 'c'].length,
+ 5
+ ).should.equal(true)
+ })
})
})
@@ -217,34 +232,75 @@ describe('HistoryManager', function () {
.stub()
.yields()
this.DocumentManager.resyncDocContentsWithLock = sinon.stub().yields()
- this.HistoryManager.resyncProjectHistory(
- this.project_id,
- this.projectHistoryId,
- this.docs,
- this.files,
- this.callback
- )
})
- it('should queue a project structure reync', function () {
- this.ProjectHistoryRedisManager.queueResyncProjectStructure
- .calledWith(
+ describe('full sync', function () {
+ beforeEach(function () {
+ this.HistoryManager.resyncProjectHistory(
this.project_id,
this.projectHistoryId,
this.docs,
- this.files
+ this.files,
+ {},
+ this.callback
)
- .should.equal(true)
+ })
+
+ it('should queue a project structure reync', function () {
+ this.ProjectHistoryRedisManager.queueResyncProjectStructure
+ .calledWith(
+ this.project_id,
+ this.projectHistoryId,
+ this.docs,
+ this.files
+ )
+ .should.equal(true)
+ })
+
+ it('should queue doc content reyncs', function () {
+ this.DocumentManager.resyncDocContentsWithLock
+ .calledWith(this.project_id, this.docs[0].doc, this.docs[0].path)
+ .should.equal(true)
+ })
+
+ it('should call the callback', function () {
+ this.callback.called.should.equal(true)
+ })
})
- it('should queue doc content reyncs', function () {
- this.DocumentManager.resyncDocContentsWithLock
- .calledWith(this.project_id, this.docs[0].doc, this.docs[0].path)
- .should.equal(true)
- })
+ describe('resyncProjectStructureOnly=true', function () {
+ beforeEach(function () {
+ this.HistoryManager.resyncProjectHistory(
+ this.project_id,
+ this.projectHistoryId,
+ this.docs,
+ this.files,
+ { resyncProjectStructureOnly: true },
+ this.callback
+ )
+ })
- it('should call the callback', function () {
- this.callback.called.should.equal(true)
+ it('should queue a project structure reync', function () {
+ this.ProjectHistoryRedisManager.queueResyncProjectStructure
+ .calledWith(
+ this.project_id,
+ this.projectHistoryId,
+ this.docs,
+ this.files,
+ { resyncProjectStructureOnly: true }
+ )
+ .should.equal(true)
+ })
+
+ it('should not queue doc content reyncs', function () {
+ this.DocumentManager.resyncDocContentsWithLock.called.should.equal(
+ false
+ )
+ })
+
+ it('should call the callback', function () {
+ this.callback.called.should.equal(true)
+ })
})
})
})
diff --git a/services/document-updater/test/unit/js/HttpController/HttpControllerTests.js b/services/document-updater/test/unit/js/HttpController/HttpControllerTests.js
index c422b8c2c0..333da10d15 100644
--- a/services/document-updater/test/unit/js/HttpController/HttpControllerTests.js
+++ b/services/document-updater/test/unit/js/HttpController/HttpControllerTests.js
@@ -26,6 +26,7 @@ describe('HttpController', function () {
this.Metrics.Timer.prototype.done = sinon.stub()
this.project_id = 'project-id-123'
+ this.projectHistoryId = '123'
this.doc_id = 'doc-id-123'
this.source = 'editor'
this.next = sinon.stub()
@@ -65,7 +66,9 @@ describe('HttpController', function () {
this.version,
[],
this.ranges,
- this.pathname
+ this.pathname,
+ this.projectHistoryId,
+ 'sharejs-text-ot'
)
this.HttpController.getDoc(this.req, this.res, this.next)
})
@@ -77,17 +80,16 @@ describe('HttpController', function () {
})
it('should return the doc as JSON', function () {
- this.res.json
- .calledWith({
- id: this.doc_id,
- lines: this.lines,
- version: this.version,
- ops: [],
- ranges: this.ranges,
- pathname: this.pathname,
- ttlInS: 42,
- })
- .should.equal(true)
+ this.res.json.should.have.been.calledWith({
+ id: this.doc_id,
+ lines: this.lines,
+ version: this.version,
+ ops: [],
+ ranges: this.ranges,
+ pathname: this.pathname,
+ ttlInS: 42,
+ type: 'sharejs-text-ot',
+ })
})
it('should log the request', function () {
@@ -115,7 +117,9 @@ describe('HttpController', function () {
this.version,
this.ops,
this.ranges,
- this.pathname
+ this.pathname,
+ this.projectHistoryId,
+ 'sharejs-text-ot'
)
this.req.query = { fromVersion: `${this.fromVersion}` }
this.HttpController.getDoc(this.req, this.res, this.next)
@@ -128,17 +132,16 @@ describe('HttpController', function () {
})
it('should return the doc as JSON', function () {
- this.res.json
- .calledWith({
- id: this.doc_id,
- lines: this.lines,
- version: this.version,
- ops: this.ops,
- ranges: this.ranges,
- pathname: this.pathname,
- ttlInS: 42,
- })
- .should.equal(true)
+ this.res.json.should.have.been.calledWith({
+ id: this.doc_id,
+ lines: this.lines,
+ version: this.version,
+ ops: this.ops,
+ ranges: this.ranges,
+ pathname: this.pathname,
+ ttlInS: 42,
+ type: 'sharejs-text-ot',
+ })
})
it('should log the request', function () {
@@ -184,6 +187,65 @@ describe('HttpController', function () {
})
})
+ describe('getComment', function () {
+ beforeEach(function () {
+ this.ranges = {
+ changes: 'mock',
+ comments: [
+ {
+ id: 'comment-id-1',
+ },
+ {
+ id: 'comment-id-2',
+ },
+ ],
+ }
+ this.req = {
+ params: {
+ project_id: this.project_id,
+ doc_id: this.doc_id,
+ comment_id: this.comment_id,
+ },
+ query: {},
+ body: {},
+ }
+ })
+
+ beforeEach(function () {
+ this.DocumentManager.getCommentWithLock = sinon
+ .stub()
+ .callsArgWith(3, null, this.ranges.comments[0])
+ this.HttpController.getComment(this.req, this.res, this.next)
+ })
+
+ it('should get the comment', function () {
+ this.DocumentManager.getCommentWithLock
+ .calledWith(this.project_id, this.doc_id, this.comment_id)
+ .should.equal(true)
+ })
+
+ it('should return the comment as JSON', function () {
+ this.res.json
+ .calledWith({
+ id: 'comment-id-1',
+ })
+ .should.equal(true)
+ })
+
+ it('should log the request', function () {
+ this.logger.debug
+ .calledWith(
+ {
+ projectId: this.project_id,
+ docId: this.doc_id,
+ commentId: this.comment_id,
+ },
+ 'getting comment via http'
+ )
+ .should.equal(true)
+ })
+ })
+
describe('setDoc', function () {
beforeEach(function () {
this.lines = ['one', 'two', 'three']
@@ -209,7 +271,7 @@ describe('HttpController', function () {
beforeEach(function () {
this.DocumentManager.setDocWithLock = sinon
.stub()
- .callsArgWith(6, null, { rev: '123' })
+ .callsArgWith(7, null, { rev: '123' })
this.HttpController.setDoc(this.req, this.res, this.next)
})
@@ -221,7 +283,8 @@ describe('HttpController', function () {
this.lines,
this.source,
this.user_id,
- this.undoing
+ this.undoing,
+ true
)
.should.equal(true)
})
@@ -255,7 +318,7 @@ describe('HttpController', function () {
beforeEach(function () {
this.DocumentManager.setDocWithLock = sinon
.stub()
- .callsArgWith(6, new Error('oops'))
+ .callsArgWith(7, new Error('oops'))
this.HttpController.setDoc(this.req, this.res, this.next)
})
@@ -1103,4 +1166,96 @@ describe('HttpController', function () {
})
})
})
+
+ describe('appendToDoc', function () {
+ beforeEach(function () {
+ this.lines = ['one', 'two', 'three']
+ this.source = 'dropbox'
+ this.user_id = 'user-id-123'
+ this.req = {
+ headers: {},
+ params: {
+ project_id: this.project_id,
+ doc_id: this.doc_id,
+ },
+ query: {},
+ body: {
+ lines: this.lines,
+ source: this.source,
+ user_id: this.user_id,
+ undoing: (this.undoing = true),
+ },
+ }
+ })
+
+ describe('successfully', function () {
+ beforeEach(function () {
+ this.DocumentManager.appendToDocWithLock = sinon
+ .stub()
+ .callsArgWith(5, null, { rev: '123' })
+ this.HttpController.appendToDoc(this.req, this.res, this.next)
+ })
+
+ it('should append to the doc', function () {
+ this.DocumentManager.appendToDocWithLock
+ .calledWith(
+ this.project_id,
+ this.doc_id,
+ this.lines,
+ this.source,
+ this.user_id
+ )
+ .should.equal(true)
+ })
+
+ it('should return a json response with the document rev from web', function () {
+ this.res.json.calledWithMatch({ rev: '123' }).should.equal(true)
+ })
+
+ it('should log the request', function () {
+ this.logger.debug
+ .calledWith(
+ {
+ docId: this.doc_id,
+ projectId: this.project_id,
+ lines: this.lines,
+ source: this.source,
+ userId: this.user_id,
+ },
+ 'appending to doc via http'
+ )
+ .should.equal(true)
+ })
+
+ it('should time the request', function () {
+ this.Metrics.Timer.prototype.done.called.should.equal(true)
+ })
+ })
+
+ describe('when an errors occurs', function () {
+ beforeEach(function () {
+ this.DocumentManager.appendToDocWithLock = sinon
+ .stub()
+ .callsArgWith(5, new Error('oops'))
+ this.HttpController.appendToDoc(this.req, this.res, this.next)
+ })
+
+ it('should call next with the error', function () {
+ this.next.calledWith(sinon.match.instanceOf(Error)).should.equal(true)
+ })
+ })
+
+ describe('when the payload is too large', function () {
+ beforeEach(function () {
+ this.DocumentManager.appendToDocWithLock = sinon
+ .stub()
+ .callsArgWith(5, new Errors.FileTooLargeError())
+ this.HttpController.appendToDoc(this.req, this.res, this.next)
+ })
+
+ it('should send back a 422 response', function () {
+ this.res.sendStatus.calledWith(422).should.equal(true)
+ })
+ })
+ })
})
diff --git a/services/document-updater/test/unit/js/Limits/LimitsTests.js b/services/document-updater/test/unit/js/Limits/LimitsTests.js
index 34a5c13c26..11ca38746a 100644
--- a/services/document-updater/test/unit/js/Limits/LimitsTests.js
+++ b/services/document-updater/test/unit/js/Limits/LimitsTests.js
@@ -81,4 +81,88 @@ describe('Limits', function () {
})
})
})
+
+ describe('stringFileDataContentIsTooLarge', function () {
+ it('should handle small docs', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge({ content: '' }, 123)
+ ).to.equal(false)
+ })
+ it('should handle docs at the limit', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge(
+ { content: 'x'.repeat(123) },
+ 123
+ )
+ ).to.equal(false)
+ })
+ it('should handle docs above the limit', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge(
+ { content: 'x'.repeat(123 + 1) },
+ 123
+ )
+ ).to.equal(true)
+ })
+ it('should handle docs above the limit and below with tracked-deletes removed', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge(
+ {
+ content: 'x'.repeat(123 + 1),
+ trackedChanges: [
+ {
+ range: { pos: 1, length: 1 },
+ tracking: {
+ type: 'delete',
+ ts: '2025-06-16T14:31:44.910Z',
+ userId: 'user-id',
+ },
+ },
+ ],
+ },
+ 123
+ )
+ ).to.equal(false)
+ })
+ it('should handle docs above the limit and above with tracked-deletes removed', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge(
+ {
+ content: 'x'.repeat(123 + 2),
+ trackedChanges: [
+ {
+ range: { pos: 1, length: 1 },
+ tracking: {
+ type: 'delete',
+ ts: '2025-06-16T14:31:44.910Z',
+ userId: 'user-id',
+ },
+ },
+ ],
+ },
+ 123
+ )
+ ).to.equal(true)
+ })
+ it('should handle docs above the limit and with tracked-inserts', function () {
+ expect(
+ this.Limits.stringFileDataContentIsTooLarge(
+ {
+ content: 'x'.repeat(123 + 1),
+ trackedChanges: [
+ {
+ range: { pos: 1, length: 1 },
+ tracking: {
+ type: 'insert',
+ ts: '2025-06-16T14:31:44.910Z',
+ userId: 'user-id',
+ },
+ },
+ ],
+ },
+ 123
+ )
+ ).to.equal(true)
+ })
+ })
})
diff --git a/services/document-updater/test/unit/js/LockManager/CheckingTheLock.js b/services/document-updater/test/unit/js/LockManager/CheckingTheLock.js
index eb5b44532a..575ed90702 100644
--- a/services/document-updater/test/unit/js/LockManager/CheckingTheLock.js
+++ b/services/document-updater/test/unit/js/LockManager/CheckingTheLock.js
@@ -10,8 +10,8 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const sinon = require('sinon')
-const assert = require('assert')
-const path = require('path')
+const assert = require('node:assert')
+const path = require('node:path')
const modulePath = path.join(__dirname, '../../../../app/js/LockManager.js')
const projectId = 1234
const docId = 5678
diff --git a/services/document-updater/test/unit/js/LockManager/ReleasingTheLock.js b/services/document-updater/test/unit/js/LockManager/ReleasingTheLock.js
index 0413e268d6..a39a3b4fff 100644
--- a/services/document-updater/test/unit/js/LockManager/ReleasingTheLock.js
+++ b/services/document-updater/test/unit/js/LockManager/ReleasingTheLock.js
@@ -11,8 +11,8 @@
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const sinon = require('sinon')
-const assert = require('assert')
-const path = require('path')
+const assert = require('node:assert')
+const path = require('node:path')
const modulePath = path.join(__dirname, '../../../../app/js/LockManager.js')
const projectId = 1234
const docId = 5678
diff --git a/services/document-updater/test/unit/js/ProjectHistoryRedisManager/ProjectHistoryRedisManagerTests.js b/services/document-updater/test/unit/js/ProjectHistoryRedisManager/ProjectHistoryRedisManagerTests.js
index 0f5df2e29f..ad6c121dfb 100644
--- a/services/document-updater/test/unit/js/ProjectHistoryRedisManager/ProjectHistoryRedisManagerTests.js
+++ b/services/document-updater/test/unit/js/ProjectHistoryRedisManager/ProjectHistoryRedisManagerTests.js
@@ -15,6 +15,7 @@ describe('ProjectHistoryRedisManager', function () {
this.Limits = {
docIsTooLarge: sinon.stub().returns(false),
+ stringFileDataContentIsTooLarge: sinon.stub().returns(false),
}
this.ProjectHistoryRedisManager = SandboxedModule.require(modulePath, {
@@ -61,22 +62,18 @@ describe('ProjectHistoryRedisManager', function () {
})
it('should queue an update', function () {
- this.multi.rpush
- .calledWithExactly(
- `ProjectHistory:Ops:${this.project_id}`,
- this.ops[0],
- this.ops[1]
- )
- .should.equal(true)
+ this.multi.rpush.should.have.been.calledWithExactly(
+ `ProjectHistory:Ops:${this.project_id}`,
+ this.ops[0],
+ this.ops[1]
+ )
})
it('should set the queue timestamp if not present', function () {
- this.multi.setnx
- .calledWithExactly(
- `ProjectHistory:FirstOpTimestamp:${this.project_id}`,
- Date.now()
- )
- .should.equal(true)
+ this.multi.setnx.should.have.been.calledWithExactly(
+ `ProjectHistory:FirstOpTimestamp:${this.project_id}`,
+ Date.now()
+ )
})
})
@@ -118,9 +115,10 @@ describe('ProjectHistoryRedisManager', function () {
file: this.file_id,
}
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
})
})
@@ -162,12 +160,14 @@ describe('ProjectHistoryRedisManager', function () {
},
version: this.version,
projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
doc: this.doc_id,
}
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
})
it('should queue an update with file metadata', async function () {
@@ -207,6 +207,7 @@ describe('ProjectHistoryRedisManager', function () {
hash: '1337',
metadata,
projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
file: fileId,
}
@@ -291,6 +292,7 @@ describe('ProjectHistoryRedisManager', function () {
},
version: this.version,
projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
ranges: historyCompatibleRanges,
doc: this.doc_id,
}
@@ -343,12 +345,14 @@ describe('ProjectHistoryRedisManager', function () {
},
version: this.version,
projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
doc: this.doc_id,
}
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
})
it('should not forward ranges if history ranges support is undefined', async function () {
@@ -394,12 +398,77 @@ describe('ProjectHistoryRedisManager', function () {
},
version: this.version,
projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
doc: this.doc_id,
}
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
+ })
+
+ it('should pass "false" as the createdBlob field if not provided', async function () {
+ await this.ProjectHistoryRedisManager.promises.queueAddEntity(
+ this.project_id,
+ this.projectHistoryId,
+ 'doc',
+ this.doc_id,
+ this.user_id,
+ this.rawUpdate,
+ this.source
+ )
+
+ const update = {
+ pathname: this.pathname,
+ docLines: this.docLines,
+ meta: {
+ user_id: this.user_id,
+ ts: new Date(),
+ source: this.source,
+ },
+ version: this.version,
+ projectHistoryId: this.projectHistoryId,
+ createdBlob: false,
+ doc: this.doc_id,
+ }
+
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
+ })
+
+ it('should pass through the value of the createdBlob field', async function () {
+ this.rawUpdate.createdBlob = true
+ await this.ProjectHistoryRedisManager.promises.queueAddEntity(
+ this.project_id,
+ this.projectHistoryId,
+ 'doc',
+ this.doc_id,
+ this.user_id,
+ this.rawUpdate,
+ this.source
+ )
+
+ const update = {
+ pathname: this.pathname,
+ docLines: this.docLines,
+ meta: {
+ user_id: this.user_id,
+ ts: new Date(),
+ source: this.source,
+ },
+ version: this.version,
+ projectHistoryId: this.projectHistoryId,
+ createdBlob: true,
+ doc: this.doc_id,
+ }
+
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(update)
+ )
})
})
@@ -427,8 +496,8 @@ describe('ProjectHistoryRedisManager', function () {
beforeEach(async function () {
this.update = {
resyncDocContent: {
- content: 'one\ntwo',
version: this.version,
+ content: 'one\ntwo',
},
projectHistoryId: this.projectHistoryId,
path: this.pathname,
@@ -450,19 +519,18 @@ describe('ProjectHistoryRedisManager', function () {
})
it('should check if the doc is too large', function () {
- this.Limits.docIsTooLarge
- .calledWith(
- JSON.stringify(this.update).length,
- this.lines,
- this.settings.max_doc_length
- )
- .should.equal(true)
+ this.Limits.docIsTooLarge.should.have.been.calledWith(
+ JSON.stringify(this.update).length,
+ this.lines,
+ this.settings.max_doc_length
+ )
})
it('should queue an update', function () {
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(this.update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(this.update)
+ )
})
})
@@ -485,9 +553,8 @@ describe('ProjectHistoryRedisManager', function () {
})
it('should not queue an update if the doc is too large', function () {
- this.ProjectHistoryRedisManager.promises.queueOps.called.should.equal(
- false
- )
+ this.ProjectHistoryRedisManager.promises.queueOps.should.not.have.been
+ .called
})
})
@@ -495,10 +562,10 @@ describe('ProjectHistoryRedisManager', function () {
beforeEach(async function () {
this.update = {
resyncDocContent: {
- content: 'onedeleted\ntwo',
version: this.version,
ranges: this.ranges,
resolvedCommentIds: this.resolvedCommentIds,
+ content: 'onedeleted\ntwo',
},
projectHistoryId: this.projectHistoryId,
path: this.pathname,
@@ -535,9 +602,76 @@ describe('ProjectHistoryRedisManager', function () {
})
it('should queue an update', function () {
- this.ProjectHistoryRedisManager.promises.queueOps
- .calledWithExactly(this.project_id, JSON.stringify(this.update))
- .should.equal(true)
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(this.update)
+ )
+ })
+ })
+
+ describe('history-ot', function () {
+ beforeEach(async function () {
+ this.lines = {
+ content: 'onedeleted\ntwo',
+ comments: [{ id: 'id1', ranges: [{ pos: 0, length: 3 }] }],
+ trackedChanges: [
+ {
+ range: { pos: 3, length: 7 },
+ tracking: {
+ type: 'delete',
+ userId: 'user-id',
+ ts: '2025-06-16T14:31:44.910Z',
+ },
+ },
+ ],
+ }
+ this.update = {
+ resyncDocContent: {
+ version: this.version,
+ historyOTRanges: {
+ comments: this.lines.comments,
+ trackedChanges: this.lines.trackedChanges,
+ },
+ content: this.lines.content,
+ },
+ projectHistoryId: this.projectHistoryId,
+ path: this.pathname,
+ doc: this.doc_id,
+ meta: { ts: new Date() },
+ }
+
+ await this.ProjectHistoryRedisManager.promises.queueResyncDocContent(
+ this.project_id,
+ this.projectHistoryId,
+ this.doc_id,
+ this.lines,
+ this.ranges,
+ this.resolvedCommentIds,
+ this.version,
+ this.pathname,
+ true
+ )
+ })
+
+ it('should include tracked deletes in the update', function () {
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(this.update)
+ )
+ })
+
+ it('should check the doc length without tracked deletes', function () {
+ this.Limits.stringFileDataContentIsTooLarge.should.have.been.calledWith(
+ this.lines,
+ this.settings.max_doc_length
+ )
+ })
+
+ it('should queue an update', function () {
+ this.ProjectHistoryRedisManager.promises.queueOps.should.have.been.calledWithExactly(
+ this.project_id,
+ JSON.stringify(this.update)
+ )
})
})
})
diff --git a/services/document-updater/test/unit/js/RangesManager/RangesManagerTests.js b/services/document-updater/test/unit/js/RangesManager/RangesManagerTests.js
index 67ac6cc175..4053aafb01 100644
--- a/services/document-updater/test/unit/js/RangesManager/RangesManagerTests.js
+++ b/services/document-updater/test/unit/js/RangesManager/RangesManagerTests.js
@@ -323,6 +323,44 @@ describe('RangesManager', function () {
})
})
+ describe('tracked delete rejections with multiple tracked deletes at the same position', function () {
+ beforeEach(function () {
+ // original text is "one [two ][three ][four ]five"
+ // [] denotes tracked deletes
+ this.ranges = {
+ changes: makeRanges([
+ { d: 'two ', p: 4 },
+ { d: 'three ', p: 4 },
+ { d: 'four ', p: 4 },
+ ]),
+ }
+ this.updates = makeUpdates([{ i: 'three ', p: 4, u: true }])
+ this.newDocLines = ['one three five']
+ this.result = this.RangesManager.applyUpdate(
+ this.project_id,
+ this.doc_id,
+ this.ranges,
+ this.updates,
+ this.newDocLines,
+ { historyRangesSupport: true }
+ )
+ })
+
+ it('should insert the text at the right history position', function () {
+ expect(this.result.historyUpdates.map(x => x.op)).to.deep.equal([
+ [
+ {
+ i: 'three ',
+ p: 4,
+ hpos: 8,
+ u: true,
+ trackedDeleteRejection: true,
+ },
+ ],
+ ])
+ })
+ })
+
describe('deletes over tracked changes', function () {
beforeEach(function () {
// original text is "on[1]e [22](three) f[333]ou[4444]r [55555]five"
@@ -658,6 +696,7 @@ describe('RangesManager', function () {
{ i: 'amet', p: 40 },
]),
}
+ this.lines = ['lorem xxx', 'ipsum yyy', 'dolor zzz', 'sit wwwww', 'amet']
this.removeChangeIdsSpy = sinon.spy(
this.RangesTracker.prototype,
'removeChangeIds'
@@ -668,8 +707,11 @@ describe('RangesManager', function () {
beforeEach(function () {
this.change_ids = [this.ranges.changes[1].id]
this.result = this.RangesManager.acceptChanges(
+ this.project_id,
+ this.doc_id,
this.change_ids,
- this.ranges
+ this.ranges,
+ this.lines
)
})
@@ -714,8 +756,11 @@ describe('RangesManager', function () {
this.ranges.changes[4].id,
]
this.result = this.RangesManager.acceptChanges(
+ this.project_id,
+ this.doc_id,
this.change_ids,
- this.ranges
+ this.ranges,
+ this.lines
)
})
diff --git a/services/document-updater/test/unit/js/RedisManager/RedisManagerTests.js b/services/document-updater/test/unit/js/RedisManager/RedisManagerTests.js
index e23964eaba..125dd3d08c 100644
--- a/services/document-updater/test/unit/js/RedisManager/RedisManagerTests.js
+++ b/services/document-updater/test/unit/js/RedisManager/RedisManagerTests.js
@@ -2,7 +2,7 @@ const sinon = require('sinon')
const { expect } = require('chai')
const SandboxedModule = require('sandboxed-module')
const Errors = require('../../../../app/js/Errors')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const tk = require('timekeeper')
const MODULE_PATH = '../../../../app/js/RedisManager.js'
diff --git a/services/document-updater/test/unit/js/ShareJsUpdateManager/ShareJsUpdateManagerTests.js b/services/document-updater/test/unit/js/ShareJsUpdateManager/ShareJsUpdateManagerTests.js
index 347ac7dea6..e699439a74 100644
--- a/services/document-updater/test/unit/js/ShareJsUpdateManager/ShareJsUpdateManagerTests.js
+++ b/services/document-updater/test/unit/js/ShareJsUpdateManager/ShareJsUpdateManagerTests.js
@@ -12,7 +12,7 @@
const sinon = require('sinon')
const modulePath = '../../../../app/js/ShareJsUpdateManager.js'
const SandboxedModule = require('sandboxed-module')
-const crypto = require('crypto')
+const crypto = require('node:crypto')
describe('ShareJsUpdateManager', function () {
beforeEach(function () {
diff --git a/services/document-updater/test/unit/js/UpdateManager/UpdateManagerTests.js b/services/document-updater/test/unit/js/UpdateManager/UpdateManagerTests.js
index 16ee0b12e1..912707e01d 100644
--- a/services/document-updater/test/unit/js/UpdateManager/UpdateManagerTests.js
+++ b/services/document-updater/test/unit/js/UpdateManager/UpdateManagerTests.js
@@ -1,5 +1,4 @@
-// @ts-check
-
+const { createHash } = require('node:crypto')
const sinon = require('sinon')
const { expect } = require('chai')
const SandboxedModule = require('sandboxed-module')
@@ -332,6 +331,7 @@ describe('UpdateManager', function () {
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
historyRangesSupport: false,
+ type: 'sharejs-text-ot',
})
this.RangesManager.applyUpdate.returns({
newRanges: this.updated_ranges,
@@ -399,7 +399,9 @@ describe('UpdateManager', function () {
this.historyUpdates,
this.pathname,
this.projectHistoryId,
- this.lines
+ this.lines,
+ this.ranges,
+ this.updatedDocLines
)
})
@@ -501,6 +503,7 @@ describe('UpdateManager', function () {
pathname: this.pathname,
projectHistoryId: this.projectHistoryId,
historyRangesSupport: true,
+ type: 'sharejs-text-ot',
})
await this.UpdateManager.promises.applyUpdate(
this.project_id,
@@ -526,6 +529,7 @@ describe('UpdateManager', function () {
describe('_adjustHistoryUpdatesMetadata', function () {
beforeEach(function () {
this.lines = ['some', 'test', 'data']
+ this.updatedDocLines = ['after', 'updates']
this.historyUpdates = [
{
v: 42,
@@ -570,6 +574,7 @@ describe('UpdateManager', function () {
this.pathname,
this.projectHistoryId,
this.lines,
+ this.updatedDocLines,
this.ranges,
false
)
@@ -632,6 +637,7 @@ describe('UpdateManager', function () {
this.projectHistoryId,
this.lines,
this.ranges,
+ this.updatedDocLines,
true
)
this.historyUpdates.should.deep.equal([
@@ -685,6 +691,7 @@ describe('UpdateManager', function () {
meta: {
pathname: this.pathname,
doc_length: 21, // 23 - 'so'
+ doc_hash: stringHash(this.updatedDocLines.join('\n')),
history_doc_length: 28, // 30 - 'so'
},
},
@@ -699,6 +706,7 @@ describe('UpdateManager', function () {
this.projectHistoryId,
[],
{},
+ ['foobar'],
false
)
this.historyUpdates.should.deep.equal([
@@ -822,3 +830,9 @@ describe('UpdateManager', function () {
})
})
})
+
+function stringHash(s) {
+ const hash = createHash('sha1')
+ hash.update(s)
+ return hash.digest('hex')
+}
diff --git a/services/document-updater/test/unit/js/UtilsTests.js b/services/document-updater/test/unit/js/UtilsTests.js
index 553b90159a..5d0f03ca64 100644
--- a/services/document-updater/test/unit/js/UtilsTests.js
+++ b/services/document-updater/test/unit/js/UtilsTests.js
@@ -1,5 +1,6 @@
// @ts-check
+const { createHash } = require('node:crypto')
const { expect } = require('chai')
const Utils = require('../../../app/js/Utils')
@@ -24,4 +25,30 @@ describe('Utils', function () {
expect(result).to.equal('the quick brown fox jumps over the lazy dog')
})
})
+
+ describe('computeDocHash', function () {
+ it('computes the hash for an empty doc', function () {
+ const actual = Utils.computeDocHash([])
+ const expected = stringHash('')
+ expect(actual).to.equal(expected)
+ })
+
+ it('computes the hash for a single-line doc', function () {
+ const actual = Utils.computeDocHash(['hello'])
+ const expected = stringHash('hello')
+ expect(actual).to.equal(expected)
+ })
+
+ it('computes the hash for a multiline doc', function () {
+ const actual = Utils.computeDocHash(['hello', 'there', 'world'])
+ const expected = stringHash('hello\nthere\nworld')
+ expect(actual).to.equal(expected)
+ })
+ })
})
+
+function stringHash(s) {
+ const hash = createHash('sha1')
+ hash.update(s)
+ return hash.digest('hex')
+}
diff --git a/services/filestore/.gitignore b/services/filestore/.gitignore
index a2f4b5afb2..1772191882 100644
--- a/services/filestore/.gitignore
+++ b/services/filestore/.gitignore
@@ -1,54 +1,3 @@
-compileFolder
-
-Compiled source #
-###################
-*.com
-*.class
-*.dll
-*.exe
-*.o
-*.so
-
-# Packages #
-############
-# it's better to unpack these files and commit the raw source
-# git has its own built in compression methods
-*.7z
-*.dmg
-*.gz
-*.iso
-*.jar
-*.rar
-*.tar
-*.zip
-
-# Logs and databases #
-######################
-*.log
-*.sql
-*.sqlite
-
-# OS generated files #
-######################
-.DS_Store?
-ehthumbs.db
-Icon?
-Thumbs.db
-
-/node_modules/*
-data/*/*
-
-**/*.map
-cookies.txt
uploads/*
-
user_files/*
template_files/*
-
-**.swp
-
-/log.json
-hash_folder
-
-# managed by dev-environment$ bin/update_build_scripts
-.npmrc
diff --git a/services/filestore/.nvmrc b/services/filestore/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/filestore/.nvmrc
+++ b/services/filestore/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/filestore/Dockerfile b/services/filestore/Dockerfile
index 6593f60161..33de01c80f 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:18.20.2 AS base
+FROM node:22.17.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 941f989d64..69d7f85bf4 100644
--- a/services/filestore/Makefile
+++ b/services/filestore/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -130,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/filestore/app.js b/services/filestore/app.js
index 74b5fff246..178e8c7ff0 100644
--- a/services/filestore/app.js
+++ b/services/filestore/app.js
@@ -1,7 +1,7 @@
// Metrics must be initialized before importing anything else
require('@overleaf/metrics/initialize')
-const Events = require('events')
+const Events = require('node:events')
const Metrics = require('@overleaf/metrics')
const logger = require('@overleaf/logger')
@@ -23,10 +23,6 @@ const app = express()
app.use(RequestLogger.middleware)
-if (settings.sentry && settings.sentry.dsn) {
- logger.initializeErrorReporting(settings.sentry.dsn)
-}
-
Metrics.open_sockets.monitor(true)
Metrics.memory.monitor(logger)
if (Metrics.event_loop) {
@@ -54,64 +50,73 @@ app.use((req, res, next) => {
Metrics.injectMetricsRoute(app)
-app.head(
- '/project/:project_id/file/:file_id',
- keyBuilder.userFileKeyMiddleware,
- fileController.getFileHead
-)
-app.get(
- '/project/:project_id/file/:file_id',
- keyBuilder.userFileKeyMiddleware,
- fileController.getFile
-)
-app.post(
- '/project/:project_id/file/:file_id',
- keyBuilder.userFileKeyMiddleware,
- fileController.insertFile
-)
-app.put(
- '/project/:project_id/file/:file_id',
- keyBuilder.userFileKeyMiddleware,
- bodyParser.json(),
- fileController.copyFile
-)
-app.delete(
- '/project/:project_id/file/:file_id',
- keyBuilder.userFileKeyMiddleware,
- fileController.deleteFile
-)
-app.delete(
- '/project/:project_id',
- keyBuilder.userProjectKeyMiddleware,
- fileController.deleteProject
-)
+if (settings.filestore.stores.user_files) {
+ app.head(
+ '/project/:project_id/file/:file_id',
+ keyBuilder.userFileKeyMiddleware,
+ fileController.getFileHead
+ )
+ app.get(
+ '/project/:project_id/file/:file_id',
+ keyBuilder.userFileKeyMiddleware,
+ fileController.getFile
+ )
+ app.post(
+ '/project/:project_id/file/:file_id',
+ keyBuilder.userFileKeyMiddleware,
+ fileController.insertFile
+ )
+ app.put(
+ '/project/:project_id/file/:file_id',
+ keyBuilder.userFileKeyMiddleware,
+ bodyParser.json(),
+ fileController.copyFile
+ )
+ app.delete(
+ '/project/:project_id/file/:file_id',
+ keyBuilder.userFileKeyMiddleware,
+ fileController.deleteFile
+ )
+ app.delete(
+ '/project/:project_id',
+ keyBuilder.userProjectKeyMiddleware,
+ fileController.deleteProject
+ )
-app.get(
- '/project/:project_id/size',
- keyBuilder.userProjectKeyMiddleware,
- fileController.directorySize
-)
+ app.get(
+ '/project/:project_id/size',
+ keyBuilder.userProjectKeyMiddleware,
+ fileController.directorySize
+ )
+}
-app.head(
- '/template/:template_id/v/:version/:format',
- keyBuilder.templateFileKeyMiddleware,
- fileController.getFileHead
-)
-app.get(
- '/template/:template_id/v/:version/:format',
- keyBuilder.templateFileKeyMiddleware,
- fileController.getFile
-)
-app.get(
- '/template/:template_id/v/:version/:format/:sub_type',
- keyBuilder.templateFileKeyMiddleware,
- fileController.getFile
-)
-app.post(
- '/template/:template_id/v/:version/:format',
- keyBuilder.templateFileKeyMiddleware,
- fileController.insertFile
-)
+if (settings.filestore.stores.template_files) {
+ app.head(
+ '/template/:template_id/v/:version/:format',
+ keyBuilder.templateFileKeyMiddleware,
+ fileController.getFileHead
+ )
+ app.get(
+ '/template/:template_id/v/:version/:format',
+ keyBuilder.templateFileKeyMiddleware,
+ fileController.getFile
+ )
+ app.get(
+ '/template/:template_id/v/:version/:format/:sub_type',
+ keyBuilder.templateFileKeyMiddleware,
+ fileController.getFile
+ )
+ app.post(
+ '/template/:template_id/v/:version/:format',
+ keyBuilder.templateFileKeyMiddleware,
+ fileController.insertFile
+ )
+ app.delete(
+ '/template/:template_id/v/:version/:format',
+ keyBuilder.templateFileKeyMiddleware,
+ fileController.deleteFile
+ )
+}
app.get(
'/bucket/:bucket/key/*',
@@ -166,7 +171,10 @@ function handleShutdownSignal(signal) {
// stop accepting new connections, the callback is called when existing connections have finished
server.close(() => {
logger.info({ signal }, 'server closed')
- process.exit()
+ // exit after a short delay so logs can be flushed
+ setTimeout(() => {
+ process.exit()
+ }, 100)
})
// close idle http keep-alive connections
server.closeIdleConnections()
@@ -178,7 +186,7 @@ function handleShutdownSignal(signal) {
setTimeout(() => {
process.exit()
}, 100)
- }, settings.delayShutdownMs)
+ }, settings.gracefulShutdownDelayInMs)
}
process.on('SIGTERM', handleShutdownSignal)
diff --git a/services/filestore/app/js/FileController.js b/services/filestore/app/js/FileController.js
index a97869258a..127bbcc20f 100644
--- a/services/filestore/app/js/FileController.js
+++ b/services/filestore/app/js/FileController.js
@@ -1,9 +1,8 @@
-const PersistorManager = require('./PersistorManager')
const FileHandler = require('./FileHandler')
const metrics = require('@overleaf/metrics')
const parseRange = require('range-parser')
const Errors = require('./Errors')
-const { pipeline } = require('stream')
+const { pipeline } = require('node:stream')
const maxSizeInBytes = 1024 * 1024 * 1024 // 1GB
@@ -139,17 +138,17 @@ function copyFile(req, res, next) {
})
req.requestLogger.setMessage('copying file')
- PersistorManager.copyObject(bucket, `${oldProjectId}/${oldFileId}`, key)
- .then(() => res.sendStatus(200))
- .catch(err => {
- if (err) {
- if (err instanceof Errors.NotFoundError) {
- res.sendStatus(404)
- } else {
- next(err)
- }
+ FileHandler.copyObject(bucket, `${oldProjectId}/${oldFileId}`, key, err => {
+ if (err) {
+ if (err instanceof Errors.NotFoundError) {
+ res.sendStatus(404)
+ } else {
+ next(err)
}
- })
+ } else {
+ res.sendStatus(200)
+ }
+ })
}
function deleteFile(req, res, next) {
diff --git a/services/filestore/app/js/FileConverter.js b/services/filestore/app/js/FileConverter.js
index cb21a482e3..bfc34314e9 100644
--- a/services/filestore/app/js/FileConverter.js
+++ b/services/filestore/app/js/FileConverter.js
@@ -1,11 +1,11 @@
const metrics = require('@overleaf/metrics')
const Settings = require('@overleaf/settings')
-const { callbackify } = require('util')
+const { callbackify } = require('node:util')
const safeExec = require('./SafeExec').promises
const { ConversionError } = require('./Errors')
-const APPROVED_FORMATS = ['png']
+const APPROVED_FORMATS = ['png', 'jpg']
const FOURTY_SECONDS = 40 * 1000
const KILL_SIGNAL = 'SIGTERM'
@@ -34,16 +34,14 @@ async function convert(sourcePath, requestedFormat) {
}
async function thumbnail(sourcePath) {
- const width = '260x'
- return await convert(sourcePath, 'png', [
+ const width = '548x'
+ return await _convert(sourcePath, 'jpg', [
'convert',
'-flatten',
'-background',
'white',
'-density',
'300',
- '-define',
- `pdf:fit-page=${width}`,
`${sourcePath}[0]`,
'-resize',
width,
@@ -51,16 +49,14 @@ async function thumbnail(sourcePath) {
}
async function preview(sourcePath) {
- const width = '548x'
- return await convert(sourcePath, 'png', [
+ const width = '794x'
+ return await _convert(sourcePath, 'jpg', [
'convert',
'-flatten',
'-background',
'white',
'-density',
'300',
- '-define',
- `pdf:fit-page=${width}`,
`${sourcePath}[0]`,
'-resize',
width,
diff --git a/services/filestore/app/js/FileHandler.js b/services/filestore/app/js/FileHandler.js
index b52418f07d..0c092c85cd 100644
--- a/services/filestore/app/js/FileHandler.js
+++ b/services/filestore/app/js/FileHandler.js
@@ -1,7 +1,7 @@
const Settings = require('@overleaf/settings')
-const { callbackify } = require('util')
-const fs = require('fs')
-const PersistorManager = require('./PersistorManager')
+const { callbackify } = require('node:util')
+const fs = require('node:fs')
+let PersistorManager = require('./PersistorManager')
const LocalFileWriter = require('./LocalFileWriter')
const FileConverter = require('./FileConverter')
const KeyBuilder = require('./KeyBuilder')
@@ -10,6 +10,7 @@ const { ConversionError, InvalidParametersError } = require('./Errors')
const metrics = require('@overleaf/metrics')
module.exports = {
+ copyObject: callbackify(copyObject),
insertFile: callbackify(insertFile),
deleteFile: callbackify(deleteFile),
deleteProject: callbackify(deleteProject),
@@ -18,6 +19,7 @@ module.exports = {
getFileSize: callbackify(getFileSize),
getDirectorySize: callbackify(getDirectorySize),
promises: {
+ copyObject,
getFile,
getRedirectUrl,
insertFile,
@@ -28,6 +30,16 @@ module.exports = {
},
}
+if (process.env.NODE_ENV === 'test') {
+ module.exports._TESTONLYSwapPersistorManager = _PersistorManager => {
+ PersistorManager = _PersistorManager
+ }
+}
+
+async function copyObject(bucket, sourceKey, destinationKey) {
+ await PersistorManager.copyObject(bucket, sourceKey, destinationKey)
+}
+
async function insertFile(bucket, key, stream) {
const convertedKey = KeyBuilder.getConvertedFolderKey(key)
if (!convertedKey.match(/^[0-9a-f]{24}\/([0-9a-f]{24}|v\/[0-9]+\/[a-z]+)/i)) {
@@ -37,9 +49,6 @@ async function insertFile(bucket, key, stream) {
convertedKey,
})
}
- if (Settings.enableConversions) {
- await PersistorManager.deleteDirectory(bucket, convertedKey)
- }
await PersistorManager.sendStream(bucket, key, stream)
}
@@ -53,7 +62,10 @@ async function deleteFile(bucket, key) {
})
}
const jobs = [PersistorManager.deleteObject(bucket, key)]
- if (Settings.enableConversions) {
+ if (
+ Settings.enableConversions &&
+ bucket === Settings.filestore.stores.template_files
+ ) {
jobs.push(PersistorManager.deleteDirectory(bucket, convertedKey))
}
await Promise.all(jobs)
@@ -118,7 +130,7 @@ async function getFileSize(bucket, key) {
}
async function getDirectorySize(bucket, projectId) {
- return PersistorManager.directorySize(bucket, projectId)
+ return await PersistorManager.directorySize(bucket, projectId)
}
async function _getConvertedFile(bucket, key, opts) {
@@ -138,7 +150,9 @@ async function _getConvertedFileAndCache(bucket, key, convertedKey, opts) {
let convertedFsPath
try {
convertedFsPath = await _convertFile(bucket, key, opts)
- await ImageOptimiser.promises.compressPng(convertedFsPath)
+ if (convertedFsPath.toLowerCase().endsWith(".png")) {
+ await ImageOptimiser.promises.compressPng(convertedFsPath)
+ }
await PersistorManager.sendFile(bucket, convertedKey, convertedFsPath)
} catch (err) {
LocalFileWriter.deleteFile(convertedFsPath, () => {})
diff --git a/services/filestore/app/js/HealthCheckController.js b/services/filestore/app/js/HealthCheckController.js
index fb296513b5..e9b739a971 100644
--- a/services/filestore/app/js/HealthCheckController.js
+++ b/services/filestore/app/js/HealthCheckController.js
@@ -1,9 +1,9 @@
-const fs = require('fs')
-const path = require('path')
+const fs = require('node:fs')
+const path = require('node:path')
const Settings = require('@overleaf/settings')
const { WritableBuffer } = require('@overleaf/stream-utils')
-const { promisify } = require('util')
-const Stream = require('stream')
+const { promisify } = require('node:util')
+const Stream = require('node:stream')
const pipeline = promisify(Stream.pipeline)
const fsCopy = promisify(fs.copyFile)
diff --git a/services/filestore/app/js/ImageOptimiser.js b/services/filestore/app/js/ImageOptimiser.js
index a46a2857e1..6ed29e1c6d 100644
--- a/services/filestore/app/js/ImageOptimiser.js
+++ b/services/filestore/app/js/ImageOptimiser.js
@@ -1,6 +1,6 @@
const logger = require('@overleaf/logger')
const metrics = require('@overleaf/metrics')
-const { callbackify } = require('util')
+const { callbackify } = require('node:util')
const safeExec = require('./SafeExec').promises
module.exports = {
diff --git a/services/filestore/app/js/LocalFileWriter.js b/services/filestore/app/js/LocalFileWriter.js
index c5b8ea41f1..fe55bdc138 100644
--- a/services/filestore/app/js/LocalFileWriter.js
+++ b/services/filestore/app/js/LocalFileWriter.js
@@ -1,8 +1,8 @@
-const fs = require('fs')
-const crypto = require('crypto')
-const path = require('path')
-const Stream = require('stream')
-const { callbackify, promisify } = require('util')
+const fs = require('node:fs')
+const crypto = require('node:crypto')
+const path = require('node:path')
+const Stream = require('node:stream')
+const { callbackify, promisify } = require('node:util')
const metrics = require('@overleaf/metrics')
const Settings = require('@overleaf/settings')
const { WriteError } = require('./Errors')
diff --git a/services/filestore/app/js/SafeExec.js b/services/filestore/app/js/SafeExec.js
index 63177b8057..16ebcf126b 100644
--- a/services/filestore/app/js/SafeExec.js
+++ b/services/filestore/app/js/SafeExec.js
@@ -1,5 +1,5 @@
const lodashOnce = require('lodash.once')
-const childProcess = require('child_process')
+const childProcess = require('node:child_process')
const Settings = require('@overleaf/settings')
const { ConversionsDisabledError, FailedCommandError } = require('./Errors')
diff --git a/services/filestore/buildscript.txt b/services/filestore/buildscript.txt
index 147e8b4a46..bd4d2116f6 100644
--- a/services/filestore/buildscript.txt
+++ b/services/filestore/buildscript.txt
@@ -2,11 +2,11 @@ filestore
--data-dirs=uploads,user_files,template_files
--dependencies=s3,gcs
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
---env-add=ENABLE_CONVERSIONS="true",USE_PROM_METRICS="true",AWS_S3_USER_FILES_BUCKET_NAME=fake_user_files,AWS_S3_TEMPLATE_FILES_BUCKET_NAME=fake_template_files,GCS_USER_FILES_BUCKET_NAME=fake_userfiles,GCS_TEMPLATE_FILES_BUCKET_NAME=fake_templatefiles
+--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=18.20.2
+--node-version=22.17.0
--public-repo=True
---script-version=4.5.0
+--script-version=4.7.0
--test-acceptance-shards=SHARD_01_,SHARD_02_,SHARD_03_
--use-large-ci-runner=True
diff --git a/services/filestore/config/settings.defaults.js b/services/filestore/config/settings.defaults.js
index 08fa66408f..9a08bb197e 100644
--- a/services/filestore/config/settings.defaults.js
+++ b/services/filestore/config/settings.defaults.js
@@ -1,4 +1,4 @@
-const Path = require('path')
+const Path = require('node:path')
// environment variables renamed for consistency
// use AWS_ACCESS_KEY_ID-style going forward
@@ -73,6 +73,10 @@ const settings = {
stores: {
user_files: process.env.USER_FILES_BUCKET_NAME,
template_files: process.env.TEMPLATE_FILES_BUCKET_NAME,
+
+ // allow signed links to be generated for these buckets
+ project_blobs: process.env.OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET,
+ global_blobs: process.env.OVERLEAF_EDITOR_BLOBS_BUCKET,
},
fallback: process.env.FALLBACK_BACKEND
@@ -99,10 +103,6 @@ const settings = {
enableConversions: process.env.ENABLE_CONVERSIONS === 'true',
- sentry: {
- dsn: process.env.SENTRY_DSN,
- },
-
gracefulShutdownDelayInMs:
parseInt(process.env.GRACEFUL_SHUTDOWN_DELAY_SECONDS ?? '30', 10) * 1000,
}
diff --git a/services/filestore/docker-compose.ci.yml b/services/filestore/docker-compose.ci.yml
index aaa11bea6b..fdf860b511 100644
--- a/services/filestore/docker-compose.ci.yml
+++ b/services/filestore/docker-compose.ci.yml
@@ -21,10 +21,12 @@ services:
ELASTIC_SEARCH_DSN: es:9200
MONGO_HOST: mongo
POSTGRES_HOST: postgres
- AWS_S3_ENDPOINT: http://s3:9090
+ AWS_S3_ENDPOINT: https://minio:9000
AWS_S3_PATH_STYLE: 'true'
- AWS_ACCESS_KEY_ID: fake
- AWS_SECRET_ACCESS_KEY: fake
+ AWS_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
+ AWS_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
GCS_API_ENDPOINT: http://gcs:9090
GCS_PROJECT_ID: fake
STORAGE_EMULATOR_HOST: http://gcs:9090/storage/v1
@@ -33,13 +35,21 @@ services:
NODE_OPTIONS: "--unhandled-rejections=strict"
ENABLE_CONVERSIONS: "true"
USE_PROM_METRICS: "true"
- AWS_S3_USER_FILES_BUCKET_NAME: fake_user_files
- AWS_S3_TEMPLATE_FILES_BUCKET_NAME: fake_template_files
- GCS_USER_FILES_BUCKET_NAME: fake_userfiles
- GCS_TEMPLATE_FILES_BUCKET_NAME: fake_templatefiles
+ 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
+ volumes:
+ - ./test/acceptance/certs:/certs
depends_on:
- s3:
- condition: service_healthy
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ minio_setup:
+ condition: service_completed_successfully
gcs:
condition: service_healthy
user: node
@@ -53,14 +63,137 @@ services:
- ./:/tmp/build/
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
- s3:
- image: adobe/s3mock:2.4.14
+ certs:
+ image: node:22.17.0
+ volumes:
+ - ./test/acceptance/certs:/certs
+ working_dir: /certs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ if [ ! -f ./certgen ]; then
+ wget -O ./certgen "https://github.com/minio/certgen/releases/download/v1.3.0/certgen-linux-$(dpkg --print-architecture)"
+ chmod +x ./certgen
+ fi
+ if [ ! -f private.key ] || [ ! -f public.crt ]; then
+ ./certgen -host minio
+ fi
+
+ minio:
+ image: minio/minio:RELEASE.2024-10-13T13-34-11Z
+ command: server /data
+ volumes:
+ - ./test/acceptance/certs:/root/.minio/certs
environment:
- - initialBuckets=fake_user_files,fake_template_files,bucket
- healthcheck:
- test: wget --quiet --output-document=/dev/null http://localhost:9090
- interval: 1s
- retries: 20
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+
+ minio_setup:
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ image: minio/mc:RELEASE.2024-10-08T09-37-26Z
+ volumes:
+ - ./test/acceptance/certs:/root/.mc/certs/CAs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ sleep 1
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
+ mc mb --ignore-existing s3/fake-user-files
+ mc mb --ignore-existing s3/fake-user-files-dek
+ mc mb --ignore-existing s3/fake-template-files
+ mc admin user add s3 \
+ OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID \
+ OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
+
+ echo '
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files-dek"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files-dek/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-template-files"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-template-files/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::random-bucket-*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::random-bucket-*"
+ }
+ ]
+ }' > policy-filestore.json
+
+ mc admin policy create s3 overleaf-filestore policy-filestore.json
+ mc admin policy attach s3 overleaf-filestore \
+ --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
gcs:
image: fsouza/fake-gcs-server:1.45.2
command: ["--port=9090", "--scheme=http"]
diff --git a/services/filestore/docker-compose.yml b/services/filestore/docker-compose.yml
index 427384e452..971d35b708 100644
--- a/services/filestore/docker-compose.yml
+++ b/services/filestore/docker-compose.yml
@@ -17,6 +17,7 @@ services:
working_dir: /overleaf/services/filestore
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
@@ -31,44 +32,176 @@ services:
- .:/overleaf/services/filestore
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ./test/acceptance/certs:/certs
working_dir: /overleaf/services/filestore
environment:
ELASTIC_SEARCH_DSN: es:9200
MONGO_HOST: mongo
POSTGRES_HOST: postgres
- AWS_S3_ENDPOINT: http://s3:9090
+ AWS_S3_ENDPOINT: https://minio:9000
AWS_S3_PATH_STYLE: 'true'
- AWS_ACCESS_KEY_ID: fake
- AWS_SECRET_ACCESS_KEY: fake
+ AWS_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
+ AWS_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
GCS_API_ENDPOINT: http://gcs:9090
GCS_PROJECT_ID: fake
STORAGE_EMULATOR_HOST: http://gcs:9090/storage/v1
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
ENABLE_CONVERSIONS: "true"
USE_PROM_METRICS: "true"
- AWS_S3_USER_FILES_BUCKET_NAME: fake_user_files
- AWS_S3_TEMPLATE_FILES_BUCKET_NAME: fake_template_files
- GCS_USER_FILES_BUCKET_NAME: fake_userfiles
- GCS_TEMPLATE_FILES_BUCKET_NAME: fake_templatefiles
+ 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
user: node
depends_on:
- s3:
- condition: service_healthy
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ minio_setup:
+ condition: service_completed_successfully
gcs:
condition: service_healthy
command: npm run --silent test:acceptance
- s3:
- image: adobe/s3mock:2.4.14
+ certs:
+ image: node:22.17.0
+ volumes:
+ - ./test/acceptance/certs:/certs
+ working_dir: /certs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ if [ ! -f ./certgen ]; then
+ wget -O ./certgen "https://github.com/minio/certgen/releases/download/v1.3.0/certgen-linux-$(dpkg --print-architecture)"
+ chmod +x ./certgen
+ fi
+ if [ ! -f private.key ] || [ ! -f public.crt ]; then
+ ./certgen -host minio
+ fi
+
+ minio:
+ image: minio/minio:RELEASE.2024-10-13T13-34-11Z
+ command: server /data
+ volumes:
+ - ./test/acceptance/certs:/root/.minio/certs
environment:
- - initialBuckets=fake_user_files,fake_template_files,bucket
- healthcheck:
- test: wget --quiet --output-document=/dev/null http://localhost:9090
- interval: 1s
- retries: 20
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+
+ minio_setup:
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ image: minio/mc:RELEASE.2024-10-08T09-37-26Z
+ volumes:
+ - ./test/acceptance/certs:/root/.mc/certs/CAs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ sleep 1
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
+ mc mb --ignore-existing s3/fake-user-files
+ mc mb --ignore-existing s3/fake-user-files-dek
+ mc mb --ignore-existing s3/fake-template-files
+ mc admin user add s3 \
+ OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID \
+ OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
+
+ echo '
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files-dek"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-user-files-dek/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::fake-template-files"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::fake-template-files/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::random-bucket-*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::random-bucket-*"
+ }
+ ]
+ }' > policy-filestore.json
+
+ mc admin policy create s3 overleaf-filestore policy-filestore.json
+ mc admin policy attach s3 overleaf-filestore \
+ --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
gcs:
image: fsouza/fake-gcs-server:1.45.2
command: ["--port=9090", "--scheme=http"]
diff --git a/services/filestore/package.json b/services/filestore/package.json
index e680f54b2b..4b9043aed7 100644
--- a/services/filestore/package.json
+++ b/services/filestore/package.json
@@ -11,8 +11,8 @@
"start": "node app.js",
"nodemon": "node --watch app.js",
"lint": "eslint --max-warnings 0 --format unix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js",
"test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js",
"lint:fix": "eslint --fix .",
@@ -27,7 +27,7 @@
"@overleaf/stream-utils": "^0.1.0",
"body-parser": "^1.20.3",
"bunyan": "^1.8.15",
- "express": "^4.21.0",
+ "express": "^4.21.2",
"glob": "^7.1.6",
"lodash.once": "^4.1.1",
"node-fetch": "^2.7.0",
@@ -36,17 +36,14 @@
},
"devDependencies": {
"@google-cloud/storage": "^6.10.1",
- "aws-sdk": "^2.718.0",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "disrequire": "^1.1.0",
- "mocha": "^10.2.0",
- "mongodb": "^6.1.0",
+ "mocha": "^11.1.0",
+ "mongodb": "6.12.0",
"sandboxed-module": "2.0.4",
"sinon": "9.0.2",
"sinon-chai": "^3.7.0",
"streamifier": "^0.1.1",
- "timekeeper": "^2.2.0",
"typescript": "^5.0.4"
}
}
diff --git a/services/filestore/test/acceptance/certs/.gitignore b/services/filestore/test/acceptance/certs/.gitignore
new file mode 100644
index 0000000000..d6b7ef32c8
--- /dev/null
+++ b/services/filestore/test/acceptance/certs/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/services/filestore/test/acceptance/deps/healthcheck.sh b/services/filestore/test/acceptance/deps/healthcheck.sh
index cd19cea637..675c205be6 100755
--- a/services/filestore/test/acceptance/deps/healthcheck.sh
+++ b/services/filestore/test/acceptance/deps/healthcheck.sh
@@ -1,9 +1,9 @@
#!/bin/sh
# health check to allow 404 status code as valid
-STATUSCODE=$(curl --silent --output /dev/null --write-out "%{http_code}" $1)
+STATUSCODE=$(curl --silent --output /dev/null --write-out "%{http_code}" "$1")
# will be 000 on non-http error (e.g. connection failure)
-if test $STATUSCODE -ge 500 || test $STATUSCODE -lt 200; then
+if test "$STATUSCODE" -ge 500 || test "$STATUSCODE" -lt 200; then
exit 1
fi
exit 0
diff --git a/services/filestore/test/acceptance/js/FilestoreApp.js b/services/filestore/test/acceptance/js/FilestoreApp.js
index 924f852eea..61e9a29b7d 100644
--- a/services/filestore/test/acceptance/js/FilestoreApp.js
+++ b/services/filestore/test/acceptance/js/FilestoreApp.js
@@ -1,64 +1,31 @@
-const logger = require('@overleaf/logger')
+const ObjectPersistor = require('@overleaf/object-persistor')
const Settings = require('@overleaf/settings')
-const fs = require('fs')
-const Path = require('path')
-const { promisify } = require('util')
-const disrequire = require('disrequire')
-const AWS = require('aws-sdk')
-
-logger.logger.level('info')
-
-const fsReaddir = promisify(fs.readdir)
-const sleep = promisify(setTimeout)
+const { promisify } = require('node:util')
+const App = require('../../../app')
+const FileHandler = require('../../../app/js/FileHandler')
class FilestoreApp {
- constructor() {
- this.running = false
- this.initing = false
- }
-
async runServer() {
- if (this.running) {
- return
- }
-
- if (this.initing) {
- return await this.waitForInit()
- }
- this.initing = true
-
- this.app = await FilestoreApp.requireApp()
-
- await new Promise((resolve, reject) => {
- this.server = this.app.listen(
- Settings.internal.filestore.port,
- '127.0.0.1',
- err => {
- if (err) {
- return reject(err)
+ if (!this.server) {
+ await new Promise((resolve, reject) => {
+ this.server = App.listen(
+ Settings.internal.filestore.port,
+ '127.0.0.1',
+ err => {
+ if (err) {
+ return reject(err)
+ }
+ resolve()
}
- resolve()
- }
- )
+ )
+ })
+ }
+
+ this.persistor = ObjectPersistor({
+ ...Settings.filestore,
+ paths: Settings.path,
})
-
- if (Settings.filestore.backend === 's3') {
- try {
- await FilestoreApp.waitForS3()
- } catch (err) {
- await this.stop()
- throw err
- }
- }
-
- this.initing = false
- this.persistor = require('../../../app/js/PersistorManager')
- }
-
- async waitForInit() {
- while (this.initing) {
- await sleep(1000)
- }
+ FileHandler._TESTONLYSwapPersistorManager(this.persistor)
}
async stop() {
@@ -70,54 +37,6 @@ class FilestoreApp {
delete this.server
}
}
-
- static async waitForS3() {
- let tries = 0
- if (!Settings.filestore.s3.endpoint) {
- return
- }
-
- const s3 = new AWS.S3({
- accessKeyId: Settings.filestore.s3.key,
- secretAccessKey: Settings.filestore.s3.secret,
- endpoint: Settings.filestore.s3.endpoint,
- s3ForcePathStyle: true,
- signatureVersion: 'v4',
- })
-
- while (true) {
- try {
- return await s3
- .putObject({
- Key: 'startup',
- Body: '42',
- Bucket: Settings.filestore.stores.user_files,
- })
- .promise()
- } catch (err) {
- // swallow errors, as we may experience them until fake-s3 is running
- if (tries === 9) {
- // throw just before hitting the 10s test timeout
- throw err
- }
- tries++
- await sleep(1000)
- }
- }
- }
-
- static async requireApp() {
- // unload the app, as we may be doing this on multiple runs with
- // different settings, which affect startup in some cases
- const files = await fsReaddir(Path.resolve(__dirname, '../../../app/js'))
- files.forEach(file => {
- disrequire(Path.resolve(__dirname, '../../../app/js', file))
- })
- disrequire(Path.resolve(__dirname, '../../../app'))
- disrequire('@overleaf/object-persistor')
-
- return require('../../../app')
- }
}
module.exports = FilestoreApp
diff --git a/services/filestore/test/acceptance/js/FilestoreTests.js b/services/filestore/test/acceptance/js/FilestoreTests.js
index 441a179c59..28f90d49b6 100644
--- a/services/filestore/test/acceptance/js/FilestoreTests.js
+++ b/services/filestore/test/acceptance/js/FilestoreTests.js
@@ -1,19 +1,18 @@
const chai = require('chai')
const { expect } = chai
-const fs = require('fs')
+const fs = require('node:fs')
+const Stream = require('node:stream')
const Settings = require('@overleaf/settings')
-const Path = require('path')
+const Path = require('node:path')
const FilestoreApp = require('./FilestoreApp')
const TestHelper = require('./TestHelper')
const fetch = require('node-fetch')
-const S3 = require('aws-sdk/clients/s3')
-const { promisify } = require('util')
+const { promisify } = require('node:util')
const { Storage } = require('@google-cloud/storage')
const streamifier = require('streamifier')
chai.use(require('chai-as-promised'))
const { ObjectId } = require('mongodb')
-const tk = require('timekeeper')
-const ChildProcess = require('child_process')
+const ChildProcess = require('node:child_process')
const fsWriteFile = promisify(fs.writeFile)
const fsStat = promisify(fs.stat)
@@ -32,7 +31,26 @@ process.on('unhandledRejection', e => {
// store settings for multiple backends, so that we can test each one.
// fs will always be available - add others if they are configured
-const BackendSettings = require('./TestConfig')
+const {
+ BackendSettings,
+ s3Config,
+ s3SSECConfig,
+ AWS_S3_USER_FILES_STORAGE_CLASS,
+} = require('./TestConfig')
+const {
+ AlreadyWrittenError,
+ NotFoundError,
+ NotImplementedError,
+ NoKEKMatchedError,
+} = require('@overleaf/object-persistor/src/Errors')
+const {
+ PerProjectEncryptedS3Persistor,
+ RootKeyEncryptionKey,
+} = require('@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor')
+const { S3Persistor } = require('@overleaf/object-persistor/src/S3Persistor')
+const crypto = require('node:crypto')
+const { WritableBuffer } = require('@overleaf/stream-utils')
+const { gzipSync } = require('node:zlib')
describe('Filestore', function () {
this.timeout(1000 * 10)
@@ -77,8 +95,10 @@ describe('Filestore', function () {
}
// redefine the test suite for every available backend
- Object.keys(BackendSettings).forEach(backend => {
- describe(backend, function () {
+ for (const [backendVariantWithShardNumber, backendSettings] of Object.entries(
+ BackendSettings
+ )) {
+ describe(backendVariantWithShardNumber, function () {
let app,
previousEgress,
previousIngress,
@@ -86,6 +106,9 @@ describe('Filestore', function () {
projectId,
otherProjectId
+ const dataEncryptionKeySize =
+ backendSettings.backend === 's3SSEC' ? 32 : 0
+
const BUCKET_NAMES = [
process.env.GCS_USER_FILES_BUCKET_NAME,
process.env.GCS_TEMPLATE_FILES_BUCKET_NAME,
@@ -93,15 +116,15 @@ describe('Filestore', function () {
`${process.env.GCS_TEMPLATE_FILES_BUCKET_NAME}-deleted`,
]
- before(async function () {
+ before('start filestore with new settings', async function () {
// create the app with the relevant filestore settings
- Settings.filestore = BackendSettings[backend]
+ Settings.filestore = backendSettings
app = new FilestoreApp()
await app.runServer()
})
- if (BackendSettings[backend].gcs) {
- before(async function () {
+ if (backendSettings.gcs) {
+ before('create gcs buckets', async function () {
// create test buckets for gcs
const storage = new Storage(Settings.filestore.gcs.endpoint)
for (const bucketName of BUCKET_NAMES) {
@@ -109,7 +132,7 @@ describe('Filestore', function () {
}
})
- after(async function () {
+ after('delete gcs buckets', async function () {
// tear down all the gcs buckets
const storage = new Storage(Settings.filestore.gcs.endpoint)
for (const bucketName of BUCKET_NAMES) {
@@ -120,15 +143,14 @@ describe('Filestore', function () {
})
}
- after(async function () {
- await msleep(3000)
+ after('stop filestore app', async function () {
await app.stop()
})
- beforeEach(async function () {
+ beforeEach('fetch previous egress metric', async function () {
// retrieve previous metrics from the app
- if (['s3', 'gcs'].includes(Settings.filestore.backend)) {
- metricPrefix = Settings.filestore.backend
+ if (['s3', 's3SSEC', 'gcs'].includes(Settings.filestore.backend)) {
+ metricPrefix = Settings.filestore.backend.replace('SSEC', '')
previousEgress = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_egress`
@@ -152,7 +174,7 @@ describe('Filestore', function () {
const localFileReadPath =
'/tmp/filestore_acceptance_tests_file_read.txt'
- beforeEach(async function () {
+ beforeEach('upload file', async function () {
fileId = new ObjectId().toString()
fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
constantFileContent = [
@@ -164,14 +186,15 @@ describe('Filestore', function () {
await fsWriteFile(localFileReadPath, constantFileContent)
const readStream = fs.createReadStream(localFileReadPath)
- await fetch(fileUrl, { method: 'POST', body: readStream })
+ const res = await fetch(fileUrl, { method: 'POST', body: readStream })
+ if (!res.ok) throw new Error(res.statusText)
})
- beforeEach(async function retrievePreviousIngressMetrics() {
+ beforeEach('retrieve previous ingress metric', async function () {
// The upload request can bump the ingress metric.
// The content hash validation might require a full download
// in case the ETag field of the upload response is not a md5 sum.
- if (['s3', 'gcs'].includes(Settings.filestore.backend)) {
+ if (['s3', 's3SSEC', 'gcs'].includes(Settings.filestore.backend)) {
previousIngress = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_ingress`
@@ -212,7 +235,9 @@ describe('Filestore', function () {
})
it('should not leak a socket', async function () {
- await fetch(fileUrl)
+ const res = await fetch(fileUrl)
+ if (!res.ok) throw new Error(res.statusText)
+ await res.text()
await expectNoSockets()
})
@@ -269,24 +294,61 @@ describe('Filestore', function () {
expect(body).to.equal(newContent)
})
- if (['S3Persistor', 'GcsPersistor'].includes(backend)) {
+ describe('IfNoneMatch', function () {
+ if (backendSettings.backend === 'fs') {
+ it('should refuse to handle IfNoneMatch', async function () {
+ await expect(
+ app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${fileId}`,
+ fs.createReadStream(localFileReadPath),
+ { ifNoneMatch: '*' }
+ )
+ ).to.be.rejectedWith(NotImplementedError)
+ })
+ } else {
+ it('should reject sendStream on the same key with IfNoneMatch', async function () {
+ await expect(
+ app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${fileId}`,
+ fs.createReadStream(localFileReadPath),
+ { ifNoneMatch: '*' }
+ )
+ ).to.be.rejectedWith(AlreadyWrittenError)
+ })
+ it('should allow sendStream on a different key with IfNoneMatch', async function () {
+ await app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${fileId}-other`,
+ fs.createReadStream(localFileReadPath),
+ { ifNoneMatch: '*' }
+ )
+ })
+ }
+ })
+
+ if (backendSettings.backend !== 'fs') {
it('should record an egress metric for the upload', async function () {
const metric = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_egress`
)
- expect(metric - previousEgress).to.equal(constantFileContent.length)
+ expect(metric - previousEgress).to.equal(
+ constantFileContent.length + dataEncryptionKeySize
+ )
})
it('should record an ingress metric when downloading the file', async function () {
const response = await fetch(fileUrl)
expect(response.ok).to.be.true
+ await response.text()
const metric = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_ingress`
)
expect(metric - previousIngress).to.equal(
- constantFileContent.length
+ constantFileContent.length + dataEncryptionKeySize
)
})
@@ -295,11 +357,12 @@ describe('Filestore', function () {
headers: { Range: 'bytes=0-8' },
})
expect(response.ok).to.be.true
+ await response.text()
const metric = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_ingress`
)
- expect(metric - previousIngress).to.equal(9)
+ expect(metric - previousIngress).to.equal(9 + dataEncryptionKeySize)
})
}
})
@@ -329,7 +392,7 @@ describe('Filestore', function () {
].join('\n'),
]
- before(async function () {
+ before('create local files', async function () {
return await Promise.all([
fsWriteFile(localFileReadPaths[0], constantFileContents[0]),
fsWriteFile(localFileReadPaths[1], constantFileContents[1]),
@@ -337,7 +400,7 @@ describe('Filestore', function () {
])
})
- beforeEach(async function () {
+ beforeEach('upload two files', async function () {
projectUrl = `${filestoreUrl}/project/${projectId}`
otherProjectUrl = `${filestoreUrl}/project/${otherProjectId}`
fileIds = [
@@ -411,9 +474,10 @@ describe('Filestore', function () {
})
describe('with a large file', function () {
+ this.timeout(1000 * 20)
let fileId, fileUrl, largeFileContent, error
- beforeEach(async function () {
+ beforeEach('upload large file', async function () {
fileId = new ObjectId().toString()
fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
@@ -421,7 +485,8 @@ describe('Filestore', function () {
largeFileContent += Math.random()
const readStream = streamifier.createReadStream(largeFileContent)
- await fetch(fileUrl, { method: 'POST', body: readStream })
+ const res = await fetch(fileUrl, { method: 'POST', body: readStream })
+ if (!res.ok) throw new Error(res.statusText)
})
it('should be able to get the file back', async function () {
@@ -449,27 +514,25 @@ describe('Filestore', function () {
})
})
- if (backend === 'S3Persistor' || backend === 'FallbackGcsToS3Persistor') {
+ if (
+ (backendSettings.backend === 's3' && !backendSettings.fallback) ||
+ (backendSettings.backend === 'gcs' &&
+ backendSettings.fallback?.backend === 's3')
+ ) {
describe('with a file in a specific bucket', function () {
let constantFileContent, fileId, fileUrl, bucketName
- beforeEach(async function () {
+ beforeEach('upload file into random bucket', async function () {
constantFileContent = `This is a file in a different S3 bucket ${Math.random()}`
fileId = new ObjectId().toString()
- bucketName = new ObjectId().toString()
+ bucketName = `random-bucket-${new ObjectId().toString()}`
fileUrl = `${filestoreUrl}/bucket/${bucketName}/key/${fileId}`
- const s3ClientSettings = {
- credentials: {
- accessKeyId: process.env.AWS_ACCESS_KEY_ID,
- secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
- },
- endpoint: process.env.AWS_S3_ENDPOINT,
- sslEnabled: false,
- s3ForcePathStyle: true,
- }
-
- const s3 = new S3(s3ClientSettings)
+ const s3 = new S3Persistor({
+ ...s3Config(),
+ key: process.env.MINIO_ROOT_USER,
+ secret: process.env.MINIO_ROOT_PASSWORD,
+ })._getClientForBucket(bucketName)
await s3
.createBucket({
Bucket: bucketName,
@@ -492,25 +555,23 @@ describe('Filestore', function () {
})
}
- if (backend === 'GcsPersistor') {
+ if (backendSettings.backend === 'gcs') {
describe('when deleting a file in GCS', function () {
- let fileId, fileUrl, content, error, date
+ let fileId, fileUrl, content, error, dateBefore, dateAfter
- beforeEach(async function () {
- date = new Date()
- tk.freeze(date)
+ beforeEach('upload and delete file', async function () {
fileId = new ObjectId()
fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
content = '_wombat_' + Math.random()
const readStream = streamifier.createReadStream(content)
- await fetch(fileUrl, { method: 'POST', body: readStream })
- await fetch(fileUrl, { method: 'DELETE' })
- })
-
- afterEach(function () {
- tk.reset()
+ let res = await fetch(fileUrl, { method: 'POST', body: readStream })
+ if (!res.ok) throw new Error(res.statusText)
+ dateBefore = new Date()
+ res = await fetch(fileUrl, { method: 'DELETE' })
+ dateAfter = new Date()
+ if (!res.ok) throw new Error(res.statusText)
})
it('should not throw an error', function () {
@@ -518,10 +579,16 @@ describe('Filestore', function () {
})
it('should copy the file to the deleted-files bucket', async function () {
- await TestHelper.expectPersistorToHaveFile(
+ let date = dateBefore
+ const keys = []
+ while (date <= dateAfter) {
+ keys.push(`${projectId}/${fileId}-${date.toISOString()}`)
+ date = new Date(date.getTime() + 1)
+ }
+ await TestHelper.expectPersistorToHaveSomeFile(
app.persistor,
`${Settings.filestore.stores.user_files}-deleted`,
- `${projectId}/${fileId}-${date.toISOString()}`,
+ keys,
content
)
})
@@ -536,7 +603,7 @@ describe('Filestore', function () {
})
}
- if (BackendSettings[backend].fallback) {
+ if (backendSettings.fallback) {
describe('with a fallback', function () {
let constantFileContent,
fileId,
@@ -545,7 +612,7 @@ describe('Filestore', function () {
bucket,
fallbackBucket
- beforeEach(function () {
+ beforeEach('prepare fallback', function () {
constantFileContent = `This is yet more file content ${Math.random()}`
fileId = new ObjectId().toString()
fileKey = `${projectId}/${fileId}`
@@ -556,7 +623,7 @@ describe('Filestore', function () {
})
describe('with a file in the fallback bucket', function () {
- beforeEach(async function () {
+ beforeEach('upload into fallback', async function () {
await TestHelper.uploadStringToPersistor(
app.persistor.fallbackPersistor,
fallbackBucket,
@@ -583,7 +650,7 @@ describe('Filestore', function () {
})
describe('when copyOnMiss is disabled', function () {
- beforeEach(function () {
+ beforeEach('swap copyOnMiss=false', function () {
app.persistor.settings.copyOnMiss = false
})
@@ -596,6 +663,7 @@ describe('Filestore', function () {
it('should not copy the file to the primary', async function () {
const response = await fetch(fileUrl)
expect(response.ok).to.be.true
+ await response.text()
await TestHelper.expectPersistorNotToHaveFile(
app.persistor.primaryPersistor,
@@ -606,7 +674,7 @@ describe('Filestore', function () {
})
describe('when copyOnMiss is enabled', function () {
- beforeEach(function () {
+ beforeEach('swap copyOnMiss=true', function () {
app.persistor.settings.copyOnMiss = true
})
@@ -619,6 +687,7 @@ describe('Filestore', function () {
it('copies the file to the primary', async function () {
const response = await fetch(fileUrl)
expect(response.ok).to.be.true
+ await response.text()
// wait for the file to copy in the background
await msleep(1000)
@@ -634,7 +703,7 @@ describe('Filestore', function () {
describe('when copying a file', function () {
let newFileId, newFileUrl, newFileKey, opts
- beforeEach(function () {
+ beforeEach('prepare to copy file', function () {
const newProjectID = new ObjectId().toString()
newFileId = new ObjectId().toString()
newFileUrl = `${filestoreUrl}/project/${newProjectID}/file/${newFileId}`
@@ -655,7 +724,7 @@ describe('Filestore', function () {
})
describe('when copyOnMiss is false', function () {
- beforeEach(async function () {
+ beforeEach('copy with copyOnMiss=false', async function () {
app.persistor.settings.copyOnMiss = false
const response = await fetch(newFileUrl, opts)
@@ -701,7 +770,7 @@ describe('Filestore', function () {
})
describe('when copyOnMiss is true', function () {
- beforeEach(async function () {
+ beforeEach('copy with copyOnMiss=false', async function () {
app.persistor.settings.copyOnMiss = true
const response = await fetch(newFileUrl, opts)
@@ -750,10 +819,14 @@ describe('Filestore', function () {
})
describe('when sending a file', function () {
- beforeEach(async function () {
+ beforeEach('upload file', async function () {
const readStream =
streamifier.createReadStream(constantFileContent)
- await fetch(fileUrl, { method: 'POST', body: readStream })
+ const res = await fetch(fileUrl, {
+ method: 'POST',
+ body: readStream,
+ })
+ if (!res.ok) throw new Error(res.statusText)
})
it('should store the file on the primary', async function () {
@@ -776,7 +849,7 @@ describe('Filestore', function () {
describe('when deleting a file', function () {
describe('when the file exists on the primary', function () {
- beforeEach(async function () {
+ beforeEach('upload into primary', async function () {
await TestHelper.uploadStringToPersistor(
app.persistor.primaryPersistor,
bucket,
@@ -794,7 +867,7 @@ describe('Filestore', function () {
})
describe('when the file exists on the fallback', function () {
- beforeEach(async function () {
+ beforeEach('upload into fallback', async function () {
await TestHelper.uploadStringToPersistor(
app.persistor.fallbackPersistor,
fallbackBucket,
@@ -812,20 +885,23 @@ describe('Filestore', function () {
})
describe('when the file exists on both the primary and the fallback', function () {
- beforeEach(async function () {
- await TestHelper.uploadStringToPersistor(
- app.persistor.primaryPersistor,
- bucket,
- fileKey,
- constantFileContent
- )
- await TestHelper.uploadStringToPersistor(
- app.persistor.fallbackPersistor,
- fallbackBucket,
- fileKey,
- constantFileContent
- )
- })
+ beforeEach(
+ 'upload into both primary and fallback',
+ async function () {
+ await TestHelper.uploadStringToPersistor(
+ app.persistor.primaryPersistor,
+ bucket,
+ fileKey,
+ constantFileContent
+ )
+ await TestHelper.uploadStringToPersistor(
+ app.persistor.fallbackPersistor,
+ fallbackBucket,
+ fileKey,
+ constantFileContent
+ )
+ }
+ )
it('should delete the files', async function () {
const response1 = await fetch(fileUrl, { method: 'DELETE' })
@@ -854,13 +930,14 @@ describe('Filestore', function () {
'../../fixtures/test.pdf'
)
- beforeEach(async function () {
+ beforeEach('upload test.pdf', async function () {
fileId = new ObjectId().toString()
fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
const stat = await fsStat(localFileReadPath)
localFileSize = stat.size
const readStream = fs.createReadStream(localFileReadPath)
- await fetch(fileUrl, { method: 'POST', body: readStream })
+ const res = await fetch(fileUrl, { method: 'POST', body: readStream })
+ if (!res.ok) throw new Error(res.statusText)
})
it('should be able get the file back', async function () {
@@ -869,13 +946,15 @@ describe('Filestore', function () {
expect(body.substring(0, 8)).to.equal('%PDF-1.5')
})
- if (['S3Persistor', 'GcsPersistor'].includes(backend)) {
+ if (backendSettings.backend !== 'fs') {
it('should record an egress metric for the upload', async function () {
const metric = await TestHelper.getMetric(
filestoreUrl,
`${metricPrefix}_egress`
)
- expect(metric - previousEgress).to.equal(localFileSize)
+ expect(metric - previousEgress).to.equal(
+ localFileSize + dataEncryptionKeySize
+ )
})
}
@@ -883,18 +962,20 @@ describe('Filestore', function () {
this.timeout(1000 * 20)
let previewFileUrl
- beforeEach(function () {
+ beforeEach('prepare previewFileUrl for preview', function () {
previewFileUrl = `${fileUrl}?style=preview`
})
it('should not time out', async function () {
const response = await fetch(previewFileUrl)
expect(response.status).to.equal(200)
+ await response.arrayBuffer()
})
it('should respond with image data', async function () {
// note: this test relies of the imagemagick conversion working
const response = await fetch(previewFileUrl)
+ expect(response.status).to.equal(200)
const body = await response.text()
expect(body.length).to.be.greaterThan(400)
expect(body.substr(1, 3)).to.equal('PNG')
@@ -905,20 +986,23 @@ describe('Filestore', function () {
this.timeout(1000 * 20)
let previewFileUrl
- beforeEach(function () {
+ beforeEach('prepare previewFileUrl for cacheWarn', function () {
previewFileUrl = `${fileUrl}?style=preview&cacheWarm=true`
})
it('should not time out', async function () {
const response = await fetch(previewFileUrl)
expect(response.status).to.equal(200)
+ await response.arrayBuffer()
})
it('should not leak sockets', async function () {
const response1 = await fetch(previewFileUrl)
expect(response1.status).to.equal(200)
+ // do not read the response body, should be destroyed immediately
const response2 = await fetch(previewFileUrl)
expect(response2.status).to.equal(200)
+ // do not read the response body, should be destroyed immediately
await expectNoSockets()
})
@@ -930,6 +1014,551 @@ describe('Filestore', function () {
})
})
})
+
+ describe('with server side encryption', function () {
+ if (backendSettings.backend !== 's3SSEC') return
+
+ before('sanity check top-level variable', function () {
+ expect(dataEncryptionKeySize).to.equal(32)
+ })
+
+ let fileId1,
+ fileId2,
+ fileKey1,
+ fileKey2,
+ fileKeyOtherProject,
+ fileUrl1,
+ fileUrl2
+ beforeEach('prepare ids', function () {
+ fileId1 = new ObjectId().toString()
+ fileId2 = new ObjectId().toString()
+ fileKey1 = `${projectId}/${fileId1}`
+ fileKey2 = `${projectId}/${fileId2}`
+ fileKeyOtherProject = `${new ObjectId().toString()}/${new ObjectId().toString()}`
+ fileUrl1 = `${filestoreUrl}/project/${projectId}/file/${fileId1}`
+ fileUrl2 = `${filestoreUrl}/project/${projectId}/file/${fileId2}`
+ })
+
+ beforeEach('ensure DEK is missing', async function () {
+ // Cannot use test helper expectPersistorNotToHaveFile here, we need to use the KEK.
+ await expect(
+ app.persistor.getDataEncryptionKeySize(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ ).to.rejectedWith(NotFoundError)
+ })
+
+ async function createRandomContent(url, suffix = '') {
+ const content = Math.random().toString() + suffix
+ const res = await fetch(url, {
+ method: 'POST',
+ body: Stream.Readable.from([content]),
+ })
+ if (!res.ok) throw new Error(res.statusText)
+ return async () => {
+ const res = await fetch(url, { method: 'GET' })
+ if (!res.ok) throw new Error(res.statusText)
+ expect(await res.text()).to.equal(content)
+ }
+ }
+
+ it('should create a DEK when asked explicitly', async function () {
+ await app.persistor.generateDataEncryptionKey(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ expect(
+ await app.persistor.getDataEncryptionKeySize(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ ).to.equal(32)
+ })
+
+ it('should create a DEK from writes', async function () {
+ await createRandomContent(fileUrl1)
+ expect(
+ await app.persistor.getDataEncryptionKeySize(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ ).to.equal(32)
+ })
+
+ it('should not create a DEK from reads', async function () {
+ const res = await fetch(fileUrl1, {
+ method: 'GET',
+ })
+ if (res.status !== 404) throw new Error(`${res.status} should be 404`)
+
+ // Cannot use test helper expectPersistorNotToHaveFile here, we need to use the KEK.
+ await expect(
+ app.persistor.getDataEncryptionKeySize(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ ).to.rejectedWith(NotFoundError)
+ })
+
+ it('should never overwrite a data encryption key', async function () {
+ const checkGET = await createRandomContent(fileUrl1)
+
+ await expect(
+ app.persistor.generateDataEncryptionKey(
+ backendSettings.stores.user_files,
+ fileKey1
+ )
+ ).to.rejectedWith(AlreadyWrittenError)
+
+ await checkGET()
+ })
+
+ it('should re-use the data encryption key after a write', async function () {
+ const checkGET1 = await createRandomContent(fileUrl1, '1')
+ const checkGET2 = await createRandomContent(fileUrl2, '2')
+ await checkGET1()
+ await checkGET2()
+ })
+
+ describe('kek rotation', function () {
+ const newKEK = new RootKeyEncryptionKey(
+ crypto.generateKeySync('aes', { length: 256 }).export(),
+ Buffer.alloc(32)
+ )
+ const oldKEK = new RootKeyEncryptionKey(
+ crypto.generateKeySync('aes', { length: 256 }).export(),
+ Buffer.alloc(32)
+ )
+ const migrationStep0 = new PerProjectEncryptedS3Persistor({
+ ...s3SSECConfig(),
+ automaticallyRotateDEKEncryption: false,
+ async getRootKeyEncryptionKeys() {
+ return [oldKEK] // only old key
+ },
+ })
+ const migrationStep1 = new PerProjectEncryptedS3Persistor({
+ ...s3SSECConfig(),
+ automaticallyRotateDEKEncryption: false,
+ async getRootKeyEncryptionKeys() {
+ return [oldKEK, newKEK] // new key as fallback
+ },
+ })
+ const migrationStep2 = new PerProjectEncryptedS3Persistor({
+ ...s3SSECConfig(),
+ automaticallyRotateDEKEncryption: true, // <- different compared to partiallyRotated
+ async getRootKeyEncryptionKeys() {
+ return [newKEK, oldKEK] // old keys as fallback
+ },
+ })
+ const migrationStep3 = new PerProjectEncryptedS3Persistor({
+ ...s3SSECConfig(),
+ automaticallyRotateDEKEncryption: true,
+ async getRootKeyEncryptionKeys() {
+ return [newKEK] // only new key
+ },
+ })
+
+ async function checkWrites(
+ fileKey,
+ writer,
+ readersSuccess,
+ readersFailed
+ ) {
+ const content = Math.random().toString()
+ await writer.sendStream(
+ Settings.filestore.stores.user_files,
+ fileKey,
+ Stream.Readable.from([content])
+ )
+
+ for (const persistor of readersSuccess) {
+ await TestHelper.expectPersistorToHaveFile(
+ persistor,
+ backendSettings.stores.user_files,
+ fileKey,
+ content
+ )
+ }
+
+ for (const persistor of readersFailed) {
+ await expect(
+ TestHelper.expectPersistorToHaveFile(
+ persistor,
+ backendSettings.stores.user_files,
+ fileKey,
+ content
+ )
+ ).to.be.rejectedWith(NoKEKMatchedError)
+ }
+ }
+
+ const stages = [
+ {
+ name: 'stage 0 - [old]',
+ prev: migrationStep0,
+ cur: migrationStep0,
+ fail: [migrationStep3],
+ },
+ {
+ name: 'stage 1 - [old,new]',
+ prev: migrationStep0,
+ cur: migrationStep1,
+ fail: [],
+ },
+ {
+ name: 'stage 2 - [new,old]',
+ prev: migrationStep1,
+ cur: migrationStep2,
+ fail: [],
+ },
+ {
+ name: 'stage 3 - [new]',
+ prev: migrationStep2,
+ cur: migrationStep3,
+ fail: [migrationStep0],
+ },
+ ]
+
+ for (const { name, prev, cur, fail } of stages) {
+ describe(name, function () {
+ this.timeout(1000 * 30)
+
+ it('can read old writes', async function () {
+ await checkWrites(fileKey1, prev, [prev, cur], fail)
+ await checkWrites(fileKey2, prev, [prev, cur], fail) // check again after access
+ await checkWrites(fileKeyOtherProject, prev, [prev, cur], fail)
+ })
+ it('can read new writes', async function () {
+ await checkWrites(fileKey1, prev, [prev, cur], fail)
+ await checkWrites(fileKey2, cur, [prev, cur], fail) // check again after access
+ await checkWrites(fileKeyOtherProject, cur, [prev, cur], fail)
+ })
+ })
+ }
+
+ describe('full migration', function () {
+ it('can read old writes if rotated in sequence', async function () {
+ await checkWrites(
+ fileKey1,
+ migrationStep0,
+ [
+ migrationStep0,
+ migrationStep1,
+ migrationStep2, // migrates
+ migrationStep3,
+ ],
+ []
+ )
+ })
+ it('cannot read/write if not rotated', async function () {
+ await checkWrites(
+ fileKey1,
+ migrationStep0,
+ [migrationStep0],
+ [migrationStep3]
+ )
+ })
+ })
+ })
+
+ /** @type {import('aws-sdk/clients/s3')} */
+ let s3Client
+ before('create s3 client', function () {
+ s3Client = new S3Persistor(s3Config())._getClientForBucket('')
+ })
+
+ async function checkDEKStorage({
+ dekBucketKeys = [],
+ userFilesBucketKeys = [],
+ }) {
+ await createRandomContent(fileUrl1)
+
+ const { Contents: dekEntries } = await s3Client
+ .listObjectsV2({
+ Bucket: process.env.AWS_S3_USER_FILES_DEK_BUCKET_NAME,
+ Prefix: `${projectId}/`,
+ })
+ .promise()
+ expect(dekEntries).to.have.length(dekBucketKeys.length)
+ // Order is not predictable, use members
+ expect(dekEntries.map(o => o.Key)).to.have.members(dekBucketKeys)
+
+ const { Contents: userFilesEntries } = await s3Client
+ .listObjectsV2({
+ Bucket: backendSettings.stores.user_files,
+ Prefix: `${projectId}/`,
+ })
+ .promise()
+ expect(userFilesEntries).to.have.length(userFilesBucketKeys.length)
+ // Order is not predictable, use members
+ expect(userFilesEntries.map(o => o.Key)).to.have.members(
+ userFilesBucketKeys
+ )
+ }
+
+ it('should use a custom bucket for DEKs', async function () {
+ await checkDEKStorage({
+ dekBucketKeys: [`${projectId}/dek`],
+ userFilesBucketKeys: [fileKey1],
+ })
+ })
+
+ describe('deleteDirectory', function () {
+ let checkGET1, checkGET2
+ beforeEach('create files', async function () {
+ checkGET1 = await createRandomContent(fileUrl1, '1')
+ checkGET2 = await createRandomContent(fileUrl2, '2')
+ })
+ it('should refuse to delete top-level prefix', async function () {
+ await expect(
+ app.persistor.deleteDirectory(
+ Settings.filestore.stores.user_files,
+ projectId.slice(0, 3)
+ )
+ ).to.be.rejectedWith('not a project-folder')
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey1
+ )
+ ).to.equal(true)
+ await checkGET1()
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.equal(true)
+ expect(
+ await app.persistor.getDataEncryptionKeySize(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.equal(32)
+ await checkGET2()
+ })
+ it('should delete sub-folder and keep DEK', async function () {
+ await app.persistor.deleteDirectory(
+ Settings.filestore.stores.user_files,
+ fileKey1 // not really a sub-folder, but it will do for this test.
+ )
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey1
+ )
+ ).to.equal(false)
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.equal(true)
+ expect(
+ await app.persistor.getDataEncryptionKeySize(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.equal(32)
+ await checkGET2()
+ })
+ it('should delete project folder and DEK', async function () {
+ await app.persistor.deleteDirectory(
+ Settings.filestore.stores.user_files,
+ `${projectId}/`
+ )
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey1
+ )
+ ).to.equal(false)
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.equal(false)
+ await expect(
+ app.persistor.getDataEncryptionKeySize(
+ Settings.filestore.stores.user_files,
+ fileKey2
+ )
+ ).to.rejectedWith(NotFoundError)
+ })
+ })
+ })
+
+ describe('getObjectSize', function () {
+ it('should return a number', async function () {
+ const buf = Buffer.from('hello')
+ const fileId = new ObjectId().toString()
+ const fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
+ const res = await fetch(fileUrl, {
+ method: 'POST',
+ body: Stream.Readable.from([buf]),
+ })
+ if (!res.ok) throw new Error(res.statusText)
+ expect(
+ await app.persistor.getObjectSize(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${fileId}`
+ )
+ ).to.equal(buf.byteLength)
+ })
+ })
+
+ describe('checkIfObjectExists', function () {
+ it('should return false when the object does not exist', async function () {
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${new ObjectId().toString()}`
+ )
+ ).to.equal(false)
+ })
+ it('should return true when the object exists', async function () {
+ const fileId = new ObjectId().toString()
+ const fileUrl = `${filestoreUrl}/project/${projectId}/file/${fileId}`
+ const res = await fetch(fileUrl, {
+ method: 'POST',
+ body: Stream.Readable.from(['hello']),
+ })
+ if (!res.ok) throw new Error(res.statusText)
+ expect(
+ await app.persistor.checkIfObjectExists(
+ Settings.filestore.stores.user_files,
+ `${projectId}/${fileId}`
+ )
+ ).to.equal(true)
+ })
+ })
+
+ if (backendSettings.backend === 's3SSEC') {
+ describe('storageClass', function () {
+ it('should use the default storage class for dek', async function () {
+ const key = `${projectId}/${new ObjectId()}`
+ const dekBucket = process.env.AWS_S3_USER_FILES_DEK_BUCKET_NAME
+ await app.persistor.sendStream(
+ dekBucket,
+ key,
+ Stream.Readable.from(['hello'])
+ )
+ expect(
+ await app.persistor.getObjectStorageClass(dekBucket, key)
+ ).to.equal(undefined)
+ })
+
+ it('should use the custom storage class for user files', async function () {
+ const key = `${projectId}/${new ObjectId()}`
+ await app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ key,
+ Stream.Readable.from(['hello'])
+ )
+ const sc = AWS_S3_USER_FILES_STORAGE_CLASS
+ expect(sc).to.exist
+ expect(
+ await app.persistor.getObjectStorageClass(
+ Settings.filestore.stores.user_files,
+ key
+ )
+ ).to.equal(sc)
+ })
+ })
+ }
+
+ describe('autoGunzip', function () {
+ let key
+ beforeEach('new key', function () {
+ key = `${projectId}/${new ObjectId().toString()}`
+ })
+ this.timeout(60 * 1000)
+ const body = Buffer.alloc(10 * 1024 * 1024, 'hello')
+ const gzippedBody = gzipSync(body)
+
+ /**
+ * @param {string} key
+ * @param {Buffer} wantBody
+ * @param {boolean} autoGunzip
+ * @return {Promise}
+ */
+ async function checkBodyIsTheSame(key, wantBody, autoGunzip) {
+ const s = await app.persistor.getObjectStream(
+ Settings.filestore.stores.user_files,
+ key,
+ { autoGunzip }
+ )
+ const buf = new WritableBuffer()
+ await Stream.promises.pipeline(s, buf)
+ expect(buf.getContents()).to.deep.equal(wantBody)
+ }
+
+ if (backendSettings.backend === 'fs') {
+ it('should refuse to handle autoGunzip', async function () {
+ await expect(
+ app.persistor.getObjectStream(
+ Settings.filestore.stores.user_files,
+ key,
+ { autoGunzip: true }
+ )
+ ).to.be.rejectedWith(NotImplementedError)
+ })
+ } else {
+ it('should return the raw body with gzip', async function () {
+ await app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ key,
+ Stream.Readable.from([gzippedBody]),
+ { contentEncoding: 'gzip' }
+ )
+ expect(
+ await app.persistor.getObjectSize(
+ Settings.filestore.stores.user_files,
+ key
+ )
+ ).to.equal(gzippedBody.byteLength)
+ // raw body with autoGunzip=true
+ await checkBodyIsTheSame(key, body, true)
+ // gzip body without autoGunzip=false
+ await checkBodyIsTheSame(key, gzippedBody, false)
+ })
+ it('should return the raw body without gzip compression', async function () {
+ await app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ key,
+ Stream.Readable.from([body])
+ )
+ expect(
+ await app.persistor.getObjectSize(
+ Settings.filestore.stores.user_files,
+ key
+ )
+ ).to.equal(body.byteLength)
+ // raw body with both autoGunzip options
+ await checkBodyIsTheSame(key, body, true)
+ await checkBodyIsTheSame(key, body, false)
+ })
+
+ it('should return the gzip body without gzip header', async function () {
+ await app.persistor.sendStream(
+ Settings.filestore.stores.user_files,
+ key,
+ Stream.Readable.from([gzippedBody])
+ )
+ expect(
+ await app.persistor.getObjectSize(
+ Settings.filestore.stores.user_files,
+ key
+ )
+ ).to.equal(gzippedBody.byteLength)
+ // gzip body with both autoGunzip options
+ await checkBodyIsTheSame(key, gzippedBody, true)
+ await checkBodyIsTheSame(key, gzippedBody, false)
+ })
+ }
+ })
})
- })
+ }
})
diff --git a/services/filestore/test/acceptance/js/TestConfig.js b/services/filestore/test/acceptance/js/TestConfig.js
index 4b72bc971d..3ad4ba423d 100644
--- a/services/filestore/test/acceptance/js/TestConfig.js
+++ b/services/filestore/test/acceptance/js/TestConfig.js
@@ -1,22 +1,63 @@
-const fs = require('fs')
-const Path = require('path')
+const fs = require('node:fs')
+const Path = require('node:path')
+const crypto = require('node:crypto')
+const {
+ RootKeyEncryptionKey,
+} = require('@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor')
+
+const AWS_S3_USER_FILES_STORAGE_CLASS =
+ process.env.AWS_S3_USER_FILES_STORAGE_CLASS
// use functions to get a fresh copy, not a reference, each time
+function s3BaseConfig() {
+ return {
+ endpoint: process.env.AWS_S3_ENDPOINT,
+ pathStyle: true,
+ partSize: 100 * 1024 * 1024,
+ ca: [fs.readFileSync('/certs/public.crt')],
+ }
+}
+
function s3Config() {
return {
key: process.env.AWS_ACCESS_KEY_ID,
secret: process.env.AWS_SECRET_ACCESS_KEY,
- endpoint: process.env.AWS_S3_ENDPOINT,
- pathStyle: true,
- partSize: 100 * 1024 * 1024,
+ ...s3BaseConfig(),
+ }
+}
+
+const S3SSECKeys = [
+ new RootKeyEncryptionKey(
+ crypto.generateKeySync('aes', { length: 256 }).export(),
+ Buffer.alloc(32)
+ ),
+]
+
+function s3SSECConfig() {
+ return {
+ ...s3Config(),
+ ignoreErrorsFromDEKReEncryption: false,
+ automaticallyRotateDEKEncryption: true,
+ dataEncryptionKeyBucketName: process.env.AWS_S3_USER_FILES_DEK_BUCKET_NAME,
+ pathToProjectFolder(_bucketName, path) {
+ const match = path.match(/^[a-f0-9]{24}\//)
+ if (!match) throw new Error('not a project-folder')
+ const [projectFolder] = match
+ return projectFolder
+ },
+ async getRootKeyEncryptionKeys() {
+ return S3SSECKeys
+ },
+ storageClass: {
+ [process.env.AWS_S3_USER_FILES_BUCKET_NAME]:
+ AWS_S3_USER_FILES_STORAGE_CLASS,
+ },
}
}
function s3ConfigDefaultProviderCredentials() {
return {
- endpoint: process.env.AWS_S3_ENDPOINT,
- pathStyle: true,
- partSize: 100 * 1024 * 1024,
+ ...s3BaseConfig(),
}
}
@@ -60,7 +101,7 @@ function fallbackStores(primaryConfig, fallbackConfig) {
}
}
-module.exports = {
+const BackendSettings = {
SHARD_01_FSPersistor: {
backend: 'fs',
stores: fsStores(),
@@ -80,6 +121,11 @@ module.exports = {
gcs: gcsConfig(),
stores: gcsStores(),
},
+ SHARD_01_PerProjectEncryptedS3Persistor: {
+ backend: 's3SSEC',
+ s3SSEC: s3SSECConfig(),
+ stores: s3Stores(),
+ },
SHARD_02_FallbackS3ToFSPersistor: {
backend: 's3',
s3: s3Config(),
@@ -137,3 +183,10 @@ function checkForUnexpectedTestFile() {
}
}
checkForUnexpectedTestFile()
+
+module.exports = {
+ AWS_S3_USER_FILES_STORAGE_CLASS,
+ BackendSettings,
+ s3Config,
+ s3SSECConfig,
+}
diff --git a/services/filestore/test/acceptance/js/TestHelper.js b/services/filestore/test/acceptance/js/TestHelper.js
index 1b7eae4d0a..384f8aab6f 100644
--- a/services/filestore/test/acceptance/js/TestHelper.js
+++ b/services/filestore/test/acceptance/js/TestHelper.js
@@ -1,5 +1,6 @@
const streamifier = require('streamifier')
const fetch = require('node-fetch')
+const ObjectPersistor = require('@overleaf/object-persistor')
const { expect } = require('chai')
@@ -7,6 +8,7 @@ module.exports = {
uploadStringToPersistor,
getStringFromPersistor,
expectPersistorToHaveFile,
+ expectPersistorToHaveSomeFile,
expectPersistorNotToHaveFile,
streamToString,
getMetric,
@@ -15,10 +17,14 @@ module.exports = {
async function getMetric(filestoreUrl, metric) {
const res = await fetch(`${filestoreUrl}/metrics`)
expect(res.status).to.equal(200)
- const metricRegex = new RegExp(`^${metric}{[^}]+} ([0-9]+)$`, 'm')
+ const metricRegex = new RegExp(`^${metric}{[^}]+} ([0-9]+)$`, 'gm')
const body = await res.text()
- const found = metricRegex.exec(body)
- return parseInt(found ? found[1] : 0) || 0
+ let v = 0
+ // Sum up size="lt-128KiB" and size="gte-128KiB"
+ for (const [, found] of body.matchAll(metricRegex)) {
+ v += parseInt(found, 10) || 0
+ }
+ return v
}
function streamToString(stream) {
@@ -46,6 +52,25 @@ async function expectPersistorToHaveFile(persistor, bucket, key, content) {
expect(foundContent).to.equal(content)
}
+async function expectPersistorToHaveSomeFile(persistor, bucket, keys, content) {
+ let foundContent
+ for (const key of keys) {
+ try {
+ foundContent = await getStringFromPersistor(persistor, bucket, key)
+ break
+ } catch (err) {
+ if (err instanceof ObjectPersistor.Errors.NotFoundError) {
+ continue
+ }
+ throw err
+ }
+ }
+ if (foundContent === undefined) {
+ expect.fail(`Could not find any of the specified keys: ${keys}`)
+ }
+ expect(foundContent).to.equal(content)
+}
+
async function expectPersistorNotToHaveFile(persistor, bucket, key) {
await expect(
getStringFromPersistor(persistor, bucket, key)
diff --git a/services/filestore/test/setup.js b/services/filestore/test/setup.js
index 57a462390f..744ab9130f 100644
--- a/services/filestore/test/setup.js
+++ b/services/filestore/test/setup.js
@@ -21,6 +21,11 @@ SandboxedModule.configure({
requires: {
'@overleaf/logger': stubs.logger,
},
+ sourceTransformers: {
+ removeNodePrefix: function (source) {
+ return source.replace(/require\(['"]node:/g, "require('")
+ },
+ },
})
exports.mochaHooks = {
diff --git a/services/filestore/test/unit/js/FileControllerTests.js b/services/filestore/test/unit/js/FileControllerTests.js
index 508db8b153..ec562116a0 100644
--- a/services/filestore/test/unit/js/FileControllerTests.js
+++ b/services/filestore/test/unit/js/FileControllerTests.js
@@ -6,14 +6,7 @@ const Errors = require('../../../app/js/Errors')
const modulePath = '../../../app/js/FileController.js'
describe('FileController', function () {
- let PersistorManager,
- FileHandler,
- LocalFileWriter,
- FileController,
- req,
- res,
- next,
- stream
+ let FileHandler, LocalFileWriter, FileController, req, res, next, stream
const settings = {
s3: {
buckets: {
@@ -32,13 +25,8 @@ describe('FileController', function () {
const error = new Error('incorrect utensil')
beforeEach(function () {
- PersistorManager = {
- sendStream: sinon.stub().yields(),
- copyObject: sinon.stub().resolves(),
- deleteObject: sinon.stub().yields(),
- }
-
FileHandler = {
+ copyObject: sinon.stub().yields(),
getFile: sinon.stub().yields(null, fileStream),
getFileSize: sinon.stub().yields(null, fileSize),
deleteFile: sinon.stub().yields(),
@@ -57,7 +45,6 @@ describe('FileController', function () {
requires: {
'./LocalFileWriter': LocalFileWriter,
'./FileHandler': FileHandler,
- './PersistorManager': PersistorManager,
'./Errors': Errors,
stream,
'@overleaf/settings': settings,
@@ -239,7 +226,7 @@ describe('FileController', function () {
})
describe('insertFile', function () {
- it('should send bucket name key and res to PersistorManager', function (done) {
+ it('should send bucket name key and res to FileHandler', function (done) {
res.sendStatus = code => {
expect(FileHandler.insertFile).to.have.been.calledWith(bucket, key, req)
expect(code).to.equal(200)
@@ -263,10 +250,10 @@ describe('FileController', function () {
}
})
- it('should send bucket name and both keys to PersistorManager', function (done) {
+ it('should send bucket name and both keys to FileHandler', function (done) {
res.sendStatus = code => {
code.should.equal(200)
- expect(PersistorManager.copyObject).to.have.been.calledWith(
+ expect(FileHandler.copyObject).to.have.been.calledWith(
bucket,
oldKey,
key
@@ -277,7 +264,7 @@ describe('FileController', function () {
})
it('should send a 404 if the original file was not found', function (done) {
- PersistorManager.copyObject.rejects(
+ FileHandler.copyObject.yields(
new Errors.NotFoundError({ message: 'not found', info: {} })
)
res.sendStatus = code => {
@@ -288,7 +275,7 @@ describe('FileController', function () {
})
it('should send an error if there was an error', function (done) {
- PersistorManager.copyObject.rejects(error)
+ FileHandler.copyObject.yields(error)
FileController.copyFile(req, res, err => {
expect(err).to.equal(error)
done()
diff --git a/services/filestore/test/unit/js/FileHandlerTests.js b/services/filestore/test/unit/js/FileHandlerTests.js
index d4899dd20a..12a23667b4 100644
--- a/services/filestore/test/unit/js/FileHandlerTests.js
+++ b/services/filestore/test/unit/js/FileHandlerTests.js
@@ -67,7 +67,11 @@ describe('FileHandler', function () {
compressPng: sinon.stub().resolves(),
},
}
- Settings = {}
+ Settings = {
+ filestore: {
+ stores: { template_files: 'template_files', user_files: 'user_files' },
+ },
+ }
fs = {
createReadStream: sinon.stub().returns(readStream),
}
@@ -89,7 +93,7 @@ describe('FileHandler', function () {
},
fs,
},
- globals: { console },
+ globals: { console, process },
})
})
@@ -133,23 +137,6 @@ describe('FileHandler', function () {
done()
})
})
-
- describe('when conversions are enabled', function () {
- beforeEach(function () {
- Settings.enableConversions = true
- })
-
- it('should delete the convertedKey folder', function (done) {
- FileHandler.insertFile(bucket, key, stream, err => {
- expect(err).not.to.exist
- expect(PersistorManager.deleteDirectory).to.have.been.calledWith(
- bucket,
- convertedFolderKey
- )
- done()
- })
- })
- })
})
describe('deleteFile', function () {
@@ -195,15 +182,31 @@ describe('FileHandler', function () {
Settings.enableConversions = true
})
- it('should delete the convertedKey folder', function (done) {
- FileHandler.deleteFile(bucket, key, err => {
- expect(err).not.to.exist
- expect(PersistorManager.deleteDirectory).to.have.been.calledWith(
- bucket,
- convertedFolderKey
- )
- done()
- })
+ it('should delete the convertedKey folder for template files', function (done) {
+ FileHandler.deleteFile(
+ Settings.filestore.stores.template_files,
+ key,
+ err => {
+ expect(err).not.to.exist
+ expect(PersistorManager.deleteDirectory).to.have.been.calledWith(
+ Settings.filestore.stores.template_files,
+ convertedFolderKey
+ )
+ done()
+ }
+ )
+ })
+
+ it('should not delete the convertedKey folder for user files', function (done) {
+ FileHandler.deleteFile(
+ Settings.filestore.stores.user_files,
+ key,
+ err => {
+ expect(err).not.to.exist
+ expect(PersistorManager.deleteDirectory).to.not.have.been.called
+ done()
+ }
+ )
})
})
})
diff --git a/services/git-bridge/.gitignore b/services/git-bridge/.gitignore
index 74a7f43d6e..f35e2ee038 100644
--- a/services/git-bridge/.gitignore
+++ b/services/git-bridge/.gitignore
@@ -1,53 +1,6 @@
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# Let's not share anything because we're using Maven.
-
-.idea
-*.iml
-
-# User-specific stuff:
-.idea/workspace.xml
-.idea/tasks.xml
-.idea/dictionaries
-.idea/vcs.xml
-.idea/jsLibraryMappings.xml
-
-# Sensitive or high-churn files:
-.idea/dataSources.ids
-.idea/dataSources.xml
-.idea/dataSources.local.xml
-.idea/sqlDataSources.xml
-.idea/dynamic.xml
-.idea/uiDesigner.xml
-
-# Gradle:
-.idea/gradle.xml
-.idea/libraries
-
-# Mongo Explorer plugin:
-.idea/mongoSettings.xml
-
-## File-based project format:
-*.iws
-
-## Plugin-specific files:
-
-# IntelliJ
+# Build output
/out/
target/
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
# Local configuration files
conf/runtime.json
diff --git a/services/git-bridge/Dockerfile b/services/git-bridge/Dockerfile
index 0d8b1e43e5..48579b9494 100644
--- a/services/git-bridge/Dockerfile
+++ b/services/git-bridge/Dockerfile
@@ -1,11 +1,17 @@
-# Dockerfile for git-bridge
+# Build the a8m/envsubst binary, as it supports default values,
+# which the gnu envsubst (from gettext-base) does not.
+FROM golang:1.24.3-alpine AS envsubst_builder
+
+WORKDIR /build
+
+RUN go install github.com/a8m/envsubst/cmd/envsubst@latest
FROM maven:3-amazoncorretto-21-debian AS base
RUN apt-get update && apt-get install -y make git sqlite3 \
&& rm -rf /var/lib/apt/lists
-COPY vendor/envsubst /opt/envsubst
+COPY --from=envsubst_builder /go/bin/envsubst /opt/envsubst
RUN chmod +x /opt/envsubst
RUN useradd --create-home node
@@ -29,16 +35,11 @@ RUN apk add --update --no-cache bash git sqlite procps htop net-tools jemalloc u
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2
-# Install Google Cloud Profiler agent
-RUN mkdir -p /opt/cprof && \
- wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
- | tar xzv -C /opt/cprof
-
RUN adduser -D node
COPY --from=builder /git-bridge.jar /
-COPY vendor/envsubst /opt/envsubst
+COPY --from=envsubst_builder /go/bin/envsubst /opt/envsubst
RUN chmod +x /opt/envsubst
COPY conf/envsubst_template.json envsubst_template.json
diff --git a/services/git-bridge/README.md b/services/git-bridge/README.md
index 13b24cc6d0..eadc2abc4f 100644
--- a/services/git-bridge/README.md
+++ b/services/git-bridge/README.md
@@ -76,12 +76,10 @@ The configuration file is in `.json` format.
"postbackBaseUrl" (string): the postback url,
"serviceName" (string): current name of writeLaTeX
in case it ever changes,
- "oauth2" (object): { null or missing if oauth2 shouldn't be used
- "oauth2ClientID" (string): oauth2 client ID,
- "oauth2ClientSecret" (string): oauth2 client secret,
- "oauth2Server" (string): oauth2 server,
- with protocol and
- without trailing slash
+ "oauth2Server" (string): oauth2 server,
+ with protocol and
+ without trailing slash,
+ null or missing if oauth2 shouldn't be used
},
"repoStore" (object, optional): { configure the repo store
"maxFileSize" (long, optional): maximum size of a file, inclusive
diff --git a/services/git-bridge/conf/envsubst_template.json b/services/git-bridge/conf/envsubst_template.json
index 1f52ffbaef..4ede5bab7f 100644
--- a/services/git-bridge/conf/envsubst_template.json
+++ b/services/git-bridge/conf/envsubst_template.json
@@ -3,14 +3,11 @@
"bindIp": "${GIT_BRIDGE_BIND_IP:-0.0.0.0}",
"idleTimeout": ${GIT_BRIDGE_IDLE_TIMEOUT:-30000},
"rootGitDirectory": "${GIT_BRIDGE_ROOT_DIR:-/tmp/wlgb}",
+ "allowedCorsOrigins": "${GIT_BRIDGE_ALLOWED_CORS_ORIGINS:-https://localhost}",
"apiBaseUrl": "${GIT_BRIDGE_API_BASE_URL:-https://localhost/api/v0}",
"postbackBaseUrl": "${GIT_BRIDGE_POSTBACK_BASE_URL:-https://localhost}",
"serviceName": "${GIT_BRIDGE_SERVICE_NAME:-Overleaf}",
- "oauth2": {
- "oauth2ClientID": "${GIT_BRIDGE_OAUTH2_CLIENT_ID}",
- "oauth2ClientSecret": "${GIT_BRIDGE_OAUTH2_CLIENT_SECRET}",
- "oauth2Server": "${GIT_BRIDGE_OAUTH2_SERVER:-https://localhost}"
- },
+ "oauth2Server": "${GIT_BRIDGE_OAUTH2_SERVER:-https://localhost}",
"userPasswordEnabled": ${GIT_BRIDGE_USER_PASSWORD_ENABLED:-false},
"repoStore": {
"maxFileNum": ${GIT_BRIDGE_REPOSTORE_MAX_FILE_NUM:-2000},
diff --git a/services/git-bridge/conf/example_config.json b/services/git-bridge/conf/example_config.json
index bfad73f461..76b82eb6a0 100644
--- a/services/git-bridge/conf/example_config.json
+++ b/services/git-bridge/conf/example_config.json
@@ -3,14 +3,11 @@
"bindIp": "127.0.0.1",
"idleTimeout": 30000,
"rootGitDirectory": "/tmp/wlgb",
+ "allowedCorsOrigins": "https://localhost",
"apiBaseUrl": "https://localhost/api/v0",
"postbackBaseUrl": "https://localhost",
"serviceName": "Overleaf",
- "oauth2": {
- "oauth2ClientID": "asdf",
- "oauth2ClientSecret": "asdf",
- "oauth2Server": "https://localhost"
- },
+ "oauth2Server": "https://localhost",
"repoStore": {
"maxFileNum": 2000,
"maxFileSize": 52428800
diff --git a/services/git-bridge/conf/local.json b/services/git-bridge/conf/local.json
index 03ce4febe4..c4de48d819 100644
--- a/services/git-bridge/conf/local.json
+++ b/services/git-bridge/conf/local.json
@@ -3,14 +3,11 @@
"bindIp": "0.0.0.0",
"idleTimeout": 30000,
"rootGitDirectory": "/tmp/wlgb",
+ "allowedCorsOrigins": "http://v2.overleaf.test",
"apiBaseUrl": "http://v2.overleaf.test:3000/api/v0",
"postbackBaseUrl": "http://git-bridge:8000",
"serviceName": "Overleaf",
- "oauth2": {
- "oauth2ClientID": "264c723c925c13590880751f861f13084934030c13b4452901e73bdfab226edc",
- "oauth2ClientSecret": "e6b2e9eee7ae2bb653823250bb69594a91db0547fe3790a7135acb497108e62d",
- "oauth2Server": "http://v2.overleaf.test:3000"
- },
+ "oauth2Server": "http://v2.overleaf.test:3000",
"repoStore": {
"maxFileNum": 2000,
"maxFileSize": 52428800
diff --git a/services/git-bridge/pom.xml b/services/git-bridge/pom.xml
index 809676d769..3feb4dd860 100644
--- a/services/git-bridge/pom.xml
+++ b/services/git-bridge/pom.xml
@@ -16,24 +16,24 @@
2.23
4.13.2
2.8.4
- 9.4.51.v20230217
+ 9.4.57.v20241219
2.9.0
- 2.12.3
- 6.6.1.202309021850-r
+ 3.0.2
+ 6.10.1.202505221210-r
3.41.2.2
2.9.9
- 1.34.1
+ 1.37.0
1.23.0
- 3.12.0
- 1.2.3
+ 3.17.0
+ 1.2.13
5.12.0
5.12.0
- 1.11.274
+ 1.12.780
${jaxb.runtime.version}
2.3.2
4.5.14
- 2.10.0
- 1.24.0
+ 2.18.0
+ 1.27.1
0.10.0
1.70
@@ -206,7 +206,7 @@
com.amazonaws
- aws-java-sdk
+ aws-java-sdk-s3
${aws.java.sdk.version}
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Config.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Config.java
index cf36916600..d5b530100e 100644
--- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Config.java
+++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Config.java
@@ -26,10 +26,11 @@ public class Config implements JSONSource {
config.bindIp,
config.idleTimeout,
config.rootGitDirectory,
+ config.allowedCorsOrigins,
config.apiBaseURL,
config.postbackURL,
config.serviceName,
- Oauth2.asSanitised(config.oauth2),
+ config.oauth2Server,
config.userPasswordEnabled,
config.repoStore,
SwapStoreConfig.sanitisedCopy(config.swapStore),
@@ -41,10 +42,11 @@ public class Config implements JSONSource {
private String bindIp;
private int idleTimeout;
private String rootGitDirectory;
+ private String[] allowedCorsOrigins;
private String apiBaseURL;
private String postbackURL;
private String serviceName;
- @Nullable private Oauth2 oauth2;
+ @Nullable private String oauth2Server;
private boolean userPasswordEnabled;
@Nullable private RepoStoreConfig repoStore;
@Nullable private SwapStoreConfig swapStore;
@@ -64,10 +66,11 @@ public class Config implements JSONSource {
String bindIp,
int idleTimeout,
String rootGitDirectory,
+ String[] allowedCorsOrigins,
String apiBaseURL,
String postbackURL,
String serviceName,
- Oauth2 oauth2,
+ String oauth2Server,
boolean userPasswordEnabled,
RepoStoreConfig repoStore,
SwapStoreConfig swapStore,
@@ -77,10 +80,11 @@ public class Config implements JSONSource {
this.bindIp = bindIp;
this.idleTimeout = idleTimeout;
this.rootGitDirectory = rootGitDirectory;
+ this.allowedCorsOrigins = allowedCorsOrigins;
this.apiBaseURL = apiBaseURL;
this.postbackURL = postbackURL;
this.serviceName = serviceName;
- this.oauth2 = oauth2;
+ this.oauth2Server = oauth2Server;
this.userPasswordEnabled = userPasswordEnabled;
this.repoStore = repoStore;
this.swapStore = swapStore;
@@ -101,11 +105,18 @@ public class Config implements JSONSource {
}
this.apiBaseURL = apiBaseURL;
serviceName = getElement(configObject, "serviceName").getAsString();
+ final String rawAllowedCorsOrigins =
+ getOptionalString(configObject, "allowedCorsOrigins").trim();
+ if (rawAllowedCorsOrigins.isEmpty()) {
+ allowedCorsOrigins = new String[] {};
+ } else {
+ allowedCorsOrigins = rawAllowedCorsOrigins.split(",");
+ }
postbackURL = getElement(configObject, "postbackBaseUrl").getAsString();
if (!postbackURL.endsWith("/")) {
postbackURL += "/";
}
- oauth2 = new Gson().fromJson(configObject.get("oauth2"), Oauth2.class);
+ oauth2Server = getOptionalString(configObject, "oauth2Server");
userPasswordEnabled = getOptionalString(configObject, "userPasswordEnabled").equals("true");
repoStore = new Gson().fromJson(configObject.get("repoStore"), RepoStoreConfig.class);
swapStore = new Gson().fromJson(configObject.get("swapStore"), SwapStoreConfig.class);
@@ -139,6 +150,10 @@ public class Config implements JSONSource {
return this.sqliteHeapLimitBytes;
}
+ public String[] getAllowedCorsOrigins() {
+ return allowedCorsOrigins;
+ }
+
public String getAPIBaseURL() {
return apiBaseURL;
}
@@ -151,19 +166,12 @@ public class Config implements JSONSource {
return postbackURL;
}
- public boolean isUsingOauth2() {
- return oauth2 != null;
- }
-
public boolean isUserPasswordEnabled() {
return userPasswordEnabled;
}
- public Oauth2 getOauth2() {
- if (!isUsingOauth2()) {
- throw new AssertionError("Getting oauth2 when not using it");
- }
- return oauth2;
+ public String getOauth2Server() {
+ return oauth2Server;
}
public Optional getRepoStore() {
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Oauth2.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Oauth2.java
deleted file mode 100644
index 1db7d3b4d2..0000000000
--- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/config/Oauth2.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package uk.ac.ic.wlgitbridge.application.config;
-
-/*
- * Created by winston on 25/10/15.
- */
-public class Oauth2 {
-
- private final String oauth2ClientID;
- private final String oauth2ClientSecret;
- private final String oauth2Server;
-
- public Oauth2(String oauth2ClientID, String oauth2ClientSecret, String oauth2Server) {
- this.oauth2ClientID = oauth2ClientID;
- this.oauth2ClientSecret = oauth2ClientSecret;
- this.oauth2Server = oauth2Server;
- }
-
- public String getOauth2ClientID() {
- return oauth2ClientID;
- }
-
- public String getOauth2ClientSecret() {
- return oauth2ClientSecret;
- }
-
- public String getOauth2Server() {
- return oauth2Server;
- }
-
- public static Oauth2 asSanitised(Oauth2 oauth2) {
- return new Oauth2("", "", oauth2.oauth2Server);
- }
-}
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java
new file mode 100644
index 0000000000..10d978c352
--- /dev/null
+++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java
@@ -0,0 +1,47 @@
+package uk.ac.ic.wlgitbridge.server;
+
+import java.io.IOException;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import uk.ac.ic.wlgitbridge.util.Log;
+
+public class CORSHandler extends AbstractHandler {
+ private final Set allowedCorsOrigins;
+
+ public CORSHandler(String[] allowedCorsOrigins) {
+ this.allowedCorsOrigins = Set.of(allowedCorsOrigins);
+ }
+
+ @Override
+ public void handle(
+ String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+ throws IOException {
+
+ String origin = request.getHeader("Origin");
+ if (origin == null) {
+ return; // Not a CORS request
+ }
+
+ final boolean ok = allowedCorsOrigins.contains(origin);
+ if (ok) {
+ response.setHeader("Access-Control-Allow-Origin", origin);
+ response.setHeader("Access-Control-Allow-Credentials", "true");
+ response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, PUT, POST, DELETE");
+ response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
+ response.setHeader("Access-Control-Max-Age", "86400"); // cache for 24h
+ }
+ String method = baseRequest.getMethod();
+ if ("OPTIONS".equals(method)) {
+ Log.debug("OPTIONS <- {}", target);
+ baseRequest.setHandled(true);
+ if (ok) {
+ response.setStatus(200);
+ } else {
+ response.setStatus(403);
+ }
+ }
+ }
+}
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java
index 30c5039212..57d1b34a7b 100644
--- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java
+++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java
@@ -110,6 +110,7 @@ public class GitBridgeServer {
this.jettyServer.addConnector(connector);
HandlerCollection handlers = new HandlerList();
+ handlers.addHandler(new CORSHandler(config.getAllowedCorsOrigins()));
handlers.addHandler(initApiHandler());
handlers.addHandler(initBaseHandler());
handlers.addHandler(initGitHandler(config, repoStore, snapshotApi));
@@ -150,9 +151,9 @@ public class GitBridgeServer {
throws ServletException {
final ServletContextHandler servletContextHandler =
new ServletContextHandler(ServletContextHandler.SESSIONS);
- if (config.isUsingOauth2()) {
+ if (config.getOauth2Server() != null) {
Filter filter =
- new Oauth2Filter(snapshotApi, config.getOauth2(), config.isUserPasswordEnabled());
+ new Oauth2Filter(snapshotApi, config.getOauth2Server(), config.isUserPasswordEnabled());
servletContextHandler.addFilter(
new FilterHolder(filter), "/*", EnumSet.of(DispatcherType.REQUEST));
}
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java
index 5bd3904e47..586a21ab3f 100644
--- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java
+++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java
@@ -13,7 +13,6 @@ import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.binary.Base64;
-import uk.ac.ic.wlgitbridge.application.config.Oauth2;
import uk.ac.ic.wlgitbridge.bridge.snapshot.SnapshotApi;
import uk.ac.ic.wlgitbridge.util.Instance;
import uk.ac.ic.wlgitbridge.util.Log;
@@ -28,13 +27,13 @@ public class Oauth2Filter implements Filter {
private final SnapshotApi snapshotApi;
- private final Oauth2 oauth2;
+ private final String oauth2Server;
private final boolean isUserPasswordEnabled;
- public Oauth2Filter(SnapshotApi snapshotApi, Oauth2 oauth2, boolean isUserPasswordEnabled) {
+ public Oauth2Filter(SnapshotApi snapshotApi, String oauth2Server, boolean isUserPasswordEnabled) {
this.snapshotApi = snapshotApi;
- this.oauth2 = oauth2;
+ this.oauth2Server = oauth2Server;
this.isUserPasswordEnabled = isUserPasswordEnabled;
}
@@ -108,7 +107,7 @@ public class Oauth2Filter implements Filter {
// fail later (for example, in the unlikely event that the token
// expired between the two requests). In that case, JGit will
// return a 401 without a custom error message.
- int statusCode = checkAccessToken(oauth2, password, getClientIp(request));
+ int statusCode = checkAccessToken(this.oauth2Server, password, getClientIp(request));
if (statusCode == 429) {
handleRateLimit(projectId, username, request, response);
return;
@@ -238,10 +237,9 @@ public class Oauth2Filter implements Filter {
"your Overleaf Account Settings."));
}
- private int checkAccessToken(Oauth2 oauth2, String accessToken, String clientIp)
+ private int checkAccessToken(String oauth2Server, String accessToken, String clientIp)
throws IOException {
- GenericUrl url =
- new GenericUrl(oauth2.getOauth2Server() + "/oauth/token/info?client_ip=" + clientIp);
+ GenericUrl url = new GenericUrl(oauth2Server + "/oauth/token/info?client_ip=" + clientIp);
HttpRequest request = Instance.httpRequestFactory.buildGetRequest(url);
HttpHeaders headers = new HttpHeaders();
headers.setAuthorization("Bearer " + accessToken);
diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Tar.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Tar.java
index 878adde27d..512babf9c7 100644
--- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Tar.java
+++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/util/Tar.java
@@ -5,6 +5,7 @@ import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
@@ -147,7 +148,7 @@ public class Tar {
throws IOException {
Preconditions.checkArgument(dir.isDirectory());
String name = base.relativize(Paths.get(dir.getAbsolutePath())).toString();
- ArchiveEntry entry = tout.createArchiveEntry(dir, name);
+ TarArchiveEntry entry = tout.createArchiveEntry(dir, name);
tout.putArchiveEntry(entry);
tout.closeArchiveEntry();
for (File f : dir.listFiles()) {
@@ -160,7 +161,7 @@ public class Tar {
Preconditions.checkArgument(file.isFile(), "given file" + " is not file: %s", file);
checkFileSize(file.length());
String name = base.relativize(Paths.get(file.getAbsolutePath())).toString();
- ArchiveEntry entry = tout.createArchiveEntry(file, name);
+ TarArchiveEntry entry = tout.createArchiveEntry(file, name);
tout.putArchiveEntry(entry);
try (InputStream in = new FileInputStream(file)) {
IOUtils.copy(in, tout);
diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java
index e250798652..f706d98edf 100644
--- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java
+++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/WLGitBridgeIntegrationTest.java
@@ -465,8 +465,12 @@ public class WLGitBridgeIntegrationTest {
@After
public void tearDown() {
- server.stop();
- wlgb.stop();
+ if (server != null) {
+ server.stop();
+ }
+ if (wlgb != null) {
+ wlgb.stop();
+ }
}
private void gitConfig(File dir) throws IOException, InterruptedException {
@@ -1391,6 +1395,80 @@ public class WLGitBridgeIntegrationTest {
assertTrue(f.exists());
}
+ @Test
+ public void noCors() throws IOException, ExecutionException, InterruptedException {
+
+ int gitBridgePort = 33893;
+ int mockServerPort = 3893;
+
+ server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
+ server.start();
+ server.setState(states.get("canServePushedFiles").get("state"));
+
+ wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+ wlgb.run();
+
+ String url = "http://127.0.0.1:" + gitBridgePort + "/status";
+ Response response = asyncHttpClient().prepareGet(url).execute().get();
+ assertEquals(200, response.getStatusCode());
+ assertEquals("ok\n", response.getResponseBody());
+ assertNull(response.getHeader("Access-Control-Allow-Origin"));
+ }
+
+ @Test
+ public void cors() throws IOException, ExecutionException, InterruptedException {
+
+ int gitBridgePort = 33894;
+ int mockServerPort = 3894;
+
+ server = new MockSnapshotServer(mockServerPort, getResource("/canServePushedFiles").toFile());
+ server.start();
+ server.setState(states.get("canServePushedFiles").get("state"));
+
+ wlgb = new GitBridgeApp(new String[] {makeConfigFile(gitBridgePort, mockServerPort)});
+ wlgb.run();
+
+ String url = "http://127.0.0.1:" + gitBridgePort + "/status";
+
+ // Success
+ Response response =
+ asyncHttpClient()
+ .prepareOptions(url)
+ .setHeader("Origin", "https://localhost")
+ .execute()
+ .get();
+ assertEquals(200, response.getStatusCode());
+ assertEquals("", response.getResponseBody());
+ assertEquals("https://localhost", response.getHeader("Access-Control-Allow-Origin"));
+
+ response =
+ asyncHttpClient().prepareGet(url).setHeader("Origin", "https://localhost").execute().get();
+ assertEquals(200, response.getStatusCode());
+ assertEquals("ok\n", response.getResponseBody());
+ assertEquals("https://localhost", response.getHeader("Access-Control-Allow-Origin"));
+
+ // Deny
+ response =
+ asyncHttpClient()
+ .prepareOptions(url)
+ .setHeader("Origin", "https://not-localhost")
+ .execute()
+ .get();
+ assertEquals(403, response.getStatusCode());
+ assertEquals("", response.getResponseBody());
+ assertNull(response.getHeader("Access-Control-Allow-Origin"));
+
+ response =
+ asyncHttpClient()
+ .prepareGet(url)
+ .setHeader("Origin", "https://not-localhost")
+ .execute()
+ .get();
+ assertEquals(200, response.getStatusCode());
+ assertEquals("ok\n", response.getResponseBody());
+ assertNull(response.getHeader("Access-Control-Allow-Origin"));
+ }
+
private String makeConfigFile(int port, int apiPort) throws IOException {
return makeConfigFile(port, apiPort, null);
}
@@ -1409,6 +1487,7 @@ public class WLGitBridgeIntegrationTest {
+ " \"rootGitDirectory\": \""
+ wlgb.getAbsolutePath()
+ "\",\n"
+ + " \"allowedCorsOrigins\": \"https://localhost\",\n"
+ " \"apiBaseUrl\": \"http://127.0.0.1:"
+ apiPort
+ "/api/v0\",\n"
@@ -1416,13 +1495,9 @@ public class WLGitBridgeIntegrationTest {
+ port
+ "\",\n"
+ " \"serviceName\": \"Overleaf\",\n"
- + " \"oauth2\": {\n"
- + " \"oauth2ClientID\": \"clientID\",\n"
- + " \"oauth2ClientSecret\": \"oauth2 client secret\",\n"
- + " \"oauth2Server\": \"http://127.0.0.1:"
+ + " \"oauth2Server\": \"http://127.0.0.1:"
+ apiPort
- + "\"\n"
- + " }";
+ + "\"";
if (swapCfg != null) {
cfgStr +=
",\n"
@@ -1445,7 +1520,6 @@ public class WLGitBridgeIntegrationTest {
+ ",\n"
+ " \"intervalMillis\": "
+ swapCfg.getIntervalMillis()
- + "\n"
+ " }\n";
}
cfgStr += "}\n";
diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/config/ConfigTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/config/ConfigTest.java
index ddafc621d6..8c102dbda3 100644
--- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/config/ConfigTest.java
+++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/application/config/ConfigTest.java
@@ -23,11 +23,7 @@ public class ConfigTest {
+ " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n"
+ " \"postbackBaseUrl\": \"http://127.0.0.1\",\n"
+ " \"serviceName\": \"Overleaf\",\n"
- + " \"oauth2\": {\n"
- + " \"oauth2ClientID\": \"clientID\",\n"
- + " \"oauth2ClientSecret\": \"oauth2 client secret\",\n"
- + " \"oauth2Server\": \"https://www.overleaf.com\"\n"
- + " }\n"
+ + " \"oauth2Server\": \"https://www.overleaf.com\"\n"
+ "}\n");
Config config = new Config(reader);
assertEquals(80, config.getPort());
@@ -35,10 +31,7 @@ public class ConfigTest {
assertEquals("http://127.0.0.1:60000/api/v0/", config.getAPIBaseURL());
assertEquals("http://127.0.0.1/", config.getPostbackURL());
assertEquals("Overleaf", config.getServiceName());
- assertTrue(config.isUsingOauth2());
- assertEquals("clientID", config.getOauth2().getOauth2ClientID());
- assertEquals("oauth2 client secret", config.getOauth2().getOauth2ClientSecret());
- assertEquals("https://www.overleaf.com", config.getOauth2().getOauth2Server());
+ assertEquals("https://www.overleaf.com", config.getOauth2Server());
}
@Test(expected = AssertionError.class)
@@ -53,7 +46,7 @@ public class ConfigTest {
+ " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n"
+ " \"postbackBaseUrl\": \"http://127.0.0.1\",\n"
+ " \"serviceName\": \"Overleaf\",\n"
- + " \"oauth2\": null\n"
+ + " \"oauth2Server\": null\n"
+ "}\n");
Config config = new Config(reader);
assertEquals(80, config.getPort());
@@ -61,8 +54,7 @@ public class ConfigTest {
assertEquals("http://127.0.0.1:60000/api/v0/", config.getAPIBaseURL());
assertEquals("http://127.0.0.1/", config.getPostbackURL());
assertEquals("Overleaf", config.getServiceName());
- assertFalse(config.isUsingOauth2());
- config.getOauth2();
+ assertNull(config.getOauth2Server());
}
@Test
@@ -77,11 +69,7 @@ public class ConfigTest {
+ " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n"
+ " \"postbackBaseUrl\": \"http://127.0.0.1\",\n"
+ " \"serviceName\": \"Overleaf\",\n"
- + " \"oauth2\": {\n"
- + " \"oauth2ClientID\": \"my oauth2 client id\",\n"
- + " \"oauth2ClientSecret\": \"my oauth2 client secret\",\n"
- + " \"oauth2Server\": \"https://www.overleaf.com\"\n"
- + " }\n"
+ + " \"oauth2Server\": \"https://www.overleaf.com\"\n"
+ "}\n");
Config config = new Config(reader);
String expected =
@@ -90,14 +78,11 @@ public class ConfigTest {
+ " \"bindIp\": \"127.0.0.1\",\n"
+ " \"idleTimeout\": 30000,\n"
+ " \"rootGitDirectory\": \"/var/wlgb/git\",\n"
+ + " \"allowedCorsOrigins\": [],\n"
+ " \"apiBaseURL\": \"http://127.0.0.1:60000/api/v0/\",\n"
+ " \"postbackURL\": \"http://127.0.0.1/\",\n"
+ " \"serviceName\": \"Overleaf\",\n"
- + " \"oauth2\": {\n"
- + " \"oauth2ClientID\": \"\",\n"
- + " \"oauth2ClientSecret\": \"\",\n"
- + " \"oauth2Server\": \"https://www.overleaf.com\"\n"
- + " },\n"
+ + " \"oauth2Server\": \"https://www.overleaf.com\",\n"
+ " \"userPasswordEnabled\": false,\n"
+ " \"repoStore\": null,\n"
+ " \"swapStore\": null,\n"
diff --git a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/BridgeTest.java b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/BridgeTest.java
index f749dea357..e27c3488c0 100644
--- a/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/BridgeTest.java
+++ b/services/git-bridge/src/test/java/uk/ac/ic/wlgitbridge/bridge/BridgeTest.java
@@ -50,7 +50,7 @@ public class BridgeTest {
gcJob = mock(GcJob.class);
bridge =
new Bridge(
- new Config(0, "", 0, "", "", "", "", null, false, null, null, null, 0),
+ new Config(0, "", 0, "", null, "", "", "", null, false, null, null, null, 0),
lock,
repoStore,
dbStore,
diff --git a/services/git-bridge/vendor/envsubst b/services/git-bridge/vendor/envsubst
deleted file mode 100755
index f7ad8081d0..0000000000
Binary files a/services/git-bridge/vendor/envsubst and /dev/null differ
diff --git a/services/history-v1/.gitignore b/services/history-v1/.gitignore
deleted file mode 100644
index edb0f85350..0000000000
--- a/services/history-v1/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-
-# managed by monorepo$ bin/update_build_scripts
-.npmrc
diff --git a/services/history-v1/.nvmrc b/services/history-v1/.nvmrc
index 123b052798..fc37597bcc 100644
--- a/services/history-v1/.nvmrc
+++ b/services/history-v1/.nvmrc
@@ -1 +1 @@
-18.20.2
+22.17.0
diff --git a/services/history-v1/Dockerfile b/services/history-v1/Dockerfile
index cf6d0b3aaf..322ab67ff8 100644
--- a/services/history-v1/Dockerfile
+++ b/services/history-v1/Dockerfile
@@ -2,9 +2,11 @@
# Instead run bin/update_build_scripts from
# https://github.com/overleaf/internal/
-FROM node:18.20.2 AS base
+FROM node:22.17.0 AS base
WORKDIR /overleaf/services/history-v1
+COPY services/history-v1/install_deps.sh /overleaf/services/history-v1/
+RUN chmod 0755 ./install_deps.sh && ./install_deps.sh
# Google Cloud Storage needs a writable $HOME/.config for resumable uploads
# (see https://googleapis.dev/nodejs/storage/latest/File.html#createWriteStream)
diff --git a/services/history-v1/Makefile b/services/history-v1/Makefile
index 6ba72740b0..7e62ba1812 100644
--- a/services/history-v1/Makefile
+++ b/services/history-v1/Makefile
@@ -32,12 +32,30 @@ 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:18.20.2 npm run --silent
+RUN_LINTING = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(HERE) node:22.17.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:18.20.2 npm run --silent
+RUN_LINTING_MONOREPO = docker run --rm -v $(MONOREPO):$(MONOREPO) -w $(MONOREPO) node:22.17.0 npm run --silent
+
+SHELLCHECK_OPTS = \
+ --shell=bash \
+ --external-sources
+SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
+SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
+
+shellcheck:
+ @$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
+ koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
+
+shellcheck_fix:
+ @$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
+ diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
+ if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
+ elif [ -n "$$diff" ]; then echo "$$file"; \
+ else echo "\033[2m$$file\033[0m"; fi \
+ done
format:
$(RUN_LINTING) format
@@ -63,7 +81,7 @@ typecheck:
typecheck_ci:
$(RUN_LINTING_CI) types:check
-test: format lint typecheck test_unit test_acceptance
+test: format lint typecheck shellcheck test_unit test_acceptance
test_unit:
ifneq (,$(wildcard test/unit))
@@ -98,13 +116,6 @@ test_acceptance_clean:
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) down -v -t 0
test_acceptance_pre_run:
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) up -d mongo
- $(DOCKER_COMPOSE_TEST_ACCEPTANCE) exec -T mongo sh -c ' \
- while ! mongosh --eval "db.version()" > /dev/null; do \
- echo "Waiting for Mongo..."; \
- sleep 1; \
- done; \
- mongosh --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"mongo:27017\" } ] })"'
ifneq (,$(wildcard test/acceptance/js/scripts/pre-run))
$(DOCKER_COMPOSE_TEST_ACCEPTANCE) run --rm test_acceptance test/acceptance/js/scripts/pre-run
endif
@@ -137,6 +148,7 @@ publish:
lint lint_fix \
build_types typecheck \
lint_ci format_ci typecheck_ci \
+ shellcheck shellcheck_fix \
test test_clean test_unit test_unit_clean \
test_acceptance test_acceptance_debug test_acceptance_pre_run \
test_acceptance_run test_acceptance_run_debug test_acceptance_clean \
diff --git a/services/history-v1/api/app/rollout.js b/services/history-v1/api/app/rollout.js
new file mode 100644
index 0000000000..24ca0409f8
--- /dev/null
+++ b/services/history-v1/api/app/rollout.js
@@ -0,0 +1,76 @@
+const crypto = require('node:crypto')
+
+class Rollout {
+ constructor(config) {
+ // The history buffer level is used to determine whether to queue changes
+ // in Redis or persist them directly to the chunk store.
+ // If defaults to 0 (no queuing) if not set.
+ this.historyBufferLevel = config.has('historyBufferLevel')
+ ? parseInt(config.get('historyBufferLevel'), 10)
+ : 0
+ // The forcePersistBuffer flag will ensure the buffer is fully persisted before
+ // any persist operation. Set this to true if you want to make the persisted-version
+ // in Redis match the endVersion of the latest chunk. This should be set to true
+ // when downgrading from a history buffer level that queues changes in Redis
+ // without persisting them immediately.
+ this.forcePersistBuffer = config.has('forcePersistBuffer')
+ ? config.get('forcePersistBuffer') === 'true'
+ : false
+
+ // Support gradual rollout of the next history buffer level
+ // with a percentage of projects using it.
+ this.nextHistoryBufferLevel = config.has('nextHistoryBufferLevel')
+ ? parseInt(config.get('nextHistoryBufferLevel'), 10)
+ : null
+ this.nextHistoryBufferLevelRolloutPercentage = config.has(
+ 'nextHistoryBufferLevelRolloutPercentage'
+ )
+ ? parseInt(config.get('nextHistoryBufferLevelRolloutPercentage'), 10)
+ : 0
+ }
+
+ report(logger) {
+ logger.info(
+ {
+ historyBufferLevel: this.historyBufferLevel,
+ forcePersistBuffer: this.forcePersistBuffer,
+ nextHistoryBufferLevel: this.nextHistoryBufferLevel,
+ nextHistoryBufferLevelRolloutPercentage:
+ this.nextHistoryBufferLevelRolloutPercentage,
+ },
+ this.historyBufferLevel > 0 || this.forcePersistBuffer
+ ? 'using history buffer'
+ : 'history buffer disabled'
+ )
+ }
+
+ /**
+ * Get the history buffer level for a project.
+ * @param {string} projectId
+ * @returns {Object} - An object containing the history buffer level and force persist buffer flag.
+ * @property {number} historyBufferLevel - The history buffer level to use for processing changes.
+ * @property {boolean} forcePersistBuffer - If true, forces the buffer to be persisted before any operation.
+ */
+ getHistoryBufferLevelOptions(projectId) {
+ if (
+ this.nextHistoryBufferLevel > this.historyBufferLevel &&
+ this.nextHistoryBufferLevelRolloutPercentage > 0
+ ) {
+ const hash = crypto.createHash('sha1').update(projectId).digest('hex')
+ const percentage = parseInt(hash.slice(0, 8), 16) % 100
+ // If the project is in the rollout percentage, we use the next history buffer level.
+ if (percentage < this.nextHistoryBufferLevelRolloutPercentage) {
+ return {
+ historyBufferLevel: this.nextHistoryBufferLevel,
+ forcePersistBuffer: this.forcePersistBuffer,
+ }
+ }
+ }
+ return {
+ historyBufferLevel: this.historyBufferLevel,
+ forcePersistBuffer: this.forcePersistBuffer,
+ }
+ }
+}
+
+module.exports = Rollout
diff --git a/services/history-v1/api/app/security.js b/services/history-v1/api/app/security.js
index c82c3d2683..08d6f030dc 100644
--- a/services/history-v1/api/app/security.js
+++ b/services/history-v1/api/app/security.js
@@ -105,6 +105,8 @@ function handleJWTAuth(req, authOrSecDef, scopesOrApiKey, next) {
next()
}
+exports.hasValidBasicAuthCredentials = hasValidBasicAuthCredentials
+
/**
* Verify and decode the given JSON Web Token
*/
diff --git a/services/history-v1/api/controllers/project_import.js b/services/history-v1/api/controllers/project_import.js
index ec4aa317b0..02fb793c87 100644
--- a/services/history-v1/api/controllers/project_import.js
+++ b/services/history-v1/api/controllers/project_import.js
@@ -1,6 +1,10 @@
+// @ts-check
+
'use strict'
-const BPromise = require('bluebird')
+const config = require('config')
+const { expressify } = require('@overleaf/promise-utils')
+
const HTTPStatus = require('http-status')
const core = require('overleaf-editor-core')
@@ -18,11 +22,18 @@ const BatchBlobStore = storage.BatchBlobStore
const BlobStore = storage.BlobStore
const chunkStore = storage.chunkStore
const HashCheckBlobStore = storage.HashCheckBlobStore
-const persistChanges = storage.persistChanges
+const commitChanges = storage.commitChanges
+const persistBuffer = storage.persistBuffer
+const InvalidChangeError = storage.InvalidChangeError
const render = require('./render')
+const Rollout = require('../app/rollout')
+const redisBackend = require('../../storage/lib/chunk_store/redis')
-exports.importSnapshot = function importSnapshot(req, res, next) {
+const rollout = new Rollout(config)
+rollout.report(logger) // display the rollout configuration in the logs
+
+async function importSnapshot(req, res) {
const projectId = req.swagger.params.project_id.value
const rawSnapshot = req.swagger.params.snapshot.value
@@ -31,24 +42,26 @@ exports.importSnapshot = function importSnapshot(req, res, next) {
try {
snapshot = Snapshot.fromRaw(rawSnapshot)
} catch (err) {
+ logger.warn({ err, projectId }, 'failed to import snapshot')
return render.unprocessableEntity(res)
}
- return chunkStore
- .initializeProject(projectId, snapshot)
- .then(function (projectId) {
- res.status(HTTPStatus.OK).json({ projectId })
- })
- .catch(err => {
- if (err instanceof chunkStore.AlreadyInitialized) {
- render.conflict(res)
- } else {
- next(err)
- }
- })
+ let historyId
+ try {
+ historyId = await chunkStore.initializeProject(projectId, snapshot)
+ } catch (err) {
+ if (err instanceof chunkStore.AlreadyInitialized) {
+ logger.warn({ err, projectId }, 'already initialized')
+ return render.conflict(res)
+ } else {
+ throw err
+ }
+ }
+
+ res.status(HTTPStatus.OK).json({ projectId: historyId })
}
-exports.importChanges = function importChanges(req, res, next) {
+async function importChanges(req, res, next) {
const projectId = req.swagger.params.project_id.value
const rawChanges = req.swagger.params.changes.value
const endVersion = req.swagger.params.end_version.value
@@ -59,7 +72,7 @@ exports.importChanges = function importChanges(req, res, next) {
try {
changes = rawChanges.map(Change.fromRaw)
} catch (err) {
- logger.error(err)
+ logger.warn({ err, projectId }, 'failed to parse changes')
return render.unprocessableEntity(res)
}
@@ -76,65 +89,102 @@ exports.importChanges = function importChanges(req, res, next) {
const batchBlobStore = new BatchBlobStore(blobStore)
const hashCheckBlobStore = new HashCheckBlobStore(blobStore)
- function loadFiles() {
+ async function loadFiles() {
const blobHashes = new Set()
- changes.forEach(function findBlobHashesToPreload(change) {
+ for (const change of changes) {
+ // This populates the set blobHashes with blobs referred to in the change
change.findBlobHashes(blobHashes)
- })
-
- function lazyLoadChangeFiles(change) {
- return change.loadFiles('lazy', batchBlobStore)
}
- return batchBlobStore
- .preload(Array.from(blobHashes))
- .then(function lazyLoadChangeFilesWithBatching() {
- return BPromise.each(changes, lazyLoadChangeFiles)
- })
+ await batchBlobStore.preload(Array.from(blobHashes))
+
+ for (const change of changes) {
+ await change.loadFiles('lazy', batchBlobStore)
+ }
}
- function buildResultSnapshot(resultChunk) {
- return BPromise.resolve(
- resultChunk || chunkStore.loadLatest(projectId)
- ).then(function (chunk) {
- const snapshot = chunk.getSnapshot()
- snapshot.applyAll(chunk.getChanges())
- return snapshot.store(hashCheckBlobStore)
- })
+ async function buildResultSnapshot(resultChunk) {
+ const chunk =
+ resultChunk ||
+ (await chunkStore.loadLatest(projectId, { persistedOnly: true }))
+ const snapshot = chunk.getSnapshot()
+ snapshot.applyAll(chunk.getChanges())
+ const rawSnapshot = await snapshot.store(hashCheckBlobStore)
+ return rawSnapshot
}
- return loadFiles()
- .then(function () {
- return persistChanges(projectId, changes, limits, endVersion)
+ await loadFiles()
+
+ let result
+ try {
+ const { historyBufferLevel, forcePersistBuffer } =
+ rollout.getHistoryBufferLevelOptions(projectId)
+ result = await commitChanges(projectId, changes, limits, endVersion, {
+ historyBufferLevel,
+ forcePersistBuffer,
})
- .then(function (result) {
- if (returnSnapshot === 'none') {
- res.status(HTTPStatus.CREATED).json({})
- } else {
- return buildResultSnapshot(result && result.currentChunk).then(
- function (rawSnapshot) {
- res.status(HTTPStatus.CREATED).json(rawSnapshot)
- }
- )
- }
- })
- .catch(err => {
- if (
- err instanceof Chunk.ConflictingEndVersion ||
- err instanceof TextOperation.UnprocessableError ||
- err instanceof File.NotEditableError ||
- err instanceof FileMap.PathnameError ||
- err instanceof Snapshot.EditMissingFileError ||
- err instanceof chunkStore.ChunkVersionConflictError
- ) {
- // If we failed to apply operations, that's probably because they were
- // invalid.
- logger.error(err)
- render.unprocessableEntity(res)
- } else if (err instanceof Chunk.NotFoundError) {
- render.notFound(res)
- } else {
- next(err)
- }
+ } catch (err) {
+ if (
+ err instanceof Chunk.ConflictingEndVersion ||
+ err instanceof TextOperation.UnprocessableError ||
+ err instanceof File.NotEditableError ||
+ err instanceof FileMap.PathnameError ||
+ err instanceof Snapshot.EditMissingFileError ||
+ err instanceof chunkStore.ChunkVersionConflictError ||
+ err instanceof InvalidChangeError
+ ) {
+ // If we failed to apply operations, that's probably because they were
+ // invalid.
+ logger.warn({ err, projectId, endVersion }, 'changes rejected by history')
+ return render.unprocessableEntity(res)
+ } else if (err instanceof Chunk.NotFoundError) {
+ logger.warn({ err, projectId }, 'chunk not found')
+ return render.notFound(res)
+ } else {
+ throw err
+ }
+ }
+
+ if (returnSnapshot === 'none') {
+ res.status(HTTPStatus.CREATED).json({
+ resyncNeeded: result.resyncNeeded,
})
+ } else {
+ const rawSnapshot = await buildResultSnapshot(result && result.currentChunk)
+ res.status(HTTPStatus.CREATED).json(rawSnapshot)
+ }
}
+
+async function flushChanges(req, res, next) {
+ const projectId = req.swagger.params.project_id.value
+ // Use the same limits importChanges, since these are passed to persistChanges
+ const farFuture = new Date()
+ farFuture.setTime(farFuture.getTime() + 7 * 24 * 3600 * 1000)
+ const limits = {
+ maxChanges: 0,
+ minChangeTimestamp: farFuture,
+ maxChangeTimestamp: farFuture,
+ autoResync: true,
+ }
+ try {
+ await persistBuffer(projectId, limits)
+ res.status(HTTPStatus.OK).end()
+ } catch (err) {
+ if (err instanceof Chunk.NotFoundError) {
+ render.notFound(res)
+ } else {
+ throw err
+ }
+ }
+}
+
+async function expireProject(req, res, next) {
+ const projectId = req.swagger.params.project_id.value
+ await redisBackend.expireProject(projectId)
+ res.status(HTTPStatus.OK).end()
+}
+
+exports.importSnapshot = expressify(importSnapshot)
+exports.importChanges = expressify(importChanges)
+exports.flushChanges = expressify(flushChanges)
+exports.expireProject = expressify(expireProject)
diff --git a/services/history-v1/api/controllers/projects.js b/services/history-v1/api/controllers/projects.js
index 3e00035d39..b7f07c4834 100644
--- a/services/history-v1/api/controllers/projects.js
+++ b/services/history-v1/api/controllers/projects.js
@@ -1,12 +1,13 @@
'use strict'
const _ = require('lodash')
-const Path = require('path')
-const Stream = require('stream')
+const Path = require('node:path')
+const Stream = require('node:stream')
const HTTPStatus = require('http-status')
-const fs = require('fs')
-const { promisify } = require('util')
+const fs = require('node:fs')
+const { promisify } = require('node:util')
const config = require('config')
+const OError = require('@overleaf/o-error')
const logger = require('@overleaf/logger')
const { Chunk, ChunkResponse, Blob } = require('overleaf-editor-core')
@@ -14,6 +15,7 @@ const {
BlobStore,
blobHash,
chunkStore,
+ redisBuffer,
HashCheckBlobStore,
ProjectArchive,
zipStore,
@@ -33,6 +35,7 @@ async function initializeProject(req, res, next) {
res.status(HTTPStatus.OK).json({ projectId })
} catch (err) {
if (err instanceof chunkStore.AlreadyInitialized) {
+ logger.warn({ err, projectId }, 'failed to initialize')
render.conflict(res)
} else {
throw err
@@ -85,6 +88,26 @@ async function getLatestHistory(req, res, next) {
}
}
+async function getLatestHistoryRaw(req, res, next) {
+ const projectId = req.swagger.params.project_id.value
+ const readOnly = req.swagger.params.readOnly.value
+ try {
+ const { startVersion, endVersion, endTimestamp } =
+ await chunkStore.getLatestChunkMetadata(projectId, { readOnly })
+ res.json({
+ startVersion,
+ endVersion,
+ endTimestamp,
+ })
+ } catch (err) {
+ if (err instanceof Chunk.NotFoundError) {
+ render.notFound(res)
+ } else {
+ throw err
+ }
+ }
+}
+
async function getHistory(req, res, next) {
const projectId = req.swagger.params.project_id.value
const version = req.swagger.params.version.value
@@ -117,6 +140,43 @@ async function getHistoryBefore(req, res, next) {
}
}
+/**
+ * Get all changes since the beginning of history or since a given version
+ */
+async function getChanges(req, res, next) {
+ const projectId = req.swagger.params.project_id.value
+ const since = req.swagger.params.since.value ?? 0
+
+ if (since < 0) {
+ // Negative values would cause an infinite loop
+ return res.status(400).json({
+ error: `Version out of bounds: ${since}`,
+ })
+ }
+
+ let chunk
+ try {
+ chunk = await chunkStore.loadAtVersion(projectId, since, {
+ preferNewer: true,
+ })
+ } catch (err) {
+ if (err instanceof Chunk.VersionNotFoundError) {
+ return res.status(400).json({
+ error: `Version out of bounds: ${since}`,
+ })
+ }
+ throw err
+ }
+
+ const latestChunkMetadata = await chunkStore.getLatestChunkMetadata(projectId)
+
+ // Extract the relevant changes from the chunk that contains the start version
+ const changes = chunk.getChanges().slice(since - chunk.getStartVersion())
+ const hasMore = latestChunkMetadata.endVersion > chunk.getEndVersion()
+
+ res.json({ changes: changes.map(change => change.toRaw()), hasMore })
+}
+
async function getZip(req, res, next) {
const projectId = req.swagger.params.project_id.value
const version = req.swagger.params.version.value
@@ -167,7 +227,9 @@ async function createZip(req, res, next) {
async function deleteProject(req, res, next) {
const projectId = req.swagger.params.project_id.value
const blobStore = new BlobStore(projectId)
+
await Promise.all([
+ redisBuffer.hardDeleteProject(projectId),
chunkStore.deleteProjectChunks(projectId),
blobStore.deleteBlobs(),
])
@@ -184,44 +246,127 @@ async function createProjectBlob(req, res, next) {
const sizeLimit = new StreamSizeLimit(maxUploadSize)
await pipeline(req, sizeLimit, fs.createWriteStream(tmpPath))
if (sizeLimit.sizeLimitExceeded) {
+ logger.warn(
+ { projectId, expectedHash, maxUploadSize },
+ 'blob exceeds size threshold'
+ )
return render.requestEntityTooLarge(res)
}
const hash = await blobHash.fromFile(tmpPath)
if (hash !== expectedHash) {
- logger.debug({ hash, expectedHash }, 'Hash mismatch')
+ logger.warn({ projectId, hash, expectedHash }, 'Hash mismatch')
return render.conflict(res, 'File hash mismatch')
}
const blobStore = new BlobStore(projectId)
- await blobStore.putFile(tmpPath)
+ const newBlob = await blobStore.putFile(tmpPath)
+
+ if (config.has('backupStore')) {
+ try {
+ const { backupBlob } = await import('../../storage/lib/backupBlob.mjs')
+ await backupBlob(projectId, newBlob, tmpPath)
+ } catch (error) {
+ logger.warn({ error, projectId, hash }, 'Failed to backup blob')
+ }
+ }
res.status(HTTPStatus.CREATED).end()
})
}
+async function headProjectBlob(req, res) {
+ const projectId = req.swagger.params.project_id.value
+ const hash = req.swagger.params.hash.value
+
+ const blobStore = new BlobStore(projectId)
+ const blob = await blobStore.getBlob(hash)
+ if (blob) {
+ res.set('Content-Length', blob.getByteLength())
+ res.status(200).end()
+ } else {
+ res.status(404).end()
+ }
+}
+
+// Support simple, singular ranges starting from zero only, up-to 2MB = 2_000_000, 7 digits
+const RANGE_HEADER = /^bytes=0-(\d{1,7})$/
+
+/**
+ * @param {string} header
+ * @return {{}|{start: number, end: number}}
+ * @private
+ */
+function _getRangeOpts(header) {
+ if (!header) return {}
+ const match = header.match(RANGE_HEADER)
+ if (match) {
+ const end = parseInt(match[1], 10)
+ return { start: 0, end }
+ }
+ return {}
+}
+
async function getProjectBlob(req, res, next) {
const projectId = req.swagger.params.project_id.value
const hash = req.swagger.params.hash.value
+ const opts = _getRangeOpts(req.swagger.params.range.value || '')
const blobStore = new BlobStore(projectId)
logger.debug({ projectId, hash }, 'getProjectBlob started')
try {
let stream
try {
- stream = await blobStore.getStream(hash)
+ stream = await blobStore.getStream(hash, opts)
} catch (err) {
if (err instanceof Blob.NotFoundError) {
- return render.notFound(res)
+ logger.warn({ projectId, hash }, 'Blob not found')
+ return res.status(404).end()
} else {
throw err
}
}
res.set('Content-Type', 'application/octet-stream')
- await pipeline(stream, res)
+ try {
+ await pipeline(stream, res)
+ } catch (err) {
+ if (err?.code === 'ERR_STREAM_PREMATURE_CLOSE') {
+ res.end()
+ } else {
+ throw OError.tag(err, 'error transferring stream', { projectId, hash })
+ }
+ }
} finally {
logger.debug({ projectId, hash }, 'getProjectBlob finished')
}
}
+async function copyProjectBlob(req, res, next) {
+ const sourceProjectId = req.swagger.params.copyFrom.value
+ const targetProjectId = req.swagger.params.project_id.value
+ const blobHash = req.swagger.params.hash.value
+ // Check that blob exists in source project
+ const sourceBlobStore = new BlobStore(sourceProjectId)
+ const targetBlobStore = new BlobStore(targetProjectId)
+ const [sourceBlob, targetBlob] = await Promise.all([
+ sourceBlobStore.getBlob(blobHash),
+ targetBlobStore.getBlob(blobHash),
+ ])
+ if (!sourceBlob) {
+ logger.warn(
+ { sourceProjectId, targetProjectId, blobHash },
+ 'missing source blob when copying across projects'
+ )
+ return render.notFound(res)
+ }
+ // Exit early if the blob exists in the target project.
+ // This will also catch global blobs, which always exist.
+ if (targetBlob) {
+ return res.status(HTTPStatus.NO_CONTENT).end()
+ }
+ // Otherwise, copy blob from source project to target project
+ await sourceBlobStore.copyBlob(sourceBlob, targetProjectId)
+ res.status(HTTPStatus.CREATED).end()
+}
+
async function getSnapshotAtVersion(projectId, version) {
const chunk = await chunkStore.loadAtVersion(projectId, version)
const snapshot = chunk.getSnapshot()
@@ -240,11 +385,15 @@ module.exports = {
getLatestHashedContent: expressify(getLatestHashedContent),
getLatestPersistedHistory: expressify(getLatestHistory),
getLatestHistory: expressify(getLatestHistory),
+ getLatestHistoryRaw: expressify(getLatestHistoryRaw),
getHistory: expressify(getHistory),
getHistoryBefore: expressify(getHistoryBefore),
+ getChanges: expressify(getChanges),
getZip: expressify(getZip),
createZip: expressify(createZip),
deleteProject: expressify(deleteProject),
createProjectBlob: expressify(createProjectBlob),
getProjectBlob: expressify(getProjectBlob),
+ headProjectBlob: expressify(headProjectBlob),
+ copyProjectBlob: expressify(copyProjectBlob),
}
diff --git a/services/history-v1/api/controllers/stream_size_limit.js b/services/history-v1/api/controllers/stream_size_limit.js
index fbb2ab8030..f3a14959f6 100644
--- a/services/history-v1/api/controllers/stream_size_limit.js
+++ b/services/history-v1/api/controllers/stream_size_limit.js
@@ -1,4 +1,4 @@
-const stream = require('stream')
+const stream = require('node:stream')
/**
* Transform stream that stops passing bytes through after some threshold has
diff --git a/services/history-v1/api/controllers/with_tmp_dir.js b/services/history-v1/api/controllers/with_tmp_dir.js
index ab2279ce17..2e0737ba69 100644
--- a/services/history-v1/api/controllers/with_tmp_dir.js
+++ b/services/history-v1/api/controllers/with_tmp_dir.js
@@ -1,15 +1,15 @@
-const fs = require('fs')
+const fs = require('node:fs')
const fsExtra = require('fs-extra')
const logger = require('@overleaf/logger')
-const os = require('os')
-const path = require('path')
+const os = require('node:os')
+const path = require('node:path')
/**
* Create a temporary directory before executing a function and cleaning up
* after.
*
* @param {string} prefix - prefix for the temporary directory name
- * @param {Function} fn - async function to call
+ * @param {(tmpDir: string) => Promise} fn - async function to call
*/
async function withTmpDir(prefix, fn) {
const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), prefix))
diff --git a/services/history-v1/api/swagger/index.js b/services/history-v1/api/swagger/index.js
index edfb68f4e4..3702c6ec07 100644
--- a/services/history-v1/api/swagger/index.js
+++ b/services/history-v1/api/swagger/index.js
@@ -84,6 +84,19 @@ module.exports = {
},
},
},
+ ChunkResponseRaw: {
+ properties: {
+ startVersion: {
+ type: 'number',
+ },
+ endVersion: {
+ type: 'number',
+ },
+ endTimestamp: {
+ type: 'string',
+ },
+ },
+ },
History: {
properties: {
snapshot: {
diff --git a/services/history-v1/api/swagger/project_import.js b/services/history-v1/api/swagger/project_import.js
index 60eb47fce4..043dc70667 100644
--- a/services/history-v1/api/swagger/project_import.js
+++ b/services/history-v1/api/swagger/project_import.js
@@ -100,9 +100,120 @@ const importChanges = {
],
}
+const getChanges = {
+ 'x-swagger-router-controller': 'projects',
+ operationId: 'getChanges',
+ tags: ['Project'],
+ description: 'Get changes applied to a project',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'project id',
+ required: true,
+ type: 'string',
+ },
+ {
+ name: 'since',
+ in: 'query',
+ description: 'start version',
+ required: false,
+ type: 'number',
+ },
+ ],
+ responses: {
+ 200: {
+ description: 'Success',
+ schema: {
+ type: 'array',
+ items: {
+ $ref: '#/definitions/Change',
+ },
+ },
+ },
+ },
+ security: [
+ {
+ basic: [],
+ },
+ ],
+}
+
+const flushChanges = {
+ 'x-swagger-router-controller': 'project_import',
+ operationId: 'flushChanges',
+ tags: ['ProjectImport'],
+ description: 'Flush project changes from buffer to the chunk store.',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'project id',
+ required: true,
+ type: 'string',
+ },
+ ],
+ responses: {
+ 200: {
+ description: 'Success',
+ schema: {
+ $ref: '#/definitions/Project',
+ },
+ },
+ 404: {
+ description: 'Not Found',
+ schema: {
+ $ref: '#/definitions/Error',
+ },
+ },
+ },
+ security: [
+ {
+ basic: [],
+ },
+ ],
+}
+
+const expireProject = {
+ 'x-swagger-router-controller': 'project_import',
+ operationId: 'expireProject',
+ tags: ['ProjectImport'],
+ description: 'Expire project changes from buffer.',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'project id',
+ required: true,
+ type: 'string',
+ },
+ ],
+ responses: {
+ 200: {
+ description: 'Success',
+ schema: {
+ $ref: '#/definitions/Project',
+ },
+ },
+ 404: {
+ description: 'Not Found',
+ schema: {
+ $ref: '#/definitions/Error',
+ },
+ },
+ },
+ security: [
+ {
+ basic: [],
+ },
+ ],
+}
+
exports.paths = {
'/projects/{project_id}/import': { post: importSnapshot },
'/projects/{project_id}/legacy_import': { post: importSnapshot },
- '/projects/{project_id}/changes': { post: importChanges },
+ '/projects/{project_id}/changes': { get: getChanges, post: importChanges },
'/projects/{project_id}/legacy_changes': { post: importChanges },
+ '/projects/{project_id}/flush': { post: flushChanges },
+ '/projects/{project_id}/expire': { post: expireProject },
}
diff --git a/services/history-v1/api/swagger/projects.js b/services/history-v1/api/swagger/projects.js
index f4b8ed7352..cd4d2338fa 100644
--- a/services/history-v1/api/swagger/projects.js
+++ b/services/history-v1/api/swagger/projects.js
@@ -9,6 +9,7 @@ exports.paths = {
operationId: 'initializeProject',
tags: ['Project'],
description: 'Initialize project.',
+ consumes: ['application/json'],
parameters: [
{
name: 'body',
@@ -69,6 +70,52 @@ exports.paths = {
operationId: 'getProjectBlob',
tags: ['Project'],
description: 'Fetch blob content by its project id and hash.',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'project id',
+ required: true,
+ type: 'string',
+ },
+ {
+ name: 'hash',
+ in: 'path',
+ description: 'Hexadecimal SHA-1 hash',
+ required: true,
+ type: 'string',
+ pattern: Blob.HEX_HASH_RX_STRING,
+ },
+ {
+ name: 'range',
+ in: 'header',
+ description: 'HTTP Range header',
+ required: false,
+ type: 'string',
+ },
+ ],
+ produces: ['application/octet-stream'],
+ responses: {
+ 200: {
+ description: 'Success',
+ schema: {
+ type: 'file',
+ },
+ },
+ 404: {
+ description: 'Not Found',
+ schema: {
+ $ref: '#/definitions/Error',
+ },
+ },
+ },
+ security: [{ jwt: [] }, { token: [] }],
+ },
+ head: {
+ 'x-swagger-router-controller': 'projects',
+ operationId: 'headProjectBlob',
+ tags: ['Project'],
+ description: 'Fetch blob content-length by its project id and hash.',
parameters: [
{
name: 'project_id',
@@ -133,6 +180,42 @@ exports.paths = {
},
},
},
+ post: {
+ 'x-swagger-router-controller': 'projects',
+ operationId: 'copyProjectBlob',
+ tags: ['Project'],
+ description:
+ 'Copies a blob from a source project to a target project when duplicating a project',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'target project id',
+ required: true,
+ type: 'string',
+ },
+ {
+ name: 'hash',
+ in: 'path',
+ description: 'Hexadecimal SHA-1 hash',
+ required: true,
+ type: 'string',
+ pattern: Blob.HEX_HASH_RX_STRING,
+ },
+ {
+ name: 'copyFrom',
+ in: 'query',
+ description: 'source project id',
+ required: true,
+ type: 'string',
+ },
+ ],
+ responses: {
+ 201: {
+ description: 'Created',
+ },
+ },
+ },
},
'/projects/{project_id}/latest/content': {
get: {
@@ -238,6 +321,44 @@ exports.paths = {
},
},
},
+ '/projects/{project_id}/latest/history/raw': {
+ get: {
+ 'x-swagger-router-controller': 'projects',
+ operationId: 'getLatestHistoryRaw',
+ tags: ['Project'],
+ description: 'Get the metadata of latest sequence of changes.',
+ parameters: [
+ {
+ name: 'project_id',
+ in: 'path',
+ description: 'project id',
+ required: true,
+ type: 'string',
+ },
+ {
+ name: 'readOnly',
+ in: 'query',
+ description: 'use read only database connection',
+ required: false,
+ type: 'boolean',
+ },
+ ],
+ responses: {
+ 200: {
+ description: 'Success',
+ schema: {
+ $ref: '#/definitions/ChunkResponseRaw',
+ },
+ },
+ 404: {
+ description: 'Not Found',
+ schema: {
+ $ref: '#/definitions/Error',
+ },
+ },
+ },
+ },
+ },
'/projects/{project_id}/latest/persistedHistory': {
get: {
'x-swagger-router-controller': 'projects',
diff --git a/services/history-v1/app.js b/services/history-v1/app.js
index a10d69eba6..dd991c1a6d 100644
--- a/services/history-v1/app.js
+++ b/services/history-v1/app.js
@@ -6,7 +6,7 @@
require('@overleaf/metrics/initialize')
const config = require('config')
-const Events = require('events')
+const Events = require('node:events')
const BPromise = require('bluebird')
const express = require('express')
const helmet = require('helmet')
@@ -19,7 +19,7 @@ const swaggerDoc = require('./api/swagger')
const security = require('./api/app/security')
const healthChecks = require('./api/controllers/health_checks')
const { mongodb, loadGlobalBlobs } = require('./storage')
-const path = require('path')
+const path = require('node:path')
Events.setMaxListeners(20)
const app = express()
@@ -84,26 +84,29 @@ function setupErrorHandling() {
// Handle Swagger errors.
app.use(function (err, req, res, next) {
+ const projectId = req.swagger?.params?.project_id?.value
if (res.headersSent) {
return next(err)
}
if (err.code === 'SCHEMA_VALIDATION_FAILED') {
- logger.error(err)
+ logger.error({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json(err.results)
}
if (err.code === 'INVALID_TYPE' || err.code === 'PATTERN') {
- logger.error(err)
+ logger.error({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
message: 'invalid type: ' + err.paramName,
})
}
if (err.code === 'ENUM_MISMATCH') {
+ logger.warn({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
message: 'invalid enum value: ' + err.paramName,
})
}
if (err.code === 'REQUIRED') {
+ logger.warn({ err, projectId }, err.message)
return res.status(HTTPStatus.UNPROCESSABLE_ENTITY).json({
message: err.message,
})
@@ -112,7 +115,8 @@ function setupErrorHandling() {
})
app.use(function (err, req, res, next) {
- logger.error(err)
+ const projectId = req.swagger?.params?.project_id?.value
+ logger.error({ err, projectId }, err.message)
if (res.headersSent) {
return next(err)
diff --git a/services/history-v1/backup-deletion-app.mjs b/services/history-v1/backup-deletion-app.mjs
new file mode 100644
index 0000000000..81b2b5b8b9
--- /dev/null
+++ b/services/history-v1/backup-deletion-app.mjs
@@ -0,0 +1,81 @@
+// @ts-check
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+import http from 'node:http'
+import { fileURLToPath } from 'node:url'
+import { promisify } from 'node:util'
+import express from 'express'
+import logger from '@overleaf/logger'
+import Metrics from '@overleaf/metrics'
+import { hasValidBasicAuthCredentials } from './api/app/security.js'
+import {
+ deleteProjectBackupCb,
+ healthCheck,
+ healthCheckCb,
+ NotReadyToDelete,
+} from './storage/lib/backupDeletion.mjs'
+import { mongodb } from './storage/index.js'
+
+const app = express()
+
+logger.initialize('history-v1-backup-deletion')
+Metrics.open_sockets.monitor()
+Metrics.injectMetricsRoute(app)
+app.use(Metrics.http.monitor(logger))
+Metrics.leaked_sockets.monitor(logger)
+Metrics.event_loop.monitor(logger)
+Metrics.memory.monitor(logger)
+
+function basicAuth(req, res, next) {
+ if (hasValidBasicAuthCredentials(req)) return next()
+ res.setHeader('WWW-Authenticate', 'Basic realm="Application"')
+ res.sendStatus(401)
+}
+
+app.delete('/project/:projectId/backup', basicAuth, (req, res, next) => {
+ deleteProjectBackupCb(req.params.projectId, err => {
+ if (err) {
+ return next(err)
+ }
+ res.sendStatus(204)
+ })
+})
+
+app.get('/status', (req, res) => {
+ res.send('history-v1-backup-deletion is up')
+})
+
+app.get('/health_check', (req, res, next) => {
+ healthCheckCb(err => {
+ if (err) return next(err)
+ res.sendStatus(200)
+ })
+})
+
+app.use((err, req, res, next) => {
+ req.logger.addFields({ err })
+ if (err instanceof NotReadyToDelete) {
+ req.logger.setLevel('warn')
+ return res.status(422).send(err.message)
+ }
+ req.logger.setLevel('error')
+ next(err)
+})
+
+/**
+ * @param {number} port
+ * @return {Promise}
+ */
+export async function startApp(port) {
+ await mongodb.client.connect()
+ await healthCheck()
+ const server = http.createServer(app)
+ await promisify(server.listen.bind(server, port))()
+ return server
+}
+
+// Run this if we're called directly
+if (process.argv[1] === fileURLToPath(import.meta.url)) {
+ const PORT = parseInt(process.env.PORT || '3101', 10)
+ await startApp(PORT)
+}
diff --git a/services/history-v1/backup-verifier-app.mjs b/services/history-v1/backup-verifier-app.mjs
new file mode 100644
index 0000000000..856a15dd53
--- /dev/null
+++ b/services/history-v1/backup-verifier-app.mjs
@@ -0,0 +1,117 @@
+// @ts-check
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+import http from 'node:http'
+import { fileURLToPath } from 'node:url'
+import { promisify } from 'node:util'
+import { setTimeout } from 'node:timers/promises'
+import express from 'express'
+import logger from '@overleaf/logger'
+import Metrics from '@overleaf/metrics'
+import { healthCheck } from './backupVerifier/healthCheck.mjs'
+import {
+ BackupCorruptedError,
+ verifyBlob,
+} from './storage/lib/backupVerifier.mjs'
+import { mongodb } from './storage/index.js'
+import { expressify } from '@overleaf/promise-utils'
+import { Blob } from 'overleaf-editor-core'
+import { loadGlobalBlobs } from './storage/lib/blob_store/index.js'
+import { EventEmitter } from 'node:events'
+import {
+ loopRandomProjects,
+ setWriteMetrics,
+} from './backupVerifier/ProjectVerifier.mjs'
+
+const app = express()
+
+logger.initialize('history-v1-backup-verifier')
+Metrics.open_sockets.monitor()
+Metrics.injectMetricsRoute(app)
+app.use(Metrics.http.monitor(logger))
+Metrics.leaked_sockets.monitor(logger)
+Metrics.event_loop.monitor(logger)
+Metrics.memory.monitor(logger)
+
+app.get(
+ '/history/:historyId/blob/:hash/verify',
+ expressify(async (req, res) => {
+ const { historyId, hash } = req.params
+ try {
+ await verifyBlob(historyId, hash)
+ res.sendStatus(200)
+ } catch (err) {
+ logger.warn({ err, historyId, hash }, 'manual verify blob failed')
+ if (err instanceof Blob.NotFoundError) {
+ res.status(404).send(err.message)
+ } else if (err instanceof BackupCorruptedError) {
+ res.status(422).send(err.message)
+ } else {
+ throw err
+ }
+ }
+ })
+)
+
+app.get('/status', (req, res) => {
+ res.send('history-v1-backup-verifier is up')
+})
+
+app.get(
+ '/health_check',
+ expressify(async (req, res) => {
+ await healthCheck()
+ res.sendStatus(200)
+ })
+)
+
+app.use((err, req, res, next) => {
+ req.logger.addFields({ err })
+ req.logger.setLevel('error')
+ next(err)
+})
+
+const shutdownEmitter = new EventEmitter()
+
+shutdownEmitter.once('shutdown', async code => {
+ logger.info({ code }, 'shutting down')
+ await mongodb.client.close()
+ await setTimeout(100)
+ process.exit(code)
+})
+
+process.on('SIGTERM', () => {
+ shutdownEmitter.emit('shutdown', 0)
+})
+
+process.on('SIGINT', () => {
+ shutdownEmitter.emit('shutdown', 0)
+})
+
+/**
+ * @param {number} port
+ * @param {boolean} enableVerificationLoop
+ * @return {Promise}
+ */
+export async function startApp(port, enableVerificationLoop = true) {
+ await mongodb.client.connect()
+ await loadGlobalBlobs()
+ await healthCheck()
+ const server = http.createServer(app)
+ await promisify(server.listen.bind(server, port))()
+ enableVerificationLoop && loopRandomProjects(shutdownEmitter)
+ return server
+}
+
+setWriteMetrics(true)
+
+// Run this if we're called directly
+if (process.argv[1] === fileURLToPath(import.meta.url)) {
+ const PORT = parseInt(process.env.PORT || '3102', 10)
+ try {
+ await startApp(PORT)
+ } catch (error) {
+ shutdownEmitter.emit('shutdown', 1)
+ logger.error({ error }, 'error starting app')
+ }
+}
diff --git a/services/history-v1/backup-worker-app.mjs b/services/history-v1/backup-worker-app.mjs
new file mode 100644
index 0000000000..b21e55aafe
--- /dev/null
+++ b/services/history-v1/backup-worker-app.mjs
@@ -0,0 +1,70 @@
+// @ts-check
+// Metrics must be initialized before importing anything else
+import '@overleaf/metrics/initialize.js'
+import http from 'node:http'
+import { fileURLToPath } from 'node:url'
+import { promisify } from 'node:util'
+import express from 'express'
+import logger from '@overleaf/logger'
+import Metrics from '@overleaf/metrics'
+import { expressify } from '@overleaf/promise-utils'
+import { drainQueue, healthCheck } from './storage/scripts/backup_worker.mjs'
+const app = express()
+
+logger.initialize('history-v1-backup-worker')
+Metrics.open_sockets.monitor()
+Metrics.injectMetricsRoute(app)
+app.use(Metrics.http.monitor(logger))
+Metrics.leaked_sockets.monitor(logger)
+Metrics.event_loop.monitor(logger)
+Metrics.memory.monitor(logger)
+
+app.get('/status', (req, res) => {
+ res.send('history-v1-backup-worker is up')
+})
+
+app.get(
+ '/health_check',
+ expressify(async (req, res) => {
+ await healthCheck()
+ res.sendStatus(200)
+ })
+)
+
+app.use((err, req, res, next) => {
+ req.logger.addFields({ err })
+ req.logger.setLevel('error')
+ next(err)
+})
+
+async function triggerGracefulShutdown(server, signal) {
+ logger.info({ signal }, 'graceful shutdown: started shutdown sequence')
+ await drainQueue()
+ server.close(function () {
+ logger.info({ signal }, 'graceful shutdown: closed server')
+ setTimeout(() => {
+ process.exit(0)
+ }, 1000)
+ })
+}
+
+/**
+ * @param {number} port
+ * @return {Promise}
+ */
+export async function startApp(port) {
+ await healthCheck()
+ const server = http.createServer(app)
+ await promisify(server.listen.bind(server, port))()
+ const signals = ['SIGINT', 'SIGTERM']
+ signals.forEach(signal => {
+ process.on(signal, () => triggerGracefulShutdown(server, signal))
+ })
+ return server
+}
+
+// Run this if we're called directly
+if (process.argv[1] === fileURLToPath(import.meta.url)) {
+ const PORT = parseInt(process.env.PORT || '3103', 10)
+ await startApp(PORT)
+}
diff --git a/services/history-v1/backupVerifier/ProjectMetrics.mjs b/services/history-v1/backupVerifier/ProjectMetrics.mjs
new file mode 100644
index 0000000000..ff37085787
--- /dev/null
+++ b/services/history-v1/backupVerifier/ProjectMetrics.mjs
@@ -0,0 +1,33 @@
+import Metrics from '@overleaf/metrics'
+import { objectIdFromDate } from './utils.mjs'
+import { db } from '../storage/lib/mongodb.js'
+
+const projectsCollection = db.collection('projects')
+
+/**
+ *
+ * @param {Date} beforeTime
+ * @return {Promise}
+ */
+export async function measurePendingChangesBeforeTime(beforeTime) {
+ const pendingChangeCount = await projectsCollection.countDocuments({
+ 'overleaf.backup.pendingChangeAt': {
+ $lt: beforeTime,
+ },
+ })
+
+ Metrics.gauge('backup_verification_pending_changes', pendingChangeCount)
+}
+
+/**
+ *
+ * @param {Date} graceTime
+ * @return {Promise}
+ */
+export async function measureNeverBackedUpProjects(graceTime) {
+ const neverBackedUpCount = await projectsCollection.countDocuments({
+ 'overleaf.backup.lastBackedUpVersion': null,
+ _id: { $lt: objectIdFromDate(graceTime) },
+ })
+ Metrics.gauge('backup_verification_never_backed_up', neverBackedUpCount)
+}
diff --git a/services/history-v1/backupVerifier/ProjectSampler.mjs b/services/history-v1/backupVerifier/ProjectSampler.mjs
new file mode 100644
index 0000000000..93d9a1a31f
--- /dev/null
+++ b/services/history-v1/backupVerifier/ProjectSampler.mjs
@@ -0,0 +1,79 @@
+// @ts-check
+import { objectIdFromDate } from './utils.mjs'
+import { db } from '../storage/lib/mongodb.js'
+import config from 'config'
+
+const projectsCollection = db.collection('projects')
+
+const HAS_PROJECTS_WITHOUT_HISTORY =
+ config.get('hasProjectsWithoutHistory') === 'true'
+
+/**
+ * @param {Date} start
+ * @param {Date} end
+ * @param {number} N
+ * @yields {string}
+ */
+export async function* getProjectsCreatedInDateRangeCursor(start, end, N) {
+ yield* getSampleProjectsCursor(N, [
+ {
+ $match: {
+ _id: {
+ $gt: objectIdFromDate(start),
+ $lte: objectIdFromDate(end),
+ },
+ },
+ },
+ ])
+}
+
+export async function* getProjectsUpdatedInDateRangeCursor(start, end, N) {
+ yield* getSampleProjectsCursor(N, [
+ {
+ $match: {
+ 'overleaf.history.updatedAt': {
+ $gt: start,
+ $lte: end,
+ },
+ },
+ },
+ ])
+}
+
+/**
+ * @typedef {import('mongodb').Document} Document
+ */
+
+/**
+ *
+ * @generator
+ * @param {number} N
+ * @param {Array} preSampleAggregationStages
+ * @yields {string}
+ */
+export async function* getSampleProjectsCursor(
+ N,
+ preSampleAggregationStages = []
+) {
+ const cursor = projectsCollection.aggregate([
+ ...preSampleAggregationStages,
+ { $sample: { size: N } },
+ { $project: { 'overleaf.history.id': 1 } },
+ ])
+
+ let validProjects = 0
+ let hasInvalidProject = false
+
+ for await (const project of cursor) {
+ if (HAS_PROJECTS_WITHOUT_HISTORY && !project.overleaf?.history?.id) {
+ hasInvalidProject = true
+ continue
+ }
+ validProjects++
+ yield project.overleaf.history.id.toString()
+ }
+
+ if (validProjects === 0 && hasInvalidProject) {
+ yield* getSampleProjectsCursor(N, preSampleAggregationStages)
+ }
+}
diff --git a/services/history-v1/backupVerifier/ProjectVerifier.mjs b/services/history-v1/backupVerifier/ProjectVerifier.mjs
new file mode 100644
index 0000000000..1e4086b700
--- /dev/null
+++ b/services/history-v1/backupVerifier/ProjectVerifier.mjs
@@ -0,0 +1,320 @@
+// @ts-check
+import { verifyProjectWithErrorContext } from '../storage/lib/backupVerifier.mjs'
+import { promiseMapSettledWithLimit } from '@overleaf/promise-utils'
+import logger from '@overleaf/logger'
+import metrics from '@overleaf/metrics'
+import {
+ getSampleProjectsCursor,
+ getProjectsCreatedInDateRangeCursor,
+ getProjectsUpdatedInDateRangeCursor,
+} from './ProjectSampler.mjs'
+import OError from '@overleaf/o-error'
+import { setTimeout } from 'node:timers/promises'
+
+const MS_PER_30_DAYS = 30 * 24 * 60 * 60 * 1000
+
+const failureCounter = new metrics.prom.Counter({
+ name: 'backup_project_verification_failed',
+ help: 'Number of projects that failed verification',
+ labelNames: ['name'],
+})
+
+const successCounter = new metrics.prom.Counter({
+ name: 'backup_project_verification_succeeded',
+ help: 'Number of projects that succeeded verification',
+})
+
+let WRITE_METRICS = false
+
+/**
+ * @typedef {import('node:events').EventEmitter} EventEmitter
+ */
+
+/**
+ * Allows writing metrics to be enabled or disabled.
+ * @param {Boolean} writeMetrics
+ */
+export function setWriteMetrics(writeMetrics) {
+ WRITE_METRICS = writeMetrics
+}
+
+/**
+ *
+ * @param {Error|unknown} error
+ * @param {string} historyId
+ */
+function handleVerificationError(error, historyId) {
+ const name = error instanceof Error ? error.name : 'UnknownError'
+ logger.error({ historyId, error, name }, 'error verifying project backup')
+
+ WRITE_METRICS && failureCounter.inc({ name })
+
+ return name
+}
+
+/**
+ *
+ * @param {Date} startDate
+ * @param {Date} endDate
+ * @param {number} interval
+ * @returns {Array}
+ */
+function splitJobs(startDate, endDate, interval) {
+ /** @type {Array} */
+ const jobs = []
+ while (startDate < endDate) {
+ const nextStart = new Date(
+ Math.min(startDate.getTime() + interval, endDate.getTime())
+ )
+ jobs.push({ startDate, endDate: nextStart })
+ startDate = nextStart
+ }
+ return jobs
+}
+
+/**
+ *
+ * @param {AsyncGenerator} historyIdCursor
+ * @param {EventEmitter} [eventEmitter]
+ * @param {number} [delay] - Allows a delay between each verification
+ * @return {Promise<{verified: number, total: number, errorTypes: *[], hasFailure: boolean}>}
+ */
+async function verifyProjectsFromCursor(
+ historyIdCursor,
+ eventEmitter,
+ delay = 0
+) {
+ const errorTypes = []
+ let verified = 0
+ let total = 0
+ let receivedShutdownSignal = false
+ if (eventEmitter) {
+ eventEmitter.once('shutdown', () => {
+ receivedShutdownSignal = true
+ })
+ }
+ for await (const historyId of historyIdCursor) {
+ if (receivedShutdownSignal) {
+ break
+ }
+ total++
+ try {
+ await verifyProjectWithErrorContext(historyId)
+ logger.debug({ historyId }, 'verified project backup successfully')
+ WRITE_METRICS && successCounter.inc()
+ verified++
+ } catch (error) {
+ const errorType = handleVerificationError(error, historyId)
+ errorTypes.push(errorType)
+ }
+ if (delay > 0) {
+ await setTimeout(delay)
+ }
+ }
+ return {
+ verified,
+ total,
+ errorTypes,
+ hasFailure: errorTypes.length > 0,
+ }
+}
+
+/**
+ *
+ * @param {number} nProjectsToSample
+ * @param {EventEmitter} [signal]
+ * @param {number} [delay]
+ * @return {Promise}
+ */
+export async function verifyRandomProjectSample(
+ nProjectsToSample,
+ signal,
+ delay = 0
+) {
+ const historyIds = await getSampleProjectsCursor(nProjectsToSample)
+ return await verifyProjectsFromCursor(historyIds, signal, delay)
+}
+
+/**
+ * Samples projects with history IDs between the specified dates and verifies them.
+ *
+ * @param {Date} startDate
+ * @param {Date} endDate
+ * @param {number} projectsPerRange
+ * @param {EventEmitter} [signal]
+ * @return {Promise}
+ */
+async function verifyRange(startDate, endDate, projectsPerRange, signal) {
+ logger.info({ startDate, endDate }, 'verifying range')
+
+ const results = await verifyProjectsFromCursor(
+ getProjectsCreatedInDateRangeCursor(startDate, endDate, projectsPerRange),
+ signal
+ )
+
+ if (results.total === 0) {
+ logger.debug(
+ { start: startDate, end: endDate },
+ 'No projects found in range'
+ )
+ }
+
+ const jobStatus = {
+ ...results,
+ startDate,
+ endDate,
+ }
+
+ logger.debug(
+ { ...jobStatus, errorTypes: Array.from(new Set(jobStatus.errorTypes)) },
+ 'Verified range'
+ )
+ return jobStatus
+}
+
+/**
+ * @typedef {Object} VerificationJobSpecification
+ * @property {Date} startDate
+ * @property {Date} endDate
+ */
+
+/**
+ * @typedef {import('./types.d.ts').VerificationJobStatus} VerificationJobStatus
+ */
+
+/**
+ * @typedef {Object} VerifyDateRangeOptions
+ * @property {Date} startDate
+ * @property {Date} endDate
+ * @property {number} [interval]
+ * @property {number} [projectsPerRange]
+ * @property {number} [concurrency]
+ * @property {EventEmitter} [signal]
+ */
+
+/**
+ *
+ * @param {VerifyDateRangeOptions} options
+ * @return {Promise}
+ */
+export async function verifyProjectsCreatedInDateRange({
+ concurrency = 0,
+ projectsPerRange = 10,
+ startDate,
+ endDate,
+ interval = MS_PER_30_DAYS,
+ signal,
+}) {
+ const jobs = splitJobs(startDate, endDate, interval)
+ if (jobs.length === 0) {
+ throw new OError('Time range could not be split into jobs', {
+ start: startDate,
+ end: endDate,
+ interval,
+ })
+ }
+ const settlements = await promiseMapSettledWithLimit(
+ concurrency,
+ jobs,
+ ({ startDate, endDate }) =>
+ verifyRange(startDate, endDate, projectsPerRange, signal)
+ )
+ return settlements.reduce(
+ /**
+ *
+ * @param {VerificationJobStatus} acc
+ * @param settlement
+ * @return {VerificationJobStatus}
+ */
+ (acc, settlement) => {
+ if (settlement.status !== 'rejected') {
+ if (settlement.value.hasFailure) {
+ acc.hasFailure = true
+ }
+ acc.total += settlement.value.total
+ acc.verified += settlement.value.verified
+ acc.errorTypes = acc.errorTypes.concat(settlement.value.errorTypes)
+ } else {
+ logger.error({ ...settlement.reason }, 'Error processing range')
+ }
+ return acc
+ },
+ /** @type {VerificationJobStatus} */
+ {
+ startDate,
+ endDate,
+ verified: 0,
+ total: 0,
+ hasFailure: false,
+ errorTypes: [],
+ }
+ )
+}
+
+/**
+ * Verifies that projects that have recently gone out of RPO have been updated.
+ *
+ * @param {Date} startDate
+ * @param {Date} endDate
+ * @param {number} nProjects
+ * @param {EventEmitter} [signal]
+ * @return {Promise}
+ */
+export async function verifyProjectsUpdatedInDateRange(
+ startDate,
+ endDate,
+ nProjects,
+ signal
+) {
+ logger.debug(
+ { startDate, endDate, nProjects },
+ 'Sampling projects updated in date range'
+ )
+ const results = await verifyProjectsFromCursor(
+ getProjectsUpdatedInDateRangeCursor(startDate, endDate, nProjects),
+ signal
+ )
+
+ if (results.total === 0) {
+ logger.debug(
+ { start: startDate, end: endDate },
+ 'No projects updated recently'
+ )
+ }
+
+ const jobStatus = {
+ ...results,
+ startDate,
+ endDate,
+ }
+
+ logger.debug(
+ { ...jobStatus, errorTypes: Array.from(new Set(jobStatus.errorTypes)) },
+ 'Verified recently updated projects'
+ )
+ return jobStatus
+}
+
+/**
+ *
+ * @param {EventEmitter} signal
+ * @return {void}
+ */
+export function loopRandomProjects(signal) {
+ let shutdown = false
+ signal.on('shutdown', function () {
+ shutdown = true
+ })
+ async function loop() {
+ do {
+ try {
+ const result = await verifyRandomProjectSample(100, signal, 2_000)
+ logger.debug({ result }, 'verified random project sample')
+ } catch (error) {
+ logger.error({ error }, 'error verifying random project sample')
+ }
+ // eslint-disable-next-line no-unmodified-loop-condition
+ } while (!shutdown)
+ }
+ loop()
+}
diff --git a/services/history-v1/backupVerifier/healthCheck.mjs b/services/history-v1/backupVerifier/healthCheck.mjs
new file mode 100644
index 0000000000..af998748b5
--- /dev/null
+++ b/services/history-v1/backupVerifier/healthCheck.mjs
@@ -0,0 +1,32 @@
+import config from 'config'
+import { verifyProjectWithErrorContext } from '../storage/lib/backupVerifier.mjs'
+import {
+ measureNeverBackedUpProjects,
+ measurePendingChangesBeforeTime,
+} from './ProjectMetrics.mjs'
+import { getEndDateForRPO, RPO } from './utils.mjs'
+
+/** @type {Array} */
+const HEALTH_CHECK_PROJECTS = JSON.parse(config.get('healthCheckProjects'))
+
+export async function healthCheck() {
+ if (!Array.isArray(HEALTH_CHECK_PROJECTS)) {
+ throw new Error('expected healthCheckProjects to be an array')
+ }
+ if (HEALTH_CHECK_PROJECTS.length !== 2) {
+ throw new Error('expected 2 healthCheckProjects')
+ }
+ if (!HEALTH_CHECK_PROJECTS.some(id => id.length === 24)) {
+ throw new Error('expected mongo id in healthCheckProjects')
+ }
+ if (!HEALTH_CHECK_PROJECTS.some(id => id.length < 24)) {
+ throw new Error('expected postgres id in healthCheckProjects')
+ }
+
+ for (const historyId of HEALTH_CHECK_PROJECTS) {
+ await verifyProjectWithErrorContext(historyId)
+ }
+
+ await measurePendingChangesBeforeTime(getEndDateForRPO(2))
+ await measureNeverBackedUpProjects(getEndDateForRPO(2))
+}
diff --git a/services/history-v1/backupVerifier/types.d.ts b/services/history-v1/backupVerifier/types.d.ts
new file mode 100644
index 0000000000..7bfa4a85ff
--- /dev/null
+++ b/services/history-v1/backupVerifier/types.d.ts
@@ -0,0 +1,8 @@
+export type VerificationJobStatus = {
+ verified: number
+ total: number
+ startDate?: Date
+ endDate?: Date
+ hasFailure: boolean
+ errorTypes: Array
+}
diff --git a/services/history-v1/backupVerifier/utils.mjs b/services/history-v1/backupVerifier/utils.mjs
new file mode 100644
index 0000000000..b2d7ed2d3c
--- /dev/null
+++ b/services/history-v1/backupVerifier/utils.mjs
@@ -0,0 +1,35 @@
+import { ObjectId } from 'mongodb'
+import config from 'config'
+
+export const RPO = parseInt(config.get('backupRPOInMS'), 10)
+
+/**
+ * @param {Date} time
+ * @return {ObjectId}
+ */
+export function objectIdFromDate(time) {
+ return ObjectId.createFromTime(time.getTime() / 1000)
+}
+
+/**
+ * @param {number} [factor] - Multiply RPO by this factor, default is 1
+ * @return {Date}
+ */
+export function getEndDateForRPO(factor = 1) {
+ return new Date(Date.now() - RPO * factor)
+}
+
+/**
+ * Creates a startDate, endDate pair that checks a period of time before the RPO horizon
+ *
+ * @param {number} offset - How many seconds we should check
+ * @return {{endDate: Date, startDate: Date}}
+ */
+export function getDatesBeforeRPO(offset) {
+ const now = new Date()
+ const endDate = new Date(now.getTime() - RPO)
+ return {
+ endDate,
+ startDate: new Date(endDate.getTime() - offset * 1000),
+ }
+}
diff --git a/services/history-v1/benchmarks/blob_store.js b/services/history-v1/benchmarks/blob_store.js
index 2efb90ffb2..9efad8747f 100644
--- a/services/history-v1/benchmarks/blob_store.js
+++ b/services/history-v1/benchmarks/blob_store.js
@@ -1,4 +1,4 @@
-const crypto = require('crypto')
+const crypto = require('node:crypto')
const benny = require('benny')
const { Blob } = require('overleaf-editor-core')
const mongoBackend = require('../storage/lib/blob_store/mongo')
diff --git a/services/history-v1/buildscript.txt b/services/history-v1/buildscript.txt
index 04430a155f..4ce8eb63c7 100644
--- a/services/history-v1/buildscript.txt
+++ b/services/history-v1/buildscript.txt
@@ -1,10 +1,10 @@
history-v1
---dependencies=postgres,gcs,mongo
+--dependencies=postgres,gcs,mongo,redis,s3
--docker-repos=us-east1-docker.pkg.dev/overleaf-ops/ol-docker
--env-add=
--env-pass-through=
--esmock-loader=False
---node-version=18.20.2
+--node-version=22.17.0
--public-repo=False
---script-version=4.5.0
---tsconfig-extra-includes=api/**/*,migrations/**/*,storage/**/*
+--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/config/custom-environment-variables.json b/services/history-v1/config/custom-environment-variables.json
index 1822d33aa4..686ca25407 100644
--- a/services/history-v1/config/custom-environment-variables.json
+++ b/services/history-v1/config/custom-environment-variables.json
@@ -1,5 +1,6 @@
{
"databaseUrl": "HISTORY_CONNECTION_STRING",
+ "databaseUrlReadOnly": "HISTORY_FOLLOWER_CONNECTION_STRING",
"herokuDatabaseUrl": "DATABASE_URL",
"databasePoolMin": "DATABASE_POOL_MIN",
"databasePoolMax": "DATABASE_POOL_MAX",
@@ -8,6 +9,8 @@
"s3": {
"key": "AWS_ACCESS_KEY_ID",
"secret": "AWS_SECRET_ACCESS_KEY",
+ "endpoint": "AWS_S3_ENDPOINT",
+ "pathStyle": "AWS_S3_PATH_STYLE",
"maxRetries": "S3_MAX_RETRIES",
"httpOptions": {
"timeout": "S3_TIMEOUT"
@@ -30,6 +33,19 @@
"buckets": "PERSISTOR_BUCKET_MAPPING"
}
},
+ "backupPersistor": {
+ "keyEncryptionKeys": "BACKUP_KEY_ENCRYPTION_KEYS",
+ "s3SSEC": {
+ "key": "AWS_ACCESS_KEY_ID",
+ "secret": "AWS_SECRET_ACCESS_KEY",
+ "endpoint": "AWS_S3_ENDPOINT",
+ "pathStyle": "AWS_S3_PATH_STYLE",
+ "maxRetries": "BACKUP_S3_MAX_RETRIES",
+ "httpOptions": {
+ "timeout": "BACKUP_S3_TIMEOUT"
+ }
+ }
+ },
"blobStore": {
"globalBucket": "OVERLEAF_EDITOR_BLOBS_BUCKET",
"projectBucket": "OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET"
@@ -42,6 +58,16 @@
"bucket": "OVERLEAF_EDITOR_ZIPS_BUCKET",
"zipTimeoutMs": "ZIP_STORE_ZIP_TIMEOUT_MS"
},
+ "backupStore": {
+ "chunksBucket":"BACKUP_OVERLEAF_EDITOR_CHUNKS_BUCKET",
+ "deksBucket":"BACKUP_OVERLEAF_EDITOR_DEKS_BUCKET",
+ "globalBlobsBucket":"BACKUP_OVERLEAF_EDITOR_GLOBAL_BLOBS_BUCKET",
+ "projectBlobsBucket":"BACKUP_OVERLEAF_EDITOR_PROJECT_BLOBS_BUCKET"
+ },
+ "healthCheckBlobs": "HEALTH_CHECK_BLOBS",
+ "healthCheckProjects": "HEALTH_CHECK_PROJECTS",
+ "backupRPOInMS": "BACKUP_RPO_IN_MS",
+ "minSoftDeletionPeriodDays": "MIN_SOFT_DELETION_PERIOD_DAYS",
"mongo": {
"uri": "MONGO_CONNECTION_STRING"
},
@@ -57,5 +83,30 @@
"clusterWorkers": "CLUSTER_WORKERS",
"maxFileUploadSize": "MAX_FILE_UPLOAD_SIZE",
"httpsOnly": "HTTPS_ONLY",
- "httpRequestTimeout": "HTTP_REQUEST_TIMEOUT"
+ "httpRequestTimeout": "HTTP_REQUEST_TIMEOUT",
+ "historyBufferLevel": "HISTORY_BUFFER_LEVEL",
+ "forcePersistBuffer": "FORCE_PERSIST_BUFFER",
+ "nextHistoryBufferLevel": "NEXT_HISTORY_BUFFER_LEVEL",
+ "nextHistoryBufferLevelRolloutPercentage": "NEXT_HISTORY_BUFFER_LEVEL_ROLLOUT_PERCENTAGE",
+ "redis": {
+ "queue": {
+ "host": "QUEUES_REDIS_HOST",
+ "password": "QUEUES_REDIS_PASSWORD",
+ "port": "QUEUES_REDIS_PORT"
+ },
+ "history": {
+ "host": "HISTORY_REDIS_HOST",
+ "password": "HISTORY_REDIS_PASSWORD",
+ "port": "HISTORY_REDIS_PORT"
+ },
+ "lock": {
+ "host": "REDIS_HOST",
+ "password": "REDIS_PASSWORD",
+ "port": "REDIS_PORT"
+ }
+ },
+ "projectHistory": {
+ "host": "PROJECT_HISTORY_HOST",
+ "port": "PROJECT_HISTORY_PORT"
+ }
}
diff --git a/services/history-v1/config/default.json b/services/history-v1/config/default.json
index 84fd220789..e7732fe3f7 100644
--- a/services/history-v1/config/default.json
+++ b/services/history-v1/config/default.json
@@ -13,12 +13,25 @@
"deleteConcurrency": "50"
}
},
+ "backupPersistor": {
+ "backend": "s3SSEC",
+ "s3SSEC": {
+ "maxRetries": "1",
+ "pathStyle": false,
+ "httpOptions": {
+ "timeout": "120000"
+ }
+ }
+ },
+ "backupRPOInMS": "3600000",
"chunkStore": {
"historyStoreConcurrency": "4"
},
"zipStore": {
"zipTimeoutMs": "360000"
},
+ "hasProjectsWithoutHistory": false,
+ "minSoftDeletionPeriodDays": "90",
"maxDeleteKeys": "1000",
"useDeleteObjects": "true",
"clusterWorkers": "1",
@@ -26,5 +39,8 @@
"databasePoolMin": "2",
"databasePoolMax": "10",
"httpsOnly": "false",
- "httpRequestTimeout": "300000"
+ "httpRequestTimeout": "300000",
+ "projectHistory": {
+ "port": "3054"
+ }
}
diff --git a/services/history-v1/config/development.json b/services/history-v1/config/development.json
index f1423290b5..9cd73c62c1 100644
--- a/services/history-v1/config/development.json
+++ b/services/history-v1/config/development.json
@@ -23,6 +23,18 @@
"zipStore": {
"bucket": "overleaf-development-zips"
},
+ "backupStore": {
+ "chunksBucket":"overleaf-development-history-chunks",
+ "deksBucket":"overleaf-development-history-deks",
+ "globalBlobsBucket":"overleaf-development-history-global-blobs",
+ "projectBlobsBucket":"overleaf-development-history-project-blobs"
+ },
+ "backupPersistor": {
+ "keyEncryptionKeys": "[{\"key\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"salt\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]",
+ "s3SSEC": {
+ "ca": "[\"/certs/public.crt\"]"
+ }
+ },
"useDeleteObjects": "false",
"mongo": {
"uri": "mongodb://mongo:27017/sharelatex"
diff --git a/services/history-v1/config/production.json b/services/history-v1/config/production.json
index ffcd4415b0..23f836b1f2 100644
--- a/services/history-v1/config/production.json
+++ b/services/history-v1/config/production.json
@@ -1 +1,5 @@
-{ }
+{
+ "backupPersistor": {
+ "tieringStorageClass": "INTELLIGENT_TIERING"
+ }
+}
diff --git a/services/history-v1/config/test.json b/services/history-v1/config/test.json
index 1e4ddd3a0b..c38e28e564 100644
--- a/services/history-v1/config/test.json
+++ b/services/history-v1/config/test.json
@@ -1,5 +1,6 @@
{
"databaseUrl": "postgres://overleaf:overleaf@postgres/overleaf-history-v1-test",
+ "databaseUrlReadOnly": "postgres://read_only:password@postgres/overleaf-history-v1-test",
"persistor": {
"backend": "gcs",
"gcs": {
@@ -20,6 +21,22 @@
"zipStore": {
"bucket": "overleaf-test-zips"
},
+ "backupStore": {
+ "chunksBucket":"overleaf-test-history-chunks",
+ "deksBucket":"overleaf-test-history-deks",
+ "globalBlobsBucket":"overleaf-test-history-global-blobs",
+ "projectBlobsBucket":"overleaf-test-history-project-blobs"
+ },
+ "backupPersistor": {
+ "keyEncryptionKeys": "[{\"key\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"salt\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]",
+ "s3SSEC": {
+ "ca": "[\"/certs/public.crt\"]"
+ },
+ "tieringStorageClass": "REDUCED_REDUNDANCY"
+ },
+ "healthCheckBlobs": "[\"42/f70d7bba4ae1f07682e0358bd7a2068094fc023b\",\"000000000000000000000042/98d5521fe746bc2d11761edab5d0829bee286009\"]",
+ "healthCheckProjects": "[\"42\",\"000000000000000000000042\"]",
+ "backupRPOInMS": "360000",
"maxDeleteKeys": "3",
"useDeleteObjects": "false",
"mongo": {
diff --git a/services/history-v1/docker-compose.ci.yml b/services/history-v1/docker-compose.ci.yml
index 4de133e440..cf6ec3357d 100644
--- a/services/history-v1/docker-compose.ci.yml
+++ b/services/history-v1/docker-compose.ci.yml
@@ -19,22 +19,44 @@ services:
image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER
environment:
ELASTIC_SEARCH_DSN: es:9200
+ REDIS_HOST: redis
+ QUEUES_REDIS_HOST: redis
+ HISTORY_REDIS_HOST: redis
+ ANALYTICS_QUEUES_REDIS_HOST: redis
MONGO_HOST: mongo
POSTGRES_HOST: postgres
+ AWS_S3_ENDPOINT: https://minio:9000
+ AWS_S3_PATH_STYLE: 'true'
+ AWS_ACCESS_KEY_ID: OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
+ AWS_SECRET_ACCESS_KEY: OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
GCS_API_ENDPOINT: http://gcs:9090
GCS_PROJECT_ID: fake
STORAGE_EMULATOR_HOST: http://gcs:9090/storage/v1
MOCHA_GREP: ${MOCHA_GREP}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
+ volumes:
+ - ./test/acceptance/certs:/certs
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
depends_on:
mongo:
+ condition: service_started
+ redis:
condition: service_healthy
postgres:
condition: service_healthy
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ minio_setup:
+ condition: service_completed_successfully
gcs:
condition: service_healthy
user: node
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run test:acceptance
@@ -45,24 +67,169 @@ services:
- ./:/tmp/build/
command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs .
user: root
- mongo:
- image: mongo:6.0.13
- command: --replSet overleaf
+ redis:
+ image: redis:7.4.3
healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
+ test: ping="$$(redis-cli ping)" && [ "$$ping" = 'PONG' ]
interval: 1s
retries: 20
+
+ mongo:
+ image: mongo:8.0.11
+ command: --replSet overleaf
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
postgres:
image: postgres:10
environment:
POSTGRES_USER: overleaf
POSTGRES_PASSWORD: overleaf
POSTGRES_DB: overleaf-history-v1-test
+ volumes:
+ - ./test/acceptance/pg-init/:/docker-entrypoint-initdb.d/
healthcheck:
test: pg_isready --quiet
interval: 1s
retries: 20
+ certs:
+ image: node:22.17.0
+ volumes:
+ - ./test/acceptance/certs:/certs
+ working_dir: /certs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ if [ ! -f ./certgen ]; then
+ wget -O ./certgen "https://github.com/minio/certgen/releases/download/v1.3.0/certgen-linux-$(dpkg --print-architecture)"
+ chmod +x ./certgen
+ fi
+ if [ ! -f private.key ] || [ ! -f public.crt ]; then
+ ./certgen -host minio
+ fi
+
+ minio:
+ image: minio/minio:RELEASE.2024-10-13T13-34-11Z
+ command: server /data
+ volumes:
+ - ./test/acceptance/certs:/root/.minio/certs
+ environment:
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+
+ minio_setup:
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ image: minio/mc:RELEASE.2024-10-08T09-37-26Z
+ volumes:
+ - ./test/acceptance/certs:/root/.mc/certs/CAs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ sleep 1
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
+ mc mb --ignore-existing s3/overleaf-test-history-chunks
+ mc mb --ignore-existing s3/overleaf-test-history-deks
+ mc mb --ignore-existing s3/overleaf-test-history-global-blobs
+ mc mb --ignore-existing s3/overleaf-test-history-project-blobs
+ mc admin user add s3 \
+ OVERLEAF_HISTORY_S3_ACCESS_KEY_ID \
+ OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
+ echo '
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-chunks"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-chunks/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-deks"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-deks/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-global-blobs"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-global-blobs/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-project-blobs"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-project-blobs/*"
+ }
+ ]
+ }' > policy-history.json
+
+ mc admin policy create s3 overleaf-history policy-history.json
+ mc admin policy attach s3 overleaf-history \
+ --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
gcs:
image: fsouza/fake-gcs-server:1.45.2
command: ["--port=9090", "--scheme=http"]
diff --git a/services/history-v1/docker-compose.yml b/services/history-v1/docker-compose.yml
index f40ab5b940..3a33882d28 100644
--- a/services/history-v1/docker-compose.yml
+++ b/services/history-v1/docker-compose.yml
@@ -6,7 +6,10 @@ version: "2.3"
services:
test_unit:
- image: node:18.20.2
+ build:
+ context: ../..
+ dockerfile: services/history-v1/Dockerfile
+ target: base
volumes:
- .:/overleaf/services/history-v1
- ../../node_modules:/overleaf/node_modules
@@ -14,58 +17,228 @@ services:
working_dir: /overleaf/services/history-v1
environment:
MOCHA_GREP: ${MOCHA_GREP}
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
command: npm run --silent test:unit
user: node
test_acceptance:
- image: node:18.20.2
+ build:
+ context: ../..
+ dockerfile: services/history-v1/Dockerfile
+ target: base
volumes:
- .:/overleaf/services/history-v1
- ../../node_modules:/overleaf/node_modules
- ../../libraries:/overleaf/libraries
+ - ./test/acceptance/certs:/certs
+ - ../../bin/shared/wait_for_it:/overleaf/bin/shared/wait_for_it
working_dir: /overleaf/services/history-v1
environment:
ELASTIC_SEARCH_DSN: es:9200
+ REDIS_HOST: redis
+ HISTORY_REDIS_HOST: redis
+ QUEUES_REDIS_HOST: redis
+ ANALYTICS_QUEUES_REDIS_HOST: redis
MONGO_HOST: mongo
POSTGRES_HOST: postgres
+ AWS_S3_ENDPOINT: https://minio:9000
+ AWS_S3_PATH_STYLE: 'true'
+ AWS_ACCESS_KEY_ID: OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
+ AWS_SECRET_ACCESS_KEY: OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
GCS_API_ENDPOINT: http://gcs:9090
GCS_PROJECT_ID: fake
STORAGE_EMULATOR_HOST: http://gcs:9090/storage/v1
MOCHA_GREP: ${MOCHA_GREP}
- LOG_LEVEL: ERROR
+ LOG_LEVEL: ${LOG_LEVEL:-}
NODE_ENV: test
NODE_OPTIONS: "--unhandled-rejections=strict"
user: node
depends_on:
mongo:
+ condition: service_started
+ redis:
condition: service_healthy
postgres:
condition: service_healthy
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ minio_setup:
+ condition: service_completed_successfully
gcs:
condition: service_healthy
+ entrypoint: /overleaf/bin/shared/wait_for_it mongo:27017 --timeout=0 --
command: npm run --silent test:acceptance
- mongo:
- image: mongo:6.0.13
- command: --replSet overleaf
+ redis:
+ image: redis:7.4.3
healthcheck:
- test: "mongosh --quiet localhost/test --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 1)'"
+ test: ping=$$(redis-cli ping) && [ "$$ping" = 'PONG' ]
interval: 1s
retries: 20
+ mongo:
+ image: mongo:8.0.11
+ command: --replSet overleaf
+ volumes:
+ - ../../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
+ environment:
+ MONGO_INITDB_DATABASE: sharelatex
+ extra_hosts:
+ # Required when using the automatic database setup for initializing the
+ # replica set. This override is not needed when running the setup after
+ # starting up mongo.
+ - mongo:127.0.0.1
+
postgres:
image: postgres:10
environment:
POSTGRES_USER: overleaf
POSTGRES_PASSWORD: overleaf
POSTGRES_DB: overleaf-history-v1-test
+ volumes:
+ - ./test/acceptance/pg-init/:/docker-entrypoint-initdb.d/
healthcheck:
test: pg_isready --host=localhost --quiet
interval: 1s
retries: 20
+ certs:
+ image: node:22.17.0
+ volumes:
+ - ./test/acceptance/certs:/certs
+ working_dir: /certs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ if [ ! -f ./certgen ]; then
+ wget -O ./certgen "https://github.com/minio/certgen/releases/download/v1.3.0/certgen-linux-$(dpkg --print-architecture)"
+ chmod +x ./certgen
+ fi
+ if [ ! -f private.key ] || [ ! -f public.crt ]; then
+ ./certgen -host minio
+ fi
+
+ minio:
+ image: minio/minio:RELEASE.2024-10-13T13-34-11Z
+ command: server /data
+ volumes:
+ - ./test/acceptance/certs:/root/.minio/certs
+ environment:
+ MINIO_ROOT_USER: MINIO_ROOT_USER
+ MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+
+ minio_setup:
+ depends_on:
+ certs:
+ condition: service_completed_successfully
+ minio:
+ condition: service_started
+ image: minio/mc:RELEASE.2024-10-08T09-37-26Z
+ volumes:
+ - ./test/acceptance/certs:/root/.mc/certs/CAs
+ entrypoint: sh
+ command:
+ - '-cex'
+ - |
+ sleep 1
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
+ || sleep 3 && \
+ mc alias set s3 https://minio:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD
+ mc mb --ignore-existing s3/overleaf-test-history-chunks
+ mc mb --ignore-existing s3/overleaf-test-history-deks
+ mc mb --ignore-existing s3/overleaf-test-history-global-blobs
+ mc mb --ignore-existing s3/overleaf-test-history-project-blobs
+ mc admin user add s3 \
+ OVERLEAF_HISTORY_S3_ACCESS_KEY_ID \
+ OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY
+ echo '
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-chunks"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-chunks/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-deks"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-deks/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-global-blobs"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-global-blobs/*"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:ListBucket"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-project-blobs"
+ },
+ {
+ "Effect": "Allow",
+ "Action": [
+ "s3:PutObject",
+ "s3:GetObject",
+ "s3:DeleteObject"
+ ],
+ "Resource": "arn:aws:s3:::overleaf-test-history-project-blobs/*"
+ }
+ ]
+ }' > policy-history.json
+
+ mc admin policy create s3 overleaf-history policy-history.json
+ mc admin policy attach s3 overleaf-history \
+ --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID
gcs:
image: fsouza/fake-gcs-server:1.45.2
command: ["--port=9090", "--scheme=http"]
diff --git a/services/history-v1/install_deps.sh b/services/history-v1/install_deps.sh
new file mode 100755
index 0000000000..4ce7223b46
--- /dev/null
+++ b/services/history-v1/install_deps.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+set -ex
+
+apt-get update
+
+apt-get install jq parallel --yes
+
+rm -rf /var/lib/apt/lists/*
diff --git a/services/history-v1/migrations/20250415210802_add_chunks_closed.js b/services/history-v1/migrations/20250415210802_add_chunks_closed.js
new file mode 100644
index 0000000000..b5c1d577f9
--- /dev/null
+++ b/services/history-v1/migrations/20250415210802_add_chunks_closed.js
@@ -0,0 +1,27 @@
+// @ts-check
+
+/**
+ * @import { Knex } from "knex"
+ */
+
+/**
+ * @param { Knex } knex
+ * @returns { Promise }
+ */
+exports.up = async function (knex) {
+ await knex.raw(`
+ ALTER TABLE chunks
+ ADD COLUMN closed BOOLEAN NOT NULL DEFAULT FALSE
+ `)
+}
+
+/**
+ * @param { Knex } knex
+ * @returns { Promise }
+ */
+exports.down = async function (knex) {
+ await knex.raw(`
+ ALTER TABLE chunks
+ DROP COLUMN closed
+ `)
+}
diff --git a/services/history-v1/package.json b/services/history-v1/package.json
index 68c3dfd8aa..4796cafd03 100644
--- a/services/history-v1/package.json
+++ b/services/history-v1/package.json
@@ -6,10 +6,14 @@
"license": "Proprietary",
"private": true,
"dependencies": {
+ "@google-cloud/secret-manager": "^5.6.0",
+ "@overleaf/fetch-utils": "*",
"@overleaf/logger": "*",
"@overleaf/metrics": "*",
+ "@overleaf/mongo-utils": "*",
"@overleaf/o-error": "*",
"@overleaf/object-persistor": "*",
+ "@overleaf/promise-utils": "*",
"@overleaf/redis-wrapper": "*",
"@overleaf/settings": "*",
"@overleaf/stream-utils": "^0.1.0",
@@ -17,11 +21,12 @@
"basic-auth": "^2.0.1",
"bluebird": "^3.7.2",
"body-parser": "^1.20.3",
+ "bull": "^4.16.5",
"bunyan": "^1.8.12",
"check-types": "^11.1.2",
"command-line-args": "^3.0.3",
- "config": "^1.19.0",
- "express": "^4.21.0",
+ "config": "^3.3.12",
+ "express": "^4.21.2",
"fs-extra": "^9.0.1",
"generic-pool": "^2.1.1",
"helmet": "^3.22.0",
@@ -29,9 +34,12 @@
"jsonwebtoken": "^9.0.0",
"knex": "^2.4.0",
"lodash": "^4.17.19",
- "mongodb": "^6.2.0",
+ "mongodb": "6.12.0",
"overleaf-editor-core": "*",
+ "p-limit": "^6.2.0",
+ "p-queue": "^8.1.0",
"pg": "^8.7.1",
+ "pg-query-stream": "^4.2.4",
"swagger-tools": "^0.10.4",
"temp": "^0.8.3",
"throng": "^4.0.0",
@@ -42,7 +50,8 @@
"benny": "^3.7.1",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
- "mocha": "^10.2.0",
+ "chai-exclude": "^2.1.1",
+ "mocha": "^11.1.0",
"node-fetch": "^2.7.0",
"sinon": "^9.0.2",
"swagger-client": "^3.10.0",
@@ -53,8 +62,8 @@
"start": "node app.js",
"lint": "eslint --max-warnings 0 --format unix .",
"lint:fix": "eslint --fix .",
- "format": "prettier --list-different $PWD/'**/*.js'",
- "format:fix": "prettier --write $PWD/'**/*.js'",
+ "format": "prettier --list-different $PWD/'**/*.*js'",
+ "format:fix": "prettier --write $PWD/'**/*.*js'",
"test:unit": "npm run test:unit:_run -- --grep=$MOCHA_GREP",
"test:acceptance": "npm run test:acceptance:_run -- --grep=$MOCHA_GREP",
"test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js",
diff --git a/services/history-v1/storage/index.js b/services/history-v1/storage/index.js
index a0fd471829..6bc81f60e8 100644
--- a/services/history-v1/storage/index.js
+++ b/services/history-v1/storage/index.js
@@ -2,11 +2,16 @@ exports.BatchBlobStore = require('./lib/batch_blob_store')
exports.blobHash = require('./lib/blob_hash')
exports.HashCheckBlobStore = require('./lib/hash_check_blob_store')
exports.chunkStore = require('./lib/chunk_store')
-exports.historyStore = require('./lib/history_store')
+exports.redisBuffer = require('./lib/chunk_store/redis')
+exports.historyStore = require('./lib/history_store').historyStore
exports.knex = require('./lib/knex')
exports.mongodb = require('./lib/mongodb')
+exports.redis = require('./lib/redis')
exports.persistChanges = require('./lib/persist_changes')
exports.persistor = require('./lib/persistor')
+exports.persistBuffer = require('./lib/persist_buffer')
+exports.commitChanges = require('./lib/commit_changes')
+exports.queueChanges = require('./lib/queue_changes')
exports.ProjectArchive = require('./lib/project_archive')
exports.streams = require('./lib/streams')
exports.temp = require('./lib/temp')
@@ -15,3 +20,9 @@ exports.zipStore = require('./lib/zip_store')
const { BlobStore, loadGlobalBlobs } = require('./lib/blob_store')
exports.BlobStore = BlobStore
exports.loadGlobalBlobs = loadGlobalBlobs
+
+const { InvalidChangeError } = require('./lib/errors')
+exports.InvalidChangeError = InvalidChangeError
+
+const { ChunkVersionConflictError } = require('./lib/chunk_store/errors')
+exports.ChunkVersionConflictError = ChunkVersionConflictError
diff --git a/services/history-v1/storage/lib/assert.js b/services/history-v1/storage/lib/assert.js
index 6f79086209..91f24da7e0 100644
--- a/services/history-v1/storage/lib/assert.js
+++ b/services/history-v1/storage/lib/assert.js
@@ -1,5 +1,7 @@
'use strict'
+const OError = require('@overleaf/o-error')
+
const check = require('check-types')
const { Blob } = require('overleaf-editor-core')
@@ -7,37 +9,58 @@ const assert = check.assert
const MONGO_ID_REGEXP = /^[0-9a-f]{24}$/
const POSTGRES_ID_REGEXP = /^[1-9][0-9]{0,9}$/
-const PROJECT_ID_REGEXP = /^([0-9a-f]{24}|[1-9][0-9]{0,9})$/
+const MONGO_OR_POSTGRES_ID_REGEXP = /^([0-9a-f]{24}|[1-9][0-9]{0,9})$/
function transaction(transaction, message) {
assert.function(transaction, message)
}
function blobHash(arg, message) {
- assert.match(arg, Blob.HEX_HASH_RX, message)
+ try {
+ assert.match(arg, Blob.HEX_HASH_RX, message)
+ } catch (error) {
+ throw OError.tag(error, message, { arg })
+ }
+}
+
+/**
+ * A project id is a string that contains either an integer (for projects stored in Postgres) or 24
+ * hex digits (for projects stored in Mongo)
+ */
+function projectId(arg, message) {
+ try {
+ assert.match(arg, MONGO_OR_POSTGRES_ID_REGEXP, message)
+ } catch (error) {
+ throw OError.tag(error, message, { arg })
+ }
}
/**
* A chunk id is a string that contains either an integer (for projects stored in Postgres) or 24
* hex digits (for projects stored in Mongo)
*/
-function projectId(arg, message) {
- assert.match(arg, PROJECT_ID_REGEXP, message)
-}
-
-/**
- * A chunk id is either a number (for projects stored in Postgres) or a 24
- * character string (for projects stored in Mongo)
- */
function chunkId(arg, message) {
- const valid = check.integer(arg) || check.match(arg, MONGO_ID_REGEXP)
- if (!valid) {
- throw new TypeError(message)
+ try {
+ assert.match(arg, MONGO_OR_POSTGRES_ID_REGEXP, message)
+ } catch (error) {
+ throw OError.tag(error, message, { arg })
}
}
function mongoId(arg, message) {
- assert.match(arg, MONGO_ID_REGEXP)
+ try {
+ assert.match(arg, MONGO_ID_REGEXP, message)
+ } catch (error) {
+ throw OError.tag(error, message, { arg })
+ }
+}
+
+function postgresId(arg, message) {
+ try {
+ assert.match(arg, POSTGRES_ID_REGEXP, message)
+ } catch (error) {
+ throw OError.tag(error, message, { arg })
+ }
}
module.exports = {
@@ -47,6 +70,7 @@ module.exports = {
projectId,
chunkId,
mongoId,
+ postgresId,
MONGO_ID_REGEXP,
POSTGRES_ID_REGEXP,
}
diff --git a/services/history-v1/storage/lib/backupArchiver.mjs b/services/history-v1/storage/lib/backupArchiver.mjs
new file mode 100644
index 0000000000..c6f0e3755d
--- /dev/null
+++ b/services/history-v1/storage/lib/backupArchiver.mjs
@@ -0,0 +1,474 @@
+// @ts-check
+import path from 'node:path'
+import projectKey from './project_key.js'
+import {
+ chunksBucket,
+ backupPersistor,
+ projectBlobsBucket,
+ globalBlobsBucket as backupGlobalBlobsBucket,
+} from './backupPersistor.mjs'
+import core, { Chunk, History } from 'overleaf-editor-core'
+import {
+ GLOBAL_BLOBS,
+ makeProjectKey,
+ getStringLengthOfFile,
+ makeGlobalKey,
+} from './blob_store/index.js'
+import streams from './streams.js'
+import objectPersistor from '@overleaf/object-persistor'
+import OError from '@overleaf/o-error'
+import chunkStore from './chunk_store/index.js'
+import logger from '@overleaf/logger'
+import fs from 'node:fs'
+import { pipeline } from 'node:stream/promises'
+import withTmpDir from '../../api/controllers/with_tmp_dir.js'
+import { loadChunk } from './backupVerifier.mjs'
+import globalBlobPersistor from './persistor.js'
+import config from 'config'
+import { NoKEKMatchedError } from '@overleaf/object-persistor/src/Errors.js'
+
+const globalBlobsBucket = config.get('blobStore.globalBucket')
+
+class BackupBlobStore {
+ /**
+ *
+ * @param {string} historyId
+ * @param {string} tmp
+ * @param {CachedPerProjectEncryptedS3Persistor} persistor
+ * @param {boolean} useBackupGlobalBlobs
+ */
+ constructor(historyId, tmp, persistor, useBackupGlobalBlobs) {
+ this.historyId = historyId
+ this.tmp = tmp
+ this.blobs = new Map()
+ this.persistor = persistor
+ this.useBackupGlobalBlobs = useBackupGlobalBlobs
+ }
+
+ /**
+ * Required for BlobStore interface - not supported.
+ *
+ * @template T
+ * @param {string} hash
+ * @return {Promise}
+ */
+ async getObject(hash) {
+ try {
+ const stream = await this.getStream(hash)
+ const buffer = await streams.readStreamToBuffer(stream)
+ return JSON.parse(buffer.toString())
+ } catch (err) {
+ logger.warn({ err, hash }, 'Failed to fetch chunk blob')
+ throw err
+ }
+ }
+
+ /**
+ *
+ * @param {Set} hashes
+ * @return {Promise}
+ */
+ async fetchBlobs(hashes) {
+ for await (const hash of hashes) {
+ if (this.blobs.has(hash)) return
+ const path = `${this.tmp}/${hash}`
+ /** @type {core.Blob} */
+ let blob
+ /** @type {NodeJS.ReadableStream} */
+ let blobStream
+ if (GLOBAL_BLOBS.has(hash)) {
+ try {
+ const blobData = await this.fetchGlobalBlob(hash)
+ await pipeline(blobData.stream, fs.createWriteStream(path))
+ blob = blobData.blob
+ } catch (err) {
+ logger.warn({ hash, err }, 'Failed to fetch global blob')
+ continue
+ }
+ } else {
+ try {
+ blobStream = await fetchBlob(this.historyId, hash, this.persistor)
+ await pipeline(blobStream, fs.createWriteStream(path))
+ blob = await this.makeBlob(hash, path)
+ } catch (err) {
+ logger.warn({ err, hash }, 'Failed to fetch chunk blob')
+ continue
+ }
+ }
+
+ this.blobs.set(hash, blob)
+ }
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @return {Promise<{ blob: core.Blob, stream: NodeJS.ReadableStream }>}
+ */
+ async fetchGlobalBlob(hash) {
+ const globalBlob = GLOBAL_BLOBS.get(hash)
+ if (!globalBlob) {
+ throw new Error('blob does not exist or is not a global blob')
+ }
+ let stream
+
+ const key = makeGlobalKey(hash)
+
+ if (this.useBackupGlobalBlobs) {
+ stream = await this.persistor.getObjectStream(
+ backupGlobalBlobsBucket,
+ key
+ )
+ } else {
+ stream = await globalBlobPersistor.getObjectStream(globalBlobsBucket, key)
+ }
+ return { blob: globalBlob.blob, stream }
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @param {string} pathname
+ * @return {Promise}
+ */
+ async makeBlob(hash, pathname) {
+ const stat = await fs.promises.stat(pathname)
+ const byteLength = stat.size
+ const stringLength = await getStringLengthOfFile(byteLength, pathname)
+ if (stringLength) {
+ return new core.Blob(hash, byteLength, stringLength)
+ }
+ return new core.Blob(hash, byteLength)
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @return {Promise}
+ */
+ async getString(hash) {
+ const stream = await this.getStream(hash)
+ const buffer = await streams.readStreamToBuffer(stream)
+ return buffer.toString()
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @return {Promise}
+ */
+ async getStream(hash) {
+ return fs.createReadStream(this.getBlobPathname(hash))
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @return {Promise}
+ */
+ async getBlob(hash) {
+ return this.blobs.get(hash)
+ }
+
+ /**
+ *
+ * @param {string} hash
+ * @return {string}
+ */
+ getBlobPathname(hash) {
+ return path.join(this.tmp, hash)
+ }
+}
+
+/**
+ * @typedef {(import('@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor.js').CachedPerProjectEncryptedS3Persistor)} CachedPerProjectEncryptedS3Persistor
+ */
+
+/**
+ * @typedef {(import('archiver').Archiver)} Archiver
+ */
+
+/**
+ * @typedef {(import('overleaf-editor-core').FileMap)} FileMap
+ */
+
+/**
+ *
+ * @param historyId
+ * @return {Promise}
+ */
+async function getProjectPersistor(historyId) {
+ try {
+ return await backupPersistor.forProjectRO(
+ projectBlobsBucket,
+ makeProjectKey(historyId, '')
+ )
+ } catch (error) {
+ if (error instanceof NoKEKMatchedError) {
+ logger.info({}, 'no kek matched')
+ }
+ throw new BackupPersistorError(
+ 'Failed to get project persistor',
+ { historyId },
+ error instanceof Error ? error : undefined
+ )
+ }
+}
+
+/**
+ *
+ * @param persistor
+ * @param {string} key
+ * @return {Promise<{chunkData: any, buffer: Buffer}>}
+ */
+async function loadChunkByKey(persistor, key) {
+ try {
+ const buf = await streams.gunzipStreamToBuffer(
+ await persistor.getObjectStream(chunksBucket, key)
+ )
+ return { chunkData: JSON.parse(buf.toString('utf-8')), buffer: buf }
+ } catch (err) {
+ if (err instanceof objectPersistor.Errors.NotFoundError) {
+ throw new Chunk.NotPersistedError('chunk not found')
+ }
+ if (err instanceof Error) {
+ throw OError.tag(err, 'Failed to load chunk', { key })
+ }
+ throw err
+ }
+}
+
+/**
+ *
+ * @param {string} historyId
+ * @param {string} hash
+ * @param {CachedPerProjectEncryptedS3Persistor} persistor
+ * @return {Promise}
+ */
+async function fetchBlob(historyId, hash, persistor) {
+ const path = makeProjectKey(historyId, hash)
+ return await persistor.getObjectStream(projectBlobsBucket, path, {
+ autoGunzip: true,
+ })
+}
+
+/**
+ * @typedef {object} AddChunkOptions
+ * @property {string} [prefix] Should include trailing slash (if length > 0)
+ * @property {boolean} [useBackupGlobalBlobs]
+ */
+
+/**
+ *
+ * @param {History} history
+ * @param {Archiver} archive
+ * @param {CachedPerProjectEncryptedS3Persistor} projectCache
+ * @param {string} historyId
+ * @param {AddChunkOptions} [options]
+ * @returns {Promise}
+ */
+async function addChunkToArchive(
+ history,
+ archive,
+ projectCache,
+ historyId,
+ { prefix = '', useBackupGlobalBlobs = false } = {}
+) {
+ const chunkBlobs = new Set()
+ history.findBlobHashes(chunkBlobs)
+
+ await withTmpDir('recovery-blob-', async tmpDir => {
+ const blobStore = new BackupBlobStore(
+ historyId,
+ tmpDir,
+ projectCache,
+ useBackupGlobalBlobs
+ )
+ await blobStore.fetchBlobs(chunkBlobs)
+
+ await history.loadFiles('lazy', blobStore)
+
+ const snapshot = history.getSnapshot()
+ snapshot.applyAll(history.getChanges())
+
+ const filePaths = snapshot.getFilePathnames()
+
+ if (filePaths.length === 0) {
+ logger.warn(
+ { historyId, projectVersion: snapshot.projectVersion },
+ 'No files found in snapshot backup'
+ )
+ }
+ for (const filePath of filePaths) {
+ /** @type {core.File | null | undefined} */
+ const file = snapshot.getFile(filePath)
+ if (!file) {
+ logger.error({ filePath }, 'File not found in snapshot')
+ continue
+ }
+
+ try {
+ await file.load('eager', blobStore)
+ } catch (err) {
+ logger.error(
+ { filePath, err },
+ 'Failed to load file from snapshot, skipping'
+ )
+ continue
+ }
+
+ const hash = file.getHash()
+
+ /** @type {string | fs.ReadStream | null | undefined} */
+ let content = file.getContent({ filterTrackedDeletes: true })
+
+ if (content === null) {
+ if (!hash) {
+ logger.error({ filePath }, 'File does not have a hash')
+ continue
+ }
+ const blob = await blobStore.getBlob(hash)
+ if (!blob) {
+ logger.error({ filePath }, 'Blob not found in blob store')
+ continue
+ }
+ content = await blobStore.getStream(hash)
+ }
+ archive.append(content, {
+ name: `${prefix}${filePath}`,
+ })
+ }
+ })
+}
+
+/**
+ *
+ * @param {string} historyId
+ * @return {Promise}
+ */
+async function findStartVersionOfLatestChunk(historyId) {
+ const backend = chunkStore.getBackend(historyId)
+ const chunk = await backend.getLatestChunk(historyId, { readOnly: true })
+ if (!chunk) {
+ throw new Error('Latest chunk could not be loaded')
+ }
+ return chunk.startVersion
+}
+
+/**
+ * Restore a project from the latest snapshot
+ *
+ * There is an assumption that the database backup has been restored.
+ *
+ * @param {Archiver} archive
+ * @param {string} historyId
+ * @param {boolean} [useBackupGlobalBlobs]
+ * @return {Promise}
+ */
+export async function archiveLatestChunk(
+ archive,
+ historyId,
+ useBackupGlobalBlobs = false
+) {
+ logger.info({ historyId, useBackupGlobalBlobs }, 'Archiving latest chunk')
+
+ const projectCache = await getProjectPersistor(historyId)
+
+ const startVersion = await findStartVersionOfLatestChunk(historyId)
+
+ const backedUpChunkRaw = await loadChunk(
+ historyId,
+ startVersion,
+ projectCache
+ )
+
+ const backedUpChunk = History.fromRaw(backedUpChunkRaw)
+
+ await addChunkToArchive(backedUpChunk, archive, projectCache, historyId, {
+ useBackupGlobalBlobs,
+ })
+
+ return archive
+}
+
+/**
+ * Fetches all raw blobs from the project and adds them to the archive.
+ *
+ * @param {string} historyId
+ * @param {Archiver} archive
+ * @param {CachedPerProjectEncryptedS3Persistor} projectCache
+ * @return {Promise}
+ */
+async function addRawBlobsToArchive(historyId, archive, projectCache) {
+ const key = projectKey.format(historyId)
+ const { contents } = await projectCache.listDirectory(projectBlobsBucket, key)
+ for (const blobRecord of contents) {
+ if (!blobRecord.Key) {
+ logger.debug({ blobRecord }, 'no key')
+ continue
+ }
+ const blobKey = blobRecord.Key
+ try {
+ const stream = await projectCache.getObjectStream(
+ projectBlobsBucket,
+ blobKey,
+ { autoGunzip: true }
+ )
+ archive.append(stream, {
+ name: path.join(historyId, 'blobs', blobKey),
+ })
+ } catch (err) {
+ logger.warn(
+ { err, path: blobRecord.Key },
+ 'Failed to append blob to archive'
+ )
+ }
+ }
+}
+
+/**
+ * Download raw files from the backup.
+ *
+ * This can work without the database being backed up.
+ *
+ * It will split the project into chunks per directory and download the blobs alongside the chunk.
+ *
+ * @param {Archiver} archive
+ * @param {string} historyId
+ * @param {boolean} [useBackupGlobalBlobs]
+ * @return {Promise}
+ */
+export async function archiveRawProject(
+ archive,
+ historyId,
+ useBackupGlobalBlobs = false
+) {
+ const projectCache = await getProjectPersistor(historyId)
+
+ const { contents: chunks } = await projectCache.listDirectory(
+ chunksBucket,
+ projectKey.format(historyId)
+ )
+
+ if (chunks.length === 0) {
+ throw new Error('No chunks found')
+ }
+
+ for (const chunkRecord of chunks) {
+ if (!chunkRecord.Key) {
+ logger.debug({ chunkRecord }, 'no key')
+ continue
+ }
+ const chunkId = chunkRecord.Key.split('/').pop()
+ logger.debug({ chunkId, key: chunkRecord.Key }, 'Processing chunk')
+
+ const { buffer } = await loadChunkByKey(projectCache, chunkRecord.Key)
+
+ archive.append(buffer, {
+ name: `${historyId}/chunks/${chunkId}/chunk.json`,
+ })
+ }
+ await addRawBlobsToArchive(historyId, archive, projectCache)
+}
+
+export class BackupPersistorError extends OError {}
diff --git a/services/history-v1/storage/lib/backupBlob.mjs b/services/history-v1/storage/lib/backupBlob.mjs
new file mode 100644
index 0000000000..8ae1a6a901
--- /dev/null
+++ b/services/history-v1/storage/lib/backupBlob.mjs
@@ -0,0 +1,251 @@
+// @ts-check
+import { backupPersistor, projectBlobsBucket } from './backupPersistor.mjs'
+import { GLOBAL_BLOBS, makeProjectKey, BlobStore } from './blob_store/index.js'
+import Stream from 'node:stream'
+import fs from 'node:fs'
+import Crypto from 'node:crypto'
+import assert from './assert.js'
+import { backedUpBlobs, projects } from './mongodb.js'
+import { Binary, ObjectId } from 'mongodb'
+import logger from '@overleaf/logger/logging-manager.js'
+import { AlreadyWrittenError } from '@overleaf/object-persistor/src/Errors.js'
+import metrics from '@overleaf/metrics'
+import zLib from 'node:zlib'
+import Path from 'node:path'
+
+const HIGHWATER_MARK = 1024 * 1024
+
+/**
+ * @typedef {import("overleaf-editor-core").Blob} Blob
+ */
+
+/**
+ * @typedef {import("@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor").CachedPerProjectEncryptedS3Persistor} CachedPerProjectEncryptedS3Persistor
+ */
+
+/**
+ * Increment a metric to record the outcome of a backup operation.
+ *
+ * @param {"success"|"failure"|"skipped"} status
+ * @param {"global"|"already_backed_up"|"none"} reason
+ */
+function recordBackupConclusion(status, reason = 'none') {
+ metrics.inc('blob_backed_up', 1, { status, reason })
+}
+
+/**
+ * Downloads a blob to a specified directory
+ *
+ * @param {string} historyId - The history ID of the project the blob belongs to
+ * @param {Blob} blob - The blob to download
+ * @param {string} tmpDir - The directory path where the blob will be downloaded
+ * @returns {Promise} The full path where the blob was downloaded
+ */
+export async function downloadBlobToDir(historyId, blob, tmpDir) {
+ const blobStore = new BlobStore(historyId)
+ const blobHash = blob.getHash()
+ const src = await blobStore.getStream(blobHash)
+ const filePath = Path.join(tmpDir, `${historyId}-${blobHash}`)
+ try {
+ const dst = fs.createWriteStream(filePath, {
+ highWaterMark: HIGHWATER_MARK,
+ flags: 'wx',
+ })
+ await Stream.promises.pipeline(src, dst)
+ return filePath
+ } catch (error) {
+ try {
+ await fs.promises.unlink(filePath)
+ } catch {}
+ throw error
+ }
+}
+
+/**
+ * Performs the actual upload of the blob to the backup storage.
+ *
+ * @param {string} historyId - The history ID of the project the blob belongs to
+ * @param {Blob} blob - The blob being uploaded
+ * @param {string} path - The path to the file to upload (should have been stored on disk already)
+ * @return {Promise}
+ */
+export async function uploadBlobToBackup(historyId, blob, path, persistor) {
+ const md5 = Crypto.createHash('md5')
+ const filePathCompressed = path + '.gz'
+ let backupSource
+ let contentEncoding
+ let size
+ try {
+ if (blob.getStringLength()) {
+ backupSource = filePathCompressed
+ contentEncoding = 'gzip'
+ size = 0
+ await Stream.promises.pipeline(
+ fs.createReadStream(path, { highWaterMark: HIGHWATER_MARK }),
+ zLib.createGzip(),
+ async function* (source) {
+ for await (const chunk of source) {
+ size += chunk.byteLength
+ md5.update(chunk)
+ yield chunk
+ }
+ },
+ fs.createWriteStream(filePathCompressed, {
+ highWaterMark: HIGHWATER_MARK,
+ })
+ )
+ } else {
+ backupSource = path
+ size = blob.getByteLength()
+ await Stream.promises.pipeline(
+ fs.createReadStream(path, { highWaterMark: HIGHWATER_MARK }),
+ md5
+ )
+ }
+ const key = makeProjectKey(historyId, blob.getHash())
+ await persistor.sendStream(
+ projectBlobsBucket,
+ key,
+ fs.createReadStream(backupSource, { highWaterMark: HIGHWATER_MARK }),
+ {
+ contentEncoding,
+ contentType: 'application/octet-stream',
+ contentLength: size,
+ sourceMd5: md5.digest('hex'),
+ ifNoneMatch: '*',
+ }
+ )
+ } finally {
+ if (backupSource === filePathCompressed) {
+ try {
+ await fs.promises.rm(filePathCompressed, { force: true })
+ } catch {}
+ }
+ }
+}
+
+/**
+ * Converts a legacy (postgres) historyId to a mongo projectId
+ *
+ * @param {string} historyId
+ * @return {Promise}
+ * @private
+ */
+async function _convertLegacyHistoryIdToProjectId(historyId) {
+ const project = await projects.findOne(
+ { 'overleaf.history.id': parseInt(historyId) },
+ { projection: { _id: 1 } }
+ )
+
+ if (!project?._id) {
+ throw new Error('Did not find project for history id')
+ }
+
+ return project?._id?.toString()
+}
+
+/**
+ * Records that a blob was backed up for a project.
+ *
+ * @param {string} projectId - projectId for a project (mongo format)
+ * @param {string} hash
+ * @return {Promise}
+ */
+export async function storeBlobBackup(projectId, hash) {
+ await backedUpBlobs.updateOne(
+ { _id: new ObjectId(projectId) },
+ { $addToSet: { blobs: new Binary(Buffer.from(hash, 'hex')) } },
+ { upsert: true }
+ )
+}
+
+/**
+ * Determine whether a specific blob has been backed up in this project.
+ *
+ * @param {string} projectId
+ * @param {string} hash
+ * @return {Promise<*>}
+ * @private
+ */
+export async function _blobIsBackedUp(projectId, hash) {
+ const blobs = await backedUpBlobs.findOne(
+ {
+ _id: new ObjectId(projectId),
+ blobs: new Binary(Buffer.from(hash, 'hex')),
+ },
+ { projection: { _id: 1 } }
+ )
+ return blobs?._id
+}
+
+/**
+ * Back up a blob to the global storage and record that it was backed up.
+ *
+ * @param {string} historyId - history ID for a project (can be postgres format or mongo format)
+ * @param {Blob} blob - The blob that is being backed up
+ * @param {string} tmpPath - The path to a temporary file storing the contents of the blob.
+ * @param {CachedPerProjectEncryptedS3Persistor} [persistor] - The persistor to use (optional)
+ * @return {Promise}
+ */
+export async function backupBlob(historyId, blob, tmpPath, persistor) {
+ const hash = blob.getHash()
+
+ let projectId = historyId
+ if (assert.POSTGRES_ID_REGEXP.test(historyId)) {
+ projectId = await _convertLegacyHistoryIdToProjectId(historyId)
+ }
+
+ const globalBlob = GLOBAL_BLOBS.get(hash)
+
+ if (globalBlob && !globalBlob.demoted) {
+ recordBackupConclusion('skipped', 'global')
+ logger.debug({ projectId, hash }, 'Blob is global - skipping backup')
+ return
+ }
+
+ try {
+ if (await _blobIsBackedUp(projectId, hash)) {
+ recordBackupConclusion('skipped', 'already_backed_up')
+ logger.debug(
+ { projectId, hash },
+ 'Blob already backed up - skipping backup'
+ )
+ return
+ }
+ } catch (error) {
+ logger.warn({ error }, 'Failed to check if blob is backed up')
+ // We'll try anyway - we'll catch the error if it was backed up
+ }
+ // If we weren't passed a persistor for this project, create one.
+ // This will fetch the key from AWS, so it's prefereable to use
+ // the same persistor for all blobs in a project where possible.
+ if (!persistor) {
+ logger.debug(
+ { historyId, hash },
+ 'warning: persistor not passed to backupBlob'
+ )
+ }
+ persistor ??= await backupPersistor.forProject(
+ projectBlobsBucket,
+ makeProjectKey(historyId, '')
+ )
+ try {
+ logger.debug({ projectId, hash }, 'Starting blob backup')
+ await uploadBlobToBackup(historyId, blob, tmpPath, persistor)
+ await storeBlobBackup(projectId, hash)
+ recordBackupConclusion('success')
+ } catch (error) {
+ if (error instanceof AlreadyWrittenError) {
+ logger.debug({ error, projectId, hash }, 'Blob already backed up')
+ // record that we backed it up already
+ await storeBlobBackup(projectId, hash)
+ recordBackupConclusion('failure', 'already_backed_up')
+ return
+ }
+ // eventually queue this for retry - for now this will be fixed by running the script
+ recordBackupConclusion('failure')
+ logger.warn({ error, projectId, hash }, 'Failed to upload blob to backup')
+ } finally {
+ logger.debug({ projectId, hash }, 'Ended blob backup')
+ }
+}
diff --git a/services/history-v1/storage/lib/backupDeletion.mjs b/services/history-v1/storage/lib/backupDeletion.mjs
new file mode 100644
index 0000000000..ef50609753
--- /dev/null
+++ b/services/history-v1/storage/lib/backupDeletion.mjs
@@ -0,0 +1,93 @@
+// @ts-check
+import { callbackify } from 'util'
+import { ObjectId } from 'mongodb'
+import config from 'config'
+import OError from '@overleaf/o-error'
+import { db } from './mongodb.js'
+import projectKey from './project_key.js'
+import chunkStore from '../lib/chunk_store/index.js'
+import {
+ backupPersistor,
+ chunksBucket,
+ projectBlobsBucket,
+} from './backupPersistor.mjs'
+
+const MS_PER_DAY = 24 * 60 * 60 * 1000
+const EXPIRE_PROJECTS_AFTER_MS =
+ parseInt(config.get('minSoftDeletionPeriodDays'), 10) * MS_PER_DAY
+const deletedProjectsCollection = db.collection('deletedProjects')
+
+/**
+ * @param {string} historyId
+ * @return {Promise}
+ */
+async function projectHasLatestChunk(historyId) {
+ const chunk = await chunkStore.getBackend(historyId).getLatestChunk(historyId)
+ return chunk != null
+}
+
+export class NotReadyToDelete extends OError {}
+
+/**
+ * @param {string} projectId
+ * @return {Promise}
+ */
+async function deleteProjectBackup(projectId) {
+ const deletedProject = await deletedProjectsCollection.findOne(
+ { 'deleterData.deletedProjectId': new ObjectId(projectId) },
+ {
+ projection: {
+ 'deleterData.deletedProjectOverleafHistoryId': 1,
+ 'deleterData.deletedAt': 1,
+ },
+ }
+ )
+ if (!deletedProject) {
+ throw new NotReadyToDelete('refusing to delete non-deleted project')
+ }
+ const expiresAt =
+ deletedProject.deleterData.deletedAt.getTime() + EXPIRE_PROJECTS_AFTER_MS
+ if (expiresAt > Date.now()) {
+ throw new NotReadyToDelete('refusing to delete non-expired project')
+ }
+
+ const historyId =
+ deletedProject.deleterData.deletedProjectOverleafHistoryId?.toString()
+ if (!historyId) {
+ throw new NotReadyToDelete(
+ 'refusing to delete project with unknown historyId'
+ )
+ }
+
+ if (await projectHasLatestChunk(historyId)) {
+ throw new NotReadyToDelete(
+ 'refusing to delete project with remaining chunks'
+ )
+ }
+
+ const prefix = projectKey.format(historyId) + '/'
+ await backupPersistor.deleteDirectory(chunksBucket, prefix)
+ await backupPersistor.deleteDirectory(projectBlobsBucket, prefix)
+}
+
+export async function healthCheck() {
+ const HEALTH_CHECK_PROJECTS = JSON.parse(config.get('healthCheckProjects'))
+ if (HEALTH_CHECK_PROJECTS.length !== 2) {
+ throw new Error('expected 2 healthCheckProjects')
+ }
+ if (!HEALTH_CHECK_PROJECTS.some(id => id.length === 24)) {
+ throw new Error('expected mongo id in healthCheckProjects')
+ }
+ if (!HEALTH_CHECK_PROJECTS.some(id => id.length < 24)) {
+ throw new Error('expected postgres id in healthCheckProjects')
+ }
+
+ for (const historyId of HEALTH_CHECK_PROJECTS) {
+ if (!(await projectHasLatestChunk(historyId))) {
+ throw new Error(`project has no history: ${historyId}`)
+ }
+ }
+}
+
+export const healthCheckCb = callbackify(healthCheck)
+export const deleteProjectBackupCb = callbackify(deleteProjectBackup)
diff --git a/services/history-v1/storage/lib/backupGenerator.mjs b/services/history-v1/storage/lib/backupGenerator.mjs
new file mode 100644
index 0000000000..d8f1b0e99a
--- /dev/null
+++ b/services/history-v1/storage/lib/backupGenerator.mjs
@@ -0,0 +1,153 @@
+/**
+ * Provides a generator function to back up project chunks and blobs.
+ */
+
+import chunkStore from './chunk_store/index.js'
+
+import {
+ GLOBAL_BLOBS, // NOTE: must call loadGlobalBlobs() before using this
+ BlobStore,
+} from './blob_store/index.js'
+
+import assert from './assert.js'
+
+async function lookBehindForSeenBlobs(
+ projectId,
+ chunk,
+ lastBackedUpVersion,
+ seenBlobs
+) {
+ if (chunk.startVersion === 0) {
+ return // this is the first chunk, no need to check for blobs in the previous chunk
+ }
+ if (chunk.startVersion > 0 && lastBackedUpVersion > chunk.startVersion) {
+ return // the snapshot in this chunk has already been backed up
+ }
+ if (
+ chunk.startVersion > 0 &&
+ lastBackedUpVersion === chunk.startVersion // same as previousChunk.endVersion
+ ) {
+ // the snapshot in this chunk has not been backed up
+ // so we find the set of backed up blobs from the previous chunk
+ const previousChunk = await chunkStore.loadAtVersion(
+ projectId,
+ lastBackedUpVersion,
+ { persistedOnly: true }
+ )
+ const previousChunkHistory = previousChunk.getHistory()
+ previousChunkHistory.findBlobHashes(seenBlobs)
+ }
+}
+
+/**
+ * Records blob hashes that have been previously seen in a chunk's history.
+ *
+ * @param {Object} chunk - The chunk containing history data
+ * @param {number} currentBackedUpVersion - The version number that has been backed up
+ * @param {Set} seenBlobs - Set to collect previously seen blob hashes
+ * @returns {void}
+ */
+function recordPreviouslySeenBlobs(chunk, currentBackedUpVersion, seenBlobs) {
+ // We need to look at the chunk and decide how far we have backed up.
+ // If we have not backed up this chunk at all, we need to backup the blobs
+ // in the snapshot. Otherwise we need to backup the blobs in the changes
+ // that have occurred since the last backup.
+ const history = chunk.getHistory()
+ const startVersion = chunk.getStartVersion()
+ if (currentBackedUpVersion === 0) {
+ // If we have only backed up version 0 (i.e. the first change)
+ // then that includes the initial snapshot, so we consider
+ // the blobs of the initial snapshot as seen. If the project
+ // has not been backed up at all then currentBackedUpVersion
+ // will be undefined.
+ history.snapshot.findBlobHashes(seenBlobs)
+ } else if (currentBackedUpVersion > startVersion) {
+ history.snapshot.findBlobHashes(seenBlobs)
+ for (let i = 0; i < currentBackedUpVersion - startVersion; i++) {
+ history.changes[i].findBlobHashes(seenBlobs)
+ }
+ }
+}
+
+/**
+ * Collects new blob objects that need to be backed up from a given chunk.
+ *
+ * @param {Object} chunk - The chunk object containing history data
+ * @param {Object} blobStore - Storage interface for retrieving blobs
+ * @param {Set} seenBlobs - Set of blob hashes that have already been processed
+ * @returns {Promise} Array of blob objects that need to be backed up
+ * @throws {Error} If blob retrieval fails
+ */
+async function collectNewBlobsForBackup(chunk, blobStore, seenBlobs) {
+ /** @type {Set} */
+ const blobHashes = new Set()
+ const history = chunk.getHistory()
+ // Get all the blobs in this chunk, then exclude the seenBlobs and global blobs
+ history.findBlobHashes(blobHashes)
+ const blobsToBackup = await blobStore.getBlobs(
+ [...blobHashes].filter(
+ hash =>
+ hash &&
+ !seenBlobs.has(hash) &&
+ (!GLOBAL_BLOBS.has(hash) || GLOBAL_BLOBS.get(hash).demoted)
+ )
+ )
+ return blobsToBackup
+}
+
+/**
+ * Asynchronously generates backups for a project based on provided versions.
+ * @param {string} projectId - The ID of the project's history to back up.
+ * @param {number} lastBackedUpVersion - The last version that was successfully backed up.
+ * @yields {AsyncGenerator<{ chunkRecord: object, chunkToBackup: object, chunkBuffer: Buffer, blobsToBackup: object[] }>}
+ * Yields chunk records and corresponding data needed for backups.
+ */
+export async function* backupGenerator(projectId, lastBackedUpVersion) {
+ assert.projectId(projectId, 'bad projectId')
+ assert.maybe.integer(lastBackedUpVersion, 'bad lastBackedUpVersion')
+
+ const blobStore = new BlobStore(projectId)
+
+ /** @type {Set} */
+ const seenBlobs = new Set() // records the blobs that are already backed up
+
+ const firstPendingVersion =
+ lastBackedUpVersion >= 0 ? lastBackedUpVersion + 1 : 0
+ let isStartingChunk = true
+ let currentBackedUpVersion = lastBackedUpVersion
+ const chunkRecordIterator = chunkStore.getProjectChunksFromVersion(
+ projectId,
+ firstPendingVersion
+ )
+
+ for await (const chunkRecord of chunkRecordIterator) {
+ const { chunk, chunkBuffer } = await chunkStore.loadByChunkRecord(
+ projectId,
+ chunkRecord
+ )
+
+ if (isStartingChunk) {
+ await lookBehindForSeenBlobs(
+ projectId,
+ chunkRecord,
+ lastBackedUpVersion,
+ seenBlobs
+ )
+ isStartingChunk = false
+ }
+
+ recordPreviouslySeenBlobs(chunk, currentBackedUpVersion, seenBlobs)
+
+ const blobsToBackup = await collectNewBlobsForBackup(
+ chunk,
+ blobStore,
+ seenBlobs
+ )
+
+ yield { chunkRecord, chunkToBackup: chunk, chunkBuffer, blobsToBackup }
+
+ // After we generate a backup of this chunk, mark the backed up blobs as seen
+ blobsToBackup.forEach(blob => seenBlobs.add(blob.getHash()))
+ currentBackedUpVersion = chunkRecord.endVersion
+ }
+}
diff --git a/services/history-v1/storage/lib/backupPersistor.mjs b/services/history-v1/storage/lib/backupPersistor.mjs
new file mode 100644
index 0000000000..8f80e5faaf
--- /dev/null
+++ b/services/history-v1/storage/lib/backupPersistor.mjs
@@ -0,0 +1,121 @@
+// @ts-check
+import fs from 'node:fs'
+import Path from 'node:path'
+import _ from 'lodash'
+import config from 'config'
+import { SecretManagerServiceClient } from '@google-cloud/secret-manager'
+import OError from '@overleaf/o-error'
+import {
+ PerProjectEncryptedS3Persistor,
+ RootKeyEncryptionKey,
+} from '@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor.js'
+import { HistoryStore } from './history_store.js'
+
+const persistorConfig = _.cloneDeep(config.get('backupPersistor'))
+const { chunksBucket, deksBucket, globalBlobsBucket, projectBlobsBucket } =
+ config.get('backupStore')
+
+export { chunksBucket, globalBlobsBucket, projectBlobsBucket }
+
+function convertKey(key, convertFn) {
+ if (_.has(persistorConfig, key)) {
+ _.update(persistorConfig, key, convertFn)
+ }
+}
+
+convertKey('s3SSEC.httpOptions.timeout', s => parseInt(s, 10))
+convertKey('s3SSEC.maxRetries', s => parseInt(s, 10))
+convertKey('s3SSEC.pathStyle', s => s === 'true')
+// array of CA, either inlined or on disk
+convertKey('s3SSEC.ca', s =>
+ JSON.parse(s).map(ca => (ca.startsWith('/') ? fs.readFileSync(ca) : ca))
+)
+
+/** @type {() => Promise} */
+let getRawRootKeyEncryptionKeys
+
+if ((process.env.NODE_ENV || 'production') === 'production') {
+ ;[persistorConfig.s3SSEC.key, persistorConfig.s3SSEC.secret] = (
+ await loadFromSecretsManager(
+ process.env.BACKUP_AWS_CREDENTIALS || '',
+ 'BACKUP_AWS_CREDENTIALS'
+ )
+ ).split(':')
+ getRawRootKeyEncryptionKeys = () =>
+ loadFromSecretsManager(
+ persistorConfig.keyEncryptionKeys,
+ 'BACKUP_KEY_ENCRYPTION_KEYS'
+ )
+} else {
+ getRawRootKeyEncryptionKeys = () => persistorConfig.keyEncryptionKeys
+}
+
+export const DELETION_ONLY = persistorConfig.keyEncryptionKeys === 'none'
+if (DELETION_ONLY) {
+ // For Backup-deleter; should not encrypt or read data; deleting does not need key.
+ getRawRootKeyEncryptionKeys = () => new Promise(_resolve => {})
+}
+
+const PROJECT_FOLDER_REGEX =
+ /^\d{3}\/\d{3}\/\d{3,}\/|[0-9a-f]{3}\/[0-9a-f]{3}\/[0-9a-f]{18}\/$/
+
+/**
+ * @param {string} bucketName
+ * @param {string} path
+ * @return {string}
+ */
+export function pathToProjectFolder(bucketName, path) {
+ switch (bucketName) {
+ case deksBucket:
+ case chunksBucket:
+ case projectBlobsBucket:
+ const projectFolder = Path.join(...path.split('/').slice(0, 3)) + '/'
+ if (!PROJECT_FOLDER_REGEX.test(projectFolder)) {
+ throw new OError('invalid project folder', { bucketName, path })
+ }
+ return projectFolder
+ default:
+ throw new Error(`${bucketName} does not store per-project files`)
+ }
+}
+
+/**
+ * @param {string} name
+ * @param {string} label
+ * @return {Promise}
+ */
+async function loadFromSecretsManager(name, label) {
+ const client = new SecretManagerServiceClient()
+ const [version] = await client.accessSecretVersion({ name })
+ if (!version.payload?.data) throw new Error(`empty secret: ${label}`)
+ return version.payload.data.toString()
+}
+
+async function getRootKeyEncryptionKeys() {
+ return JSON.parse(await getRawRootKeyEncryptionKeys()).map(
+ ({ key, salt }) => {
+ return new RootKeyEncryptionKey(
+ Buffer.from(key, 'base64'),
+ Buffer.from(salt, 'base64')
+ )
+ }
+ )
+}
+
+export const backupPersistor = new PerProjectEncryptedS3Persistor({
+ ...persistorConfig.s3SSEC,
+ disableMultiPartUpload: true,
+ dataEncryptionKeyBucketName: deksBucket,
+ pathToProjectFolder,
+ getRootKeyEncryptionKeys,
+ storageClass: {
+ [deksBucket]: 'STANDARD',
+ [chunksBucket]: persistorConfig.tieringStorageClass,
+ [projectBlobsBucket]: persistorConfig.tieringStorageClass,
+ },
+})
+
+export const backupHistoryStore = new HistoryStore(
+ backupPersistor,
+ chunksBucket
+)
diff --git a/services/history-v1/storage/lib/backupVerifier.mjs b/services/history-v1/storage/lib/backupVerifier.mjs
new file mode 100644
index 0000000000..6e767b21ba
--- /dev/null
+++ b/services/history-v1/storage/lib/backupVerifier.mjs
@@ -0,0 +1,220 @@
+// @ts-check
+import OError from '@overleaf/o-error'
+import chunkStore from '../lib/chunk_store/index.js'
+import {
+ backupPersistor,
+ chunksBucket,
+ projectBlobsBucket,
+} from './backupPersistor.mjs'
+import { Blob, Chunk, History } from 'overleaf-editor-core'
+import { BlobStore, GLOBAL_BLOBS, makeProjectKey } from './blob_store/index.js'
+import blobHash from './blob_hash.js'
+import { NotFoundError } from '@overleaf/object-persistor/src/Errors.js'
+import logger from '@overleaf/logger'
+import path from 'node:path'
+import projectKey from './project_key.js'
+import streams from './streams.js'
+import objectPersistor from '@overleaf/object-persistor'
+import { getEndDateForRPO } from '../../backupVerifier/utils.mjs'
+
+/**
+ * @typedef {import("@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor.js").CachedPerProjectEncryptedS3Persistor} CachedPerProjectEncryptedS3Persistor
+ */
+
+/**
+ * @param {string} historyId
+ * @param {string} hash
+ */
+export async function verifyBlob(historyId, hash) {
+ return await verifyBlobs(historyId, [hash])
+}
+
+/**
+ *
+ * @param {string} historyId
+ * @return {Promise}
+ */
+async function getProjectPersistor(historyId) {
+ try {
+ return await backupPersistor.forProjectRO(
+ projectBlobsBucket,
+ makeProjectKey(historyId, '')
+ )
+ } catch (err) {
+ if (err instanceof NotFoundError) {
+ throw new BackupCorruptedError('dek does not exist', {}, err)
+ }
+ throw err
+ }
+}
+
+/**
+ * @param {string} historyId
+ * @param {Array} hashes
+ * @param {CachedPerProjectEncryptedS3Persistor} [projectCache]
+ */
+export async function verifyBlobs(historyId, hashes, projectCache) {
+ if (hashes.length === 0) throw new Error('bug: empty hashes')
+
+ if (!projectCache) {
+ projectCache = await getProjectPersistor(historyId)
+ }
+ const blobStore = new BlobStore(historyId)
+ for (const hash of hashes) {
+ const path = makeProjectKey(historyId, hash)
+ const blob = await blobStore.getBlob(hash)
+ if (!blob) throw new Blob.NotFoundError(hash)
+ let stream
+ try {
+ stream = await projectCache.getObjectStream(projectBlobsBucket, path, {
+ autoGunzip: true,
+ })
+ } catch (err) {
+ if (err instanceof NotFoundError) {
+ throw new BackupCorruptedMissingBlobError('missing blob', {
+ path,
+ hash,
+ })
+ }
+ throw err
+ }
+ const backupHash = await blobHash.fromStream(blob.getByteLength(), stream)
+ if (backupHash !== hash) {
+ throw new BackupCorruptedInvalidBlobError(
+ 'hash mismatch for backed up blob',
+ {
+ path,
+ hash,
+ backupHash,
+ }
+ )
+ }
+ }
+}
+
+/**
+ * @param {string} historyId
+ * @param {Date} [endTimestamp]
+ */
+export async function verifyProjectWithErrorContext(
+ historyId,
+ endTimestamp = getEndDateForRPO()
+) {
+ try {
+ await verifyProject(historyId, endTimestamp)
+ } catch (err) {
+ // @ts-ignore err is Error instance
+ throw OError.tag(err, 'verifyProject', { historyId, endTimestamp })
+ }
+}
+
+/**
+ *
+ * @param {string} historyId
+ * @param {number} startVersion
+ * @param {CachedPerProjectEncryptedS3Persistor} backupPersistorForProject
+ * @return {Promise}
+ */
+export async function loadChunk(
+ historyId,
+ startVersion,
+ backupPersistorForProject
+) {
+ const key = path.join(
+ projectKey.format(historyId),
+ projectKey.pad(startVersion)
+ )
+ try {
+ const buf = await streams.gunzipStreamToBuffer(
+ await backupPersistorForProject.getObjectStream(chunksBucket, key)
+ )
+ return JSON.parse(buf.toString('utf-8'))
+ } catch (err) {
+ if (err instanceof objectPersistor.Errors.NotFoundError) {
+ throw new Chunk.NotPersistedError(historyId)
+ }
+ if (err instanceof Error) {
+ throw OError.tag(err, 'Failed to load chunk', { historyId, startVersion })
+ }
+ throw err
+ }
+}
+
+/**
+ * @param {string} historyId
+ * @param {Date} endTimestamp
+ */
+export async function verifyProject(historyId, endTimestamp) {
+ const backend = chunkStore.getBackend(historyId)
+ const [first, last] = await Promise.all([
+ backend.getFirstChunkBeforeTimestamp(historyId, endTimestamp),
+ backend.getLastActiveChunkBeforeTimestamp(historyId, endTimestamp),
+ ])
+
+ const chunksRecordsToVerify = [
+ {
+ chunkId: first.id,
+ chunkLabel: 'first',
+ },
+ ]
+ if (first.startVersion !== last.startVersion) {
+ chunksRecordsToVerify.push({
+ chunkId: last.id,
+ chunkLabel: 'last before RPO',
+ })
+ }
+
+ const projectCache = await getProjectPersistor(historyId)
+
+ const chunks = await Promise.all(
+ chunksRecordsToVerify.map(async chunk => {
+ try {
+ return History.fromRaw(
+ await loadChunk(historyId, chunk.startVersion, projectCache)
+ )
+ } catch (err) {
+ if (err instanceof Chunk.NotPersistedError) {
+ throw new BackupRPOViolationChunkNotBackedUpError(
+ 'BackupRPOviolation: chunk not backed up',
+ chunk
+ )
+ }
+ throw err
+ }
+ })
+ )
+ const seenBlobs = new Set()
+ const blobsToVerify = []
+ for (const chunk of chunks) {
+ /** @type {Set} */
+ const chunkBlobs = new Set()
+ chunk.findBlobHashes(chunkBlobs)
+ let hasAddedBlobFromThisChunk = false
+ for (const blobHash of chunkBlobs) {
+ if (seenBlobs.has(blobHash)) continue // old blob
+ if (GLOBAL_BLOBS.has(blobHash)) continue // global blob
+ seenBlobs.add(blobHash)
+ if (!hasAddedBlobFromThisChunk) {
+ blobsToVerify.push(blobHash)
+ hasAddedBlobFromThisChunk = true
+ }
+ }
+ }
+ if (blobsToVerify.length === 0) {
+ logger.debug(
+ {
+ historyId,
+ chunksRecordsToVerify: chunksRecordsToVerify.map(c => c.chunkId),
+ },
+ 'chunks contain no blobs to verify'
+ )
+ return
+ }
+ await verifyBlobs(historyId, blobsToVerify, projectCache)
+}
+
+export class BackupCorruptedError extends OError {}
+export class BackupRPOViolationError extends OError {}
+export class BackupCorruptedMissingBlobError extends BackupCorruptedError {}
+export class BackupCorruptedInvalidBlobError extends BackupCorruptedError {}
+export class BackupRPOViolationChunkNotBackedUpError extends OError {}
diff --git a/services/history-v1/storage/lib/backup_store/index.js b/services/history-v1/storage/lib/backup_store/index.js
new file mode 100644
index 0000000000..da7944786a
--- /dev/null
+++ b/services/history-v1/storage/lib/backup_store/index.js
@@ -0,0 +1,212 @@
+const { Binary, ObjectId } = require('mongodb')
+const { projects, backedUpBlobs } = require('../mongodb')
+const OError = require('@overleaf/o-error')
+
+// List projects with pending backups older than the specified interval
+function listPendingBackups(timeIntervalMs = 0, limit = null) {
+ const cutoffTime = new Date(Date.now() - timeIntervalMs)
+ const options = {
+ projection: { 'overleaf.backup.pendingChangeAt': 1 },
+ sort: { 'overleaf.backup.pendingChangeAt': 1 },
+ }
+
+ // Apply limit if provided
+ if (limit) {
+ options.limit = limit
+ }
+
+ const cursor = projects.find(
+ {
+ 'overleaf.backup.pendingChangeAt': {
+ $exists: true,
+ $lt: cutoffTime,
+ },
+ },
+ options
+ )
+ return cursor
+}
+
+// List projects that have never been backed up and are older than the specified interval
+function listUninitializedBackups(timeIntervalMs = 0, limit = null) {
+ const cutoffTimeInSeconds = (Date.now() - timeIntervalMs) / 1000
+ const options = {
+ projection: { _id: 1 },
+ sort: { _id: 1 },
+ }
+ // Apply limit if provided
+ if (limit) {
+ options.limit = limit
+ }
+ const cursor = projects.find(
+ {
+ 'overleaf.backup.lastBackedUpVersion': null,
+ _id: {
+ $lt: ObjectId.createFromTime(cutoffTimeInSeconds),
+ },
+ },
+ options
+ )
+ return cursor
+}
+
+// Retrieve the history ID for a given project without giving direct access to the
+// projects collection.
+
+async function getHistoryId(projectId) {
+ const project = await projects.findOne(
+ { _id: new ObjectId(projectId) },
+ {
+ projection: {
+ 'overleaf.history.id': 1,
+ },
+ }
+ )
+ if (!project) {
+ throw new Error('Project not found')
+ }
+ return project.overleaf.history.id
+}
+
+async function getBackupStatus(projectId) {
+ const project = await projects.findOne(
+ { _id: new ObjectId(projectId) },
+ {
+ projection: {
+ 'overleaf.history': 1,
+ 'overleaf.backup': 1,
+ },
+ }
+ )
+ if (!project) {
+ throw new Error('Project not found')
+ }
+ return {
+ backupStatus: project.overleaf.backup,
+ historyId: `${project.overleaf.history.id}`,
+ currentEndVersion: project.overleaf.history.currentEndVersion,
+ currentEndTimestamp: project.overleaf.history.currentEndTimestamp,
+ }
+}
+
+async function setBackupVersion(
+ projectId,
+ previousBackedUpVersion,
+ currentBackedUpVersion,
+ currentBackedUpAt
+) {
+ // FIXME: include a check to handle race conditions
+ // to make sure only one process updates the version numbers
+ const result = await projects.updateOne(
+ {
+ _id: new ObjectId(projectId),
+ 'overleaf.backup.lastBackedUpVersion': previousBackedUpVersion,
+ },
+ {
+ $set: {
+ 'overleaf.backup.lastBackedUpVersion': currentBackedUpVersion,
+ 'overleaf.backup.lastBackedUpAt': currentBackedUpAt,
+ },
+ }
+ )
+ if (result.matchedCount === 0 || result.modifiedCount === 0) {
+ throw new OError('Failed to update backup version', {
+ previousBackedUpVersion,
+ currentBackedUpVersion,
+ currentBackedUpAt,
+ result,
+ })
+ }
+}
+
+async function updateCurrentMetadataIfNotSet(projectId, latestChunkMetadata) {
+ await projects.updateOne(
+ {
+ _id: new ObjectId(projectId),
+ 'overleaf.history.currentEndVersion': { $exists: false },
+ 'overleaf.history.currentEndTimestamp': { $exists: false },
+ },
+ {
+ $set: {
+ 'overleaf.history.currentEndVersion': latestChunkMetadata.endVersion,
+ 'overleaf.history.currentEndTimestamp':
+ latestChunkMetadata.endTimestamp,
+ },
+ }
+ )
+}
+
+/**
+ * Updates the pending change timestamp for a project's backup status
+ * @param {string} projectId - The ID of the project to update
+ * @param {Date} backupStartTime - The timestamp to set for pending changes
+ * @returns {Promise}
+ *
+ * If the project's last backed up version matches the current end version,
+ * the pending change timestamp is removed. Otherwise, it's set to the provided
+ * backup start time.
+ */
+async function updatePendingChangeTimestamp(projectId, backupStartTime) {
+ await projects.updateOne({ _id: new ObjectId(projectId) }, [
+ {
+ $set: {
+ 'overleaf.backup.pendingChangeAt': {
+ $cond: {
+ if: {
+ $eq: [
+ '$overleaf.backup.lastBackedUpVersion',
+ '$overleaf.history.currentEndVersion',
+ ],
+ },
+ then: '$$REMOVE',
+ else: backupStartTime,
+ },
+ },
+ },
+ },
+ ])
+}
+
+async function getBackedUpBlobHashes(projectId) {
+ const result = await backedUpBlobs.findOne(
+ { _id: new ObjectId(projectId) },
+ { projection: { blobs: 1 } }
+ )
+ if (!result) {
+ return new Set()
+ }
+ const hashes = result.blobs.map(b => b.buffer.toString('hex'))
+ return new Set(hashes)
+}
+
+async function unsetBackedUpBlobHashes(projectId, hashes) {
+ const binaryHashes = hashes.map(h => new Binary(Buffer.from(h, 'hex')))
+ const result = await backedUpBlobs.findOneAndUpdate(
+ { _id: new ObjectId(projectId) },
+ {
+ $pullAll: {
+ blobs: binaryHashes,
+ },
+ },
+ { returnDocument: 'after' }
+ )
+ if (result && result.blobs.length === 0) {
+ await backedUpBlobs.deleteOne({
+ _id: new ObjectId(projectId),
+ blobs: { $size: 0 },
+ })
+ }
+ return result
+}
+
+module.exports = {
+ getHistoryId,
+ getBackupStatus,
+ setBackupVersion,
+ updateCurrentMetadataIfNotSet,
+ updatePendingChangeTimestamp,
+ listPendingBackups,
+ listUninitializedBackups,
+ getBackedUpBlobHashes,
+ unsetBackedUpBlobHashes,
+}
diff --git a/services/history-v1/storage/lib/blob_hash.js b/services/history-v1/storage/lib/blob_hash.js
index 5c2edac14f..10ac64b87b 100644
--- a/services/history-v1/storage/lib/blob_hash.js
+++ b/services/history-v1/storage/lib/blob_hash.js
@@ -2,9 +2,9 @@
'use strict'
const BPromise = require('bluebird')
-const fs = BPromise.promisifyAll(require('fs'))
-const crypto = require('crypto')
-const { pipeline } = require('stream')
+const fs = BPromise.promisifyAll(require('node:fs'))
+const crypto = require('node:crypto')
+const { pipeline } = require('node:stream')
const assert = require('./assert')
function getGitBlobHeader(byteLength) {
@@ -63,7 +63,7 @@ exports.fromString = function blobHashFromString(string) {
* Compute the git blob hash for the content of a file
*
* @param {string} filePath
- * @return {string} hexadecimal SHA-1 hash
+ * @return {Promise} hexadecimal SHA-1 hash
*/
exports.fromFile = function blobHashFromFile(pathname) {
assert.string(pathname, 'blobHash: bad pathname')
diff --git a/services/history-v1/storage/lib/blob_store/index.js b/services/history-v1/storage/lib/blob_store/index.js
index 6f5632a595..033e288554 100644
--- a/services/history-v1/storage/lib/blob_store/index.js
+++ b/services/history-v1/storage/lib/blob_store/index.js
@@ -1,7 +1,7 @@
'use strict'
const config = require('config')
-const fs = require('fs')
+const fs = require('node:fs')
const isValidUtf8 = require('utf-8-validate')
const { ReadableString } = require('@overleaf/stream-utils')
@@ -24,6 +24,7 @@ const logger = require('@overleaf/logger')
/** @import { Readable } from 'stream' */
+/** @type {Map} */
const GLOBAL_BLOBS = new Map()
function makeGlobalKey(hash) {
@@ -79,23 +80,12 @@ function getBackend(projectId) {
}
async function makeBlobForFile(pathname) {
- async function getByteLengthOfFile() {
- const stat = await fs.promises.stat(pathname)
- return stat.size
- }
-
- async function getHashOfFile(blob) {
- const stream = fs.createReadStream(pathname)
- const hash = await blobHash.fromStream(blob.getByteLength(), stream)
- return hash
- }
-
- const blob = new Blob()
- const byteLength = await getByteLengthOfFile()
- blob.setByteLength(byteLength)
- const hash = await getHashOfFile(blob)
- blob.setHash(hash)
- return blob
+ const { size: byteLength } = await fs.promises.stat(pathname)
+ const hash = await blobHash.fromStream(
+ byteLength,
+ fs.createReadStream(pathname)
+ )
+ return new Blob(hash, byteLength)
}
async function getStringLengthOfFile(byteLength, pathname) {
@@ -136,6 +126,34 @@ async function loadGlobalBlobs() {
}
}
+/**
+ * Return metadata for all blobs in the given project
+ * @param {Array} projectIds
+ * @return {Promise<{nBlobs:number, blobs:Map>}>}
+ */
+async function getProjectBlobsBatch(projectIds) {
+ const mongoProjects = []
+ const postgresProjects = []
+ for (const projectId of projectIds) {
+ if (typeof projectId === 'number') {
+ postgresProjects.push(projectId)
+ } else {
+ mongoProjects.push(projectId)
+ }
+ }
+ const [
+ { nBlobs: nBlobsPostgres, blobs: blobsPostgres },
+ { nBlobs: nBlobsMongo, blobs: blobsMongo },
+ ] = await Promise.all([
+ postgresBackend.getProjectBlobsBatch(postgresProjects),
+ mongoBackend.getProjectBlobsBatch(mongoProjects),
+ ])
+ for (const [id, blobs] of blobsPostgres.entries()) {
+ blobsMongo.set(id.toString(), blobs)
+ }
+ return { nBlobs: nBlobsPostgres + nBlobsMongo, blobs: blobsMongo }
+}
+
/**
* @classdesc
* Fetch and store the content of files using content-addressable hashing. The
@@ -188,7 +206,7 @@ class BlobStore {
* temporary file).
*
* @param {string} pathname
- * @return {Promise.}
+ * @return {Promise}
*/
async putFile(pathname) {
assert.string(pathname, 'bad pathname')
@@ -202,11 +220,28 @@ class BlobStore {
pathname
)
newBlob.setStringLength(stringLength)
- await uploadBlob(this.projectId, newBlob, fs.createReadStream(pathname))
- await this.backend.insertBlob(this.projectId, newBlob)
+ await this.putBlob(pathname, newBlob)
return newBlob
}
+ /**
+ * Write a new blob, the stringLength must have been added already. It should
+ * have been checked that the blob does not exist yet. Consider using
+ * {@link putFile} instead of this lower-level method.
+ *
+ * @param {string} pathname
+ * @param {core.Blob} finializedBlob
+ * @return {Promise}
+ */
+ async putBlob(pathname, finializedBlob) {
+ await uploadBlob(
+ this.projectId,
+ finializedBlob,
+ fs.createReadStream(pathname)
+ )
+ await this.backend.insertBlob(this.projectId, finializedBlob)
+ }
+
/**
* Stores an object as a JSON string in a blob.
*
@@ -275,14 +310,15 @@ class BlobStore {
* failure, so the caller must be prepared to retry on errors, if appropriate.
*
* @param {string} hash hexadecimal SHA-1 hash
+ * @param {Object} opts
* @return {Promise.} a stream to read the file
*/
- async getStream(hash) {
+ async getStream(hash, opts = {}) {
assert.blobHash(hash, 'bad hash')
const { bucket, key } = getBlobLocation(this.projectId, hash)
try {
- const stream = await persistor.getObjectStream(bucket, key)
+ const stream = await persistor.getObjectStream(bucket, key, opts)
return stream
} catch (err) {
if (err instanceof objectPersistor.Errors.NotFoundError) {
@@ -308,6 +344,11 @@ class BlobStore {
return blob
}
+ /**
+ *
+ * @param {Array} hashes
+ * @return {Promise<*[]>}
+ */
async getBlobs(hashes) {
assert.array(hashes, 'bad hashes')
const nonGlobalHashes = []
@@ -320,6 +361,9 @@ class BlobStore {
nonGlobalHashes.push(hash)
}
}
+ if (nonGlobalHashes.length === 0) {
+ return blobs // to avoid unnecessary database lookup
+ }
const projectBlobs = await this.backend.findBlobs(
this.projectId,
nonGlobalHashes
@@ -328,6 +372,16 @@ class BlobStore {
return blobs
}
+ /**
+ * Retrieve all blobs associated with the project.
+ * @returns {Promise} A promise that resolves to an array of blobs.
+ */
+
+ async getProjectBlobs() {
+ const projectBlobs = await this.backend.getProjectBlobs(this.projectId)
+ return projectBlobs
+ }
+
/**
* Delete all blobs that belong to the project.
*/
@@ -346,6 +400,41 @@ class BlobStore {
const blob = await this.backend.findBlob(this.projectId, hash)
return blob
}
+
+ /**
+ * Copy an existing sourceBlob in this project to a target project.
+ * @param {Blob} sourceBlob
+ * @param {string} targetProjectId
+ * @return {Promise}
+ */
+ async copyBlob(sourceBlob, targetProjectId) {
+ assert.instance(sourceBlob, Blob, 'bad sourceBlob')
+ assert.projectId(targetProjectId, 'bad targetProjectId')
+ const hash = sourceBlob.getHash()
+ const sourceProjectId = this.projectId
+ const { bucket, key: sourceKey } = getBlobLocation(sourceProjectId, hash)
+ const destKey = makeProjectKey(targetProjectId, hash)
+ const targetBackend = getBackend(targetProjectId)
+ logger.debug({ sourceProjectId, targetProjectId, hash }, 'copyBlob started')
+ try {
+ await persistor.copyObject(bucket, sourceKey, destKey)
+ await targetBackend.insertBlob(targetProjectId, sourceBlob)
+ } finally {
+ logger.debug(
+ { sourceProjectId, targetProjectId, hash },
+ 'copyBlob finished'
+ )
+ }
+ }
}
-module.exports = { BlobStore, loadGlobalBlobs }
+module.exports = {
+ BlobStore,
+ getProjectBlobsBatch,
+ loadGlobalBlobs,
+ makeProjectKey,
+ makeGlobalKey,
+ makeBlobForFile,
+ getStringLengthOfFile,
+ GLOBAL_BLOBS,
+}
diff --git a/services/history-v1/storage/lib/blob_store/mongo.js b/services/history-v1/storage/lib/blob_store/mongo.js
index 6bd516addb..9117382148 100644
--- a/services/history-v1/storage/lib/blob_store/mongo.js
+++ b/services/history-v1/storage/lib/blob_store/mongo.js
@@ -1,3 +1,4 @@
+// @ts-check
/**
* Mongo backend for the blob store.
*
@@ -15,15 +16,20 @@
*/
const { Blob } = require('overleaf-editor-core')
-const { ObjectId, Binary } = require('mongodb')
+const { ObjectId, Binary, MongoError, ReadPreference } = require('mongodb')
const assert = require('../assert')
const mongodb = require('../mongodb')
const MAX_BLOBS_IN_BUCKET = 8
const DUPLICATE_KEY_ERROR_CODE = 11000
+/**
+ * @typedef {import('mongodb').ReadPreferenceLike} ReadPreferenceLike
+ */
+
/**
* Set up the data structures for a given project.
+ * @param {string} projectId
*/
async function initialize(projectId) {
assert.mongoId(projectId, 'bad projectId')
@@ -33,14 +39,18 @@ async function initialize(projectId) {
blobs: {},
})
} catch (err) {
- if (err.code !== DUPLICATE_KEY_ERROR_CODE) {
- throw err
+ if (err instanceof MongoError && err.code === DUPLICATE_KEY_ERROR_CODE) {
+ return // ignore already initialized case
}
+ throw err
}
}
/**
* Return blob metadata for the given project and hash.
+ * @param {string} projectId
+ * @param {string} hash
+ * @return {Promise}
*/
async function findBlob(projectId, hash) {
assert.mongoId(projectId, 'bad projectId')
@@ -69,6 +79,9 @@ async function findBlob(projectId, hash) {
/**
* Search in the sharded collection for blob metadata
+ * @param {string} projectId
+ * @param {string} hash
+ * @return {Promise}
*/
async function findBlobSharded(projectId, hash) {
const [shard, bucket] = getShardedBucket(hash)
@@ -81,11 +94,15 @@ async function findBlobSharded(projectId, hash) {
return null
}
const record = result.blobs.find(blob => blob.h.toString('hex') === hash)
+ if (!record) return null
return recordToBlob(record)
}
/**
* Read multiple blob metadata records by hexadecimal hashes.
+ * @param {string} projectId
+ * @param {Array} hashes
+ * @return {Promise>}
*/
async function findBlobs(projectId, hashes) {
assert.mongoId(projectId, 'bad projectId')
@@ -135,6 +152,9 @@ async function findBlobs(projectId, hashes) {
/**
* Search in the sharded collection for blob metadata.
+ * @param {string} projectId
+ * @param {Set} hashSet
+ * @return {Promise>}
*/
async function findBlobsSharded(projectId, hashSet) {
// Build a map of buckets by shard key
@@ -181,8 +201,113 @@ async function findBlobsSharded(projectId, hashSet) {
return blobs
}
+/**
+ * Return metadata for all blobs in the given project
+ */
+async function getProjectBlobs(projectId) {
+ assert.mongoId(projectId, 'bad projectId')
+
+ const result = await mongodb.blobs.findOne(
+ { _id: new ObjectId(projectId) },
+ { projection: { _id: 0 } }
+ )
+
+ if (!result) {
+ return []
+ }
+
+ // Build blobs from the query results
+ const blobs = []
+ for (const bucket of Object.values(result.blobs)) {
+ for (const record of bucket) {
+ blobs.push(recordToBlob(record))
+ }
+ }
+
+ // Look for all possible sharded blobs
+
+ const minShardedId = makeShardedId(projectId, '0')
+ const maxShardedId = makeShardedId(projectId, 'f')
+ // @ts-ignore We are using a custom _id here.
+ const shardedRecords = mongodb.shardedBlobs.find(
+ {
+ _id: { $gte: minShardedId, $lte: maxShardedId },
+ },
+ { projection: { _id: 0 } }
+ )
+
+ for await (const shardedRecord of shardedRecords) {
+ if (shardedRecord.blobs == null) {
+ continue
+ }
+ for (const bucket of Object.values(shardedRecord.blobs)) {
+ for (const record of bucket) {
+ blobs.push(recordToBlob(record))
+ }
+ }
+ }
+
+ return blobs
+}
+
+/**
+ * Return metadata for all blobs in the given project
+ * @param {Array} projectIds
+ * @return {Promise<{ nBlobs: number, blobs: Map> }>}
+ */
+async function getProjectBlobsBatch(projectIds) {
+ for (const project of projectIds) {
+ assert.mongoId(project, 'bad projectId')
+ }
+ let nBlobs = 0
+ const blobs = new Map()
+ if (projectIds.length === 0) return { nBlobs, blobs }
+
+ // blobs
+ {
+ const cursor = await mongodb.blobs.find(
+ { _id: { $in: projectIds.map(projectId => new ObjectId(projectId)) } },
+ { readPreference: ReadPreference.secondaryPreferred }
+ )
+ for await (const record of cursor) {
+ const projectBlobs = Object.values(record.blobs).flat().map(recordToBlob)
+ blobs.set(record._id.toString(), projectBlobs)
+ nBlobs += projectBlobs.length
+ }
+ }
+
+ // sharded blobs
+ {
+ // @ts-ignore We are using a custom _id here.
+ const cursor = await mongodb.shardedBlobs.find(
+ {
+ _id: {
+ $gte: makeShardedId(projectIds[0], '0'),
+ $lte: makeShardedId(projectIds[projectIds.length - 1], 'f'),
+ },
+ },
+ { readPreference: ReadPreference.secondaryPreferred }
+ )
+ for await (const record of cursor) {
+ const recordIdHex = record._id.toString('hex')
+ const recordProjectId = recordIdHex.slice(0, 24)
+ const projectBlobs = Object.values(record.blobs).flat().map(recordToBlob)
+ const found = blobs.get(recordProjectId)
+ if (found) {
+ found.push(...projectBlobs)
+ } else {
+ blobs.set(recordProjectId, projectBlobs)
+ }
+ nBlobs += projectBlobs.length
+ }
+ }
+ return { nBlobs, blobs }
+}
+
/**
* Add a blob's metadata to the blobs collection after it has been uploaded.
+ * @param {string} projectId
+ * @param {Blob} blob
*/
async function insertBlob(projectId, blob) {
assert.mongoId(projectId, 'bad projectId')
@@ -208,6 +333,10 @@ async function insertBlob(projectId, blob) {
/**
* Add a blob's metadata to the sharded blobs collection.
+ * @param {string} projectId
+ * @param {string} hash
+ * @param {Record} record
+ * @return {Promise}
*/
async function insertRecordSharded(projectId, hash, record) {
const [shard, bucket] = getShardedBucket(hash)
@@ -221,6 +350,7 @@ async function insertRecordSharded(projectId, hash, record) {
/**
* Delete all blobs for a given project.
+ * @param {string} projectId
*/
async function deleteBlobs(projectId) {
assert.mongoId(projectId, 'bad projectId')
@@ -228,12 +358,15 @@ async function deleteBlobs(projectId) {
const minShardedId = makeShardedId(projectId, '0')
const maxShardedId = makeShardedId(projectId, 'f')
await mongodb.shardedBlobs.deleteMany({
+ // @ts-ignore We are using a custom _id here.
_id: { $gte: minShardedId, $lte: maxShardedId },
})
}
/**
* Return the Mongo path to the bucket for the given hash.
+ * @param {string} hash
+ * @return {string}
*/
function getBucket(hash) {
return `blobs.${hash.slice(0, 3)}`
@@ -242,6 +375,8 @@ function getBucket(hash) {
/**
* Return the shard key and Mongo path to the bucket for the given hash in the
* sharded collection.
+ * @param {string} hash
+ * @return {[string, string]}
*/
function getShardedBucket(hash) {
const shard = hash.slice(0, 1)
@@ -251,13 +386,25 @@ function getShardedBucket(hash) {
/**
* Create an _id key for the sharded collection.
+ * @param {string} projectId
+ * @param {string} shard
+ * @return {Binary}
*/
function makeShardedId(projectId, shard) {
return new Binary(Buffer.from(`${projectId}0${shard}`, 'hex'))
}
+/**
+ * @typedef {Object} Record
+ * @property {Binary} h
+ * @property {number} b
+ * @property {number} [s]
+ */
+
/**
* Return the Mongo record for the given blob.
+ * @param {Blob} blob
+ * @return {Record}
*/
function blobToRecord(blob) {
const hash = blob.getHash()
@@ -272,11 +419,10 @@ function blobToRecord(blob) {
/**
* Create a blob from the given Mongo record.
+ * @param {Record} record
+ * @return {Blob}
*/
function recordToBlob(record) {
- if (record == null) {
- return
- }
return new Blob(record.h.toString('hex'), record.b, record.s)
}
@@ -284,6 +430,8 @@ module.exports = {
initialize,
findBlob,
findBlobs,
+ getProjectBlobs,
+ getProjectBlobsBatch,
insertBlob,
deleteBlobs,
}
diff --git a/services/history-v1/storage/lib/blob_store/postgres.js b/services/history-v1/storage/lib/blob_store/postgres.js
index 9e40c255da..1cedeec5d7 100644
--- a/services/history-v1/storage/lib/blob_store/postgres.js
+++ b/services/history-v1/storage/lib/blob_store/postgres.js
@@ -13,8 +13,8 @@ async function initialize(projectId) {
* Return blob metadata for the given project and hash
*/
async function findBlob(projectId, hash) {
+ assert.postgresId(projectId, 'bad projectId')
projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
assert.blobHash(hash, 'bad hash')
const binaryHash = hashToBuffer(hash)
@@ -35,8 +35,8 @@ async function findBlob(projectId, hash) {
* @return {Promise.>} no guarantee on order
*/
async function findBlobs(projectId, hashes) {
+ assert.postgresId(projectId, 'bad projectId')
projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
assert.array(hashes, 'bad hashes: not array')
hashes.forEach(function (hash) {
assert.blobHash(hash, 'bad hash')
@@ -53,12 +53,58 @@ async function findBlobs(projectId, hashes) {
return blobs
}
+/**
+ * Return metadata for all blobs in the given project
+ */
+async function getProjectBlobs(projectId) {
+ assert.postgresId(projectId, 'bad projectId')
+ projectId = parseInt(projectId, 10)
+
+ const records = await knex('project_blobs')
+ .select('hash_bytes', 'byte_length', 'string_length')
+ .where({
+ project_id: projectId,
+ })
+
+ const blobs = records.map(recordToBlob)
+ return blobs
+}
+
+/**
+ * Return metadata for all blobs in the given project
+ * @param {Array} projectIds
+ * @return {Promise<{ nBlobs: number, blobs: Map> }>}
+ */
+async function getProjectBlobsBatch(projectIds) {
+ for (const projectId of projectIds) {
+ assert.integer(projectId, 'bad projectId')
+ }
+ let nBlobs = 0
+ const blobs = new Map()
+ if (projectIds.length === 0) return { nBlobs, blobs }
+
+ const cursor = knex('project_blobs')
+ .select('project_id', 'hash_bytes', 'byte_length', 'string_length')
+ .whereIn('project_id', projectIds)
+ .stream()
+ for await (const record of cursor) {
+ const found = blobs.get(record.project_id)
+ if (found) {
+ found.push(recordToBlob(record))
+ } else {
+ blobs.set(record.project_id, [recordToBlob(record)])
+ }
+ nBlobs++
+ }
+ return { nBlobs, blobs }
+}
+
/**
* Add a blob's metadata to the blobs table after it has been uploaded.
*/
async function insertBlob(projectId, blob) {
+ assert.postgresId(projectId, 'bad projectId')
projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
await knex('project_blobs')
.insert(blobToRecord(projectId, blob))
@@ -70,8 +116,8 @@ async function insertBlob(projectId, blob) {
* Deletes all blobs for a given project
*/
async function deleteBlobs(projectId) {
+ assert.postgresId(projectId, 'bad projectId')
projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
await knex('project_blobs').where('project_id', projectId).delete()
}
@@ -108,6 +154,8 @@ module.exports = {
initialize,
findBlob,
findBlobs,
+ getProjectBlobs,
+ getProjectBlobsBatch,
insertBlob,
deleteBlobs,
}
diff --git a/services/history-v1/storage/lib/chunk_store/errors.js b/services/history-v1/storage/lib/chunk_store/errors.js
index 5f0eba6aac..75b830f9a0 100644
--- a/services/history-v1/storage/lib/chunk_store/errors.js
+++ b/services/history-v1/storage/lib/chunk_store/errors.js
@@ -1,7 +1,15 @@
const OError = require('@overleaf/o-error')
class ChunkVersionConflictError extends OError {}
+class BaseVersionConflictError extends OError {}
+class JobNotFoundError extends OError {}
+class JobNotReadyError extends OError {}
+class VersionOutOfBoundsError extends OError {}
module.exports = {
ChunkVersionConflictError,
+ BaseVersionConflictError,
+ JobNotFoundError,
+ JobNotReadyError,
+ VersionOutOfBoundsError,
}
diff --git a/services/history-v1/storage/lib/chunk_store/index.js b/services/history-v1/storage/lib/chunk_store/index.js
index eb3c8ba48d..f387b68d90 100644
--- a/services/history-v1/storage/lib/chunk_store/index.js
+++ b/services/history-v1/storage/lib/chunk_store/index.js
@@ -1,3 +1,5 @@
+// @ts-check
+
'use strict'
/**
@@ -27,10 +29,18 @@ const { Chunk, History, Snapshot } = require('overleaf-editor-core')
const assert = require('../assert')
const BatchBlobStore = require('../batch_blob_store')
const { BlobStore } = require('../blob_store')
-const historyStore = require('../history_store')
+const { historyStore } = require('../history_store')
const mongoBackend = require('./mongo')
const postgresBackend = require('./postgres')
-const { ChunkVersionConflictError } = require('./errors')
+const redisBackend = require('./redis')
+const {
+ ChunkVersionConflictError,
+ VersionOutOfBoundsError,
+} = require('./errors')
+
+/**
+ * @import { Change } from 'overleaf-editor-core'
+ */
const DEFAULT_DELETE_BATCH_SIZE = parseInt(config.get('maxDeleteKeys'), 10)
const DEFAULT_DELETE_TIMEOUT_SECS = 3000 // 50 minutes
@@ -81,49 +91,120 @@ async function lazyLoadHistoryFiles(history, batchBlobStore) {
/**
* Load the latest Chunk stored for a project, including blob metadata.
*
- * @param {number} projectId
- * @return {Promise.}
+ * @param {string} projectId
+ * @param {Object} [opts]
+ * @param {boolean} [opts.readOnly]
+ * @return {Promise<{id: string, startVersion: number, endVersion: number, endTimestamp: Date}>}
*/
-async function loadLatest(projectId) {
+async function getLatestChunkMetadata(projectId, opts) {
assert.projectId(projectId, 'bad projectId')
const backend = getBackend(projectId)
- const blobStore = new BlobStore(projectId)
- const batchBlobStore = new BatchBlobStore(blobStore)
- const chunkRecord = await backend.getLatestChunk(projectId)
- if (chunkRecord == null) {
+ const chunkMetadata = await backend.getLatestChunk(projectId, opts)
+ if (chunkMetadata == null) {
throw new Chunk.NotFoundError(projectId)
}
+ return chunkMetadata
+}
- const rawHistory = await historyStore.loadRaw(projectId, chunkRecord.id)
+/**
+ * Load the latest Chunk stored for a project, including blob metadata.
+ *
+ * @param {string} projectId
+ * @param {object} [opts]
+ * @param {boolean} [opts.persistedOnly] - only include persisted changes
+ * @return {Promise}
+ */
+async function loadLatest(projectId, opts = {}) {
+ const chunkMetadata = await getLatestChunkMetadata(projectId)
+ const rawHistory = await historyStore.loadRaw(projectId, chunkMetadata.id)
const history = History.fromRaw(rawHistory)
+
+ if (!opts.persistedOnly) {
+ const nonPersistedChanges = await getChunkExtension(
+ projectId,
+ chunkMetadata.endVersion
+ )
+ history.pushChanges(nonPersistedChanges)
+ }
+
+ const blobStore = new BlobStore(projectId)
+ const batchBlobStore = new BatchBlobStore(blobStore)
await lazyLoadHistoryFiles(history, batchBlobStore)
- return new Chunk(history, chunkRecord.startVersion)
+ return new Chunk(history, chunkMetadata.startVersion)
}
/**
* Load the the chunk that contains the given version, including blob metadata.
+ *
+ * @param {string} projectId
+ * @param {number} version
+ * @param {object} [opts]
+ * @param {boolean} [opts.persistedOnly] - only include persisted changes
+ * @param {boolean} [opts.preferNewer] - If the version is at the boundary of
+ * two chunks, return the newer chunk.
*/
-async function loadAtVersion(projectId, version) {
+async function loadAtVersion(projectId, version, opts = {}) {
assert.projectId(projectId, 'bad projectId')
assert.integer(version, 'bad version')
const backend = getBackend(projectId)
const blobStore = new BlobStore(projectId)
const batchBlobStore = new BatchBlobStore(blobStore)
+ const latestChunkMetadata = await getLatestChunkMetadata(projectId)
- const chunkRecord = await backend.getChunkForVersion(projectId, version)
+ // When loading a chunk for a version there are three cases to consider:
+ // 1. If `persistedOnly` is true, we always use the requested version
+ // to fetch the chunk.
+ // 2. If `persistedOnly` is false and the requested version is in the
+ // persisted chunk version range, we use the requested version.
+ // 3. If `persistedOnly` is false and the requested version is ahead of
+ // the persisted chunk versions, we fetch the latest chunk and see if
+ // the non-persisted changes include the requested version.
+ const targetChunkVersion = opts.persistedOnly
+ ? version
+ : Math.min(latestChunkMetadata.endVersion, version)
+
+ const chunkRecord = await backend.getChunkForVersion(
+ projectId,
+ targetChunkVersion,
+ {
+ preferNewer: opts.preferNewer,
+ }
+ )
const rawHistory = await historyStore.loadRaw(projectId, chunkRecord.id)
const history = History.fromRaw(rawHistory)
+ const startVersion = chunkRecord.endVersion - history.countChanges()
+
+ if (!opts.persistedOnly) {
+ // Try to extend the chunk with any non-persisted changes that
+ // follow the chunk's end version.
+ const nonPersistedChanges = await getChunkExtension(
+ projectId,
+ chunkRecord.endVersion
+ )
+ history.pushChanges(nonPersistedChanges)
+
+ // Check that the changes do actually contain the requested version
+ if (version > chunkRecord.endVersion + nonPersistedChanges.length) {
+ throw new Chunk.VersionNotFoundError(projectId, version)
+ }
+ }
+
await lazyLoadHistoryFiles(history, batchBlobStore)
- return new Chunk(history, chunkRecord.endVersion - history.countChanges())
+ return new Chunk(history, startVersion)
}
/**
* Load the chunk that contains the version that was current at the given
* timestamp, including blob metadata.
+ *
+ * @param {string} projectId
+ * @param {Date} timestamp
+ * @param {object} [opts]
+ * @param {boolean} [opts.persistedOnly] - only include persisted changes
*/
-async function loadAtTimestamp(projectId, timestamp) {
+async function loadAtTimestamp(projectId, timestamp, opts = {}) {
assert.projectId(projectId, 'bad projectId')
assert.date(timestamp, 'bad timestamp')
@@ -134,24 +215,58 @@ async function loadAtTimestamp(projectId, timestamp) {
const chunkRecord = await backend.getChunkForTimestamp(projectId, timestamp)
const rawHistory = await historyStore.loadRaw(projectId, chunkRecord.id)
const history = History.fromRaw(rawHistory)
+ const startVersion = chunkRecord.endVersion - history.countChanges()
+
+ if (!opts.persistedOnly) {
+ const nonPersistedChanges = await getChunkExtension(
+ projectId,
+ chunkRecord.endVersion
+ )
+ history.pushChanges(nonPersistedChanges)
+ }
+
await lazyLoadHistoryFiles(history, batchBlobStore)
- return new Chunk(history, chunkRecord.endVersion - history.countChanges())
+ return new Chunk(history, startVersion)
}
/**
* Store the chunk and insert corresponding records in the database.
*
- * @param {number} projectId
+ * @param {string} projectId
* @param {Chunk} chunk
- * @return {Promise.} for the chunkId of the inserted chunk
+ * @param {Date} [earliestChangeTimestamp]
*/
-async function create(projectId, chunk) {
+async function create(projectId, chunk, earliestChangeTimestamp) {
assert.projectId(projectId, 'bad projectId')
assert.instance(chunk, Chunk, 'bad chunk')
+ assert.maybe.date(earliestChangeTimestamp, 'bad timestamp')
const backend = getBackend(projectId)
+ const chunkStart = chunk.getStartVersion()
+
+ const opts = {}
+ if (chunkStart > 0) {
+ const oldChunk = await backend.getChunkForVersion(projectId, chunkStart)
+
+ if (oldChunk.endVersion !== chunkStart) {
+ throw new ChunkVersionConflictError(
+ 'unexpected end version on chunk to be updated',
+ {
+ projectId,
+ expectedVersion: chunkStart,
+ actualVersion: oldChunk.endVersion,
+ }
+ )
+ }
+
+ opts.oldChunkId = oldChunk.id
+ }
+ if (earliestChangeTimestamp != null) {
+ opts.earliestChangeTimestamp = earliestChangeTimestamp
+ }
+
const chunkId = await uploadChunk(projectId, chunk)
- await backend.confirmCreate(projectId, chunk, chunkId)
+ await backend.confirmCreate(projectId, chunk, chunkId, opts)
}
/**
@@ -180,29 +295,67 @@ async function uploadChunk(projectId, chunk) {
* Extend the project's history by replacing the latest chunk with a new
* chunk.
*
- * @param {number} projectId
- * @param {number} oldEndVersion
+ * @param {string} projectId
* @param {Chunk} newChunk
+ * @param {Date} [earliestChangeTimestamp]
* @return {Promise}
*/
-async function update(projectId, oldEndVersion, newChunk) {
+async function update(projectId, newChunk, earliestChangeTimestamp) {
assert.projectId(projectId, 'bad projectId')
- assert.integer(oldEndVersion, 'bad oldEndVersion')
assert.instance(newChunk, Chunk, 'bad newChunk')
+ assert.maybe.date(earliestChangeTimestamp, 'bad timestamp')
const backend = getBackend(projectId)
- const oldChunkId = await getChunkIdForVersion(projectId, oldEndVersion)
+ const oldChunk = await backend.getChunkForVersion(
+ projectId,
+ newChunk.getStartVersion(),
+ { preferNewer: true }
+ )
+
+ if (oldChunk.startVersion !== newChunk.getStartVersion()) {
+ throw new ChunkVersionConflictError(
+ 'unexpected start version on chunk to be updated',
+ {
+ projectId,
+ expectedVersion: newChunk.getStartVersion(),
+ actualVersion: oldChunk.startVersion,
+ }
+ )
+ }
+
+ if (oldChunk.endVersion > newChunk.getEndVersion()) {
+ throw new ChunkVersionConflictError(
+ 'chunk update would decrease chunk version',
+ {
+ projectId,
+ currentVersion: oldChunk.endVersion,
+ newVersion: newChunk.getEndVersion(),
+ }
+ )
+ }
+
const newChunkId = await uploadChunk(projectId, newChunk)
- await backend.confirmUpdate(projectId, oldChunkId, newChunk, newChunkId)
+ const opts = {}
+ if (earliestChangeTimestamp != null) {
+ opts.earliestChangeTimestamp = earliestChangeTimestamp
+ }
+
+ await backend.confirmUpdate(
+ projectId,
+ oldChunk.id,
+ newChunk,
+ newChunkId,
+ opts
+ )
}
/**
* Find the chunk ID for a given version of a project.
*
- * @param {number} projectId
+ * @param {string} projectId
* @param {number} version
- * @return {Promise.}
+ * @return {Promise.}
*/
async function getChunkIdForVersion(projectId, version) {
const backend = getBackend(projectId)
@@ -210,6 +363,19 @@ async function getChunkIdForVersion(projectId, version) {
return chunkRecord.id
}
+/**
+ * Find the chunk metadata for a given version of a project.
+ *
+ * @param {string} projectId
+ * @param {number} version
+ * @return {Promise.<{id: string|number, startVersion: number, endVersion: number}>}
+ */
+async function getChunkMetadataForVersion(projectId, version) {
+ const backend = getBackend(projectId)
+ const chunkRecord = await backend.getChunkForVersion(projectId, version)
+ return chunkRecord
+}
+
/**
* Get all of a project's chunk ids
*/
@@ -219,6 +385,62 @@ async function getProjectChunkIds(projectId) {
return chunkIds
}
+/**
+ * Get all of a projects chunks directly
+ */
+async function getProjectChunks(projectId) {
+ const backend = getBackend(projectId)
+ const chunkIds = await backend.getProjectChunks(projectId)
+ return chunkIds
+}
+
+/**
+ * Load the chunk for a given chunk record, including blob metadata.
+ */
+async function loadByChunkRecord(projectId, chunkRecord) {
+ const blobStore = new BlobStore(projectId)
+ const batchBlobStore = new BatchBlobStore(blobStore)
+ const { raw: rawHistory, buffer: chunkBuffer } =
+ await historyStore.loadRawWithBuffer(projectId, chunkRecord.id)
+ const history = History.fromRaw(rawHistory)
+ await lazyLoadHistoryFiles(history, batchBlobStore)
+ return {
+ chunk: new Chunk(history, chunkRecord.endVersion - history.countChanges()),
+ chunkBuffer,
+ }
+}
+
+/**
+ * Asynchronously retrieves project chunks starting from a specific version.
+ *
+ * This generator function yields chunk records for a given project starting from the specified version (inclusive).
+ * It continues to fetch and yield subsequent chunk records until the end version of the latest chunk metadata is reached.
+ * If you want to fetch all the chunks *after* a version V, call this function with V+1.
+ *
+ * @param {string} projectId - The ID of the project.
+ * @param {number} version - The starting version to retrieve chunks from.
+ * @returns {AsyncGenerator} An async generator that yields chunk records.
+ */
+async function* getProjectChunksFromVersion(projectId, version) {
+ const backend = getBackend(projectId)
+ const latestChunkMetadata = await getLatestChunkMetadata(projectId)
+ if (!latestChunkMetadata || version > latestChunkMetadata.endVersion) {
+ return
+ }
+ let chunkRecord = await backend.getChunkForVersion(projectId, version)
+ while (chunkRecord != null) {
+ yield chunkRecord
+ if (chunkRecord.endVersion >= latestChunkMetadata.endVersion) {
+ break
+ } else {
+ chunkRecord = await backend.getChunkForVersion(
+ projectId,
+ chunkRecord.endVersion + 1
+ )
+ }
+ }
+}
+
/**
* Delete the given chunk from the database.
*
@@ -242,10 +464,14 @@ async function deleteProjectChunks(projectId) {
* Delete a given number of old chunks from both the database
* and from object storage.
*
- * @param {number} count - number of chunks to delete
- * @param {number} minAgeSecs - how many seconds ago must chunks have been
- * deleted
- * @return {Promise}
+ * @param {object} options
+ * @param {number} [options.batchSize] - number of chunks to delete in each
+ * batch
+ * @param {number} [options.maxBatches] - maximum number of batches to process
+ * @param {number} [options.minAgeSecs] - minimum age of chunks to delete
+ * @param {number} [options.timeout] - maximum time to spend deleting chunks
+ *
+ * @return {Promise} number of chunks deleted
*/
async function deleteOldChunks(options = {}) {
const batchSize = options.batchSize ?? DEFAULT_DELETE_BATCH_SIZE
@@ -308,6 +534,31 @@ function getBackend(projectId) {
}
}
+/**
+ * Gets non-persisted changes that could extend a chunk
+ *
+ * @param {string} projectId
+ * @param {number} chunkEndVersion - end version of the chunk to extend
+ *
+ * @return {Promise}
+ */
+async function getChunkExtension(projectId, chunkEndVersion) {
+ try {
+ const changes = await redisBackend.getNonPersistedChanges(
+ projectId,
+ chunkEndVersion
+ )
+ return changes
+ } catch (err) {
+ if (err instanceof VersionOutOfBoundsError) {
+ // If we can't extend the chunk, simply return an empty list
+ return []
+ } else {
+ throw err
+ }
+ }
+}
+
class AlreadyInitialized extends OError {
constructor(projectId) {
super('Project is already initialized', { projectId })
@@ -315,15 +566,21 @@ class AlreadyInitialized extends OError {
}
module.exports = {
+ getBackend,
initializeProject,
loadLatest,
+ getLatestChunkMetadata,
loadAtVersion,
loadAtTimestamp,
+ loadByChunkRecord,
create,
update,
destroy,
getChunkIdForVersion,
+ getChunkMetadataForVersion,
getProjectChunkIds,
+ getProjectChunks,
+ getProjectChunksFromVersion,
deleteProjectChunks,
deleteOldChunks,
AlreadyInitialized,
diff --git a/services/history-v1/storage/lib/chunk_store/mongo.js b/services/history-v1/storage/lib/chunk_store/mongo.js
index f56131a25b..49020c6be4 100644
--- a/services/history-v1/storage/lib/chunk_store/mongo.js
+++ b/services/history-v1/storage/lib/chunk_store/mongo.js
@@ -1,6 +1,9 @@
-const { ObjectId } = require('mongodb')
+// @ts-check
+
+const { ObjectId, ReadPreference, MongoError } = require('mongodb')
const { Chunk } = require('overleaf-editor-core')
const OError = require('@overleaf/o-error')
+const config = require('config')
const assert = require('../assert')
const mongodb = require('../mongodb')
const { ChunkVersionConflictError } = require('./errors')
@@ -8,14 +11,30 @@ const { ChunkVersionConflictError } = require('./errors')
const DUPLICATE_KEY_ERROR_CODE = 11000
/**
- * Get the latest chunk's metadata from the database
+ * @import { ClientSession } from 'mongodb'
*/
-async function getLatestChunk(projectId) {
+
+/**
+ * Get the latest chunk's metadata from the database
+ * @param {string} projectId
+ * @param {Object} [opts]
+ * @param {boolean} [opts.readOnly]
+ */
+async function getLatestChunk(projectId, opts = {}) {
assert.mongoId(projectId, 'bad projectId')
+ const { readOnly = false } = opts
const record = await mongodb.chunks.findOne(
- { projectId: new ObjectId(projectId), state: 'active' },
- { sort: { startVersion: -1 } }
+ {
+ projectId: new ObjectId(projectId),
+ state: { $in: ['active', 'closed'] },
+ },
+ {
+ sort: { startVersion: -1 },
+ readPreference: readOnly
+ ? ReadPreference.secondaryPreferred
+ : ReadPreference.primary,
+ }
)
if (record == null) {
return null
@@ -25,19 +44,25 @@ async function getLatestChunk(projectId) {
/**
* Get the metadata for the chunk that contains the given version.
+ *
+ * @param {string} projectId
+ * @param {number} version
+ * @param {object} [opts]
+ * @param {boolean} [opts.preferNewer] - If the version is at the boundary of
+ * two chunks, return the newer chunk.
*/
-async function getChunkForVersion(projectId, version) {
+async function getChunkForVersion(projectId, version, opts = {}) {
assert.mongoId(projectId, 'bad projectId')
assert.integer(version, 'bad version')
const record = await mongodb.chunks.findOne(
{
projectId: new ObjectId(projectId),
- state: 'active',
+ state: { $in: ['active', 'closed'] },
startVersion: { $lte: version },
endVersion: { $gte: version },
},
- { sort: { startVersion: 1 } }
+ { sort: { startVersion: opts.preferNewer ? -1 : 1 } }
)
if (record == null) {
throw new Chunk.VersionNotFoundError(projectId, version)
@@ -45,6 +70,35 @@ async function getChunkForVersion(projectId, version) {
return chunkFromRecord(record)
}
+/**
+ * Get the metadata for the chunk that contains the given version before the endTime.
+ */
+async function getFirstChunkBeforeTimestamp(projectId, timestamp) {
+ assert.mongoId(projectId, 'bad projectId')
+ assert.date(timestamp, 'bad timestamp')
+
+ const recordActive = await getChunkForVersion(projectId, 0)
+ if (recordActive && recordActive.endTimestamp <= timestamp) {
+ return recordActive
+ }
+
+ // fallback to deleted chunk
+ const recordDeleted = await mongodb.chunks.findOne(
+ {
+ projectId: new ObjectId(projectId),
+ state: 'deleted',
+ startVersion: 0,
+ updatedAt: { $lte: timestamp }, // indexed for state=deleted
+ endTimestamp: { $lte: timestamp },
+ },
+ { sort: { updatedAt: -1 } }
+ )
+ if (recordDeleted) {
+ return chunkFromRecord(recordDeleted)
+ }
+ throw new Chunk.BeforeTimestampNotFoundError(projectId, timestamp)
+}
+
/**
* Get the metadata for the chunk that contains the version that was current at
* the given timestamp.
@@ -56,7 +110,7 @@ async function getChunkForTimestamp(projectId, timestamp) {
const record = await mongodb.chunks.findOne(
{
projectId: new ObjectId(projectId),
- state: 'active',
+ state: { $in: ['active', 'closed'] },
endTimestamp: { $gte: timestamp },
},
// We use the index on the startVersion for sorting records. This assumes
@@ -77,6 +131,39 @@ async function getChunkForTimestamp(projectId, timestamp) {
return chunkFromRecord(record)
}
+/**
+ * Get the metadata for the chunk that contains the version that was current before
+ * the given timestamp.
+ */
+async function getLastActiveChunkBeforeTimestamp(projectId, timestamp) {
+ assert.mongoId(projectId, 'bad projectId')
+ assert.date(timestamp, 'bad timestamp')
+
+ const record = await mongodb.chunks.findOne(
+ {
+ projectId: new ObjectId(projectId),
+ state: { $in: ['active', 'closed'] },
+ $or: [
+ {
+ endTimestamp: {
+ $lte: timestamp,
+ },
+ },
+ {
+ endTimestamp: null,
+ },
+ ],
+ },
+ // We use the index on the startVersion for sorting records. This assumes
+ // that timestamps go up with each version.
+ { sort: { startVersion: -1 } }
+ )
+ if (record == null) {
+ throw new Chunk.BeforeTimestampNotFoundError(projectId, timestamp)
+ }
+ return chunkFromRecord(record)
+}
+
/**
* Get all of a project's chunk ids
*/
@@ -84,12 +171,33 @@ async function getProjectChunkIds(projectId) {
assert.mongoId(projectId, 'bad projectId')
const cursor = mongodb.chunks.find(
- { projectId: new ObjectId(projectId), state: 'active' },
+ {
+ projectId: new ObjectId(projectId),
+ state: { $in: ['active', 'closed'] },
+ },
{ projection: { _id: 1 } }
)
return await cursor.map(record => record._id).toArray()
}
+/**
+ * Get all of a projects chunks directly
+ */
+async function getProjectChunks(projectId) {
+ assert.mongoId(projectId, 'bad projectId')
+
+ const cursor = mongodb.chunks
+ .find(
+ {
+ projectId: new ObjectId(projectId),
+ state: { $in: ['active', 'closed'] },
+ },
+ { projection: { state: 0 } }
+ )
+ .sort({ startVersion: 1 })
+ return await cursor.map(chunkFromRecord).toArray()
+}
+
/**
* Insert a pending chunk before sending it to object storage.
*/
@@ -112,10 +220,141 @@ async function insertPendingChunk(projectId, chunk) {
/**
* Record that a new chunk was created.
+ *
+ * @param {string} projectId
+ * @param {Chunk} chunk
+ * @param {string} chunkId
+ * @param {object} opts
+ * @param {Date} [opts.earliestChangeTimestamp]
+ * @param {string} [opts.oldChunkId]
*/
-async function confirmCreate(projectId, chunk, chunkId, mongoOpts = {}) {
+async function confirmCreate(projectId, chunk, chunkId, opts = {}) {
+ assert.mongoId(projectId, 'bad projectId')
+ assert.instance(chunk, Chunk, 'bad newChunk')
+ assert.mongoId(chunkId, 'bad newChunkId')
+
+ await mongodb.client.withSession(async session => {
+ await session.withTransaction(async () => {
+ if (opts.oldChunkId != null) {
+ await closeChunk(projectId, opts.oldChunkId, { session })
+ }
+
+ await activateChunk(projectId, chunkId, { session })
+
+ await updateProjectRecord(
+ projectId,
+ chunk,
+ opts.earliestChangeTimestamp,
+ { session }
+ )
+ })
+ })
+}
+
+/**
+ * Write the metadata to the project record
+ */
+async function updateProjectRecord(
+ projectId,
+ chunk,
+ earliestChangeTimestamp,
+ mongoOpts = {}
+) {
+ if (!config.has('backupStore')) {
+ return
+ }
+ // record the end version against the project
+ await mongodb.projects.updateOne(
+ {
+ 'overleaf.history.id': projectId, // string for Object ids, number for postgres ids
+ },
+ {
+ // always store the latest end version and timestamp for the chunk
+ $max: {
+ 'overleaf.history.currentEndVersion': chunk.getEndVersion(),
+ 'overleaf.history.currentEndTimestamp': chunk.getEndTimestamp(),
+ 'overleaf.history.updatedAt': new Date(),
+ },
+ // store the first pending change timestamp for the chunk, this will
+ // be cleared every time a backup is completed.
+ $min: {
+ 'overleaf.backup.pendingChangeAt':
+ earliestChangeTimestamp || chunk.getEndTimestamp() || new Date(),
+ },
+ },
+ mongoOpts
+ )
+}
+
+/**
+ * @param {number} historyId
+ * @return {Promise}
+ */
+async function lookupMongoProjectIdFromHistoryId(historyId) {
+ const project = await mongodb.projects.findOne(
+ // string for Object ids, number for postgres ids
+ { 'overleaf.history.id': historyId },
+ { projection: { _id: 1 } }
+ )
+ if (!project) {
+ // should not happen: We flush before allowing a project to be soft-deleted.
+ throw new OError('mongo project not found by history id', { historyId })
+ }
+ return project._id.toString()
+}
+
+async function resolveHistoryIdToMongoProjectId(projectId) {
+ return projectId
+}
+
+/**
+ * Record that a chunk was replaced by a new one.
+ *
+ * @param {string} projectId
+ * @param {string} oldChunkId
+ * @param {Chunk} newChunk
+ * @param {string} newChunkId
+ * @param {object} [opts]
+ * @param {Date} [opts.earliestChangeTimestamp]
+ */
+async function confirmUpdate(
+ projectId,
+ oldChunkId,
+ newChunk,
+ newChunkId,
+ opts = {}
+) {
+ assert.mongoId(projectId, 'bad projectId')
+ assert.mongoId(oldChunkId, 'bad oldChunkId')
+ assert.instance(newChunk, Chunk, 'bad newChunk')
+ assert.mongoId(newChunkId, 'bad newChunkId')
+
+ await mongodb.client.withSession(async session => {
+ await session.withTransaction(async () => {
+ await deleteActiveChunk(projectId, oldChunkId, { session })
+
+ await activateChunk(projectId, newChunkId, { session })
+
+ await updateProjectRecord(
+ projectId,
+ newChunk,
+ opts.earliestChangeTimestamp,
+ { session }
+ )
+ })
+ })
+}
+
+/**
+ * Activate a pending chunk
+ *
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {object} [opts]
+ * @param {ClientSession} [opts.session]
+ */
+async function activateChunk(projectId, chunkId, opts = {}) {
assert.mongoId(projectId, 'bad projectId')
- assert.instance(chunk, Chunk, 'bad chunk')
assert.mongoId(chunkId, 'bad chunkId')
let result
@@ -127,10 +366,10 @@ async function confirmCreate(projectId, chunk, chunkId, mongoOpts = {}) {
state: 'pending',
},
{ $set: { state: 'active', updatedAt: new Date() } },
- mongoOpts
+ opts
)
} catch (err) {
- if (err.code === DUPLICATE_KEY_ERROR_CODE) {
+ if (err instanceof MongoError && err.code === DUPLICATE_KEY_ERROR_CODE) {
throw new ChunkVersionConflictError('chunk start version is not unique', {
projectId,
chunkId,
@@ -145,30 +384,70 @@ async function confirmCreate(projectId, chunk, chunkId, mongoOpts = {}) {
}
/**
- * Record that a chunk was replaced by a new one.
+ * Close a chunk
+ *
+ * A closed chunk is one that can't be extended anymore.
+ *
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {object} [opts]
+ * @param {ClientSession} [opts.session]
*/
-async function confirmUpdate(projectId, oldChunkId, newChunk, newChunkId) {
- assert.mongoId(projectId, 'bad projectId')
- assert.mongoId(oldChunkId, 'bad oldChunkId')
- assert.instance(newChunk, Chunk, 'bad newChunk')
- assert.mongoId(newChunkId, 'bad newChunkId')
+async function closeChunk(projectId, chunkId, opts = {}) {
+ const result = await mongodb.chunks.updateOne(
+ {
+ _id: new ObjectId(chunkId),
+ projectId: new ObjectId(projectId),
+ state: 'active',
+ },
+ { $set: { state: 'closed' } },
+ opts
+ )
- const session = mongodb.client.startSession()
- try {
- await session.withTransaction(async () => {
- await deleteChunk(projectId, oldChunkId, { session })
- await confirmCreate(projectId, newChunk, newChunkId, { session })
+ if (result.matchedCount === 0) {
+ throw new ChunkVersionConflictError('unable to close chunk', {
+ projectId,
+ chunkId,
+ })
+ }
+}
+
+/**
+ * Delete an active chunk
+ *
+ * This is used to delete chunks that are in the process of being extended. It
+ * will refuse to delete chunks that are already closed and can therefore not be
+ * extended.
+ *
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {object} [opts]
+ * @param {ClientSession} [opts.session]
+ */
+async function deleteActiveChunk(projectId, chunkId, opts = {}) {
+ const updateResult = await mongodb.chunks.updateOne(
+ {
+ _id: new ObjectId(chunkId),
+ projectId: new ObjectId(projectId),
+ state: 'active',
+ },
+ { $set: { state: 'deleted', updatedAt: new Date() } },
+ opts
+ )
+
+ if (updateResult.matchedCount === 0) {
+ throw new ChunkVersionConflictError('unable to delete active chunk', {
+ projectId,
+ chunkId,
})
- } finally {
- await session.endSession()
}
}
/**
* Delete a chunk.
*
- * @param {number} projectId
- * @param {number} chunkId
+ * @param {string} projectId
+ * @param {string} chunkId
* @return {Promise}
*/
async function deleteChunk(projectId, chunkId, mongoOpts = {}) {
@@ -189,7 +468,10 @@ async function deleteProjectChunks(projectId) {
assert.mongoId(projectId, 'bad projectId')
await mongodb.chunks.updateMany(
- { projectId: new ObjectId(projectId), state: 'active' },
+ {
+ projectId: new ObjectId(projectId),
+ state: { $in: ['active', 'closed'] },
+ },
{ $set: { state: 'deleted', updatedAt: new Date() } }
)
}
@@ -252,19 +534,26 @@ function chunkFromRecord(record) {
id: record._id.toString(),
startVersion: record.startVersion,
endVersion: record.endVersion,
+ endTimestamp: record.endTimestamp,
}
}
module.exports = {
getLatestChunk,
+ getFirstChunkBeforeTimestamp,
+ getLastActiveChunkBeforeTimestamp,
getChunkForVersion,
getChunkForTimestamp,
getProjectChunkIds,
+ getProjectChunks,
insertPendingChunk,
confirmCreate,
confirmUpdate,
+ updateProjectRecord,
deleteChunk,
deleteProjectChunks,
getOldChunksBatch,
deleteOldChunks,
+ lookupMongoProjectIdFromHistoryId,
+ resolveHistoryIdToMongoProjectId,
}
diff --git a/services/history-v1/storage/lib/chunk_store/postgres.js b/services/history-v1/storage/lib/chunk_store/postgres.js
index f6eead7354..8906db38e1 100644
--- a/services/history-v1/storage/lib/chunk_store/postgres.js
+++ b/services/history-v1/storage/lib/chunk_store/postgres.js
@@ -1,19 +1,33 @@
+// @ts-check
+
const { Chunk } = require('overleaf-editor-core')
const assert = require('../assert')
const knex = require('../knex')
+const knexReadOnly = require('../knex_read_only')
const { ChunkVersionConflictError } = require('./errors')
+const {
+ updateProjectRecord,
+ lookupMongoProjectIdFromHistoryId,
+} = require('./mongo')
const DUPLICATE_KEY_ERROR_CODE = '23505'
/**
- * Get the latest chunk's metadata from the database
+ * @import { Knex } from 'knex'
*/
-async function getLatestChunk(projectId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
- const record = await knex('chunks')
- .where('doc_id', projectId)
+/**
+ * Get the latest chunk's metadata from the database
+ * @param {string} projectId
+ * @param {Object} [opts]
+ * @param {boolean} [opts.readOnly]
+ */
+async function getLatestChunk(projectId, opts = {}) {
+ assert.postgresId(projectId, 'bad projectId')
+ const { readOnly = false } = opts
+
+ const record = await (readOnly ? knexReadOnly : knex)('chunks')
+ .where('doc_id', parseInt(projectId, 10))
.orderBy('end_version', 'desc')
.first()
if (record == null) {
@@ -24,15 +38,21 @@ async function getLatestChunk(projectId) {
/**
* Get the metadata for the chunk that contains the given version.
+ *
+ * @param {string} projectId
+ * @param {number} version
+ * @param {object} [opts]
+ * @param {boolean} [opts.preferNewer] - If the version is at the boundary of
+ * two chunks, return the newer chunk.
*/
-async function getChunkForVersion(projectId, version) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+async function getChunkForVersion(projectId, version, opts = {}) {
+ assert.postgresId(projectId, 'bad projectId')
const record = await knex('chunks')
- .where('doc_id', projectId)
+ .where('doc_id', parseInt(projectId, 10))
+ .where('start_version', '<=', version)
.where('end_version', '>=', version)
- .orderBy('end_version')
+ .orderBy('end_version', opts.preferNewer ? 'desc' : 'asc')
.first()
if (!record) {
throw new Chunk.VersionNotFoundError(projectId, version)
@@ -40,13 +60,73 @@ async function getChunkForVersion(projectId, version) {
return chunkFromRecord(record)
}
+/**
+ * Get the metadata for the chunk that contains the given version.
+ *
+ * @param {string} projectId
+ * @param {Date} timestamp
+ */
+async function getFirstChunkBeforeTimestamp(projectId, timestamp) {
+ assert.date(timestamp, 'bad timestamp')
+
+ const recordActive = await getChunkForVersion(projectId, 0)
+
+ // projectId must be valid if getChunkForVersion did not throw
+ if (recordActive && recordActive.endTimestamp <= timestamp) {
+ return recordActive
+ }
+
+ // fallback to deleted chunk
+ const recordDeleted = await knex('old_chunks')
+ .where('doc_id', parseInt(projectId, 10))
+ .where('start_version', '=', 0)
+ .where('end_timestamp', '<=', timestamp)
+ .orderBy('end_version', 'desc')
+ .first()
+ if (recordDeleted) {
+ return chunkFromRecord(recordDeleted)
+ }
+ throw new Chunk.BeforeTimestampNotFoundError(projectId, timestamp)
+}
+
/**
* Get the metadata for the chunk that contains the version that was current at
* the given timestamp.
+ *
+ * @param {string} projectId
+ * @param {Date} timestamp
+ */
+async function getLastActiveChunkBeforeTimestamp(projectId, timestamp) {
+ assert.date(timestamp, 'bad timestamp')
+ assert.postgresId(projectId, 'bad projectId')
+
+ const query = knex('chunks')
+ .where('doc_id', parseInt(projectId, 10))
+ .where(function () {
+ this.where('end_timestamp', '<=', timestamp).orWhere(
+ 'end_timestamp',
+ null
+ )
+ })
+ .orderBy('end_version', 'desc', 'last')
+
+ const record = await query.first()
+
+ if (!record) {
+ throw new Chunk.BeforeTimestampNotFoundError(projectId, timestamp)
+ }
+ return chunkFromRecord(record)
+}
+
+/**
+ * Get the metadata for the chunk that contains the version that was current at
+ * the given timestamp.
+ *
+ * @param {string} projectId
+ * @param {Date} timestamp
*/
async function getChunkForTimestamp(projectId, timestamp) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+ assert.postgresId(projectId, 'bad projectId')
// This query will find the latest chunk after the timestamp (query orders
// in reverse chronological order), OR the latest chunk
@@ -59,11 +139,11 @@ async function getChunkForTimestamp(projectId, timestamp) {
'WHERE doc_id = ? ' +
'ORDER BY end_version desc LIMIT 1' +
')',
- [timestamp, projectId]
+ [timestamp, parseInt(projectId, 10)]
)
const record = await knex('chunks')
- .where('doc_id', projectId)
+ .where('doc_id', parseInt(projectId, 10))
.where(whereAfterEndTimestampOrLatestChunk)
.orderBy('end_version')
.first()
@@ -78,29 +158,50 @@ async function getChunkForTimestamp(projectId, timestamp) {
*/
function chunkFromRecord(record) {
return {
- id: record.id,
+ id: record.id.toString(),
startVersion: record.start_version,
endVersion: record.end_version,
+ endTimestamp: record.end_timestamp,
}
}
/**
* Get all of a project's chunk ids
+ *
+ * @param {string} projectId
*/
async function getProjectChunkIds(projectId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+ assert.postgresId(projectId, 'bad projectId')
- const records = await knex('chunks').select('id').where('doc_id', projectId)
+ const records = await knex('chunks')
+ .select('id')
+ .where('doc_id', parseInt(projectId, 10))
return records.map(record => record.id)
}
+/**
+ * Get all of a projects chunks directly
+ *
+ * @param {string} projectId
+ */
+async function getProjectChunks(projectId) {
+ assert.postgresId(projectId, 'bad projectId')
+
+ const records = await knex('chunks')
+ .select()
+ .where('doc_id', parseInt(projectId, 10))
+ .orderBy('end_version')
+ return records.map(chunkFromRecord)
+}
+
/**
* Insert a pending chunk before sending it to object storage.
+ *
+ * @param {string} projectId
+ * @param {Chunk} chunk
*/
async function insertPendingChunk(projectId, chunk) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+ assert.postgresId(projectId, 'bad projectId')
const result = await knex.first(
knex.raw("nextval('chunks_id_seq'::regclass)::integer as chunkid")
@@ -108,67 +209,119 @@ async function insertPendingChunk(projectId, chunk) {
const chunkId = result.chunkid
await knex('pending_chunks').insert({
id: chunkId,
- doc_id: projectId,
+ doc_id: parseInt(projectId, 10),
end_version: chunk.getEndVersion(),
start_version: chunk.getStartVersion(),
end_timestamp: chunk.getEndTimestamp(),
})
- return chunkId
+ return chunkId.toString()
}
/**
* Record that a new chunk was created.
+ *
+ * @param {string} projectId
+ * @param {Chunk} chunk
+ * @param {string} chunkId
+ * @param {object} opts
+ * @param {Date} [opts.earliestChangeTimestamp]
+ * @param {string} [opts.oldChunkId]
*/
-async function confirmCreate(projectId, chunk, chunkId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+async function confirmCreate(projectId, chunk, chunkId, opts = {}) {
+ assert.postgresId(projectId, 'bad projectId')
await knex.transaction(async tx => {
+ if (opts.oldChunkId != null) {
+ await _assertChunkIsNotClosed(tx, projectId, opts.oldChunkId)
+ await _closeChunk(tx, projectId, opts.oldChunkId)
+ }
await Promise.all([
_deletePendingChunk(tx, projectId, chunkId),
_insertChunk(tx, projectId, chunk, chunkId),
])
+ await updateProjectRecord(
+ // The history id in Mongo is an integer for Postgres projects
+ parseInt(projectId, 10),
+ chunk,
+ opts.earliestChangeTimestamp
+ )
})
}
/**
* Record that a chunk was replaced by a new one.
+ *
+ * @param {string} projectId
+ * @param {string} oldChunkId
+ * @param {Chunk} newChunk
+ * @param {string} newChunkId
*/
-async function confirmUpdate(projectId, oldChunkId, newChunk, newChunkId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+async function confirmUpdate(
+ projectId,
+ oldChunkId,
+ newChunk,
+ newChunkId,
+ opts = {}
+) {
+ assert.postgresId(projectId, 'bad projectId')
await knex.transaction(async tx => {
+ await _assertChunkIsNotClosed(tx, projectId, oldChunkId)
await _deleteChunks(tx, { doc_id: projectId, id: oldChunkId })
await Promise.all([
_deletePendingChunk(tx, projectId, newChunkId),
_insertChunk(tx, projectId, newChunk, newChunkId),
])
+ await updateProjectRecord(
+ // The history id in Mongo is an integer for Postgres projects
+ parseInt(projectId, 10),
+ newChunk,
+ opts.earliestChangeTimestamp
+ )
})
}
+/**
+ * Delete a pending chunk
+ *
+ * @param {Knex} tx
+ * @param {string} projectId
+ * @param {string} chunkId
+ */
async function _deletePendingChunk(tx, projectId, chunkId) {
await tx('pending_chunks')
.where({
- doc_id: projectId,
- id: chunkId,
+ doc_id: parseInt(projectId, 10),
+ id: parseInt(chunkId, 10),
})
.del()
}
+/**
+ * Adds an active chunk
+ *
+ * @param {Knex} tx
+ * @param {string} projectId
+ * @param {Chunk} chunk
+ * @param {string} chunkId
+ */
async function _insertChunk(tx, projectId, chunk, chunkId) {
const startVersion = chunk.getStartVersion()
const endVersion = chunk.getEndVersion()
try {
await tx('chunks').insert({
- id: chunkId,
- doc_id: projectId,
+ id: parseInt(chunkId, 10),
+ doc_id: parseInt(projectId, 10),
start_version: startVersion,
end_version: endVersion,
end_timestamp: chunk.getEndTimestamp(),
})
} catch (err) {
- if (err.code === DUPLICATE_KEY_ERROR_CODE) {
+ if (
+ err instanceof Error &&
+ 'code' in err &&
+ err.code === DUPLICATE_KEY_ERROR_CODE
+ ) {
throw new ChunkVersionConflictError(
'chunk start or end version is not unique',
{ projectId, chunkId, startVersion, endVersion }
@@ -178,35 +331,92 @@ async function _insertChunk(tx, projectId, chunk, chunkId) {
}
}
+/**
+ * Check that a chunk is not closed
+ *
+ * This is used to synchronize chunk creations and extensions.
+ *
+ * @param {Knex} tx
+ * @param {string} projectId
+ * @param {string} chunkId
+ */
+async function _assertChunkIsNotClosed(tx, projectId, chunkId) {
+ const record = await tx('chunks')
+ .forUpdate()
+ .select('closed')
+ .where('doc_id', parseInt(projectId, 10))
+ .where('id', parseInt(chunkId, 10))
+ .first()
+ if (!record) {
+ throw new ChunkVersionConflictError('unable to close chunk: not found', {
+ projectId,
+ chunkId,
+ })
+ }
+ if (record.closed) {
+ throw new ChunkVersionConflictError(
+ 'unable to close chunk: already closed',
+ {
+ projectId,
+ chunkId,
+ }
+ )
+ }
+}
+
+/**
+ * Close a chunk
+ *
+ * A closed chunk can no longer be extended.
+ *
+ * @param {Knex} tx
+ * @param {string} projectId
+ * @param {string} chunkId
+ */
+async function _closeChunk(tx, projectId, chunkId) {
+ await tx('chunks')
+ .update({ closed: true })
+ .where('doc_id', parseInt(projectId, 10))
+ .where('id', parseInt(chunkId, 10))
+}
+
/**
* Delete a chunk.
*
- * @param {number} projectId
- * @param {number} chunkId
- * @return {Promise}
+ * @param {string} projectId
+ * @param {string} chunkId
*/
async function deleteChunk(projectId, chunkId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+ assert.postgresId(projectId, 'bad projectId')
assert.integer(chunkId, 'bad chunkId')
- await _deleteChunks(knex, { doc_id: projectId, id: chunkId })
+ await _deleteChunks(knex, {
+ doc_id: parseInt(projectId, 10),
+ id: parseInt(chunkId, 10),
+ })
}
/**
* Delete all of a project's chunks
+ *
+ * @param {string} projectId
*/
async function deleteProjectChunks(projectId) {
- projectId = parseInt(projectId, 10)
- assert.integer(projectId, 'bad projectId')
+ assert.postgresId(projectId, 'bad projectId')
await knex.transaction(async tx => {
- await _deleteChunks(knex, { doc_id: projectId })
+ await _deleteChunks(knex, { doc_id: parseInt(projectId, 10) })
})
}
+/**
+ * Delete many chunks
+ *
+ * @param {Knex} tx
+ * @param {any} whereClause
+ */
async function _deleteChunks(tx, whereClause) {
- const rows = await tx('chunks').returning('*').where(whereClause).del()
+ const rows = await tx('chunks').where(whereClause).del().returning('*')
if (rows.length === 0) {
return
}
@@ -224,6 +434,9 @@ async function _deleteChunks(tx, whereClause) {
/**
* Get a batch of old chunks for deletion
+ *
+ * @param {number} count
+ * @param {number} minAgeSecs
*/
async function getOldChunksBatch(count, minAgeSecs) {
const maxDeletedAt = new Date(Date.now() - minAgeSecs * 1000)
@@ -234,15 +447,22 @@ async function getOldChunksBatch(count, minAgeSecs) {
.limit(count)
return records.map(oldChunk => ({
projectId: oldChunk.doc_id.toString(),
- chunkId: oldChunk.chunk_id,
+ chunkId: oldChunk.chunk_id.toString(),
}))
}
/**
* Delete a batch of old chunks from the database
+ *
+ * @param {string[]} chunkIds
*/
async function deleteOldChunks(chunkIds) {
- await knex('old_chunks').whereIn('chunk_id', chunkIds).del()
+ await knex('old_chunks')
+ .whereIn(
+ 'chunk_id',
+ chunkIds.map(id => parseInt(id, 10))
+ )
+ .del()
}
/**
@@ -255,11 +475,18 @@ async function generateProjectId() {
return record.doc_id.toString()
}
+async function resolveHistoryIdToMongoProjectId(projectId) {
+ return await lookupMongoProjectIdFromHistoryId(parseInt(projectId, 10))
+}
+
module.exports = {
getLatestChunk,
+ getFirstChunkBeforeTimestamp,
+ getLastActiveChunkBeforeTimestamp,
getChunkForVersion,
getChunkForTimestamp,
getProjectChunkIds,
+ getProjectChunks,
insertPendingChunk,
confirmCreate,
confirmUpdate,
@@ -268,4 +495,5 @@ module.exports = {
getOldChunksBatch,
deleteOldChunks,
generateProjectId,
+ resolveHistoryIdToMongoProjectId,
}
diff --git a/services/history-v1/storage/lib/chunk_store/redis.js b/services/history-v1/storage/lib/chunk_store/redis.js
new file mode 100644
index 0000000000..b8a79b498d
--- /dev/null
+++ b/services/history-v1/storage/lib/chunk_store/redis.js
@@ -0,0 +1,854 @@
+// @ts-check
+
+const metrics = require('@overleaf/metrics')
+const OError = require('@overleaf/o-error')
+const { Change, Snapshot } = require('overleaf-editor-core')
+const redis = require('../redis')
+const rclient = redis.rclientHistory
+const {
+ BaseVersionConflictError,
+ JobNotFoundError,
+ JobNotReadyError,
+ VersionOutOfBoundsError,
+} = require('./errors')
+
+const MAX_PERSISTED_CHANGES = 100 // Maximum number of persisted changes to keep in the buffer for clients that need to catch up.
+const PROJECT_TTL_MS = 3600 * 1000 // Amount of time a project can stay inactive before it gets expired
+const MAX_PERSIST_DELAY_MS = 300 * 1000 // Maximum amount of time before a change is persisted
+const RETRY_DELAY_MS = 120 * 1000 // Time before a claimed job is considered stale and a worker can retry it.
+
+const keySchema = {
+ head({ projectId }) {
+ return `head:{${projectId}}`
+ },
+ headVersion({ projectId }) {
+ return `head-version:{${projectId}}`
+ },
+ persistedVersion({ projectId }) {
+ return `persisted-version:{${projectId}}`
+ },
+ expireTime({ projectId }) {
+ return `expire-time:{${projectId}}`
+ },
+ persistTime({ projectId }) {
+ return `persist-time:{${projectId}}`
+ },
+ changes({ projectId }) {
+ return `changes:{${projectId}}`
+ },
+}
+
+rclient.defineCommand('get_head_snapshot', {
+ numberOfKeys: 2,
+ lua: `
+ local headSnapshotKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+
+ -- Check if the head version exists. If not, consider it a cache miss.
+ local version = redis.call('GET', headVersionKey)
+ if not version then
+ return nil
+ end
+
+ -- Retrieve the snapshot value
+ local snapshot = redis.call('GET', headSnapshotKey)
+ return {snapshot, version}
+ `,
+})
+
+/**
+ * Retrieves the head snapshot from Redis storage
+ * @param {string} projectId - The unique identifier of the project
+ * @returns {Promise<{version: number, snapshot: Snapshot}|null>} A Promise that resolves to an object containing the version and Snapshot,
+ * or null if retrieval fails or cache miss
+ * @throws {Error} If Redis operations fail
+ */
+async function getHeadSnapshot(projectId) {
+ try {
+ const result = await rclient.get_head_snapshot(
+ keySchema.head({ projectId }),
+ keySchema.headVersion({ projectId })
+ )
+ if (!result) {
+ metrics.inc('chunk_store.redis.get_head_snapshot', 1, {
+ status: 'cache-miss',
+ })
+ return null // cache-miss
+ }
+ const snapshot = Snapshot.fromRaw(JSON.parse(result[0]))
+ const version = parseInt(result[1], 10)
+ metrics.inc('chunk_store.redis.get_head_snapshot', 1, {
+ status: 'success',
+ })
+ return { version, snapshot }
+ } catch (err) {
+ metrics.inc('chunk_store.redis.get_head_snapshot', 1, { status: 'error' })
+ throw err
+ }
+}
+
+rclient.defineCommand('queue_changes', {
+ numberOfKeys: 5,
+ lua: `
+ local headSnapshotKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+ local changesKey = KEYS[3]
+ local expireTimeKey = KEYS[4]
+ local persistTimeKey = KEYS[5]
+
+ local baseVersion = tonumber(ARGV[1])
+ local head = ARGV[2]
+ local persistTime = tonumber(ARGV[3])
+ local expireTime = tonumber(ARGV[4])
+ local onlyIfExists = ARGV[5]
+ local changesIndex = 6 -- Changes start here
+
+ local headVersion = tonumber(redis.call('GET', headVersionKey))
+
+ -- Check if updates should only be queued if the project already exists (used for gradual rollouts)
+ if not headVersion and onlyIfExists == 'true' then
+ return 'ignore'
+ end
+
+ -- Check that the supplied baseVersion matches the head version
+ -- If headVersion is nil, it means the project does not exist yet and will be created.
+ if headVersion and headVersion ~= baseVersion then
+ return 'conflict'
+ end
+
+ -- Check if there are any changes to queue
+ if #ARGV < changesIndex then
+ return 'no_changes_provided'
+ end
+
+ -- Store the changes
+ -- RPUSH changesKey change1 change2 ...
+ redis.call('RPUSH', changesKey, unpack(ARGV, changesIndex, #ARGV))
+
+ -- Update head snapshot only if changes were successfully pushed
+ redis.call('SET', headSnapshotKey, head)
+
+ -- Update the head version
+ local numChanges = #ARGV - changesIndex + 1
+ local newHeadVersion = baseVersion + numChanges
+ redis.call('SET', headVersionKey, newHeadVersion)
+
+ -- Update the persist time if the new time is sooner
+ local currentPersistTime = tonumber(redis.call('GET', persistTimeKey))
+ if not currentPersistTime or persistTime < currentPersistTime then
+ redis.call('SET', persistTimeKey, persistTime)
+ end
+
+ -- Update the expire time
+ redis.call('SET', expireTimeKey, expireTime)
+
+ return 'ok'
+ `,
+})
+
+/**
+ * Atomically queues changes to the project history in Redis if the baseVersion matches.
+ * Updates head snapshot, version, persist time, and expire time.
+ *
+ * @param {string} projectId - The project identifier.
+ * @param {Snapshot} headSnapshot - The new head snapshot after applying changes.
+ * @param {number} baseVersion - The expected current head version.
+ * @param {Change[]} changes - An array of Change objects to queue.
+ * @param {object} [opts]
+ * @param {number} [opts.persistTime] - Timestamp (ms since epoch) when the
+ * oldest change in the buffer should be persisted.
+ * @param {number} [opts.expireTime] - Timestamp (ms since epoch) when the
+ * project buffer should expire if inactive.
+ * @param {boolean} [opts.onlyIfExists] - If true, only queue changes if the
+ * project already exists in Redis, otherwise ignore.
+ * @returns {Promise} Resolves on success to either 'ok' or 'ignore'.
+ * @throws {BaseVersionConflictError} If the baseVersion does not match the current head version in Redis.
+ * @throws {Error} If changes array is empty or if Redis operations fail.
+ */
+async function queueChanges(
+ projectId,
+ headSnapshot,
+ baseVersion,
+ changes,
+ opts = {}
+) {
+ if (!changes || changes.length === 0) {
+ throw new Error('Cannot queue empty changes array')
+ }
+
+ const persistTime = opts.persistTime ?? Date.now() + MAX_PERSIST_DELAY_MS
+ const expireTime = opts.expireTime ?? Date.now() + PROJECT_TTL_MS
+ const onlyIfExists = Boolean(opts.onlyIfExists)
+
+ try {
+ const keys = [
+ keySchema.head({ projectId }),
+ keySchema.headVersion({ projectId }),
+ keySchema.changes({ projectId }),
+ keySchema.expireTime({ projectId }),
+ keySchema.persistTime({ projectId }),
+ ]
+
+ const args = [
+ baseVersion.toString(),
+ JSON.stringify(headSnapshot.toRaw()),
+ persistTime.toString(),
+ expireTime.toString(),
+ onlyIfExists.toString(), // Only queue changes if the snapshot already exists
+ ...changes.map(change => JSON.stringify(change.toRaw())), // Serialize changes
+ ]
+
+ const status = await rclient.queue_changes(keys, args)
+ metrics.inc('chunk_store.redis.queue_changes', 1, { status })
+ if (status === 'ok') {
+ return status
+ }
+ if (status === 'ignore') {
+ return status // skip changes when project does not exist and onlyIfExists is true
+ }
+ if (status === 'conflict') {
+ throw new BaseVersionConflictError('base version mismatch', {
+ projectId,
+ baseVersion,
+ })
+ } else {
+ throw new Error(`unexpected result queuing changes: ${status}`)
+ }
+ } catch (err) {
+ if (err instanceof BaseVersionConflictError) {
+ // Re-throw conflict errors directly
+ throw err
+ }
+ metrics.inc('chunk_store.redis.queue_changes', 1, { status: 'error' })
+ throw err
+ }
+}
+
+rclient.defineCommand('get_state', {
+ numberOfKeys: 6, // Number of keys defined in keySchema
+ lua: `
+ local headSnapshotKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+ local persistedVersionKey = KEYS[3]
+ local expireTimeKey = KEYS[4]
+ local persistTimeKey = KEYS[5]
+ local changesKey = KEYS[6]
+
+ local headSnapshot = redis.call('GET', headSnapshotKey)
+ local headVersion = redis.call('GET', headVersionKey)
+ local persistedVersion = redis.call('GET', persistedVersionKey)
+ local expireTime = redis.call('GET', expireTimeKey)
+ local persistTime = redis.call('GET', persistTimeKey)
+ local changes = redis.call('LRANGE', changesKey, 0, -1) -- Get all changes in the list
+
+ return {headSnapshot, headVersion, persistedVersion, expireTime, persistTime, changes}
+ `,
+})
+
+/**
+ * Retrieves the entire state associated with a project from Redis atomically.
+ * @param {string} projectId - The unique identifier of the project.
+ * @returns {Promise} A Promise that resolves to an object containing the project state,
+ * or null if the project state does not exist (e.g., head version is missing).
+ * @throws {Error} If Redis operations fail.
+ */
+async function getState(projectId) {
+ const keys = [
+ keySchema.head({ projectId }),
+ keySchema.headVersion({ projectId }),
+ keySchema.persistedVersion({ projectId }),
+ keySchema.expireTime({ projectId }),
+ keySchema.persistTime({ projectId }),
+ keySchema.changes({ projectId }),
+ ]
+
+ // Pass keys individually, not as an array
+ const result = await rclient.get_state(...keys)
+
+ const [
+ rawHeadSnapshot,
+ rawHeadVersion,
+ rawPersistedVersion,
+ rawExpireTime,
+ rawPersistTime,
+ rawChanges,
+ ] = result
+
+ // Safely parse values, providing defaults or nulls if necessary
+ const headSnapshot = rawHeadSnapshot
+ ? JSON.parse(rawHeadSnapshot)
+ : rawHeadSnapshot
+ const headVersion = rawHeadVersion ? parseInt(rawHeadVersion, 10) : null // Should always exist if result is not null
+ const persistedVersion = rawPersistedVersion
+ ? parseInt(rawPersistedVersion, 10)
+ : null
+ const expireTime = rawExpireTime ? parseInt(rawExpireTime, 10) : null
+ const persistTime = rawPersistTime ? parseInt(rawPersistTime, 10) : null
+ const changes = rawChanges ? rawChanges.map(JSON.parse) : null
+
+ return {
+ headSnapshot,
+ headVersion,
+ persistedVersion,
+ expireTime,
+ persistTime,
+ changes,
+ }
+}
+
+rclient.defineCommand('get_changes_since_version', {
+ numberOfKeys: 2,
+ lua: `
+ local headVersionKey = KEYS[1]
+ local changesKey = KEYS[2]
+
+ local requestedVersion = tonumber(ARGV[1])
+
+ -- Check if head version exists
+ local headVersion = tonumber(redis.call('GET', headVersionKey))
+ if not headVersion then
+ return {'not_found'}
+ end
+
+ -- If requested version equals head version, return empty array
+ if requestedVersion == headVersion then
+ return {'ok', {}}
+ end
+
+ -- If requested version is greater than head version, return error
+ if requestedVersion > headVersion then
+ return {'out_of_bounds'}
+ end
+
+ -- Get length of changes list
+ local changesCount = redis.call('LLEN', changesKey)
+
+ -- Check if requested version is too old (changes already removed from buffer)
+ if requestedVersion < (headVersion - changesCount) then
+ return {'out_of_bounds'}
+ end
+
+ -- Calculate the starting index, using negative indexing to count backwards
+ -- from the end of the list
+ local startIndex = requestedVersion - headVersion
+
+ -- Get changes using LRANGE
+ local changes = redis.call('LRANGE', changesKey, startIndex, -1)
+
+ return {'ok', changes}
+ `,
+})
+
+/**
+ * Retrieves changes since a specific version for a project from Redis.
+ *
+ * @param {string} projectId - The unique identifier of the project.
+ * @param {number} version - The version number to retrieve changes since.
+ * @returns {Promise<{status: string, changes?: Array}>} A Promise that resolves to an object containing:
+ * - status: 'OK', 'NOT_FOUND', or 'OUT_OF_BOUNDS'
+ * - changes: Array of Change objects (only when status is 'OK')
+ * @throws {Error} If Redis operations fail.
+ */
+async function getChangesSinceVersion(projectId, version) {
+ try {
+ const keys = [
+ keySchema.headVersion({ projectId }),
+ keySchema.changes({ projectId }),
+ ]
+
+ const args = [version.toString()]
+
+ const result = await rclient.get_changes_since_version(keys, args)
+ const status = result[0]
+
+ if (status === 'ok') {
+ // If status is OK, parse the changes
+ const changes = result[1]
+ ? result[1].map(rawChange =>
+ typeof rawChange === 'string' ? JSON.parse(rawChange) : rawChange
+ )
+ : []
+
+ metrics.inc('chunk_store.redis.get_changes_since_version', 1, {
+ status: 'success',
+ })
+ return { status, changes }
+ } else {
+ // For other statuses, just return the status
+ metrics.inc('chunk_store.redis.get_changes_since_version', 1, {
+ status,
+ })
+ return { status }
+ }
+ } catch (err) {
+ metrics.inc('chunk_store.redis.get_changes_since_version', 1, {
+ status: 'error',
+ })
+ throw err
+ }
+}
+
+rclient.defineCommand('get_non_persisted_changes', {
+ numberOfKeys: 3,
+ lua: `
+ local headVersionKey = KEYS[1]
+ local persistedVersionKey = KEYS[2]
+ local changesKey = KEYS[3]
+ local baseVersion = tonumber(ARGV[1])
+ local maxChanges = tonumber(ARGV[2])
+
+ -- Check if head version exists
+ local headVersion = tonumber(redis.call('GET', headVersionKey))
+ if not headVersion then
+ return {'not_found'}
+ end
+
+ -- Check if persisted version exists
+ local persistedVersion = tonumber(redis.call('GET', persistedVersionKey))
+ if not persistedVersion then
+ local changesCount = tonumber(redis.call('LLEN', changesKey))
+ persistedVersion = headVersion - changesCount
+ end
+
+ if baseVersion < persistedVersion or baseVersion > headVersion then
+ return {'out_of_bounds'}
+ elseif baseVersion == headVersion then
+ return {'ok', {}}
+ else
+ local numChanges = headVersion - baseVersion
+
+ local endIndex, expectedChanges
+ if maxChanges > 0 and maxChanges < numChanges then
+ -- return only the first maxChanges changes; the end index is inclusive
+ endIndex = -numChanges + maxChanges - 1
+ expectedChanges = maxChanges
+ else
+ endIndex = -1
+ expectedChanges = numChanges
+ end
+
+ local changes = redis.call('LRANGE', changesKey, -numChanges, endIndex)
+
+ if #changes < expectedChanges then
+ -- We didn't get as many changes as we expected
+ return {'out_of_bounds'}
+ end
+
+ return {'ok', changes}
+ end
+ `,
+})
+
+/**
+ * Retrieves non-persisted changes for a project from Redis.
+ *
+ * @param {string} projectId - The unique identifier of the project.
+ * @param {number} baseVersion - The version on top of which the changes should
+ * be applied.
+ * @param {object} [opts]
+ * @param {number} [opts.maxChanges] - The maximum number of changes to return.
+ * Defaults to 0, meaning no limit.
+ * @returns {Promise} Changes that can be applied on top of
+ * baseVersion. An empty array means that the project doesn't have
+ * changes to persist. A null value means that the non-persisted
+ * changes can't be applied to the given base version.
+ *
+ * @throws {Error} If Redis operations fail.
+ */
+async function getNonPersistedChanges(projectId, baseVersion, opts = {}) {
+ let result
+ try {
+ result = await rclient.get_non_persisted_changes(
+ keySchema.headVersion({ projectId }),
+ keySchema.persistedVersion({ projectId }),
+ keySchema.changes({ projectId }),
+ baseVersion.toString(),
+ opts.maxChanges ?? 0
+ )
+ } catch (err) {
+ metrics.inc('chunk_store.redis.get_non_persisted_changes', 1, {
+ status: 'error',
+ })
+ throw err
+ }
+
+ const status = result[0]
+ metrics.inc('chunk_store.redis.get_non_persisted_changes', 1, {
+ status,
+ })
+
+ if (status === 'ok') {
+ return result[1].map(json => Change.fromRaw(JSON.parse(json)))
+ } else if (status === 'not_found') {
+ return []
+ } else if (status === 'out_of_bounds') {
+ throw new VersionOutOfBoundsError(
+ "Non-persisted changes can't be applied to base version",
+ { projectId, baseVersion }
+ )
+ } else {
+ throw new OError('unknown status for get_non_persisted_changes', {
+ projectId,
+ baseVersion,
+ status,
+ })
+ }
+}
+
+rclient.defineCommand('set_persisted_version', {
+ numberOfKeys: 4,
+ lua: `
+ local headVersionKey = KEYS[1]
+ local persistedVersionKey = KEYS[2]
+ local persistTimeKey = KEYS[3]
+ local changesKey = KEYS[4]
+
+ local newPersistedVersion = tonumber(ARGV[1])
+ local maxPersistedChanges = tonumber(ARGV[2])
+
+ -- Check if head version exists
+ local headVersion = tonumber(redis.call('GET', headVersionKey))
+ if not headVersion then
+ return 'not_found'
+ end
+
+ -- Get current persisted version
+ local persistedVersion = tonumber(redis.call('GET', persistedVersionKey))
+ if persistedVersion and persistedVersion > newPersistedVersion then
+ return 'too_low'
+ end
+
+ -- Refuse to set a persisted version that is higher than the head version
+ if newPersistedVersion > headVersion then
+ return 'too_high'
+ end
+
+ -- Set the persisted version
+ redis.call('SET', persistedVersionKey, newPersistedVersion)
+
+ -- Clear the persist time if the persisted version now matches the head version
+ if newPersistedVersion == headVersion then
+ redis.call('DEL', persistTimeKey)
+ end
+
+ -- Calculate the starting index, to keep only maxPersistedChanges beyond the persisted version
+ -- Using negative indexing to count backwards from the end of the list
+ local startIndex = newPersistedVersion - headVersion - maxPersistedChanges
+
+ -- Trim the changes list to keep only the specified number of changes beyond persisted version
+ if startIndex < 0 then
+ redis.call('LTRIM', changesKey, startIndex, -1)
+ end
+
+ return 'ok'
+ `,
+})
+
+/**
+ * Sets the persisted version for a project in Redis and trims the changes list.
+ *
+ * @param {string} projectId - The unique identifier of the project.
+ * @param {number} persistedVersion - The version number to set as persisted.
+ * @returns {Promise} A Promise that resolves to 'OK' or 'NOT_FOUND'.
+ * @throws {Error} If Redis operations fail.
+ */
+async function setPersistedVersion(projectId, persistedVersion) {
+ try {
+ const keys = [
+ keySchema.headVersion({ projectId }),
+ keySchema.persistedVersion({ projectId }),
+ keySchema.persistTime({ projectId }),
+ keySchema.changes({ projectId }),
+ ]
+
+ const args = [persistedVersion.toString(), MAX_PERSISTED_CHANGES.toString()]
+
+ const status = await rclient.set_persisted_version(keys, args)
+
+ metrics.inc('chunk_store.redis.set_persisted_version', 1, {
+ status,
+ })
+
+ if (status === 'too_high') {
+ throw new VersionOutOfBoundsError(
+ 'Persisted version cannot be higher than head version',
+ { projectId, persistedVersion }
+ )
+ }
+
+ return status
+ } catch (err) {
+ metrics.inc('chunk_store.redis.set_persisted_version', 1, {
+ status: 'error',
+ })
+ throw err
+ }
+}
+
+rclient.defineCommand('hard_delete_project', {
+ numberOfKeys: 6,
+ lua: `
+ local headKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+ local persistedVersionKey = KEYS[3]
+ local expireTimeKey = KEYS[4]
+ local persistTimeKey = KEYS[5]
+ local changesKey = KEYS[6]
+ -- Delete all keys associated with the project
+ redis.call('DEL',
+ headKey,
+ headVersionKey,
+ persistedVersionKey,
+ expireTimeKey,
+ persistTimeKey,
+ changesKey
+ )
+ return 'ok'
+ `,
+})
+
+/** Hard delete a project from Redis by removing all keys associated with it.
+ * This is only to be used when a project is **permanently** deleted.
+ * DO NOT USE THIS FOR ANY OTHER PURPOSES AS IT WILL REMOVE NON-PERSISTED CHANGES.
+ * @param {string} projectId - The unique identifier of the project to delete.
+ * @returns {Promise} A Promise that resolves to 'ok' on success.
+ * @throws {Error} If Redis operations fail.
+ */
+async function hardDeleteProject(projectId) {
+ try {
+ const status = await rclient.hard_delete_project(
+ keySchema.head({ projectId }),
+ keySchema.headVersion({ projectId }),
+ keySchema.persistedVersion({ projectId }),
+ keySchema.expireTime({ projectId }),
+ keySchema.persistTime({ projectId }),
+ keySchema.changes({ projectId })
+ )
+ metrics.inc('chunk_store.redis.hard_delete_project', 1, { status })
+ return status
+ } catch (err) {
+ metrics.inc('chunk_store.redis.hard_delete_project', 1, { status: 'error' })
+ throw err
+ }
+}
+
+rclient.defineCommand('set_expire_time', {
+ numberOfKeys: 2,
+ lua: `
+ local expireTimeKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+ local expireTime = tonumber(ARGV[1])
+
+ -- Only set the expire time if the project is loaded in Redis
+ local headVersion = redis.call('GET', headVersionKey)
+ if headVersion then
+ redis.call('SET', expireTimeKey, expireTime)
+ end
+ `,
+})
+
+/**
+ * Sets the expire version for a project in Redis
+ *
+ * @param {string} projectId
+ * @param {number} expireTime - Timestamp (ms since epoch) when the project
+ * buffer should expire if inactive
+ */
+async function setExpireTime(projectId, expireTime) {
+ try {
+ await rclient.set_expire_time(
+ keySchema.expireTime({ projectId }),
+ keySchema.headVersion({ projectId }),
+ expireTime.toString()
+ )
+ metrics.inc('chunk_store.redis.set_expire_time', 1, { status: 'success' })
+ } catch (err) {
+ metrics.inc('chunk_store.redis.set_expire_time', 1, { status: 'error' })
+ throw err
+ }
+}
+
+rclient.defineCommand('expire_project', {
+ numberOfKeys: 6,
+ lua: `
+ local headKey = KEYS[1]
+ local headVersionKey = KEYS[2]
+ local changesKey = KEYS[3]
+ local persistedVersionKey = KEYS[4]
+ local persistTimeKey = KEYS[5]
+ local expireTimeKey = KEYS[6]
+
+ local headVersion = tonumber(redis.call('GET', headVersionKey))
+ if not headVersion then
+ return 'not-found'
+ end
+
+ local persistedVersion = tonumber(redis.call('GET', persistedVersionKey))
+ if not persistedVersion or persistedVersion ~= headVersion then
+ return 'not-persisted'
+ end
+
+ redis.call('DEL',
+ headKey,
+ headVersionKey,
+ changesKey,
+ persistedVersionKey,
+ persistTimeKey,
+ expireTimeKey
+ )
+ return 'success'
+ `,
+})
+
+async function expireProject(projectId) {
+ try {
+ const status = await rclient.expire_project(
+ keySchema.head({ projectId }),
+ keySchema.headVersion({ projectId }),
+ keySchema.changes({ projectId }),
+ keySchema.persistedVersion({ projectId }),
+ keySchema.persistTime({ projectId }),
+ keySchema.expireTime({ projectId })
+ )
+ metrics.inc('chunk_store.redis.expire_project', 1, {
+ status,
+ })
+ return status
+ } catch (err) {
+ metrics.inc('chunk_store.redis.expire_project', 1, {
+ status: 'error',
+ })
+ throw err
+ }
+}
+
+rclient.defineCommand('claim_job', {
+ numberOfKeys: 1,
+ lua: `
+ local jobTimeKey = KEYS[1]
+ local currentTime = tonumber(ARGV[1])
+ local retryDelay = tonumber(ARGV[2])
+
+ local jobTime = tonumber(redis.call('GET', jobTimeKey))
+ if not jobTime then
+ return {'no-job'}
+ end
+
+ local msUntilReady = jobTime - currentTime
+ if msUntilReady <= 0 then
+ local retryTime = currentTime + retryDelay
+ redis.call('SET', jobTimeKey, retryTime)
+ return {'ok', retryTime}
+ else
+ return {'wait', msUntilReady}
+ end
+ `,
+})
+
+rclient.defineCommand('close_job', {
+ numberOfKeys: 1,
+ lua: `
+ local jobTimeKey = KEYS[1]
+ local expectedJobTime = tonumber(ARGV[1])
+
+ local jobTime = tonumber(redis.call('GET', jobTimeKey))
+ if jobTime and jobTime == expectedJobTime then
+ redis.call('DEL', jobTimeKey)
+ end
+ `,
+})
+
+/**
+ * Claim an expire job
+ *
+ * @param {string} projectId
+ * @return {Promise}
+ */
+async function claimExpireJob(projectId) {
+ return await claimJob(keySchema.expireTime({ projectId }))
+}
+
+/**
+ * Claim a persist job
+ *
+ * @param {string} projectId
+ * @return {Promise}
+ */
+async function claimPersistJob(projectId) {
+ return await claimJob(keySchema.persistTime({ projectId }))
+}
+
+/**
+ * Claim a persist or expire job
+ *
+ * @param {string} jobKey - the Redis key containing the time at which the job
+ * is ready
+ * @return {Promise}
+ */
+async function claimJob(jobKey) {
+ let result, status
+ try {
+ result = await rclient.claim_job(jobKey, Date.now(), RETRY_DELAY_MS)
+ status = result[0]
+ metrics.inc('chunk_store.redis.claim_job', 1, { status })
+ } catch (err) {
+ metrics.inc('chunk_store.redis.claim_job', 1, { status: 'error' })
+ throw err
+ }
+
+ if (status === 'ok') {
+ return new Job(jobKey, parseInt(result[1], 10))
+ } else if (status === 'wait') {
+ throw new JobNotReadyError('job not ready', {
+ jobKey,
+ retryTime: result[1],
+ })
+ } else if (status === 'no-job') {
+ throw new JobNotFoundError('job not found', { jobKey })
+ } else {
+ throw new OError('unknown status for claim_job', { jobKey, status })
+ }
+}
+
+/**
+ * Handle for a claimed job
+ */
+class Job {
+ /**
+ * @param {string} redisKey
+ * @param {number} claimTimestamp
+ */
+ constructor(redisKey, claimTimestamp) {
+ this.redisKey = redisKey
+ this.claimTimestamp = claimTimestamp
+ }
+
+ async close() {
+ try {
+ await rclient.close_job(this.redisKey, this.claimTimestamp.toString())
+ metrics.inc('chunk_store.redis.close_job', 1, { status: 'success' })
+ } catch (err) {
+ metrics.inc('chunk_store.redis.close_job', 1, { status: 'error' })
+ throw err
+ }
+ }
+}
+
+module.exports = {
+ getHeadSnapshot,
+ queueChanges,
+ getState,
+ getChangesSinceVersion,
+ getNonPersistedChanges,
+ setPersistedVersion,
+ hardDeleteProject,
+ setExpireTime,
+ expireProject,
+ claimExpireJob,
+ claimPersistJob,
+ MAX_PERSISTED_CHANGES,
+ MAX_PERSIST_DELAY_MS,
+ PROJECT_TTL_MS,
+ RETRY_DELAY_MS,
+ keySchema,
+}
diff --git a/services/history-v1/storage/lib/commit_changes.js b/services/history-v1/storage/lib/commit_changes.js
new file mode 100644
index 0000000000..5749e5fc0e
--- /dev/null
+++ b/services/history-v1/storage/lib/commit_changes.js
@@ -0,0 +1,159 @@
+// @ts-check
+
+'use strict'
+
+const metrics = require('@overleaf/metrics')
+const redisBackend = require('./chunk_store/redis')
+const logger = require('@overleaf/logger')
+const queueChanges = require('./queue_changes')
+const persistChanges = require('./persist_changes')
+const persistBuffer = require('./persist_buffer')
+
+/**
+ * @typedef {import('overleaf-editor-core').Change} Change
+ */
+
+/**
+ * Handle incoming changes by processing them according to the specified options.
+ * @param {string} projectId
+ * @param {Change[]} changes
+ * @param {Object} limits
+ * @param {number} endVersion
+ * @param {Object} options
+ * @param {number} [options.historyBufferLevel] - The history buffer level to use for processing changes.
+ * @param {Boolean} [options.forcePersistBuffer] - If true, forces the buffer to be persisted before any operation.
+ * @return {Promise.}
+ */
+
+async function commitChanges(
+ projectId,
+ changes,
+ limits,
+ endVersion,
+ options = {}
+) {
+ const { historyBufferLevel, forcePersistBuffer } = options
+
+ // Force the buffer to be persisted if specified.
+ if (forcePersistBuffer) {
+ try {
+ const status = await redisBackend.expireProject(projectId) // clear the project from Redis if it is persisted, returns 'not-persisted' if it was not persisted
+ if (status === 'not-persisted') {
+ await persistBuffer(projectId, limits)
+ await redisBackend.expireProject(projectId) // clear the project from Redis after persisting
+ metrics.inc('persist_buffer_force', 1, { status: 'persisted' })
+ }
+ } catch (err) {
+ metrics.inc('persist_buffer_force', 1, { status: 'error' })
+ logger.error(
+ { err, projectId },
+ 'failed to persist buffer before committing changes'
+ )
+ }
+ }
+
+ metrics.inc('commit_changes', 1, {
+ history_buffer_level: historyBufferLevel || 0,
+ })
+
+ // Now handle the changes based on the configured history buffer level.
+ switch (historyBufferLevel) {
+ case 4: // Queue changes and only persist them in the background
+ await queueChanges(projectId, changes, endVersion)
+ return {}
+ case 3: // Queue changes and immediately persist with persistBuffer
+ await queueChanges(projectId, changes, endVersion)
+ return await persistBuffer(projectId, limits)
+ case 2: // Equivalent to queueChangesInRedis:true
+ await queueChangesFake(projectId, changes, endVersion)
+ return await persistChanges(projectId, changes, limits, endVersion)
+ case 1: // Queue changes with fake persist only for projects in redis already
+ await queueChangesFakeOnlyIfExists(projectId, changes, endVersion)
+ return await persistChanges(projectId, changes, limits, endVersion)
+ case 0: // Persist changes directly to the chunk store
+ return await persistChanges(projectId, changes, limits, endVersion)
+ default:
+ throw new Error(`Invalid history buffer level: ${historyBufferLevel}`)
+ }
+}
+
+/**
+ * Queues a set of changes in redis as if they had been persisted, ignoring any errors.
+ * @param {string} projectId
+ * @param {Change[]} changes
+ * @param {number} endVersion
+ * @param {Object} [options]
+ * @param {boolean} [options.onlyIfExists] - If true, only queue changes if the project
+ * already exists in Redis.
+ */
+
+async function queueChangesFake(projectId, changes, endVersion, options = {}) {
+ try {
+ await queueChanges(projectId, changes, endVersion)
+ await fakePersistRedisChanges(projectId, changes, endVersion)
+ } catch (err) {
+ logger.error({ err }, 'Chunk buffer verification failed')
+ }
+}
+
+/**
+ * Queues changes in Redis, simulating persistence, but only if the project already exists.
+ * @param {string} projectId - The ID of the project.
+ * @param {Change[]} changes - An array of changes to be queued.
+ * @param {number} endVersion - The expected version of the project before these changes are applied.
+ */
+
+async function queueChangesFakeOnlyIfExists(projectId, changes, endVersion) {
+ await queueChangesFake(projectId, changes, endVersion, {
+ onlyIfExists: true,
+ })
+}
+
+/**
+ * Simulates the persistence of changes by verifying a given set of changes against
+ * what is currently stored as non-persisted in Redis, and then updates the
+ * persisted version number in Redis.
+ *
+ * @async
+ * @param {string} projectId - The ID of the project.
+ * @param {Change[]} changesToPersist - An array of changes that are expected to be
+ * persisted. These are used for verification
+ * against the changes currently in Redis.
+ * @param {number} baseVersion - The base version number from which to calculate
+ * the new persisted version.
+ * @returns {Promise} A promise that resolves when the persisted version
+ * in Redis has been updated.
+ */
+async function fakePersistRedisChanges(
+ projectId,
+ changesToPersist,
+ baseVersion
+) {
+ const nonPersistedChanges = await redisBackend.getNonPersistedChanges(
+ projectId,
+ baseVersion
+ )
+
+ if (
+ serializeChanges(nonPersistedChanges) === serializeChanges(changesToPersist)
+ ) {
+ metrics.inc('persist_redis_changes_verification', 1, { status: 'match' })
+ } else {
+ logger.warn({ projectId }, 'mismatch of non-persisted changes from Redis')
+ metrics.inc('persist_redis_changes_verification', 1, {
+ status: 'mismatch',
+ })
+ }
+
+ const persistedVersion = baseVersion + nonPersistedChanges.length
+ await redisBackend.setPersistedVersion(projectId, persistedVersion)
+}
+
+/**
+ * @param {Change[]} changes
+ */
+function serializeChanges(changes) {
+ return JSON.stringify(changes.map(change => change.toRaw()))
+}
+
+module.exports = commitChanges
diff --git a/services/history-v1/storage/lib/content_hash.js b/services/history-v1/storage/lib/content_hash.js
new file mode 100644
index 0000000000..a381babc04
--- /dev/null
+++ b/services/history-v1/storage/lib/content_hash.js
@@ -0,0 +1,18 @@
+// @ts-check
+
+const { createHash } = require('node:crypto')
+
+/**
+ * Compute a SHA-1 hash of the content
+ *
+ * This is used to validate incoming updates.
+ *
+ * @param {string} content
+ */
+function getContentHash(content) {
+ const hash = createHash('sha-1')
+ hash.update(content)
+ return hash.digest('hex')
+}
+
+module.exports = { getContentHash }
diff --git a/services/history-v1/storage/lib/errors.js b/services/history-v1/storage/lib/errors.js
new file mode 100644
index 0000000000..626536b079
--- /dev/null
+++ b/services/history-v1/storage/lib/errors.js
@@ -0,0 +1,5 @@
+const OError = require('@overleaf/o-error')
+
+class InvalidChangeError extends OError {}
+
+module.exports = { InvalidChangeError }
diff --git a/services/history-v1/storage/lib/history_store.js b/services/history-v1/storage/lib/history_store.js
index 0e7c11ffb5..e51bdc25c5 100644
--- a/services/history-v1/storage/lib/history_store.js
+++ b/services/history-v1/storage/lib/history_store.js
@@ -1,10 +1,13 @@
+// @ts-check
'use strict'
-const BPromise = require('bluebird')
const core = require('overleaf-editor-core')
const config = require('config')
-const path = require('path')
+const path = require('node:path')
+const Stream = require('node:stream')
+const { promisify } = require('node:util')
+const zlib = require('node:zlib')
const OError = require('@overleaf/o-error')
const objectPersistor = require('@overleaf/object-persistor')
@@ -17,26 +20,48 @@ const streams = require('./streams')
const Chunk = core.Chunk
-const BUCKET = config.get('chunkStore.bucket')
+const gzip = promisify(zlib.gzip)
+const gunzip = promisify(zlib.gunzip)
class LoadError extends OError {
- constructor(projectId, chunkId) {
- super('HistoryStore: failed to load chunk history', { projectId, chunkId })
+ /**
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {any} cause
+ */
+ constructor(projectId, chunkId, cause) {
+ super(
+ 'HistoryStore: failed to load chunk history',
+ { projectId, chunkId },
+ cause
+ )
this.projectId = projectId
this.chunkId = chunkId
}
}
-HistoryStore.LoadError = LoadError
class StoreError extends OError {
- constructor(projectId, chunkId) {
- super('HistoryStore: failed to store chunk history', { projectId, chunkId })
+ /**
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {any} cause
+ */
+ constructor(projectId, chunkId, cause) {
+ super(
+ 'HistoryStore: failed to store chunk history',
+ { projectId, chunkId },
+ cause
+ )
this.projectId = projectId
this.chunkId = chunkId
}
}
-HistoryStore.StoreError = StoreError
+/**
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @return {string}
+ */
function getKey(projectId, chunkId) {
return path.join(projectKey.format(projectId), projectKey.pad(chunkId))
}
@@ -53,86 +78,125 @@ function getKey(projectId, chunkId) {
*
* @class
*/
-function HistoryStore() {}
+class HistoryStore {
+ #persistor
+ #bucket
+ constructor(persistor, bucket) {
+ this.#persistor = persistor
+ this.#bucket = bucket
+ }
-/**
- * Load the raw object for a History.
- *
- * @param {number} projectId
- * @param {number} chunkId
- * @return {Promise.}
- */
-HistoryStore.prototype.loadRaw = function historyStoreLoadRaw(
- projectId,
- chunkId
-) {
- assert.projectId(projectId, 'bad projectId')
- assert.chunkId(chunkId, 'bad chunkId')
+ /**
+ * Load the raw object for a History.
+ *
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @return {Promise}
+ */
+ async loadRaw(projectId, chunkId) {
+ assert.projectId(projectId, 'bad projectId')
+ assert.chunkId(chunkId, 'bad chunkId')
- const key = getKey(projectId, chunkId)
+ const key = getKey(projectId, chunkId)
- logger.debug({ projectId, chunkId }, 'loadRaw started')
- return BPromise.resolve()
- .then(() => persistor.getObjectStream(BUCKET, key))
- .then(streams.gunzipStreamToBuffer)
- .then(buffer => JSON.parse(buffer))
- .catch(err => {
+ logger.debug({ projectId, chunkId }, 'loadRaw started')
+ try {
+ const buf = await streams.gunzipStreamToBuffer(
+ await this.#persistor.getObjectStream(this.#bucket, key)
+ )
+ return JSON.parse(buf.toString('utf-8'))
+ } catch (err) {
if (err instanceof objectPersistor.Errors.NotFoundError) {
throw new Chunk.NotPersistedError(projectId)
}
- throw new HistoryStore.LoadError(projectId, chunkId).withCause(err)
- })
- .finally(() => logger.debug({ projectId, chunkId }, 'loadRaw finished'))
+ throw new LoadError(projectId, chunkId, err)
+ } finally {
+ logger.debug({ projectId, chunkId }, 'loadRaw finished')
+ }
+ }
+
+ async loadRawWithBuffer(projectId, chunkId) {
+ assert.projectId(projectId, 'bad projectId')
+ assert.chunkId(chunkId, 'bad chunkId')
+
+ const key = getKey(projectId, chunkId)
+
+ logger.debug({ projectId, chunkId }, 'loadBuffer started')
+ try {
+ const buf = await streams.readStreamToBuffer(
+ await this.#persistor.getObjectStream(this.#bucket, key)
+ )
+ const unzipped = await gunzip(buf)
+ return {
+ buffer: buf,
+ raw: JSON.parse(unzipped.toString('utf-8')),
+ }
+ } catch (err) {
+ if (err instanceof objectPersistor.Errors.NotFoundError) {
+ throw new Chunk.NotPersistedError(projectId)
+ }
+ throw new LoadError(projectId, chunkId, err)
+ } finally {
+ logger.debug({ projectId, chunkId }, 'loadBuffer finished')
+ }
+ }
+
+ /**
+ * Compress and store a {@link History}.
+ *
+ * @param {string} projectId
+ * @param {string} chunkId
+ * @param {import('overleaf-editor-core/lib/types').RawHistory} rawHistory
+ */
+ async storeRaw(projectId, chunkId, rawHistory) {
+ assert.projectId(projectId, 'bad projectId')
+ assert.chunkId(chunkId, 'bad chunkId')
+ assert.object(rawHistory, 'bad rawHistory')
+
+ const key = getKey(projectId, chunkId)
+
+ logger.debug({ projectId, chunkId }, 'storeRaw started')
+
+ const buf = await gzip(JSON.stringify(rawHistory))
+ try {
+ await this.#persistor.sendStream(
+ this.#bucket,
+ key,
+ Stream.Readable.from([buf]),
+ {
+ contentType: 'application/json',
+ contentEncoding: 'gzip',
+ contentLength: buf.byteLength,
+ }
+ )
+ } catch (err) {
+ throw new StoreError(projectId, chunkId, err)
+ } finally {
+ logger.debug({ projectId, chunkId }, 'storeRaw finished')
+ }
+ }
+
+ /**
+ * Delete multiple chunks from bucket. Expects an Array of objects with
+ * projectId and chunkId properties
+ * @param {Array<{projectId: string,chunkId:string}>} chunks
+ */
+ async deleteChunks(chunks) {
+ logger.debug({ chunks }, 'deleteChunks started')
+ try {
+ await Promise.all(
+ chunks.map(chunk => {
+ const key = getKey(chunk.projectId, chunk.chunkId)
+ return this.#persistor.deleteObject(this.#bucket, key)
+ })
+ )
+ } finally {
+ logger.debug({ chunks }, 'deleteChunks finished')
+ }
+ }
}
-/**
- * Compress and store a {@link History}.
- *
- * @param {number} projectId
- * @param {number} chunkId
- * @param {Object} rawHistory
- * @return {Promise}
- */
-HistoryStore.prototype.storeRaw = function historyStoreStoreRaw(
- projectId,
- chunkId,
- rawHistory
-) {
- assert.projectId(projectId, 'bad projectId')
- assert.chunkId(chunkId, 'bad chunkId')
- assert.object(rawHistory, 'bad rawHistory')
-
- const key = getKey(projectId, chunkId)
-
- logger.debug({ projectId, chunkId }, 'storeRaw started')
- return BPromise.resolve()
- .then(() => streams.gzipStringToStream(JSON.stringify(rawHistory)))
- .then(stream =>
- persistor.sendStream(BUCKET, key, stream, {
- contentType: 'application/json',
- contentEncoding: 'gzip',
- })
- )
- .catch(err => {
- throw new HistoryStore.StoreError(projectId, chunkId).withCause(err)
- })
- .finally(() => logger.debug({ projectId, chunkId }, 'storeRaw finished'))
+module.exports = {
+ HistoryStore,
+ historyStore: new HistoryStore(persistor, config.get('chunkStore.bucket')),
}
-
-/**
- * Delete multiple chunks from bucket. Expects an Array of objects with
- * projectId and chunkId properties
- * @param {Array} chunks
- * @return {Promise}
- */
-HistoryStore.prototype.deleteChunks = function historyDeleteChunks(chunks) {
- logger.debug({ chunks }, 'deleteChunks started')
- return BPromise.all(
- chunks.map(chunk => {
- const key = getKey(chunk.projectId, chunk.chunkId)
- return persistor.deleteObject(BUCKET, key)
- })
- ).finally(() => logger.debug({ chunks }, 'deleteChunks finished'))
-}
-
-module.exports = new HistoryStore()
diff --git a/services/history-v1/storage/lib/knex.js b/services/history-v1/storage/lib/knex.js
index 5cdc85e2ab..7000fe034c 100644
--- a/services/history-v1/storage/lib/knex.js
+++ b/services/history-v1/storage/lib/knex.js
@@ -1,6 +1,8 @@
+// @ts-check
+
'use strict'
const env = process.env.NODE_ENV || 'development'
const knexfile = require('../../knexfile')
-module.exports = require('knex')(knexfile[env])
+module.exports = require('knex').default(knexfile[env])
diff --git a/services/history-v1/storage/lib/knex_read_only.js b/services/history-v1/storage/lib/knex_read_only.js
new file mode 100644
index 0000000000..a78c4689a4
--- /dev/null
+++ b/services/history-v1/storage/lib/knex_read_only.js
@@ -0,0 +1,19 @@
+'use strict'
+
+const config = require('config')
+const knexfile = require('../../knexfile')
+
+const env = process.env.NODE_ENV || 'development'
+
+if (config.databaseUrlReadOnly) {
+ module.exports = require('knex')({
+ ...knexfile[env],
+ pool: {
+ ...knexfile[env].pool,
+ min: 0,
+ },
+ connection: config.databaseUrlReadOnly,
+ })
+} else {
+ module.exports = require('./knex')
+}
diff --git a/services/history-v1/storage/lib/mongodb.js b/services/history-v1/storage/lib/mongodb.js
index 53b1837a8f..e887bc25a5 100644
--- a/services/history-v1/storage/lib/mongodb.js
+++ b/services/history-v1/storage/lib/mongodb.js
@@ -10,7 +10,21 @@ const chunks = db.collection('projectHistoryChunks')
const blobs = db.collection('projectHistoryBlobs')
const globalBlobs = db.collection('projectHistoryGlobalBlobs')
const shardedBlobs = db.collection('projectHistoryShardedBlobs')
+const projects = db.collection('projects')
+// Temporary collection for tracking progress of backed up old blobs (without a hash).
+// The initial sync process will be able to skip over these.
+// Schema: _id: projectId, blobs: [Binary]
+const backedUpBlobs = db.collection('projectHistoryBackedUpBlobs')
Metrics.mongodb.monitor(client)
-module.exports = { client, db, chunks, blobs, globalBlobs, shardedBlobs }
+module.exports = {
+ client,
+ db,
+ chunks,
+ blobs,
+ globalBlobs,
+ projects,
+ shardedBlobs,
+ backedUpBlobs,
+}
diff --git a/services/history-v1/storage/lib/persist_buffer.js b/services/history-v1/storage/lib/persist_buffer.js
new file mode 100644
index 0000000000..68b71e148f
--- /dev/null
+++ b/services/history-v1/storage/lib/persist_buffer.js
@@ -0,0 +1,237 @@
+// @ts-check
+'use strict'
+
+const logger = require('@overleaf/logger')
+const metrics = require('@overleaf/metrics')
+const OError = require('@overleaf/o-error')
+const assert = require('./assert')
+const chunkStore = require('./chunk_store')
+const { BlobStore } = require('./blob_store')
+const BatchBlobStore = require('./batch_blob_store')
+const persistChanges = require('./persist_changes')
+const resyncProject = require('./resync_project')
+const redisBackend = require('./chunk_store/redis')
+
+const PERSIST_BATCH_SIZE = 50
+
+/**
+ * Persist the changes from Redis buffer to the main storage
+ *
+ * Algorithm Outline:
+ * 1. Get the latest chunk's endVersion from the database
+ * 2. Get non-persisted changes from Redis that are after this endVersion.
+ * 3. If no such changes, exit.
+ * 4. Load file blobs for these Redis changes.
+ * 5. Run the persistChanges() algorithm to store these changes into a new chunk(s) in GCS.
+ * - This must not decrease the endVersion. If changes were processed, it must advance.
+ * 6. Set the new persisted version (endVersion of the latest persisted chunk) in Redis.
+ *
+ * @param {string} projectId
+ * @param {Object} limits
+ * @throws {Error | OError} If a critical error occurs during persistence.
+ */
+async function persistBuffer(projectId, limits) {
+ assert.projectId(projectId)
+ logger.debug({ projectId }, 'starting persistBuffer operation')
+
+ // 1. Get the latest chunk's endVersion from GCS/main store
+ let endVersion
+ const latestChunkMetadata = await chunkStore.getLatestChunkMetadata(projectId)
+
+ if (latestChunkMetadata) {
+ endVersion = latestChunkMetadata.endVersion
+ } else {
+ endVersion = 0 // No chunks found, start from version 0
+ logger.debug({ projectId }, 'no existing chunks found in main storage')
+ }
+ const originalEndVersion = endVersion
+
+ logger.debug({ projectId, endVersion }, 'got latest persisted chunk')
+
+ // Process changes in batches
+ let numberOfChangesPersisted = 0
+ let currentChunk = null
+ let resyncNeeded = false
+ let resyncChangesWerePersisted = false
+ while (true) {
+ // 2. Get non-persisted changes from Redis
+ const changesToPersist = await redisBackend.getNonPersistedChanges(
+ projectId,
+ endVersion,
+ { maxChanges: PERSIST_BATCH_SIZE }
+ )
+
+ if (changesToPersist.length === 0) {
+ break
+ }
+
+ logger.debug(
+ {
+ projectId,
+ endVersion,
+ count: changesToPersist.length,
+ },
+ 'found changes in Redis to persist'
+ )
+
+ // 4. Load file blobs for these Redis changes. Errors will propagate.
+ const blobStore = new BlobStore(projectId)
+ const batchBlobStore = new BatchBlobStore(blobStore)
+
+ const blobHashes = new Set()
+ for (const change of changesToPersist) {
+ change.findBlobHashes(blobHashes)
+ }
+ if (blobHashes.size > 0) {
+ await batchBlobStore.preload(Array.from(blobHashes))
+ }
+ for (const change of changesToPersist) {
+ await change.loadFiles('lazy', blobStore)
+ }
+
+ // 5. Run the persistChanges() algorithm. Errors will propagate.
+ logger.debug(
+ {
+ projectId,
+ endVersion,
+ changeCount: changesToPersist.length,
+ },
+ 'calling persistChanges'
+ )
+
+ const persistResult = await persistChanges(
+ projectId,
+ changesToPersist,
+ limits,
+ endVersion
+ )
+
+ if (!persistResult || !persistResult.currentChunk) {
+ metrics.inc('persist_buffer', 1, { status: 'no-chunk-error' })
+ throw new OError(
+ 'persistChanges did not produce a new chunk for non-empty changes',
+ {
+ projectId,
+ endVersion,
+ changeCount: changesToPersist.length,
+ }
+ )
+ }
+
+ currentChunk = persistResult.currentChunk
+ const newEndVersion = currentChunk.getEndVersion()
+
+ if (newEndVersion <= endVersion) {
+ metrics.inc('persist_buffer', 1, { status: 'chunk-version-mismatch' })
+ throw new OError(
+ 'persisted chunk endVersion must be greater than current persisted chunk end version for non-empty changes',
+ {
+ projectId,
+ newEndVersion,
+ endVersion,
+ changeCount: changesToPersist.length,
+ }
+ )
+ }
+
+ logger.debug(
+ {
+ projectId,
+ oldVersion: endVersion,
+ newVersion: newEndVersion,
+ },
+ 'successfully persisted changes from Redis to main storage'
+ )
+
+ // 6. Set the persisted version in Redis. Errors will propagate.
+ const status = await redisBackend.setPersistedVersion(
+ projectId,
+ newEndVersion
+ )
+
+ if (status !== 'ok') {
+ metrics.inc('persist_buffer', 1, { status: 'error-on-persisted-version' })
+ throw new OError('failed to update persisted version in Redis', {
+ projectId,
+ newEndVersion,
+ status,
+ })
+ }
+
+ logger.debug(
+ { projectId, newEndVersion },
+ 'updated persisted version in Redis'
+ )
+ numberOfChangesPersisted += persistResult.numberOfChangesPersisted
+ endVersion = newEndVersion
+
+ // Check if a resync might be needed
+ if (persistResult.resyncNeeded) {
+ resyncNeeded = true
+ }
+
+ if (
+ changesToPersist.some(
+ change => change.getOrigin()?.getKind() === 'history-resync'
+ )
+ ) {
+ resyncChangesWerePersisted = true
+ }
+
+ if (persistResult.numberOfChangesPersisted < PERSIST_BATCH_SIZE) {
+ // We reached the end of available changes
+ break
+ }
+ }
+
+ if (numberOfChangesPersisted === 0) {
+ logger.debug(
+ { projectId, endVersion },
+ 'no new changes in Redis buffer to persist'
+ )
+ metrics.inc('persist_buffer', 1, { status: 'no_changes' })
+ // No changes to persist, update the persisted version in Redis
+ // to match the current endVersion. This shouldn't be needed
+ // unless a worker failed to update the persisted version.
+ await redisBackend.setPersistedVersion(projectId, endVersion)
+ } else {
+ logger.debug(
+ { projectId, finalPersistedVersion: endVersion },
+ 'persistBuffer operation completed successfully'
+ )
+ metrics.inc('persist_buffer', 1, { status: 'persisted' })
+ }
+
+ if (limits.autoResync && resyncNeeded) {
+ if (resyncChangesWerePersisted) {
+ // To avoid an infinite loop, do not resync if the current batch of
+ // changes contains a history resync.
+ logger.warn(
+ { projectId },
+ 'content hash validation failed while persisting a history resync, skipping additional resync'
+ )
+ } else {
+ const backend = chunkStore.getBackend(projectId)
+ const mongoProjectId =
+ await backend.resolveHistoryIdToMongoProjectId(projectId)
+ await resyncProject(mongoProjectId)
+ }
+ }
+
+ if (currentChunk == null) {
+ const { chunk } = await chunkStore.loadByChunkRecord(
+ projectId,
+ latestChunkMetadata
+ )
+ currentChunk = chunk
+ }
+
+ return {
+ numberOfChangesPersisted,
+ originalEndVersion,
+ currentChunk,
+ resyncNeeded,
+ }
+}
+
+module.exports = persistBuffer
diff --git a/services/history-v1/storage/lib/persist_changes.js b/services/history-v1/storage/lib/persist_changes.js
index b661a4818c..d2ca00053f 100644
--- a/services/history-v1/storage/lib/persist_changes.js
+++ b/services/history-v1/storage/lib/persist_changes.js
@@ -1,8 +1,9 @@
-/** @module */
+// @ts-check
+
'use strict'
const _ = require('lodash')
-const BPromise = require('bluebird')
+const logger = require('@overleaf/logger')
const core = require('overleaf-editor-core')
const Chunk = core.Chunk
@@ -10,6 +11,9 @@ const History = core.History
const assert = require('./assert')
const chunkStore = require('./chunk_store')
+const { BlobStore } = require('./blob_store')
+const { InvalidChangeError } = require('./errors')
+const { getContentHash } = require('./content_hash')
function countChangeBytes(change) {
// Note: This is not quite accurate, because the raw change may contain raw
@@ -48,28 +52,35 @@ Timer.prototype.elapsed = function () {
* endVersion may be better suited to the metadata record.
*
* @param {string} projectId
- * @param {Array.} allChanges
+ * @param {core.Change[]} allChanges
* @param {Object} limits
* @param {number} clientEndVersion
* @return {Promise.}
*/
-module.exports = function persistChanges(
- projectId,
- allChanges,
- limits,
- clientEndVersion
-) {
+async function persistChanges(projectId, allChanges, limits, clientEndVersion) {
assert.projectId(projectId)
assert.array(allChanges)
assert.maybe.object(limits)
assert.integer(clientEndVersion)
+ const blobStore = new BlobStore(projectId)
+
+ const earliestChangeTimestamp =
+ allChanges.length > 0 ? allChanges[0].getTimestamp() : null
+
let currentChunk
- // currentSnapshot tracks the latest change that we're applying; we use it to
- // check that the changes we are persisting are valid.
+
+ /**
+ * currentSnapshot tracks the latest change that we're applying; we use it to
+ * check that the changes we are persisting are valid.
+ *
+ * @type {core.Snapshot}
+ */
let currentSnapshot
+
let originalEndVersion
let changesToPersist
+ let resyncNeeded = false
limits = limits || {}
_.defaults(limits, {
@@ -88,57 +99,135 @@ module.exports = function persistChanges(
}
}
- function fillChunk(chunk, changes) {
+ /**
+ * Add changes to a chunk until the chunk is full
+ *
+ * The chunk is full if it reaches a certain number of changes or a certain
+ * size in bytes
+ *
+ * @param {core.Chunk} chunk
+ * @param {core.Change[]} changes
+ */
+ async function fillChunk(chunk, changes) {
let totalBytes = totalChangeBytes(chunk.getChanges())
let changesPushed = false
while (changes.length > 0) {
- if (chunk.getChanges().length >= limits.maxChunkChanges) break
- const changeBytes = countChangeBytes(changes[0])
- if (totalBytes + changeBytes > limits.maxChunkChangeBytes) break
- const changesToFill = changes.splice(0, 1)
- currentSnapshot.applyAll(changesToFill, { strict: true })
- chunk.pushChanges(changesToFill)
+ if (chunk.getChanges().length >= limits.maxChunkChanges) {
+ break
+ }
+
+ const change = changes[0]
+ const changeBytes = countChangeBytes(change)
+
+ if (totalBytes + changeBytes > limits.maxChunkChangeBytes) {
+ break
+ }
+
+ for (const operation of change.iterativelyApplyTo(currentSnapshot, {
+ strict: true,
+ })) {
+ await validateContentHash(operation)
+ }
+
+ chunk.pushChanges([change])
+ changes.shift()
totalBytes += changeBytes
changesPushed = true
}
return changesPushed
}
- function extendLastChunkIfPossible() {
- return chunkStore.loadLatest(projectId).then(function (latestChunk) {
- currentChunk = latestChunk
- originalEndVersion = latestChunk.getEndVersion()
- if (originalEndVersion !== clientEndVersion) {
- throw new Chunk.ConflictingEndVersion(
- clientEndVersion,
- originalEndVersion
- )
+ /**
+ * Check that the operation is valid and can be incorporated to the history.
+ *
+ * For now, this checks content hashes when they are provided.
+ *
+ * @param {core.Operation} operation
+ */
+ async function validateContentHash(operation) {
+ if (operation instanceof core.EditFileOperation) {
+ const editOperation = operation.getOperation()
+ if (
+ editOperation instanceof core.TextOperation &&
+ editOperation.contentHash != null
+ ) {
+ const path = operation.getPathname()
+ const file = currentSnapshot.getFile(path)
+ if (file == null) {
+ throw new InvalidChangeError('file not found for hash validation', {
+ projectId,
+ path,
+ })
+ }
+ await file.load('eager', blobStore)
+ const content = file.getContent({ filterTrackedDeletes: true })
+ const expectedHash = editOperation.contentHash
+ const actualHash = content != null ? getContentHash(content) : null
+ logger.debug({ expectedHash, actualHash }, 'validating content hash')
+ if (actualHash !== expectedHash) {
+ // only log a warning on the first mismatch in each persistChanges call
+ if (!resyncNeeded) {
+ logger.warn(
+ { projectId, path, expectedHash, actualHash },
+ 'content hash mismatch'
+ )
+ }
+ resyncNeeded = true
+ }
+
+ // Remove the content hash from the change before storing it in the chunk.
+ // It was only useful for validation.
+ editOperation.contentHash = null
}
-
- currentSnapshot = latestChunk.getSnapshot().clone()
- const timer = new Timer()
- currentSnapshot.applyAll(latestChunk.getChanges())
-
- if (!fillChunk(currentChunk, changesToPersist)) return
- checkElapsedTime(timer)
-
- return chunkStore.update(projectId, originalEndVersion, currentChunk)
- })
+ }
}
- function createNewChunksAsNeeded() {
- if (changesToPersist.length === 0) return
+ async function loadLatestChunk() {
+ const latestChunk = await chunkStore.loadLatest(projectId, {
+ persistedOnly: true,
+ })
- const endVersion = currentChunk.getEndVersion()
- const history = new History(currentSnapshot.clone(), [])
- const chunk = new Chunk(history, endVersion)
- const timer = new Timer()
- if (fillChunk(chunk, changesToPersist)) {
- checkElapsedTime(timer)
- currentChunk = chunk
- return chunkStore.create(projectId, chunk).then(createNewChunksAsNeeded)
+ currentChunk = latestChunk
+ originalEndVersion = latestChunk.getEndVersion()
+ if (originalEndVersion !== clientEndVersion) {
+ throw new Chunk.ConflictingEndVersion(
+ clientEndVersion,
+ originalEndVersion
+ )
+ }
+
+ currentSnapshot = latestChunk.getSnapshot().clone()
+ currentSnapshot.applyAll(currentChunk.getChanges())
+ }
+
+ async function extendLastChunkIfPossible() {
+ const timer = new Timer()
+ const changesPushed = await fillChunk(currentChunk, changesToPersist)
+ if (!changesPushed) {
+ return
+ }
+
+ checkElapsedTime(timer)
+
+ await chunkStore.update(projectId, currentChunk, earliestChangeTimestamp)
+ }
+
+ async function createNewChunksAsNeeded() {
+ while (changesToPersist.length > 0) {
+ const endVersion = currentChunk.getEndVersion()
+ const history = new History(currentSnapshot.clone(), [])
+ const chunk = new Chunk(history, endVersion)
+ const timer = new Timer()
+
+ const changesPushed = await fillChunk(chunk, changesToPersist)
+ if (changesPushed) {
+ checkElapsedTime(timer)
+ currentChunk = chunk
+ await chunkStore.create(projectId, chunk, earliestChangeTimestamp)
+ } else {
+ throw new Error('failed to fill empty chunk')
+ }
}
- throw new Error('failed to fill empty chunk')
}
function isOlderThanMinChangeTimestamp(change) {
@@ -157,15 +246,20 @@ module.exports = function persistChanges(
if (anyTooOld || tooManyChanges || tooManyBytes) {
changesToPersist = oldChanges
const numberOfChangesToPersist = oldChanges.length
- return extendLastChunkIfPossible()
- .then(createNewChunksAsNeeded)
- .then(function () {
- return {
- numberOfChangesPersisted: numberOfChangesToPersist,
- originalEndVersion,
- currentChunk,
- }
- })
+
+ await loadLatestChunk()
+ await extendLastChunkIfPossible()
+ await createNewChunksAsNeeded()
+
+ return {
+ numberOfChangesPersisted: numberOfChangesToPersist,
+ originalEndVersion,
+ currentChunk,
+ resyncNeeded,
+ }
+ } else {
+ return null
}
- return BPromise.resolve(null)
}
+
+module.exports = persistChanges
diff --git a/services/history-v1/storage/lib/project_archive.js b/services/history-v1/storage/lib/project_archive.js
index d6680ae33c..8a8e93f1c9 100644
--- a/services/history-v1/storage/lib/project_archive.js
+++ b/services/history-v1/storage/lib/project_archive.js
@@ -8,8 +8,8 @@
const Archive = require('archiver')
const BPromise = require('bluebird')
-const fs = require('fs')
-const { pipeline } = require('stream')
+const fs = require('node:fs')
+const { pipeline } = require('node:stream')
const core = require('overleaf-editor-core')
@@ -49,7 +49,7 @@ class ProjectArchive {
/**
* @constructor
* @param {Snapshot} snapshot
- * @param {?number} timeout in ms
+ * @param {number} [timeout] in ms
* @classdesc
* Writes the project snapshot to a zip file.
*/
diff --git a/services/history-v1/storage/lib/project_key.js b/services/history-v1/storage/lib/project_key.js
index e84f024e06..03fb2a5141 100644
--- a/services/history-v1/storage/lib/project_key.js
+++ b/services/history-v1/storage/lib/project_key.js
@@ -1,5 +1,6 @@
+// Keep in sync with services/web/app/src/Features/History/project_key.js
const _ = require('lodash')
-const path = require('path')
+const path = require('node:path')
//
// The advice in http://docs.aws.amazon.com/AmazonS3/latest/dev/
diff --git a/services/history-v1/storage/lib/queue_changes.js b/services/history-v1/storage/lib/queue_changes.js
new file mode 100644
index 0000000000..6b8d4b22b4
--- /dev/null
+++ b/services/history-v1/storage/lib/queue_changes.js
@@ -0,0 +1,75 @@
+// @ts-check
+
+'use strict'
+
+const redisBackend = require('./chunk_store/redis')
+const { BlobStore } = require('./blob_store')
+const chunkStore = require('./chunk_store')
+const core = require('overleaf-editor-core')
+const Chunk = core.Chunk
+
+/**
+ * Queues an incoming set of changes after validating them against the current snapshot.
+ *
+ * @async
+ * @function queueChanges
+ * @param {string} projectId - The project to queue changes for.
+ * @param {Array} changesToQueue - An array of change objects to be applied and queued.
+ * @param {number} endVersion - The expected version of the project before these changes are applied.
+ * This is used for optimistic concurrency control.
+ * @param {Object} [opts] - Additional options for queuing changes.
+ * @throws {Chunk.ConflictingEndVersion} If the provided `endVersion` does not match the
+ * current version of the project.
+ * @returns {Promise} A promise that resolves with the status returned by the
+ * `redisBackend.queueChanges` operation.
+ */
+async function queueChanges(projectId, changesToQueue, endVersion, opts) {
+ const result = await redisBackend.getHeadSnapshot(projectId)
+ let currentSnapshot = null
+ let currentVersion = null
+ if (result) {
+ // If we have a snapshot in redis, we can use it to check the current state
+ // of the project and apply changes to it.
+ currentSnapshot = result.snapshot
+ currentVersion = result.version
+ } else {
+ // Otherwise, load the latest chunk from the chunk store.
+ const latestChunk = await chunkStore.loadLatest(projectId, {
+ persistedOnly: true,
+ })
+ // Throw an error if no latest chunk is found, indicating the project has not been initialised.
+ if (!latestChunk) {
+ throw new Chunk.NotFoundError(projectId)
+ }
+ currentSnapshot = latestChunk.getSnapshot()
+ currentSnapshot.applyAll(latestChunk.getChanges())
+ currentVersion = latestChunk.getEndVersion()
+ }
+
+ // Ensure the endVersion matches the current version of the project.
+ if (endVersion !== currentVersion) {
+ throw new Chunk.ConflictingEndVersion(endVersion, currentVersion)
+ }
+
+ // Compute the new hollow snapshot to be saved to redis.
+ const hollowSnapshot = currentSnapshot
+ const blobStore = new BlobStore(projectId)
+ await hollowSnapshot.loadFiles('hollow', blobStore)
+ // Clone the changes to avoid modifying the original ones when computing the hollow snapshot.
+ const hollowChanges = changesToQueue.map(change => change.clone())
+ for (const change of hollowChanges) {
+ await change.loadFiles('hollow', blobStore)
+ }
+ hollowSnapshot.applyAll(hollowChanges, { strict: true })
+ const baseVersion = currentVersion
+ const status = await redisBackend.queueChanges(
+ projectId,
+ hollowSnapshot,
+ baseVersion,
+ changesToQueue,
+ opts
+ )
+ return status
+}
+
+module.exports = queueChanges
diff --git a/services/history-v1/storage/lib/redis.js b/services/history-v1/storage/lib/redis.js
new file mode 100644
index 0000000000..9b00cc0a26
--- /dev/null
+++ b/services/history-v1/storage/lib/redis.js
@@ -0,0 +1,19 @@
+const config = require('config')
+const redis = require('@overleaf/redis-wrapper')
+
+const historyRedisOptions = config.get('redis.history')
+const rclientHistory = redis.createClient(historyRedisOptions)
+
+const lockRedisOptions = config.get('redis.history')
+const rclientLock = redis.createClient(lockRedisOptions)
+
+async function disconnect() {
+ await Promise.all([rclientHistory.disconnect(), rclientLock.disconnect()])
+}
+
+module.exports = {
+ rclientHistory,
+ rclientLock,
+ redis,
+ disconnect,
+}
diff --git a/services/history-v1/storage/lib/resync_project.js b/services/history-v1/storage/lib/resync_project.js
new file mode 100644
index 0000000000..3ec680bb5b
--- /dev/null
+++ b/services/history-v1/storage/lib/resync_project.js
@@ -0,0 +1,14 @@
+// @ts-check
+
+const config = require('config')
+const { fetchNothing } = require('@overleaf/fetch-utils')
+
+const PROJECT_HISTORY_URL = `http://${config.projectHistory.host}:${config.projectHistory.port}`
+
+async function resyncProject(projectId) {
+ await fetchNothing(`${PROJECT_HISTORY_URL}/project/${projectId}/resync`, {
+ method: 'POST',
+ })
+}
+
+module.exports = resyncProject
diff --git a/services/history-v1/storage/lib/scan.js b/services/history-v1/storage/lib/scan.js
new file mode 100644
index 0000000000..d55f5362c1
--- /dev/null
+++ b/services/history-v1/storage/lib/scan.js
@@ -0,0 +1,202 @@
+// @ts-check
+
+'use strict'
+
+const logger = require('@overleaf/logger')
+const { JobNotFoundError, JobNotReadyError } = require('./chunk_store/errors')
+const BATCH_SIZE = 1000 // Default batch size for SCAN
+
+/**
+ * Asynchronously scans a Redis instance or cluster for keys matching a pattern.
+ *
+ * This function handles both standalone Redis instances and Redis clusters.
+ * For clusters, it iterates over all master nodes. It yields keys in batches
+ * as they are found by the SCAN command.
+ *
+ * @param {object} redisClient - The Redis client instance (from @overleaf/redis-wrapper).
+ * @param {string} pattern - The pattern to match keys against (e.g., 'user:*').
+ * @param {number} [count=BATCH_SIZE] - Optional hint for Redis SCAN count per iteration.
+ * @yields {string[]} A batch of matching keys.
+ */
+async function* scanRedisCluster(redisClient, pattern, count = BATCH_SIZE) {
+ const nodes = redisClient.nodes ? redisClient.nodes('master') : [redisClient]
+
+ for (const node of nodes) {
+ let cursor = '0'
+ do {
+ // redisClient from @overleaf/redis-wrapper uses ioredis style commands
+ const [nextCursor, keys] = await node.scan(
+ cursor,
+ 'MATCH',
+ pattern,
+ 'COUNT',
+ count
+ )
+ cursor = nextCursor
+ if (keys.length > 0) {
+ yield keys
+ }
+ } while (cursor !== '0')
+ }
+}
+
+/**
+ * Extracts the content within the first pair of curly braces {} from a string.
+ * This is used to extract a user ID or project ID from a Redis key.
+ *
+ * @param {string} key - The input string containing content within curly braces.
+ * @returns {string | null} The extracted content (the key ID) if found, otherwise null.
+ */
+function extractKeyId(key) {
+ const match = key.match(/\{(.*?)\}/)
+ if (match && match[1]) {
+ return match[1]
+ }
+ return null
+}
+
+/**
+ * Fetches timestamps for a list of project IDs based on a given key name.
+ *
+ * @param {string[]} projectIds - Array of project identifiers.
+ * @param {object} rclient - The Redis client instance.
+ * @param {string} keyName - The base name for the Redis keys storing the timestamps (e.g., "expire-time", "persist-time").
+ * @param {number} currentTime - The current time (timestamp in milliseconds) to compare against.
+ * @returns {Promise>}
+ * A promise that resolves to an array of objects, each containing a projectId and
+ * its corresponding timestampValue, for due projects only.
+ */
+async function fetchOverdueProjects(projectIds, rclient, keyName, currentTime) {
+ if (!projectIds || projectIds.length === 0) {
+ return []
+ }
+ const timestampKeys = projectIds.map(id => `${keyName}:{${id}}`)
+ const timestamps = await rclient.mget(timestampKeys)
+
+ const dueProjects = []
+ for (let i = 0; i < projectIds.length; i++) {
+ const projectId = projectIds[i]
+ const timestampValue = timestamps[i]
+
+ if (timestampValue !== null) {
+ const timestamp = parseInt(timestampValue, 10)
+ if (!isNaN(timestamp) && currentTime > timestamp) {
+ dueProjects.push({ projectId, timestampValue })
+ }
+ }
+ }
+ return dueProjects
+}
+
+/**
+ * Scans Redis for keys matching a pattern derived from keyName, identifies items that are "due" based on a timestamp,
+ * and performs a specified action on them.
+ *
+ * @param {object} rclient - The Redis client instance.
+ * @param {string} taskName - A descriptive name for the task (used in logging).
+ * @param {string} keyName - The base name for the Redis keys (e.g., "expire-time", "persist-time").
+ * The function will derive the key prefix as `${keyName}:` and scan pattern as `${keyName}:{*}`.
+ * @param {function(string): Promise} actionFn - An async function that takes a projectId and performs an action.
+ * @param {boolean} DRY_RUN - If true, logs actions that would be taken without performing them.
+ * @returns {Promise<{scannedKeyCount: number, processedKeyCount: number}>} Counts of scanned and processed keys.
+ */
+async function scanAndProcessDueItems(
+ rclient,
+ taskName,
+ keyName,
+ actionFn,
+ DRY_RUN
+) {
+ let scannedKeyCount = 0
+ let processedKeyCount = 0
+ const START_TIME = Date.now()
+ const logContext = { taskName, dryRun: DRY_RUN }
+
+ const scanPattern = `${keyName}:{*}`
+
+ if (DRY_RUN) {
+ logger.info(logContext, `Starting ${taskName} scan in DRY RUN mode`)
+ } else {
+ logger.info(logContext, `Starting ${taskName} scan`)
+ }
+
+ for await (const keysBatch of scanRedisCluster(rclient, scanPattern)) {
+ scannedKeyCount += keysBatch.length
+ const projectIds = keysBatch.map(extractKeyId).filter(id => id != null)
+
+ if (projectIds.length === 0) {
+ continue
+ }
+
+ const currentTime = Date.now()
+ const overdueProjects = await fetchOverdueProjects(
+ projectIds,
+ rclient,
+ keyName,
+ currentTime
+ )
+
+ for (const project of overdueProjects) {
+ const { projectId } = project
+ if (DRY_RUN) {
+ logger.info(
+ { ...logContext, projectId },
+ `[Dry Run] Would perform ${taskName} for project`
+ )
+ } else {
+ try {
+ await actionFn(projectId)
+ logger.debug(
+ { ...logContext, projectId },
+ `Successfully performed ${taskName} for project`
+ )
+ } catch (err) {
+ if (err instanceof JobNotReadyError) {
+ // the project has been touched since the job was created
+ logger.info(
+ { ...logContext, projectId },
+ `Job not ready for ${taskName} for project`
+ )
+ } else if (err instanceof JobNotFoundError) {
+ // the project has been expired already by another worker
+ logger.info(
+ { ...logContext, projectId },
+ `Job not found for ${taskName} for project`
+ )
+ } else {
+ logger.error(
+ { ...logContext, projectId, err },
+ `Error performing ${taskName} for project`
+ )
+ }
+ continue
+ }
+ }
+ processedKeyCount++
+
+ if (processedKeyCount % 1000 === 0 && processedKeyCount > 0) {
+ logger.info(
+ { ...logContext, scannedKeyCount, processedKeyCount },
+ `${taskName} scan progress`
+ )
+ }
+ }
+ }
+
+ logger.info(
+ {
+ ...logContext,
+ scannedKeyCount,
+ processedKeyCount,
+ elapsedTimeInSeconds: Math.floor((Date.now() - START_TIME) / 1000),
+ },
+ `${taskName} scan complete`
+ )
+ return { scannedKeyCount, processedKeyCount }
+}
+
+module.exports = {
+ scanRedisCluster,
+ extractKeyId,
+ scanAndProcessDueItems,
+}
diff --git a/services/history-v1/storage/lib/streams.js b/services/history-v1/storage/lib/streams.js
index 9e216c3f97..e60e5aa725 100644
--- a/services/history-v1/storage/lib/streams.js
+++ b/services/history-v1/storage/lib/streams.js
@@ -1,3 +1,4 @@
+// @ts-check
/**
* Promises are promises and streams are streams, and ne'er the twain shall
* meet.
@@ -5,52 +6,20 @@
*/
'use strict'
-const BPromise = require('bluebird')
-const zlib = require('zlib')
-const { WritableBuffer, ReadableString } = require('@overleaf/stream-utils')
-const { pipeline } = require('stream')
-
-/**
- * Pipe a read stream to a write stream. The promise resolves when the write
- * stream finishes.
- *
- * @function
- * @param {stream.Readable} readStream
- * @param {stream.Writable} writeStream
- * @return {Promise}
- */
-function promisePipe(readStream, writeStream) {
- return new BPromise(function (resolve, reject) {
- pipeline(readStream, writeStream, function (err) {
- if (err) {
- reject(err)
- } else {
- resolve()
- }
- })
- })
-}
-
-exports.promisePipe = promisePipe
+const Stream = require('node:stream')
+const zlib = require('node:zlib')
+const { WritableBuffer } = require('@overleaf/stream-utils')
/**
* Create a promise for the result of reading a stream to a buffer.
*
- * @function
- * @param {stream.Readable} readStream
- * @return {Promise.}
+ * @param {Stream.Readable} readStream
+ * @return {Promise}
*/
-function readStreamToBuffer(readStream) {
- return new BPromise(function (resolve, reject) {
- const bufferStream = new WritableBuffer()
- pipeline(readStream, bufferStream, function (err) {
- if (err) {
- reject(err)
- } else {
- resolve(bufferStream.contents())
- }
- })
- })
+async function readStreamToBuffer(readStream) {
+ const bufferStream = new WritableBuffer()
+ await Stream.promises.pipeline(readStream, bufferStream)
+ return bufferStream.contents()
}
exports.readStreamToBuffer = readStreamToBuffer
@@ -58,43 +27,14 @@ exports.readStreamToBuffer = readStreamToBuffer
/**
* Create a promise for the result of un-gzipping a stream to a buffer.
*
- * @function
- * @param {stream.Readable} readStream
- * @return {Promise.}
+ * @param {NodeJS.ReadableStream} readStream
+ * @return {Promise}
*/
-function gunzipStreamToBuffer(readStream) {
+async function gunzipStreamToBuffer(readStream) {
const gunzip = zlib.createGunzip()
const bufferStream = new WritableBuffer()
- return new BPromise(function (resolve, reject) {
- pipeline(readStream, gunzip, bufferStream, function (err) {
- if (err) {
- reject(err)
- } else {
- resolve(bufferStream.contents())
- }
- })
- })
+ await Stream.promises.pipeline(readStream, gunzip, bufferStream)
+ return bufferStream.contents()
}
exports.gunzipStreamToBuffer = gunzipStreamToBuffer
-
-/**
- * Create a write stream that gzips the given string.
- *
- * @function
- * @param {string} string
- * @return {Promise.}
- */
-function gzipStringToStream(string) {
- return new BPromise(function (resolve, reject) {
- zlib.gzip(Buffer.from(string), function (error, result) {
- if (error) {
- reject(error)
- } else {
- resolve(new ReadableString(result))
- }
- })
- })
-}
-
-exports.gzipStringToStream = gzipStringToStream
diff --git a/services/history-v1/storage/lib/temp.js b/services/history-v1/storage/lib/temp.js
index 719e0767a6..1aab3c1df4 100644
--- a/services/history-v1/storage/lib/temp.js
+++ b/services/history-v1/storage/lib/temp.js
@@ -7,7 +7,7 @@
*/
const BPromise = require('bluebird')
-const fs = BPromise.promisifyAll(require('fs'))
+const fs = BPromise.promisifyAll(require('node:fs'))
const temp = BPromise.promisifyAll(require('temp'))
exports.open = function (affixes) {
diff --git a/services/history-v1/storage/lib/zip_store.js b/services/history-v1/storage/lib/zip_store.js
index b3cf7c2663..0741829303 100644
--- a/services/history-v1/storage/lib/zip_store.js
+++ b/services/history-v1/storage/lib/zip_store.js
@@ -2,8 +2,8 @@
const BPromise = require('bluebird')
const config = require('config')
-const fs = require('fs')
-const path = require('path')
+const fs = require('node:fs')
+const path = require('node:path')
const OError = require('@overleaf/o-error')
const objectPersistor = require('@overleaf/object-persistor')
diff --git a/services/history-v1/storage/scripts/back_fill_file_hash.mjs b/services/history-v1/storage/scripts/back_fill_file_hash.mjs
new file mode 100644
index 0000000000..2e12328e5c
--- /dev/null
+++ b/services/history-v1/storage/scripts/back_fill_file_hash.mjs
@@ -0,0 +1,1158 @@
+// @ts-check
+import Events from 'node:events'
+import fs from 'node:fs'
+import Path from 'node:path'
+import { performance } from 'node:perf_hooks'
+import Stream from 'node:stream'
+import { setTimeout } from 'node:timers/promises'
+import { ObjectId } from 'mongodb'
+import pLimit from 'p-limit'
+import logger from '@overleaf/logger'
+import {
+ batchedUpdate,
+ objectIdFromInput,
+ renderObjectId,
+} from '@overleaf/mongo-utils/batchedUpdate.js'
+import OError from '@overleaf/o-error'
+import { NotFoundError } from '@overleaf/object-persistor/src/Errors.js'
+import {
+ BlobStore,
+ GLOBAL_BLOBS,
+ loadGlobalBlobs,
+ getProjectBlobsBatch,
+ getStringLengthOfFile,
+ makeBlobForFile,
+} from '../lib/blob_store/index.js'
+import { db } from '../lib/mongodb.js'
+import commandLineArgs from 'command-line-args'
+import readline from 'node:readline'
+
+// Silence warning.
+Events.setMaxListeners(20)
+
+// Enable caching for ObjectId.toString()
+ObjectId.cacheHexString = true
+
+/**
+ * @typedef {import("overleaf-editor-core").Blob} Blob
+ * @typedef {import("perf_hooks").EventLoopUtilization} EventLoopUtilization
+ * @typedef {import("mongodb").Collection} Collection
+ * @typedef {import("mongodb").Collection} ProjectsCollection
+ * @typedef {import("mongodb").Collection<{project:Project}>} DeletedProjectsCollection
+ * @typedef {import("@overleaf/object-persistor/src/PerProjectEncryptedS3Persistor").CachedPerProjectEncryptedS3Persistor} CachedPerProjectEncryptedS3Persistor
+ */
+
+/**
+ * @typedef {Object} FileRef
+ * @property {ObjectId} _id
+ * @property {string} hash
+ */
+
+/**
+ * @typedef {Object} Folder
+ * @property {Array} folders
+ * @property {Array} fileRefs
+ */
+
+/**
+ * @typedef {Object} DeletedFileRef
+ * @property {ObjectId} _id
+ * @property {ObjectId} projectId
+ * @property {string} hash
+ */
+
+/**
+ * @typedef {Object} Project
+ * @property {ObjectId} _id
+ * @property {Array} rootFolder
+ * @property {{history: {id: (number|string)}}} overleaf
+ */
+
+/**
+ * @typedef {Object} QueueEntry
+ * @property {ProjectContext} ctx
+ * @property {string} cacheKey
+ * @property {string} [fileId]
+ * @property {string} path
+ * @property {string} [hash]
+ * @property {Blob} [blob]
+ */
+
+/**
+ * @return {{PROJECT_IDS_FROM: string, PROCESS_HASHED_FILES: boolean, LOGGING_IDENTIFIER: string, BATCH_RANGE_START: string, PROCESS_BLOBS: boolean, BATCH_RANGE_END: string, PROCESS_NON_DELETED_PROJECTS: boolean, PROCESS_DELETED_PROJECTS: boolean}}
+ */
+function parseArgs() {
+ const PUBLIC_LAUNCH_DATE = new Date('2012-01-01T00:00:00Z')
+ const args = commandLineArgs([
+ { name: 'processNonDeletedProjects', type: String, defaultValue: 'false' },
+ { name: 'processDeletedProjects', type: String, defaultValue: 'false' },
+ { name: 'processHashedFiles', type: String, defaultValue: 'false' },
+ { name: 'processBlobs', type: String, defaultValue: 'true' },
+ { name: 'projectIdsFrom', type: String, defaultValue: '' },
+ {
+ name: 'BATCH_RANGE_START',
+ type: String,
+ defaultValue: PUBLIC_LAUNCH_DATE.toISOString(),
+ },
+ {
+ name: 'BATCH_RANGE_END',
+ type: String,
+ defaultValue: new Date().toISOString(),
+ },
+ { name: 'LOGGING_IDENTIFIER', type: String, defaultValue: '' },
+ ])
+ /**
+ * commandLineArgs cannot handle --foo=false, so go the long way
+ * @param {string} name
+ * @return {boolean}
+ */
+ function boolVal(name) {
+ const v = args[name]
+ if (['true', 'false'].includes(v)) return v === 'true'
+ throw new Error(`expected "true" or "false" for boolean option ${name}`)
+ }
+ const BATCH_RANGE_START = objectIdFromInput(
+ args['BATCH_RANGE_START']
+ ).toString()
+ const BATCH_RANGE_END = objectIdFromInput(args['BATCH_RANGE_END']).toString()
+ return {
+ PROCESS_NON_DELETED_PROJECTS: boolVal('processNonDeletedProjects'),
+ PROCESS_DELETED_PROJECTS: boolVal('processDeletedProjects'),
+ PROCESS_BLOBS: boolVal('processBlobs'),
+ PROCESS_HASHED_FILES: boolVal('processHashedFiles'),
+ BATCH_RANGE_START,
+ BATCH_RANGE_END,
+ LOGGING_IDENTIFIER: args['LOGGING_IDENTIFIER'] || BATCH_RANGE_START,
+ PROJECT_IDS_FROM: args['projectIdsFrom'],
+ }
+}
+
+const {
+ PROCESS_NON_DELETED_PROJECTS,
+ PROCESS_DELETED_PROJECTS,
+ PROCESS_BLOBS,
+ PROCESS_HASHED_FILES,
+ BATCH_RANGE_START,
+ BATCH_RANGE_END,
+ LOGGING_IDENTIFIER,
+ PROJECT_IDS_FROM,
+} = parseArgs()
+
+// We need to handle the start and end differently as ids of deleted projects are created at time of deletion.
+if (process.env.BATCH_RANGE_START || process.env.BATCH_RANGE_END) {
+ throw new Error('use --BATCH_RANGE_START and --BATCH_RANGE_END')
+}
+
+// Concurrency for downloading from GCS and updating hashes in mongo
+const CONCURRENCY = parseInt(process.env.CONCURRENCY || '100', 10)
+const CONCURRENT_BATCHES = parseInt(process.env.CONCURRENT_BATCHES || '2', 10)
+// Retries for processing a given file
+const RETRIES = parseInt(process.env.RETRIES || '10', 10)
+const RETRY_DELAY_MS = parseInt(process.env.RETRY_DELAY_MS || '100', 10)
+
+const RETRY_FILESTORE_404 = process.env.RETRY_FILESTORE_404 === 'true'
+const BUFFER_DIR = fs.mkdtempSync(
+ process.env.BUFFER_DIR_PREFIX || '/tmp/back_fill_file_hash-'
+)
+// https://nodejs.org/api/stream.html#streamgetdefaulthighwatermarkobjectmode
+const STREAM_HIGH_WATER_MARK = parseInt(
+ process.env.STREAM_HIGH_WATER_MARK || (64 * 1024).toString(),
+ 10
+)
+const LOGGING_INTERVAL = parseInt(process.env.LOGGING_INTERVAL || '60000', 10)
+const SLEEP_BEFORE_EXIT = parseInt(process.env.SLEEP_BEFORE_EXIT || '1000', 10)
+
+// Filestore endpoint location
+const FILESTORE_HOST = process.env.FILESTORE_HOST || '127.0.0.1'
+const FILESTORE_PORT = process.env.FILESTORE_PORT || '3009'
+
+async function fetchFromFilestore(projectId, fileId) {
+ const url = `http://${FILESTORE_HOST}:${FILESTORE_PORT}/project/${projectId}/file/${fileId}`
+ const response = await fetch(url)
+ if (!response.ok) {
+ if (response.status === 404) {
+ throw new NotFoundError('file not found in filestore', {
+ status: response.status,
+ })
+ }
+ const body = await response.text()
+ throw new OError('fetchFromFilestore failed', {
+ projectId,
+ fileId,
+ status: response.status,
+ body,
+ })
+ }
+ if (!response.body) {
+ throw new OError('fetchFromFilestore response has no body', {
+ projectId,
+ fileId,
+ status: response.status,
+ })
+ }
+ return response.body
+}
+
+const projectsCollection = db.collection('projects')
+/** @type {ProjectsCollection} */
+const typedProjectsCollection = db.collection('projects')
+const deletedProjectsCollection = db.collection('deletedProjects')
+/** @type {DeletedProjectsCollection} */
+const typedDeletedProjectsCollection = db.collection('deletedProjects')
+
+const concurrencyLimit = pLimit(CONCURRENCY)
+
+/**
+ * @template T
+ * @template V
+ * @param {Array} array
+ * @param {(arg: T) => Promise} fn
+ * @return {Promise>>}
+ */
+async function processConcurrently(array, fn) {
+ return await Promise.all(array.map(x => concurrencyLimit(() => fn(x))))
+}
+
+const STATS = {
+ projects: 0,
+ blobs: 0,
+ filesWithHash: 0,
+ filesWithoutHash: 0,
+ filesDuplicated: 0,
+ filesRetries: 0,
+ filesFailed: 0,
+ fileTreeUpdated: 0,
+ badFileTrees: 0,
+ globalBlobsCount: 0,
+ globalBlobsEgress: 0,
+ projectDeleted: 0,
+ projectHardDeleted: 0,
+ fileHardDeleted: 0,
+ mongoUpdates: 0,
+ readFromGCSCount: 0,
+ readFromGCSIngress: 0,
+ writeToGCSCount: 0,
+ writeToGCSEgress: 0,
+}
+
+const processStart = performance.now()
+let lastLogTS = processStart
+let lastLog = Object.assign({}, STATS)
+let lastEventLoopStats = performance.eventLoopUtilization()
+
+/**
+ * @param {number} v
+ * @param {number} ms
+ */
+function toMiBPerSecond(v, ms) {
+ const ONE_MiB = 1024 * 1024
+ return v / ONE_MiB / (ms / 1000)
+}
+
+/**
+ * @param {any} stats
+ * @param {number} ms
+ * @return {{readFromGCSThroughputMiBPerSecond: number}}
+ */
+function bandwidthStats(stats, ms) {
+ return {
+ readFromGCSThroughputMiBPerSecond: toMiBPerSecond(
+ stats.readFromGCSIngress,
+ ms
+ ),
+ }
+}
+
+/**
+ * @param {EventLoopUtilization} nextEventLoopStats
+ * @param {number} now
+ * @return {Object}
+ */
+function computeDiff(nextEventLoopStats, now) {
+ const ms = now - lastLogTS
+ lastLogTS = now
+ const diff = {
+ eventLoop: performance.eventLoopUtilization(
+ nextEventLoopStats,
+ lastEventLoopStats
+ ),
+ }
+ for (const [name, v] of Object.entries(STATS)) {
+ diff[name] = v - lastLog[name]
+ }
+ return Object.assign(diff, bandwidthStats(diff, ms))
+}
+
+/**
+ * @param {boolean} isLast
+ */
+function printStats(isLast = false) {
+ const now = performance.now()
+ const nextEventLoopStats = performance.eventLoopUtilization()
+ const logLine = JSON.stringify({
+ time: new Date(),
+ LOGGING_IDENTIFIER,
+ ...STATS,
+ ...bandwidthStats(STATS, now - processStart),
+ eventLoop: nextEventLoopStats,
+ diff: computeDiff(nextEventLoopStats, now),
+ deferredBatches: Array.from(deferredBatches.keys()),
+ })
+ if (isLast) {
+ console.warn(logLine)
+ } else {
+ console.log(logLine)
+ }
+ lastEventLoopStats = nextEventLoopStats
+ lastLog = Object.assign({}, STATS)
+}
+
+setInterval(printStats, LOGGING_INTERVAL)
+
+let gracefulShutdownInitiated = false
+
+process.on('SIGINT', handleSignal)
+process.on('SIGTERM', handleSignal)
+
+function handleSignal() {
+ gracefulShutdownInitiated = true
+ console.warn('graceful shutdown initiated, draining queue')
+}
+
+/**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+async function processFileWithCleanup(entry) {
+ const {
+ ctx: { projectId },
+ cacheKey,
+ } = entry
+ const filePath = Path.join(BUFFER_DIR, projectId.toString() + cacheKey)
+ try {
+ return await processFile(entry, filePath)
+ } finally {
+ await Promise.all([
+ fs.promises.rm(filePath, { force: true }),
+ fs.promises.rm(filePath + GZ_SUFFIX, { force: true }),
+ ])
+ }
+}
+
+/**
+ * @param {QueueEntry} entry
+ * @param {string} filePath
+ * @return {Promise}
+ */
+async function processFile(entry, filePath) {
+ for (let attempt = 0; attempt < RETRIES; attempt++) {
+ try {
+ return await processFileOnce(entry, filePath)
+ } catch (err) {
+ if (gracefulShutdownInitiated) throw err
+ if (err instanceof NotFoundError) {
+ if (!RETRY_FILESTORE_404) {
+ throw err // disable retries for not found in filestore bucket case
+ }
+ }
+ STATS.filesRetries++
+ const {
+ ctx: { projectId },
+ fileId,
+ hash,
+ path,
+ } = entry
+ logger.warn(
+ { err, projectId, fileId, hash, path, attempt },
+ 'failed to process file, trying again'
+ )
+ const jitter = Math.random() * RETRY_DELAY_MS
+ await setTimeout(RETRY_DELAY_MS + jitter)
+ }
+ }
+ return await processFileOnce(entry, filePath)
+}
+
+/**
+ * @param {QueueEntry} entry
+ * @param {string} filePath
+ * @return {Promise}
+ */
+async function processFileOnce(entry, filePath) {
+ const {
+ ctx: { projectId, historyId },
+ fileId,
+ } = entry
+ if (entry.hash && entry.ctx.hasCompletedBlob(entry.hash)) {
+ // We can enter this case for two identical files in the same project,
+ // one with hash, the other without. When the one without hash gets
+ // processed first, we can skip downloading the other one we already
+ // know the hash of.
+ return entry.hash
+ }
+ const blobStore = new BlobStore(historyId)
+ STATS.readFromGCSCount++
+ // make a fetch request to filestore itself
+ const src = await fetchFromFilestore(projectId, fileId)
+ const dst = fs.createWriteStream(filePath, {
+ highWaterMark: STREAM_HIGH_WATER_MARK,
+ })
+ try {
+ await Stream.promises.pipeline(src, dst)
+ } finally {
+ STATS.readFromGCSIngress += dst.bytesWritten
+ }
+ const blob = await makeBlobForFile(filePath)
+ blob.setStringLength(
+ await getStringLengthOfFile(blob.getByteLength(), filePath)
+ )
+ const hash = blob.getHash()
+ if (entry.hash && hash !== entry.hash) {
+ throw new OError('hash mismatch', { entry, hash })
+ }
+
+ if (GLOBAL_BLOBS.has(hash)) {
+ STATS.globalBlobsCount++
+ STATS.globalBlobsEgress += estimateBlobSize(blob)
+ return hash
+ }
+ if (entry.ctx.hasCompletedBlob(hash)) {
+ return hash
+ }
+ entry.ctx.recordPendingBlob(hash)
+
+ try {
+ await uploadBlobToGCS(blobStore, entry, blob, hash, filePath)
+ entry.ctx.recordCompletedBlob(hash) // mark upload as completed
+ } catch (err) {
+ entry.ctx.recordFailedBlob(hash)
+ throw err
+ }
+ return hash
+}
+
+/**
+ * @param {BlobStore} blobStore
+ * @param {QueueEntry} entry
+ * @param {Blob} blob
+ * @param {string} hash
+ * @param {string} filePath
+ * @return {Promise}
+ */
+async function uploadBlobToGCS(blobStore, entry, blob, hash, filePath) {
+ if (entry.ctx.getCachedHistoryBlob(hash)) {
+ return // fast-path using hint from pre-fetched blobs
+ }
+ if (!PROCESS_BLOBS) {
+ // round trip to postgres/mongo when not pre-fetched
+ const blob = await blobStore.getBlob(hash)
+ if (blob) {
+ entry.ctx.recordHistoryBlob(blob)
+ return
+ }
+ }
+ // blob missing in history-v1, create in GCS and persist in postgres/mongo
+ STATS.writeToGCSCount++
+ STATS.writeToGCSEgress += blob.getByteLength()
+ await blobStore.putBlob(filePath, blob)
+ entry.ctx.recordHistoryBlob(blob)
+}
+
+const GZ_SUFFIX = '.gz'
+
+/**
+ * @param {Array} files
+ * @return {Promise}
+ */
+async function processFiles(files) {
+ await processConcurrently(
+ files,
+ /**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+ async function (entry) {
+ if (gracefulShutdownInitiated) return
+ try {
+ await entry.ctx.processFile(entry)
+ } catch (err) {
+ STATS.filesFailed++
+ const {
+ ctx: { projectId },
+ fileId,
+ hash,
+ path,
+ } = entry
+ logger.error(
+ { err, projectId, fileId, hash, path },
+ 'failed to process file'
+ )
+ }
+ }
+ )
+}
+
+/** @type {Map} */
+const deferredBatches = new Map()
+
+async function waitForDeferredQueues() {
+ // Wait for ALL pending batches to finish, especially wait for their mongo
+ // writes to finish to avoid extra work when resuming the batch.
+ const all = await Promise.allSettled(deferredBatches.values())
+ // Now that all batches finished, we can throw if needed.
+ for (const res of all) {
+ if (res.status === 'rejected') {
+ throw res.reason
+ }
+ }
+}
+
+/**
+ * @param {Array} batch
+ * @param {string} prefix
+ */
+async function queueNextBatch(batch, prefix = 'rootFolder.0') {
+ if (gracefulShutdownInitiated) {
+ throw new Error('graceful shutdown: aborting batch processing')
+ }
+
+ // Read ids now, the batch will get trimmed by processBatch shortly.
+ const start = renderObjectId(batch[0]._id)
+ const end = renderObjectId(batch[batch.length - 1]._id)
+ const deferred = processBatch(batch, prefix)
+ .then(() => {
+ console.error(`Actually completed batch ending ${end}`)
+ })
+ .catch(err => {
+ logger.error({ err, start, end }, 'fatal error processing batch')
+ throw err
+ })
+ .finally(() => {
+ deferredBatches.delete(end)
+ })
+ deferredBatches.set(end, deferred)
+
+ if (deferredBatches.size >= CONCURRENT_BATCHES) {
+ // Wait for any of the deferred batches to finish before fetching the next.
+ // We should never have more than CONCURRENT_BATCHES batches in memory.
+ await Promise.race(deferredBatches.values())
+ }
+}
+
+/**
+ * @param {Array} batch
+ * @param {string} prefix
+ * @return {Promise}
+ */
+async function processBatch(batch, prefix = 'rootFolder.0') {
+ const { nBlobs, blobs } = await collectProjectBlobs(batch)
+ const files = Array.from(findFileInBatch(batch, prefix, blobs))
+ STATS.projects += batch.length
+ STATS.blobs += nBlobs
+
+ // GC
+ batch.length = 0
+ blobs.clear()
+
+ // The files are currently ordered by project-id.
+ // Order them by file-id ASC then hash ASC to
+ // increase the hit rate on the "already processed
+ // hash for project" checks.
+ files.sort(
+ /**
+ * @param {QueueEntry} a
+ * @param {QueueEntry} b
+ * @return {number}
+ */
+ function (a, b) {
+ if (a.fileId && b.fileId) return a.fileId > b.fileId ? 1 : -1
+ if (a.hash && b.hash) return a.hash > b.hash ? 1 : -1
+ if (a.fileId) return -1
+ return 1
+ }
+ )
+ await processFiles(files)
+ await processConcurrently(
+ files,
+ /**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+ async function (entry) {
+ await entry.ctx.flushMongoQueues()
+ }
+ )
+}
+
+/**
+ * @param {Array<{project: Project}>} batch
+ * @return {Promise}
+ */
+async function handleDeletedFileTreeBatch(batch) {
+ await queueNextBatch(
+ batch.map(d => d.project),
+ 'project.rootFolder.0'
+ )
+}
+
+/**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+async function tryUpdateFileRefInMongo(entry) {
+ if (entry.path.startsWith('project.')) {
+ return await tryUpdateFileRefInMongoInDeletedProject(entry)
+ }
+
+ STATS.mongoUpdates++
+ const result = await projectsCollection.updateOne(
+ {
+ _id: entry.ctx.projectId,
+ [`${entry.path}._id`]: new ObjectId(entry.fileId),
+ },
+ {
+ $set: { [`${entry.path}.hash`]: entry.hash },
+ }
+ )
+ return result.matchedCount === 1
+}
+
+/**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+async function tryUpdateFileRefInMongoInDeletedProject(entry) {
+ STATS.mongoUpdates++
+ const result = await deletedProjectsCollection.updateOne(
+ {
+ 'deleterData.deletedProjectId': entry.ctx.projectId,
+ [`${entry.path}._id`]: new ObjectId(entry.fileId),
+ },
+ {
+ $set: { [`${entry.path}.hash`]: entry.hash },
+ }
+ )
+ return result.matchedCount === 1
+}
+
+const RETRY_UPDATE_HASH = 100
+
+/**
+ * @param {QueueEntry} entry
+ * @return {Promise}
+ */
+async function updateFileRefInMongo(entry) {
+ if (await tryUpdateFileRefInMongo(entry)) return
+
+ const { fileId } = entry
+ const { projectId } = entry.ctx
+ for (let i = 0; i < RETRY_UPDATE_HASH; i++) {
+ let prefix = 'rootFolder.0'
+ let p = await projectsCollection.findOne(
+ { _id: projectId },
+ { projection: { rootFolder: 1 } }
+ )
+ if (!p) {
+ STATS.projectDeleted++
+ prefix = 'project.rootFolder.0'
+ const deletedProject = await deletedProjectsCollection.findOne(
+ {
+ 'deleterData.deletedProjectId': projectId,
+ project: { $exists: true },
+ },
+ { projection: { 'project.rootFolder': 1 } }
+ )
+ p = deletedProject?.project
+ if (!p) {
+ STATS.projectHardDeleted++
+ console.warn(
+ 'bug: project hard-deleted while processing',
+ projectId,
+ fileId
+ )
+ return
+ }
+ }
+ let found = false
+ for (const e of findFiles(entry.ctx, p.rootFolder[0], prefix)) {
+ found = e.fileId === fileId
+ if (!found) continue
+ if (await tryUpdateFileRefInMongo(e)) return
+ break
+ }
+ if (!found) {
+ STATS.fileHardDeleted++
+ console.warn('bug: file hard-deleted while processing', projectId, fileId)
+ return
+ }
+
+ STATS.fileTreeUpdated++
+ }
+ throw new OError(
+ 'file-tree updated repeatedly while trying to add hash',
+ entry
+ )
+}
+
+/**
+ * @param {ProjectContext} ctx
+ * @param {Folder} folder
+ * @param {string} path
+ * @param {boolean} isInputLoop
+ * @return Generator
+ */
+function* findFiles(ctx, folder, path, isInputLoop = false) {
+ if (!folder || typeof folder !== 'object') {
+ ctx.fileTreeBroken = true
+ logger.warn({ projectId: ctx.projectId, path }, 'bad file-tree, bad folder')
+ return
+ }
+ if (!Array.isArray(folder.folders)) {
+ folder.folders = []
+ ctx.fileTreeBroken = true
+ logger.warn(
+ { projectId: ctx.projectId, path: `${path}.folders` },
+ 'bad file-tree, bad folders'
+ )
+ }
+ let i = 0
+ for (const child of folder.folders) {
+ const idx = i++
+ yield* findFiles(ctx, child, `${path}.folders.${idx}`, isInputLoop)
+ }
+ if (!Array.isArray(folder.fileRefs)) {
+ folder.fileRefs = []
+ ctx.fileTreeBroken = true
+ logger.warn(
+ { projectId: ctx.projectId, path: `${path}.fileRefs` },
+ 'bad file-tree, bad fileRefs'
+ )
+ }
+ i = 0
+ for (const fileRef of folder.fileRefs) {
+ const idx = i++
+ const fileRefPath = `${path}.fileRefs.${idx}`
+ if (!fileRef._id || !(fileRef._id instanceof ObjectId)) {
+ ctx.fileTreeBroken = true
+ logger.warn(
+ { projectId: ctx.projectId, path: fileRefPath },
+ 'bad file-tree, bad fileRef id'
+ )
+ continue
+ }
+ const fileId = fileRef._id.toString()
+ if (PROCESS_HASHED_FILES && fileRef.hash) {
+ if (ctx.canSkipProcessingHashedFile(fileRef.hash)) continue
+ if (isInputLoop) {
+ ctx.remainingQueueEntries++
+ STATS.filesWithHash++
+ }
+ yield {
+ ctx,
+ cacheKey: fileRef.hash,
+ fileId,
+ path: MONGO_PATH_SKIP_WRITE_HASH_TO_FILE_TREE,
+ hash: fileRef.hash,
+ }
+ }
+ if (!fileRef.hash) {
+ if (isInputLoop) {
+ ctx.remainingQueueEntries++
+ STATS.filesWithoutHash++
+ }
+ yield {
+ ctx,
+ cacheKey: fileId,
+ fileId,
+ path: fileRefPath,
+ }
+ }
+ }
+}
+
+/**
+ * @param {Array} projects
+ * @param {string} prefix
+ * @param {Map>} blobs
+ * @return Generator
+ */
+function* findFileInBatch(projects, prefix, blobs) {
+ for (const project of projects) {
+ const projectIdS = project._id.toString()
+ const historyIdS = project.overleaf.history.id.toString()
+ const projectBlobs = blobs.get(historyIdS) || []
+ const ctx = new ProjectContext(project._id, historyIdS, projectBlobs)
+ try {
+ yield* findFiles(ctx, project.rootFolder?.[0], prefix, true)
+ } catch (err) {
+ logger.error(
+ { err, projectId: projectIdS },
+ 'bad file-tree, processing error'
+ )
+ } finally {
+ if (ctx.fileTreeBroken) STATS.badFileTrees++
+ }
+ }
+}
+
+/**
+ * @param {Array} batch
+ * @return {Promise<{nBlobs: number, blobs: Map>}>}
+ */
+async function collectProjectBlobs(batch) {
+ if (!PROCESS_BLOBS) return { nBlobs: 0, blobs: new Map() }
+ return await getProjectBlobsBatch(batch.map(p => p.overleaf.history.id))
+}
+
+const BATCH_FILE_UPDATES = 100
+
+const MONGO_PATH_SKIP_WRITE_HASH_TO_FILE_TREE = 'skip-write-to-file-tree'
+
+class ProjectContext {
+ /** @type {Map} */
+ #historyBlobs
+
+ /** @type {number} */
+ remainingQueueEntries = 0
+
+ /** @type {boolean} */
+ fileTreeBroken = false
+
+ /**
+ * @param {ObjectId} projectId
+ * @param {string} historyId
+ * @param {Array} blobs
+ */
+ constructor(projectId, historyId, blobs) {
+ this.projectId = projectId
+ this.historyId = historyId
+ this.#historyBlobs = new Map(blobs.map(b => [b.getHash(), b]))
+ }
+
+ /**
+ * @param {string} hash
+ * @return {Blob | undefined}
+ */
+ getCachedHistoryBlob(hash) {
+ return this.#historyBlobs.get(hash)
+ }
+
+ /**
+ * @param {Blob} blob
+ */
+ recordHistoryBlob(blob) {
+ this.#historyBlobs.set(blob.getHash(), blob)
+ }
+
+ /**
+ * @param {string} hash
+ * @return {boolean}
+ */
+ canSkipProcessingHashedFile(hash) {
+ if (this.#historyBlobs.has(hash)) return true // This file will be processed as blob.
+ if (GLOBAL_BLOBS.has(hash)) return true // global blob
+ return false
+ }
+
+ async flushMongoQueuesIfNeeded() {
+ if (this.remainingQueueEntries === 0) {
+ await this.flushMongoQueues()
+ }
+
+ if (this.#pendingFileWrites.length > BATCH_FILE_UPDATES) {
+ await this.#storeFileHashes()
+ }
+ }
+
+ async flushMongoQueues() {
+ await this.#storeFileHashes()
+ }
+
+ /** @type {Set} */
+ #pendingBlobs = new Set()
+ /** @type {Set} */
+ #completedBlobs = new Set()
+
+ /**
+ * @param {string} hash
+ */
+ recordPendingBlob(hash) {
+ this.#pendingBlobs.add(hash)
+ }
+
+ /**
+ * @param {string} hash
+ */
+ recordFailedBlob(hash) {
+ this.#pendingBlobs.delete(hash)
+ }
+
+ /**
+ * @param {string} hash
+ */
+ recordCompletedBlob(hash) {
+ this.#completedBlobs.add(hash)
+ this.#pendingBlobs.delete(hash)
+ }
+
+ /**
+ * @param {string} hash
+ * @return {boolean}
+ */
+ hasCompletedBlob(hash) {
+ return this.#pendingBlobs.has(hash) || this.#completedBlobs.has(hash)
+ }
+
+ /** @type {Array} */
+ #pendingFileWrites = []
+
+ /**
+ * @param {QueueEntry} entry
+ */
+ queueFileForWritingHash(entry) {
+ if (entry.path === MONGO_PATH_SKIP_WRITE_HASH_TO_FILE_TREE) return
+ this.#pendingFileWrites.push(entry)
+ }
+
+ /**
+ * @param {Collection} collection
+ * @param {Array