diff --git a/.env.default b/.env.default index d4254427e..e9b560b72 100644 --- a/.env.default +++ b/.env.default @@ -11,18 +11,8 @@ DOCKER_COMPOSE_APP_PORT_TARGET=9001 # The env var DEFAULT_PAD_TEXT seems to be mandatory in the latest version of etherpad. DOCKER_COMPOSE_APP_DEV_ENV_DEFAULT_PAD_TEXT="Welcome to etherpad" -# REQUIRED. The /admin account password. docker-compose refuses to start while -# this is empty (the value has no insecure fallback). Set a strong value — the -# /admin UI can install plugins, which is arbitrary code execution. DOCKER_COMPOSE_APP_ADMIN_PASSWORD= -# Set to true ONLY when Etherpad runs behind a trusted reverse proxy that sets -# the X-Forwarded-* headers (Traefik, Nginx, Kubernetes Ingress, …). On a -# directly-exposed instance keep it false so clients can't spoof their IP. If you -# DO run behind a proxy you must set this to true, otherwise HTTPS detection -# (secure cookies) and client-IP / rate-limiting will be wrong. -DOCKER_COMPOSE_APP_TRUST_PROXY=false - DOCKER_COMPOSE_POSTGRES_DATABASE=db DOCKER_COMPOSE_POSTGRES_PASSWORD=etherpad-lite-password DOCKER_COMPOSE_POSTGRES_USER=etherpad-lite-user diff --git a/.env.dev.default b/.env.dev.default index 8aa1709f8..b78b5599a 100644 --- a/.env.dev.default +++ b/.env.dev.default @@ -13,10 +13,6 @@ DOCKER_COMPOSE_APP_DEV_ENV_DEFAULT_PAD_TEXT="Welcome to etherpad" DOCKER_COMPOSE_APP_DEV_ADMIN_PASSWORD= -# docker-compose.dev.yml defaults this to true (dev convenience). Set to false if -# you are not running the dev container behind a reverse proxy. -DOCKER_COMPOSE_APP_DEV_ENV_TRUST_PROXY=true - DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_DATABASE=db DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_PASSWORD=etherpad-lite-password DOCKER_COMPOSE_POSTGRES_DEV_ENV_POSTGRES_USER=etherpad-lite-user \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e7fcee26f..1e7ac79ed 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,11 +17,4 @@ updates: open-pull-requests-limit: 30 groups: dev-dependencies: - dependency-type: "development" - cooldown: - default-days: 1 # fallback for anything not covered below - semver-major-days: 7 - semver-minor-days: 3 - semver-patch-days: 1 - include: - - "*" + dependency-type: "development" \ No newline at end of file diff --git a/.github/workflows/backend-tests.yml b/.github/workflows/backend-tests.yml index 19c655a4c..d0183a1a9 100644 --- a/.github/workflows/backend-tests.yml +++ b/.github/workflows/backend-tests.yml @@ -33,7 +33,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -45,13 +45,13 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.6.3 + uses: awalsh128/cache-apt-pkgs-action@v1.6.1 with: packages: libreoffice libreoffice-pdfimport version: 1.0 @@ -89,7 +89,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -101,13 +101,13 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.6.3 + uses: awalsh128/cache-apt-pkgs-action@v1.6.1 with: packages: libreoffice libreoffice-pdfimport version: 1.0 @@ -169,7 +169,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -181,7 +181,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm @@ -235,7 +235,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -247,7 +247,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm diff --git a/.github/workflows/build-and-deploy-docs.yml b/.github/workflows/build-and-deploy-docs.yml index 0733c08e4..062ec72fd 100644 --- a/.github/workflows/build-and-deploy-docs.yml +++ b/.github/workflows/build-and-deploy-docs.yml @@ -37,14 +37,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ~/.pnpm-store key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache vitepress build with: path: doc/.vitepress/cache @@ -58,7 +58,7 @@ jobs: # Pin Node so the build does not silently fall back to whatever the # runner image ships with. The repo declares engines.node >=24.0.0. - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/deb-package.yml b/.github/workflows/deb-package.yml index 3825852ff..51bad3b93 100644 --- a/.github/workflows/deb-package.yml +++ b/.github/workflows/deb-package.yml @@ -69,7 +69,7 @@ jobs: - uses: pnpm/action-setup@v6 - name: Setup Node - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: '24' cache: pnpm diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 44354474f..5abe166aa 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -42,7 +42,7 @@ jobs: tags: ${{ env.TEST_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -57,7 +57,7 @@ jobs: # packageManager in a root package.json. package_json_file: etherpad/package.json - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/downstream-smoke.yml b/.github/workflows/downstream-smoke.yml index 08208f882..4b5ff372a 100644 --- a/.github/workflows/downstream-smoke.yml +++ b/.github/workflows/downstream-smoke.yml @@ -28,7 +28,7 @@ jobs: - name: Checkout core (PR) uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -42,7 +42,7 @@ jobs: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/frontend-admin-tests.yml b/.github/workflows/frontend-admin-tests.yml index 9283eb5da..f8995db07 100644 --- a/.github/workflows/frontend-admin-tests.yml +++ b/.github/workflows/frontend-admin-tests.yml @@ -28,7 +28,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -40,7 +40,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm @@ -48,7 +48,7 @@ jobs: name: Install all dependencies and symlink for ep_etherpad-lite run: pnpm i - name: Cache Playwright browsers - uses: actions/cache@v6 + uses: actions/cache@v5 id: playwright-cache with: path: ~/.cache/ms-playwright diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index c948082c8..51ca2bfb6 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -21,14 +21,14 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache Playwright browsers with: path: ~/.cache/ms-playwright @@ -40,7 +40,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -93,14 +93,14 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache Playwright browsers with: path: ~/.cache/ms-playwright @@ -112,7 +112,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -169,14 +169,14 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache Playwright browsers with: path: ~/.cache/ms-playwright @@ -188,7 +188,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -270,14 +270,14 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache Playwright browsers with: path: ~/.cache/ms-playwright @@ -289,7 +289,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/handleRelease.yml b/.github/workflows/handleRelease.yml index ee71ae696..782a3c898 100644 --- a/.github/workflows/handleRelease.yml +++ b/.github/workflows/handleRelease.yml @@ -28,7 +28,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -40,7 +40,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/installer-test.yml b/.github/workflows/installer-test.yml index 7ae984574..a40cd9db2 100644 --- a/.github/workflows/installer-test.yml +++ b/.github/workflows/installer-test.yml @@ -40,7 +40,7 @@ jobs: steps: - uses: actions/checkout@v7 - - uses: actions/setup-node@v7 + - uses: actions/setup-node@v6 with: node-version: 24 @@ -116,7 +116,7 @@ jobs: steps: - uses: actions/checkout@v7 - - uses: actions/setup-node@v7 + - uses: actions/setup-node@v6 with: node-version: 24 diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml index c5b5dbcb9..e48ead25a 100644 --- a/.github/workflows/load-test.yml +++ b/.github/workflows/load-test.yml @@ -25,7 +25,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -37,7 +37,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -63,7 +63,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -75,7 +75,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -126,7 +126,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -138,7 +138,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/perform-type-check.yml b/.github/workflows/perform-type-check.yml index c4602f13e..8567eece2 100644 --- a/.github/workflows/perform-type-check.yml +++ b/.github/workflows/perform-type-check.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -37,7 +37,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/rate-limit.yml b/.github/workflows/rate-limit.yml index 9d7671765..9205be08b 100644 --- a/.github/workflows/rate-limit.yml +++ b/.github/workflows/rate-limit.yml @@ -28,7 +28,7 @@ jobs: - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -40,7 +40,7 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4e27607b2..684963a2a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: repository: ether/ether.github.com path: ether.github.com token: '${{ secrets.ETHER_RELEASE_TOKEN }}' - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -62,7 +62,7 @@ jobs: # packageManager in a root package.json. package_json_file: etherpad/package.json - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm @@ -82,7 +82,7 @@ jobs: with: ruby-version: 2.7 - - uses: reitzig/actions-asciidoctor@v2.0.5 + - uses: reitzig/actions-asciidoctor@v2.0.4 with: version: 2.0.18 - name: Prepare release diff --git a/.github/workflows/releaseEtherpad.yml b/.github/workflows/releaseEtherpad.yml index a80b4a207..4942b02ce 100644 --- a/.github/workflows/releaseEtherpad.yml +++ b/.github/workflows/releaseEtherpad.yml @@ -46,7 +46,7 @@ jobs: exit 1 - name: Checkout repository uses: actions/checkout@v7 - - uses: actions/setup-node@v7 + - uses: actions/setup-node@v6 with: # OIDC trusted publishing needs npm >= 11.5.1, which requires # Node >= 22.9.0. Node 24 satisfies that and matches the rest of CI. @@ -54,7 +54,7 @@ jobs: registry-url: https://registry.npmjs.org/ - name: Upgrade npm to >=11.5.1 (required for trusted publishing) run: npm install -g npm@latest - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} diff --git a/.github/workflows/update-plugins.yml b/.github/workflows/update-plugins.yml index 33f463fd4..2f3ca4783 100644 --- a/.github/workflows/update-plugins.yml +++ b/.github/workflows/update-plugins.yml @@ -24,7 +24,7 @@ jobs: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: 24 diff --git a/.github/workflows/upgrade-from-latest-release.yml b/.github/workflows/upgrade-from-latest-release.yml index 5528b7f94..f9e3481ab 100644 --- a/.github/workflows/upgrade-from-latest-release.yml +++ b/.github/workflows/upgrade-from-latest-release.yml @@ -38,7 +38,7 @@ jobs: - name: Check out latest release tag run: git checkout "$(git tag --list 'v*' --sort=-version:refname | head -n1)" - - uses: actions/cache@v6 + - uses: actions/cache@v5 name: Cache pnpm store with: path: ${{ env.PNPM_HOME }} @@ -50,12 +50,12 @@ jobs: with: run_install: false - name: Use Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} cache: pnpm - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.6.3 + uses: awalsh128/cache-apt-pkgs-action@v1.6.1 with: packages: libreoffice libreoffice-pdfimport version: 1.0 diff --git a/Dockerfile b/Dockerfile index f0ad8351c..be7a201ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -171,12 +171,6 @@ ARG ETHERPAD_GITHUB_PLUGINS= COPY --chown=etherpad:etherpad ./src/ ./src/ COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/templates/admin ./src/templates/admin COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/static/oidc ./src/static/oidc -# docker-compose mounts a named volume over src/plugin_packages. Docker seeds a -# fresh named volume from the mountpoint in the image, so the directory has to -# exist here (owned by etherpad, since USER is already etherpad) — otherwise -# Docker creates it root:root and plugin installs cannot write install.lock. -# See ether/etherpad#8026. -RUN mkdir -p ./src/plugin_packages COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/ @@ -209,12 +203,6 @@ RUN printf 'packages:\n - src\n - bin\nonlyBuiltDependencies:\n - esbuild\nig COPY --chown=etherpad:etherpad ./src ./src COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/templates/admin ./src/templates/admin COPY --chown=etherpad:etherpad --from=adminbuild /opt/etherpad-lite/src/static/oidc ./src/static/oidc -# docker-compose mounts a named volume over src/plugin_packages. Docker seeds a -# fresh named volume from the mountpoint in the image, so the directory has to -# exist here (owned by etherpad, since USER is already etherpad) — otherwise -# Docker creates it root:root and plugin installs cannot write install.lock. -# See ether/etherpad#8026. -RUN mkdir -p ./src/plugin_packages COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/ diff --git a/README.md b/README.md index b52dec31f..3be539f4c 100644 --- a/README.md +++ b/README.md @@ -117,11 +117,11 @@ services: - postgres environment: NODE_ENV: production - ADMIN_PASSWORD: "${DOCKER_COMPOSE_APP_ADMIN_PASSWORD:?Set DOCKER_COMPOSE_APP_ADMIN_PASSWORD to a strong value}" + ADMIN_PASSWORD: ${DOCKER_COMPOSE_APP_ADMIN_PASSWORD:-admin} DB_CHARSET: ${DOCKER_COMPOSE_APP_DB_CHARSET:-utf8mb4} DB_HOST: postgres DB_NAME: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad} - DB_PASS: "${DOCKER_COMPOSE_POSTGRES_PASSWORD:?Set DOCKER_COMPOSE_POSTGRES_PASSWORD to a strong value}" + DB_PASS: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin} DB_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432} DB_TYPE: "postgres" DB_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin} @@ -129,7 +129,7 @@ services: DEFAULT_PAD_TEXT: ${DOCKER_COMPOSE_APP_DEFAULT_PAD_TEXT:- } DISABLE_IP_LOGGING: ${DOCKER_COMPOSE_APP_DISABLE_IP_LOGGING:-false} SOFFICE: ${DOCKER_COMPOSE_APP_SOFFICE:-null} - TRUST_PROXY: ${DOCKER_COMPOSE_APP_TRUST_PROXY:-false} + TRUST_PROXY: ${DOCKER_COMPOSE_APP_TRUST_PROXY:-true} restart: always ports: - "${DOCKER_COMPOSE_APP_PORT_PUBLISHED:-9001}:${DOCKER_COMPOSE_APP_PORT_TARGET:-9001}" @@ -138,7 +138,7 @@ services: image: postgres:15-alpine environment: POSTGRES_DB: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad} - POSTGRES_PASSWORD: "${DOCKER_COMPOSE_POSTGRES_PASSWORD:?Set DOCKER_COMPOSE_POSTGRES_PASSWORD to a strong value}" + POSTGRES_PASSWORD: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin} POSTGRES_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432} POSTGRES_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin} PGDATA: /var/lib/postgresql/data/pgdata diff --git a/admin/package.json b/admin/package.json index 0428e2391..72f3eb9ce 100644 --- a/admin/package.json +++ b/admin/package.json @@ -14,39 +14,39 @@ "test": "pnpm gen:api && tsx --test 'src/**/__tests__/*.test.ts' 'src/**/__tests__/*.test.tsx'" }, "dependencies": { - "@radix-ui/react-switch": "^1.3.7", - "@tanstack/react-query": "^5.101.4", - "@tanstack/react-query-devtools": "^5.101.4", + "@radix-ui/react-switch": "^1.3.1", + "@tanstack/react-query": "^5.101.0", + "@tanstack/react-query-devtools": "^5.101.0", "jsonc-parser": "^3.3.1", "openapi-fetch": "^0.17.0", "openapi-react-query": "^0.5.4" }, "devDependencies": { - "@radix-ui/react-dialog": "^1.1.23", - "@radix-ui/react-toast": "^1.2.23", - "@radix-ui/react-visually-hidden": "^1.2.11", + "@radix-ui/react-dialog": "^1.1.17", + "@radix-ui/react-toast": "^1.2.17", + "@radix-ui/react-visually-hidden": "^1.2.6", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.65.0", - "@typescript-eslint/parser": "^8.65.0", - "@vitejs/plugin-react": "^6.0.4", + "@typescript-eslint/eslint-plugin": "^8.61.1", + "@typescript-eslint/parser": "^8.61.1", + "@vitejs/plugin-react": "^6.0.2", "babel-plugin-react-compiler": "19.1.0-rc.3", - "eslint": "^10.7.0", + "eslint": "^10.5.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", - "i18next": "^26.3.6", + "i18next": "^26.3.1", "i18next-browser-languagedetector": "^8.2.1", - "lucide-react": "^1.26.0", + "lucide-react": "^1.21.0", "openapi-typescript": "^7.13.0", - "react": "^19.2.8", - "react-dom": "^19.2.8", - "react-hook-form": "^7.82.0", - "react-i18next": "^17.0.11", - "react-router-dom": "^7.18.1", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-hook-form": "^7.80.0", + "react-i18next": "^17.0.8", + "react-router-dom": "^7.18.0", "socket.io-client": "^4.8.3", - "tsx": "^4.23.1", + "tsx": "^4.22.4", "typescript": "^6.0.3", - "vite": "^8.1.5", + "vite": "^8.0.16", "vite-plugin-babel": "^1.7.3", "zustand": "^5.0.14" } diff --git a/bin/package.json b/bin/package.json index c96444e71..510669da5 100644 --- a/bin/package.json +++ b/bin/package.json @@ -9,14 +9,14 @@ "dependencies": { "ep_etherpad-lite": "workspace:../src", "log4js": "^6.9.1", - "semver": "^7.8.5", - "tsx": "^4.23.1", - "ueberdb2": "6.1.16" + "semver": "^7.8.4", + "tsx": "^4.22.4", + "ueberdb2": "6.1.13" }, "devDependencies": { - "@types/node": "^26.1.1", + "@types/node": "^26.0.0", "@types/semver": "^7.7.1", - "typescript": "^7.0.0" + "typescript": "^6.0.3" }, "scripts": { "makeDocs": "node --import tsx make_docs.ts", diff --git a/doc/.vitepress/config.mts b/doc/.vitepress/config.mts index 846127ae7..85c00f5aa 100644 --- a/doc/.vitepress/config.mts +++ b/doc/.vitepress/config.mts @@ -27,18 +27,13 @@ export default defineConfig({ items: [ { text: 'Docker', link: '/docker.md' }, { text: 'Configuration', link: '/configuration.md' }, - { text: 'Deployment', link: '/deployment.md' }, - { text: 'Database', link: '/database.md' }, { text: 'Localization', link: '/localization.md' }, { text: 'Cookies', link: '/cookies.md' }, { text: 'Plugins', link: '/plugins.md' }, { text: 'Stats', link: '/stats.md' }, {text: 'Skins', link: '/skins.md' }, - { text: 'Accessibility', link: '/accessibility.md' }, {text: 'Demo', link: '/demo.md' }, {text: 'CLI', link: '/cli.md'}, - { text: 'Development', link: '/development.md' }, - { text: 'FAQ', link: '/faq.md' }, ] }, { diff --git a/doc/accessibility.md b/doc/accessibility.md deleted file mode 100644 index 24e1269b4..000000000 --- a/doc/accessibility.md +++ /dev/null @@ -1,91 +0,0 @@ -# Accessibility - -Etherpad aims to be usable by everyone, including people who rely on a -keyboard, a screen reader, or other assistive technology. The editor follows -common conventions so that selecting, formatting, and navigating text works the -way you would expect in other applications, and the toolbar can be reached and -operated without a mouse. - -If you find a feature that is not accessible, please let us know by opening an -issue so it can be improved. - -## Keyboard shortcuts - -The following shortcuts are built into the editor. On macOS use the Command -(`Cmd`) key wherever `Ctrl` is listed. - -::: tip -Most shortcuts can be individually enabled or disabled through the -`padShortcutEnabled` settings, so a deployment may have customised which of -these are active. -::: - -### Editor - -| Action | Shortcut | -| --- | --- | -| Bold | `Ctrl` + `B` | -| Italic | `Ctrl` + `I` | -| Underline | `Ctrl` + `U` | -| Strikethrough | `Ctrl` + `5` | -| Ordered (numbered) list | `Ctrl` + `Shift` + `N` or `Ctrl` + `Shift` + `1` | -| Unordered (bulleted) list | `Ctrl` + `Shift` + `L` | -| Indent line or selection | `Tab` | -| Outdent line or selection | `Shift` + `Tab` | -| Undo | `Ctrl` + `Z` | -| Redo | `Ctrl` + `Y` or `Ctrl` + `Shift` + `Z` | -| Save a named revision | `Ctrl` + `S` | -| Duplicate the current line(s) | `Ctrl` + `Shift` + `D` | -| Delete the current line(s) | `Ctrl` + `Shift` + `K` | -| Clear authorship colors on the pad or selection | `Ctrl` + `Shift` + `C` | -| Show the authors of the current line | `Ctrl` + `Shift` + `2` | -| Focus the toolbar (see below) | `Alt` + `F9` | -| Focus the chat input | `Alt` + `C` | - -Text selection, cut (`Ctrl` + `X`), copy (`Ctrl` + `C`), paste -(`Ctrl` + `V`), and the arrow keys behave as they do in any standard text -editor. - -### Timeslider - -The timeslider (revision history) provides its own shortcuts: - -| Action | Shortcut | -| --- | --- | -| Play / pause history playback | `Space` | -| Step back one revision | `Left Arrow` | -| Step forward one revision | `Right Arrow` | -| Jump back to the previous starred revision | `Shift` + `Left Arrow` | -| Jump forward to the next starred revision | `Shift` + `Right Arrow` | - -## Toolbar navigation - -The toolbar holds the formatting controls (bold, italic, lists, and so on) and -can be reached and operated entirely from the keyboard: - -* Press `Alt` + `F9` from the editor to move focus to the first button in the - toolbar. -* Use the `Left Arrow` and `Right Arrow` keys to move between buttons. `Tab` - also moves to the next focusable control. -* Press `Enter` to activate the focused button. -* Press `Alt` + `F9` again, or `Escape`, to return focus to the pad. - -Pressing `Escape` while a toolbar dropdown (such as the settings or color -picker) is open closes that dropdown first. - -## Screen readers - -Etherpad provides as much screen reader support as possible. Support quality -varies between platforms and browsers, so the following combinations are -recommended: - -* On Windows, Firefox with [NVDA](https://www.nvaccess.org/) currently gives the - best experience. - -To reduce verbose feedback while typing collaboratively in NVDA, open the -keyboard settings (`NVDA` + `Ctrl` + `K`) and turn off **Speak typed characters** -and **Speak typed words**. - -Support in other screen readers and browsers (for example Orca on Linux, or -Chrome) is more limited. Contributions to improve coverage on these platforms -are very welcome. diff --git a/doc/api/changeset_library.md b/doc/api/changeset_library.md index dbf3c9224..9785f2b47 100644 --- a/doc/api/changeset_library.md +++ b/doc/api/changeset_library.md @@ -1,7 +1,7 @@ # Changeset Library The [changeset -library](https://github.com/ether/etherpad/blob/develop/src/static/js/Changeset.ts) +library](https://github.com/ether/etherpad-lite/blob/develop/src/static/js/Changeset.ts) provides tools to create, read, and apply changesets. ## Changeset @@ -21,42 +21,6 @@ A transmitted changeset looks like this: 'Z:z>1|2=m=b*0|1+1$\n' ``` -### Reading a changeset - -`unpack()` splits a changeset string into its parts: - -```javascript -const unpacked = Changeset.unpack('Z:z>1|2=m=b*0|1+1$\n'); -// { oldLen: 35, newLen: 36, ops: '|2=m=b*0|1+1', charBank: '\n' } -``` - -`oldLen` is the document length before the change and `newLen` the length after. -`ops` is the list of operations, and `charBank` holds the characters inserted by -those operations. - -Iterate the operations with `deserializeOps()`, which yields one `Op` at a time: - -```javascript -for (const op of Changeset.deserializeOps(unpacked.ops)) { - console.log(op); -} -// Op { opcode: '=', chars: 22, lines: 2, attribs: '' } -// Op { opcode: '=', chars: 11, lines: 0, attribs: '' } -// Op { opcode: '+', chars: 1, lines: 1, attribs: '*0' } -``` - -There are three kinds of operation, each applied starting from the current -position in the text: - -- `=` keeps text (it may still change the text's attributes, e.g. make it bold). -- `-` removes text. -- `+` inserts text (taking the characters from the changeset's `charBank`). - -`opcode` is the operation type; `chars` and `lines` are how much text it covers; -and `attribs` are the attributes applied, written as `*` references into the -pad's attribute pool. In the example above the final op inserts one character -(the newline from `charBank`) carrying attribute `*0`. - ## Attribute Pool ```javascript @@ -72,59 +36,6 @@ are used many times. There is one attribute pool per pad, and it includes every current and historical attribute used in the pad. -A pool can be serialized to and from a plain object with `toJsonable()` and -`fromJsonable()`: - -```javascript -const pool = new AttributePool(); -pool.fromJsonable({ - numToAttrib: { - 0: ['author', 'a.kVnWeomPADAT2pn9'], - 1: ['bold', 'true'], - 2: ['italic', 'true'], - }, - nextNum: 3, -}); - -pool.getAttrib(1); // [ 'bold', 'true' ] -pool.getAttribKey(1); // 'bold' -pool.getAttribValue(1); // 'true' -``` - -Each attribute is a `[key, value]` pair — `['bold', 'true']`, or -`['author', '']`. A character can carry several attributes (bold *and* -italic), but only one value per key (so it cannot belong to two authors). - -## Attributed text (atext) - -A pad's content is stored as *attributed text* (`atext`): the plain text plus an -attribute string describing which attributes apply to each span. - -```javascript -const atext = { - text: 'bold text\nitalic text\nnormal text\n\n', - attribs: '*0*1+9*0|1+1*0*1*2+b|1+1*0+b|2+2', -}; -``` - -The attribute string is a sequence of `+` operations — the same encoding used by -changesets — which you can read with `deserializeOps()`: - -```javascript -for (const op of Changeset.deserializeOps(atext.attribs)) { - console.log(op); -} -// Op { opcode: '+', chars: 9, lines: 0, attribs: '*0*1' } -// Op { opcode: '+', chars: 1, lines: 1, attribs: '*0' } -// Op { opcode: '+', chars: 11, lines: 0, attribs: '*0*1*2' } -// Op { opcode: '+', chars: 1, lines: 1, attribs: '' } -// Op { opcode: '+', chars: 11, lines: 0, attribs: '*0' } -// Op { opcode: '+', chars: 2, lines: 2, attribs: '' } -``` - -Read against the pool above, the first nine characters (`bold text`) carry -attributes `*0*1` (author + bold), the following newline carries `*0`, and so on. - ## Further Reading Detailed information about the changesets & Easysync protocol: diff --git a/doc/database.md b/doc/database.md deleted file mode 100644 index 9d73eb8e4..000000000 --- a/doc/database.md +++ /dev/null @@ -1,204 +0,0 @@ -# Database structure - -## Keys and their values - -### groups -A list of all existing groups (a JSON object with groupIDs as keys and `1` as values). - -### pad:$PADID -Contains all information about pads - -- **atext** - the latest attributed text -- **pool** - the attribute pool -- **head** - the number of the latest revision -- **chatHead** - the number of the latest chat entry -- **public** - flag that disables security for this pad -- **passwordHash** - string that contains a salted sha512 sum of this pad's password - -### pad:$PADID:revs:$REVNUM -Saves a revision $REVNUM of pad $PADID - -- **meta** - - **author** - the autorID of this revision - - **timestamp** - the timestamp of when this revision was created -- **changeset** - the changeset of this revision - -### pad:$PADID:chat:$CHATNUM -Saves a chat entry with num $CHATNUM of pad $PADID - -- **text** - the text of this chat entry -- **userId** - the authorID of this chat entry -- **time** - the timestamp of this chat entry - -### pad2readonly:$PADID -Translates a padID to a readonlyID - -### readonly2pad:$READONLYID -Translates a readonlyID to a padID - -### token2author:$TOKENID -Translates a token to an authorID - -### globalAuthor:$AUTHORID -Information about an author - -- **name** - the name of this author as shown in the pad -- **colorID** - the colorID of this author as shown in the pad - -### mapper2group:$MAPPER -Maps an external application identifier to an internal group - -### mapper2author:$MAPPER -Maps an external application identifier to an internal author - -### group:$GROUPID -a group of pads - -- **pads** - object with pad names in it, values are 1 - -### session:$SESSIONID -a session between an author and a group - -- **groupID** - the groupID the session belongs too -- **authorID** - the authorID the session belongs too -- **validUntil** - the timestamp until this session is valid - -### author2sessions:$AUTHORID -saves the sessions of an author - -- **sessionsIDs** - object with sessionIDs in it, values are 1 - -### group2sessions:$GROUPID - -- **sessionsIDs** - object with sessionIDs in it, values are 1 - -# Connecting to a database backend - -Etherpad stores everything in a single key/value table through -[ueberDB](https://www.npmjs.com/package/ueberdb2), so the same data model works -across many backends. The backend is selected with `dbType` in `settings.json`, -and backend-specific connection options go in `dbSettings`. - -The default `dirty` backend writes to a local file (`var/dirty.db`) and needs no -setup, which is convenient for development but not recommended for production. -For a production instance, point Etherpad at a real database such as MySQL/MariaDB, -PostgreSQL or Redis. Etherpad creates its own table on first run; you only need -to provision an empty database and a user with access to it. - -## MySQL / MariaDB - -Create the database and a user, then grant access: - -```sql -CREATE DATABASE `etherpad` CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -CREATE USER 'etherpad'@'localhost' IDENTIFIED BY 'a-secure-password'; -GRANT CREATE,ALTER,SELECT,INSERT,UPDATE,DELETE ON `etherpad`.* TO 'etherpad'@'localhost'; -``` - -Then configure `settings.json`: - -```json -"dbType": "mysql", -"dbSettings": { - "user": "etherpad", - "host": "localhost", - "port": 3306, - "password": "a-secure-password", - "database": "etherpad", - "charset": "utf8mb4" -} -``` - -Setting `charset` to `utf8mb4` is strongly recommended so that the full range of -Unicode (including emoji) is stored correctly. To connect over a local socket -instead of TCP, replace `host`/`port` with `"socketPath": "/var/run/mysqld/mysqld.sock"`. - -## PostgreSQL - -Create the user and a database owned by it: - -```sql -CREATE USER etherpad WITH PASSWORD 'a-secure-password'; -CREATE DATABASE etherpad OWNER etherpad; -``` - -Then configure `settings.json`: - -```json -"dbType": "postgres", -"dbSettings": { - "user": "etherpad", - "host": "localhost", - "port": 5432, - "password": "a-secure-password", - "database": "etherpad" -} -``` - -The `dbSettings` object is passed straight to the `node-postgres` connection -pool, so any option it accepts (including a single `"connectionString"`) works. -On Debian/Ubuntu you can use peer authentication over the local socket by -setting `"host": "/var/run/postgresql"` and an empty password, provided the -operating-system user that runs Etherpad matches the PostgreSQL role. - -## Redis - -Install Redis and make sure it persists data to disk. Configure `settings.json` -with either discrete fields or a single connection URL: - -```json -"dbType": "redis", -"dbSettings": { - "host": "localhost", - "port": 6379, - "password": "a-secure-redis-password" -} -``` - -```json -"dbType": "redis", -"dbSettings": { - "url": "redis://:a-secure-redis-password@localhost:6379" -} -``` - -## Migrating from MySQL to PostgreSQL - -[pgloader](https://pgloader.io/) can copy an existing Etherpad database from -MySQL to PostgreSQL. Stop Etherpad first so the source database is quiescent. - -```bash -sudo apt-get install postgresql pgloader - -# Create the target role and database -sudo -u postgres createuser etherpad -sudo -u postgres createdb -O etherpad etherpad - -# Describe and run the migration -cat > pgloader.load <<'EOF' -LOAD DATABASE - FROM mysql://etherpad:MYSQL_PASSWORD@127.0.0.1/etherpad - INTO postgresql:///etherpad -WITH preserve index names, prefetch rows = 100 -ALTER SCHEMA 'etherpad' RENAME TO 'public'; -EOF - -pgloader --verbose pgloader.load -``` - -Afterwards set the PostgreSQL user's password and make sure it can read and -write the migrated table: - -```sql -ALTER USER etherpad WITH PASSWORD 'a-secure-password'; -GRANT pg_read_all_data TO etherpad; -GRANT pg_write_all_data TO etherpad; -``` - -Then point `settings.json` at PostgreSQL as shown above and start Etherpad. - -::: tip -To move data between *any* two backends supported by ueberDB, you can also -use the `migrateDB` CLI tool, which reads every record from a source database -descriptor and writes it to a target one. See the [CLI chapter](./cli.md). -::: diff --git a/doc/deployment.md b/doc/deployment.md deleted file mode 100644 index 2c5ab5d0c..000000000 --- a/doc/deployment.md +++ /dev/null @@ -1,359 +0,0 @@ -# Deployment - -This page collects working configurations for deploying Etherpad in production: -running it behind a reverse proxy, hosting it under a subdirectory, terminating -HTTPS natively, running it as a system service, and deploying it on Kubernetes. - -Etherpad listens on port `9001` by default. Throughout this page the upstream -Etherpad server is assumed to be reachable at `http://127.0.0.1:9001`. - -## Running behind a reverse proxy - -The recommended production setup is to run Etherpad on `127.0.0.1:9001` and put a -reverse proxy in front of it to terminate TLS, serve a virtual host, and forward -requests. - -Etherpad uses WebSockets (via socket.io). The load-bearing part of every proxy -config below is the WebSocket upgrade: the proxy **must** forward the `Upgrade` -and `Connection` headers, or real-time editing will silently fail back to slow -long-polling (or break entirely). - -When Etherpad runs behind a proxy you should also set `trustProxy: true` in your -settings so that Etherpad honours the `X-Forwarded-*` headers (correct client IP, -secure-cookie flag, etc.). See the `trustProxy` section in the [Configuration documentation](./configuration.md) for the full details of which headers are trusted. - -### Nginx - -```nginx -# Map the Upgrade header so WebSockets work. Place this in the http context. -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} - -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name pad.example.com; - - ssl_certificate /etc/nginx/ssl/etherpad.crt; - ssl_certificate_key /etc/nginx/ssl/etherpad.key; - - location / { - proxy_pass http://127.0.0.1:9001; - proxy_buffering off; - proxy_set_header Host $host; - proxy_pass_header Server; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # WebSocket support - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - } -} - -# Redirect plain HTTP to HTTPS -server { - listen 80; - listen [::]:80; - server_name pad.example.com; - return 301 https://$host$request_uri; -} -``` - -### Apache - -Enable `mod_proxy`, `mod_proxy_http`, `mod_proxy_wstunnel` and `mod_headers`. -The `mod_proxy_wstunnel` `upgrade=websocket` syntax requires Apache 2.4.47 or -newer. - -```apache - - ServerName pad.example.com - - SSLEngine on - SSLCertificateFile /etc/ssl/etherpad/etherpad.crt - SSLCertificateKeyFile /etc/ssl/etherpad/etherpad.key - - ProxyVia On - ProxyRequests Off - ProxyPreserveHost On - - # WebSocket traffic (socket.io) must be matched first. - - ProxyPass "ws://127.0.0.1:9001/socket.io" upgrade=websocket timeout=30 - ProxyPassReverse "ws://127.0.0.1:9001/socket.io" - - - - ProxyPass "http://127.0.0.1:9001/" retry=0 timeout=30 - ProxyPassReverse "http://127.0.0.1:9001/" - - -``` - -### Caddy - -Caddy v2 proxies WebSocket connections automatically and obtains/renews a -certificate for you, so the configuration is minimal: - -```caddy -pad.example.com { - reverse_proxy 127.0.0.1:9001 -} -``` - -### Traefik - -Traefik v2 also proxies WebSockets transparently. For a Docker deployment, attach -these labels to the Etherpad container: - -```yaml -labels: - - "traefik.enable=true" - - "traefik.http.routers.etherpad.rule=Host(`pad.example.com`)" - - "traefik.http.routers.etherpad.entrypoints=websecure" - - "traefik.http.routers.etherpad.tls.certresolver=myresolver" - - "traefik.http.services.etherpad.loadbalancer.server.port=9001" - - "traefik.http.services.etherpad.loadbalancer.passhostheader=true" -``` - -### HAProxy - -HAProxy detects the `Connection: Upgrade` exchange automatically and switches to -tunnel mode once the WebSocket is established. The important value is -`timeout tunnel`, which governs the lifetime of the upgraded connection. - -```haproxy -frontend http - mode http - bind *:80 - bind *:443 ssl crt /etc/haproxy/certs/etherpad.pem alpn h2,http/1.1 - http-request redirect scheme https code 301 unless { ssl_fc } - http-request add-header X-Forwarded-Proto https if { ssl_fc } - default_backend etherpad - -backend etherpad - mode http - option forwardfor - timeout client 25s - timeout server 25s - timeout tunnel 3600s - server pad 127.0.0.1:9001 -``` - -## Hosting under a subdirectory - -To serve Etherpad from a path such as `https://example.com/pad` rather than from -the root of a domain, the proxy must send the `X-Proxy-Path` header so that -Etherpad rewrites its own asset and API URLs to include the prefix. This header -is honoured regardless of the `trustProxy` setting — see the [Configuration documentation](./configuration.md). - -```nginx -location /pad/ { - rewrite ^/pad/(.*)$ /$1 break; - proxy_pass http://127.0.0.1:9001; - proxy_buffering off; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Proxy-Path /pad; - - # WebSocket support - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; -} -``` - -## Native HTTPS without a proxy - -Etherpad can terminate TLS itself using Node's native HTTPS server, with no -reverse proxy required. Configure the `ssl` block in `settings.json`: - -```json -"ssl": { - "key": "/path-to-your/etherpad-server.key", - "cert": "/path-to-your/etherpad-server.crt", - "ca": ["/path-to-your/intermediate-cert1.crt", "/path-to-your/intermediate-cert2.crt"] -} -``` - -* `key` — path to the private key file. -* `cert` — path to the certificate file. -* `ca` — an (optional) array of intermediate/chain certificate paths. - -Restart Etherpad after editing the settings. It will now serve HTTPS on its -configured port. - -For local testing you can generate a self-signed certificate with a single -command: - -```bash -openssl req -x509 -newkey rsa:4096 -nodes -days 365 \ - -keyout etherpad-server.key -out etherpad-server.crt \ - -subj "/CN=localhost" -``` - -Make sure the files are readable only by the user that runs Etherpad: - -```bash -chmod 400 etherpad-server.key etherpad-server.crt -chown etherpad etherpad-server.key etherpad-server.crt -``` - -::: tip -Self-signed certificates trigger browser warnings and are only suitable for -testing. For production, obtain a free, trusted certificate from -[Let's Encrypt](https://letsencrypt.org/), or terminate TLS at a reverse proxy -(see above) and let it manage certificate issuance and renewal. -::: - -## Running as a service (systemd) - -On a modern Linux distribution, run Etherpad as a `systemd` service so it starts -on boot and restarts automatically on failure. - -Create a dedicated unprivileged user and install Etherpad into its home -directory (for example `/opt/etherpad`), owned by that user. Etherpad refuses to -start as root. - -Create `/etc/systemd/system/etherpad.service`: - -```ini -[Unit] -Description=Etherpad collaborative editor -After=network.target - -[Service] -Type=simple -User=etherpad -Group=etherpad -WorkingDirectory=/opt/etherpad -Environment=NODE_ENV=production -ExecStart=/usr/bin/pnpm run prod -Restart=always -RestartSec=5 - -[Install] -WantedBy=multi-user.target -``` - -Adjust `WorkingDirectory` to your install path and the `ExecStart` path to -wherever `pnpm` lives (`which pnpm`). Then enable and start the service: - -```bash -sudo systemctl daemon-reload -sudo systemctl enable --now etherpad.service - -# check status and follow logs -sudo systemctl status etherpad.service -sudo journalctl -u etherpad.service -f -``` - -## Kubernetes (Istio) - -The following manifest deploys Etherpad behind an Istio ingress gateway. It -defines three resources: a `Gateway` (TLS + hostname), a `VirtualService` -(routing with WebSocket-friendly timeouts), and a `DestinationRule` (sticky -sessions via the socket.io `io` cookie). - -It assumes: - -* Istio >= 1.18 -* A `Service` named `etherpad` in the `etherpad` namespace, on port `9001` -* A TLS secret `etherpad-tls` provisioned in the gateway namespace -* You replace `` with your own hostname - -::: warning -Sticky sessions are necessary but **not** sufficient for a multi-replica -Etherpad deployment. Multi-replica also needs the socket.io Redis adapter so -that pad state is shared across pods. Without it, two clients editing the same -pad but routed to different pods will see divergent state. - -Recommendation: start with `replicas: 1` plus good failover, and only go -multi-replica once the Redis adapter is wired up. -::: - -```yaml -apiVersion: networking.istio.io/v1beta1 -kind: Gateway -metadata: - name: etherpad - namespace: etherpad -spec: - selector: - istio: ingressgateway - servers: - - port: - number: 443 - name: https - protocol: HTTPS - tls: - mode: SIMPLE - credentialName: etherpad-tls - hosts: - - - - port: - number: 80 - name: http - protocol: HTTP - hosts: - - - tls: - httpsRedirect: true - ---- -apiVersion: networking.istio.io/v1beta1 -kind: VirtualService -metadata: - name: etherpad - namespace: etherpad -spec: - hosts: - - - gateways: - - etherpad - http: - - match: - - uri: - prefix: / - route: - - destination: - host: etherpad - port: - number: 9001 - # No per-request timeout — websockets and long-polling sit on the - # connection indefinitely. The default of 15s kills WS upgrades. - timeout: 0s - ---- -apiVersion: networking.istio.io/v1beta1 -kind: DestinationRule -metadata: - name: etherpad - namespace: etherpad -spec: - host: etherpad - trafficPolicy: - loadBalancer: - # Sticky sessions on the socket.io session cookie. Required so that - # long-polling fallback requests land on the same pod that owns the - # session state. - consistentHash: - httpCookie: - name: io - ttl: 0s # session cookie, expires with the browser tab - connectionPool: - tcp: - maxConnections: 10000 - http: - # Must comfortably exceed socket.io's pingInterval (25s) + - # pingTimeout (20s). 1h is conservative. - idleTimeout: 3600s - h2UpgradePolicy: UPGRADE - http1MaxPendingRequests: 1000 -``` diff --git a/doc/development.md b/doc/development.md deleted file mode 100644 index 4a0780ed7..000000000 --- a/doc/development.md +++ /dev/null @@ -1,240 +0,0 @@ -# Development - -This page is a contributor-oriented tour of the Etherpad source tree and of a -few internals that plugin authors and core contributors commonly need to -understand: how the source is laid out, how pads are converted to and from -other formats, and how to access the database from server-side code. - -The Etherpad server is written in TypeScript (`.ts`). Most server code lives -under `src/node/` and most client code under `src/static/js/`. - -## Source tree overview - -The repository root contains, among others, the following directories: - -``` -etherpad/ -|- bin/ # maintenance and build scripts (run.sh, pad tools, docs, release) -|- doc/ # this manual, in AsciiDoc and Markdown -|- src/ # the Etherpad source code -|- packaging/ # OS/distribution packaging helpers -|- var/ # runtime data (e.g. the dirty.db database file) -``` - -`bin/` contains scripts for running and maintaining Etherpad. For example -`bin/run.sh` starts the server, and there are TypeScript utilities such as -`bin/checkPad.ts`, `bin/deletePad.ts`, `bin/repairPad.ts`, -`bin/rebuildPad.ts`, `bin/migrateDB.ts` and `bin/make_docs.ts`. - -The HTML manual is built from the AsciiDoc sources in `doc/` by -`bin/make_docs.ts` (exposed as the `makeDocs` script), which shells out to -`asciidoctor` and writes the result to `out/doc/`. From the repository root you -can run it with `pnpm run makeDocs`. (`asciidoctor` must be installed.) - -The `src/` directory looks like this: - -``` -src/ -|- locales/ # translations, managed via https://translatewiki.net -|- node/ # server-side code -|- static/ # client-side code, CSS and fonts -|- templates/ # server-rendered page templates -|- ep.json # core plugin/hook registration -|- package.json # package name: ep_etherpad-lite -``` - -### src/node/ (server side) - -``` -src/node/ -|- db/ # database access and pad/author/group/session state -|- eejs/ # server-side embedded-JS templating -|- handler/ # import/export and collaboration message handling -|- hooks/ # express route registration and i18n -|- security/ # crypto, OAuth2/OIDC, secret rotation -|- types/ # shared TypeScript types -|- updater/ # in-place self-update machinery -|- utils/ # settings, import/export format helpers, toolbar, minification -|- server.ts # entry point -``` - -`db/` contains the modules that read and write pad state. `Pad.ts` manages an -individual pad; `PadManager.ts`, `AuthorManager.ts`, `GroupManager.ts`, -`SessionManager.ts` and `ReadOnlyManager.ts` manage the corresponding records; -`DB.ts` exposes the low-level key/value store (see -[Accessing the database from server code / plugins](#accessing-the-database-from-server-code-plugins)); and `API.ts` implements -the public HTTP API. - -`handler/` contains the request and message handlers. `PadMessageHandler.ts` -drives real-time collaboration, while `ImportHandler.ts` and `ExportHandler.ts` -handle import and export. - -`hooks/` contains mostly Express-related code. `i18n.ts` builds the translation -files and registers routes to serve them, and `hooks/express/` registers the -routes that serve pads, the timeslider, static assets and the admin pages. - -`utils/` contains the import/export format converters (`ImportHtml.ts`, -`ExportHtml.ts`, `ExportTxt.ts`, `ExportEtherpad.ts`, `ImportEtherpad.ts`, -`ExportHelper.ts`, and native converters such as `ExportPdfNative.ts` and -`ImportDocxNative.ts`), the settings parser (`Settings.ts`), the toolbar builder -(`toolbar.ts`) and the asset minifier (`Minify.ts`). - -### src/static/ (client side) - -``` -src/static/ -|- css/ # stylesheets, including css/pad/icons.css -|- font/ # web fonts, including the fontawesome-etherpad icon font -|- img/ -|- js/ # client-side TypeScript -|- skins/ # bundled UI skins -|- vendor/ -``` - -`js/` contains the client-side editor code. Notable modules include -`ace2_inner.ts` and `ace2_common.ts` (the editor core), `contentcollector.ts`, -`linestylefilter.ts` and `domline.ts` (content/attribute processing, shared -with the server import/export pipeline), `Changeset.ts` and `AttributePool.ts` -(the changeset and attribute model), and `collab_client.ts` (the -client side of real-time collaboration). - -### src/templates/ - -`templates/` contains the server-rendered page templates for the index, the -pad, the timeslider and the admin pages, plus the bootstrap scripts that load -the client bundles. The templates expose named `eejs` blocks that plugins can -hook into to inject custom HTML. - -## How Etherpad converts pads to and from other formats - -Internally a pad is not stored as HTML. A pad is a sequence of lines, and each -line carries **attributes** (for example `heading1`, `bullet` or a list number). -The set of attributes that a pad can use is stored in its **attribute pool**; the -pool only records which attributes exist, not where they are applied. The -pool grows over the history of the pad. - -Where an attribute is applied to a line is recorded in an **attribute string**, -and a line that carries a line-level attribute is prefixed with a **line marker** -(`lmkr`). Attribute strings and changesets are defined by -`src/static/js/Changeset.ts` and `src/static/js/AttributePool.ts`. - -### Collecting content - -`src/static/js/contentcollector.ts` is the shared starting point for both the -client (when content is typed or pasted) and the server (when content is -imported). It walks the incoming DOM/HTML, decides which attributes apply to -each line, adds the discovered attributes to the attribute pool, and emits the -resulting attribute strings. On import, `src/node/utils/ImportHtml.ts` calls -`contentcollector.makeContentCollector(...)` to do exactly this, and the HTML -import path in `src/node/handler/ImportHandler.ts` ultimately drives it. - -### From attributes to HTML/text (export) - -On export the flow is, conceptually: - -``` -contentcollector.ts - -> linestylefilter.ts - -> ExportHtml.ts / ExportTxt.ts (helped by ExportHelper.ts) - -> ExportHandler.ts - -> the HTTP API / /export/* route -``` - -- `src/static/js/linestylefilter.ts` walks each line, reads its attributes, - and turns them into the classes/markup the line should render with. -- `src/node/utils/ExportHelper.ts` adds export-only logic that does not belong - in the live editor. The clearest example is lists: in the editor each list - item is rendered as its own line-level block, but a clean export needs the - items collapsed into a single properly nested list. The helper performs that - reshaping for export only. -- `src/node/utils/ExportHtml.ts` and `src/node/utils/ExportTxt.ts` (and - `ExportEtherpad.ts` for the native `.etherpad` format) turn the attributed - text (`atext`) into the final HTML or plain text. -- `src/node/handler/ExportHandler.ts` receives the export request and dispatches - on the requested format — for instance, office formats such as `.docx` and - `.pdf` are routed through the native converters / LibreOffice rather than - through the plain HTML/text path. - -On the client side, edits are turned into changesets by the editor, attributes -are translated into CSS classes (so `heading2` becomes -`class="heading2"`), and `src/static/js/domline.ts` (`createDomLine`) renders -the final DOM for each line. - -## Accessing the database from server code / plugins - -Etherpad stores everything in a single key/value store backed by -[ueberDB](https://www.npmjs.com/package/ueberdb2), which abstracts over the -configured database (dirtyDB, MySQL/MariaDB, PostgreSQL, SQLite, MongoDB, Redis, -and others). Server-side code and plugins access it through -`src/node/db/DB.ts`. - -The package name of the core module is, for historical reasons, still -`ep_etherpad-lite`, so plugins import the database module like this: - -```javascript -const db = require('ep_etherpad-lite/node/db/DB'); -``` - -The exposed methods are asynchronous and return promises (use `await`), not the -old callback style. The available methods are `get`, `set`, `remove`, `getSub`, -`setSub`, `findKeys` and `findKeysPaged`: - -```javascript -// Read a record (returns undefined/null if it does not exist) -const value = await db.get('record_key'); - -// Create or replace a record -await db.set('record_key', data); - -// Read or write a nested value inside a record -const colorId = await db.getSub('author_key', ['colorId']); -await db.setSub('author_key', ['email'], 'tutti@frutti.org'); - -// Delete a record -await db.remove('record_key'); -``` - -For example, given the author record: - -```json -{"colorId":"#79d9d9","name":"tutti","timestamp":1364832712430,"padIDs":{"mypad":1}} -``` - -calling `await db.setSub('author_key', ['email'], 'tutti@frutti.org')` yields: - -```json -{"colorId":"#79d9d9","name":"tutti","timestamp":1364832712430,"padIDs":{"mypad":1},"email":"tutti@frutti.org"} -``` - -::: warning -Keys are namespaced (for example `pad:`, -`pad::revs:`, `globalAuthor:`). Prefer the high-level -managers (`Pad.ts`, `AuthorManager.ts`, etc.) over direct `DB` access where one -exists; reach for `DB` directly only for data your plugin owns, and use a key -prefix unique to your plugin to avoid collisions. -::: - -## Adding a toolbar icon - -Etherpad's toolbar icons come from the bundled `fontawesome-etherpad` icon -font in `src/static/font/`. Toolbar buttons reference an icon by a -`buttonicon-` CSS class (see `src/node/utils/toolbar.ts`, which builds -each button's class as `buttonicon buttonicon-`), and those classes are -defined in `src/static/css/pad/icons.css`. The font itself is generated with -[Fontello](http://fontello.com) from `src/static/font/config.json` (whose -`css_prefix_text` is `buttonicon-`). - -To add a new icon: - -1. Go to [Fontello](http://fontello.com) and import the existing - `src/static/font/config.json` (Fontello's "import" loads the current icon - set and pre-selects the icons it contains). -2. Select the additional icon(s) you want, then click **Download webfont**. -3. From the unzipped download, copy `config.json` and the - `font/fontawesome-etherpad.*` files over the ones in `src/static/font/`. -4. From the unzipped `css/fontawesome-etherpad.css`, copy the new - `.buttonicon-:before { content: '\\eXXX'; }` rules into - `src/static/css/pad/icons.css`, replacing the existing block of icon rules. - -The icon is then available wherever a `buttonicon-` class can be used, -including toolbar button definitions. diff --git a/doc/docker.md b/doc/docker.md index 3e99c77cb..ad7d21f17 100644 --- a/doc/docker.md +++ b/doc/docker.md @@ -374,11 +374,11 @@ services: - postgres environment: NODE_ENV: production - ADMIN_PASSWORD: "${DOCKER_COMPOSE_APP_ADMIN_PASSWORD:?Set DOCKER_COMPOSE_APP_ADMIN_PASSWORD to a strong value}" + ADMIN_PASSWORD: ${DOCKER_COMPOSE_APP_ADMIN_PASSWORD:-admin} DB_CHARSET: ${DOCKER_COMPOSE_APP_DB_CHARSET:-utf8mb4} DB_HOST: postgres DB_NAME: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad} - DB_PASS: "${DOCKER_COMPOSE_POSTGRES_PASSWORD:?Set DOCKER_COMPOSE_POSTGRES_PASSWORD to a strong value}" + DB_PASS: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin} DB_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432} DB_TYPE: "postgres" DB_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin} @@ -386,7 +386,7 @@ services: DEFAULT_PAD_TEXT: ${DOCKER_COMPOSE_APP_DEFAULT_PAD_TEXT:- } DISABLE_IP_LOGGING: ${DOCKER_COMPOSE_APP_DISABLE_IP_LOGGING:-false} SOFFICE: ${DOCKER_COMPOSE_APP_SOFFICE:-null} - TRUST_PROXY: ${DOCKER_COMPOSE_APP_TRUST_PROXY:-false} + TRUST_PROXY: ${DOCKER_COMPOSE_APP_TRUST_PROXY:-true} restart: always ports: - "${DOCKER_COMPOSE_APP_PORT_PUBLISHED:-9001}:${DOCKER_COMPOSE_APP_PORT_TARGET:-9001}" @@ -395,7 +395,7 @@ services: image: postgres:15-alpine environment: POSTGRES_DB: ${DOCKER_COMPOSE_POSTGRES_DATABASE:-etherpad} - POSTGRES_PASSWORD: "${DOCKER_COMPOSE_POSTGRES_PASSWORD:?Set DOCKER_COMPOSE_POSTGRES_PASSWORD to a strong value}" + POSTGRES_PASSWORD: ${DOCKER_COMPOSE_POSTGRES_PASSWORD:-admin} POSTGRES_PORT: ${DOCKER_COMPOSE_POSTGRES_PORT:-5432} POSTGRES_USER: ${DOCKER_COMPOSE_POSTGRES_USER:-admin} PGDATA: /var/lib/postgresql/data/pgdata diff --git a/doc/faq.md b/doc/faq.md deleted file mode 100644 index 8f2a81a58..000000000 --- a/doc/faq.md +++ /dev/null @@ -1,204 +0,0 @@ -# FAQ - -This page answers common operational questions about running and maintaining -an Etherpad instance. It collects material previously kept on the project wiki. - -## How do I install Etherpad? - -There are several supported ways to install Etherpad. Pick whichever suits your -environment. - -### Docker - -The official image is published to Docker Hub (`etherpad/etherpad`) and to the -GitHub Container Registry (`ghcr.io/ether/etherpad`) with identical tags. - -```bash -docker pull etherpad/etherpad -docker run -p 9001:9001 etherpad/etherpad -``` - -See the [Docker chapter](./docker.md) for building personalized images, enabling plugins, and -configuring office-format import/export. - -### One-line installer (macOS / Linux / WSL) - -```bash -curl -fsSL https://raw.githubusercontent.com/ether/etherpad/master/bin/installer.sh | sh -``` - -On Windows (PowerShell): - -```powershell -irm https://raw.githubusercontent.com/ether/etherpad/master/bin/installer.ps1 | iex -``` - -The installer clones Etherpad, installs dependencies and builds the frontend. -Set `ETHERPAD_RUN=1` to also start it once the install finishes. - -### apt repository (Debian / Ubuntu) - -Etherpad publishes a signed APT repository (`stable` channel). Import the signing -key, add the repository and install: - -```bash -curl -fsSL https://etherpad.org/key.asc \ - | sudo gpg --dearmor -o /usr/share/keyrings/etherpad.gpg - -echo "deb [signed-by=/usr/share/keyrings/etherpad.gpg] https://etherpad.org/apt stable main" \ - | sudo tee /etc/apt/sources.list.d/etherpad.list - -sudo apt-get update -sudo apt-get install etherpad -``` - -The repository provides `amd64` and `arm64` builds. Etherpad depends on -Node.js >= 24, so on older distributions you may also need NodeSource's apt -repository to satisfy that dependency. - -### From source - -Etherpad requires [Node.js](https://nodejs.org/) >= 24 and `pnpm`. - -```bash -git clone -b master https://github.com/ether/etherpad -cd etherpad -pnpm i -pnpm run build:etherpad -pnpm run prod -``` - -Then open `http://localhost:9001`. - -## What URL paths does Etherpad serve? - -| Path | Description | -|------|-------------| -| `/admin` | Administration dashboard (requires admin login). | -| `/admin/plugins` | Install, update and remove plugins from the web UI. | -| `/admin/settings` | Edit `settings.json` from the web UI. | -| `/p/:padID` | Open (or create) the pad with the given `padID`, e.g. `/p/foo`. | -| `/p/:padID/timeslider` | Open the pad's history/timeslider view. Append `#N` to jump to a specific revision, e.g. `/p/foo/timeslider#5`. | -| `/p/:padID/export/:type` | Export the pad in the given format, e.g. `/p/foo/export/html`. Append `?revs=N` to export a specific revision. | - -Supported export types: - -- **Native (no extra dependencies):** `txt`, `html`, `etherpad`, `docx`, `pdf`. -- **Via LibreOffice:** `odt`, `doc`, `rtf` — these require the `soffice` setting -to point at a LibreOffice executable. See the office-format notes in the -[Docker chapter](./docker.md). - -## How do I list all pads? - -The recommended way is the HTTP API method `listAllPads`, combined with `jq`: - -```bash -ETHERPAD_HOST='https://pad.example.com' -ETHERPAD_API_KEY='...' # the APIKEY.txt file in the Etherpad root -ETHERPAD_API_VERSION='...' # see https://pad.example.com/api - -curl -s "${ETHERPAD_HOST}/api/${ETHERPAD_API_VERSION}/listAllPads?apikey=${ETHERPAD_API_KEY}" \ - | jq -r '.data.padIDs[]' -``` - -For an interactive list with management actions, install the `ep_adminpads2` -plugin and browse to `/admin/pads`. - -As a last resort you can query the database directly. The exact query depends on -your configured backend; pad records use keys of the form `pad:` and -`pad::revs:`. For example, with SQLite: - -```bash -sqlite3 ./var/sqlite.db "select key from store where key like 'pad:%'" \ - | grep -Eo '^pad:[^:]+' \ - | sed -e 's/pad://' \ - | sort -u -``` - -Prefer the API or admin plugin over direct SQL: the schema is an implementation -detail and may change. - -## How do I delete or manage pads? - -Use the HTTP API `deletePad` method: - -```bash -curl -s "${ETHERPAD_HOST}/api/${ETHERPAD_API_VERSION}/deletePad?apikey=${ETHERPAD_API_KEY}&padID=foo" -``` - -The API also offers `copyPad`, `movePad`, `getRevisionsCount` and more — see the -[HTTP API chapter](./api/http_api.md). - -For a web UI, install the `ep_adminpads2` plugin and manage pads from -`/admin/pads`, where you can search, view and delete pads. - -The `deletePad` CLI tool is also available for operators: - -```bash -pnpm run --filter bin deletePad -``` - -## How do I back up and restore pads? - -### Back up the whole instance - -All pad data lives in the configured database. Back it up using the tool -appropriate to your backend (for example `mysqldump` for MySQL/MariaDB, -`pg_dump` for PostgreSQL, or a file copy of `var/*.db` for the file-based -`dirty`/`rusty` engines while Etherpad is stopped). A regular, automated dump of -the database is the canonical backup for a production instance. - -### Back up a single pad - -Export the pad over HTTP by appending `/export/` to its URL. Plain text, -HTML and the round-trippable `etherpad` format are most useful for backups: - -```bash -curl -o mypad.txt https://pad.example.com/p/foo/export/txt -curl -o mypad.html https://pad.example.com/p/foo/export/html -curl -o mypad.etherpad https://pad.example.com/p/foo/export/etherpad -``` - -The `etherpad` export preserves the pad's full history and can be re-imported, -making it the best choice for migrating or archiving an individual pad. - -### Restore or inspect an old revision - -Every state the pad has been in is stored in the database, so you can retrieve -an earlier revision without a separate backup: - -- Open `/p/:padID/timeslider` to browse the history and find the revision -number you want. -- Export a specific revision directly with the `?revs=N` query parameter, e.g. -`https://pad.example.com/p/foo/export/html?revs=1000`. - -### Repairing a damaged pad - -If a pad is corrupt, use the CLI repair tools (`checkPad`, `repairPad`, -`rebuildPad`) documented in the [CLI chapter](./cli.md). Always back up the database before -running write operations. - -## How do I limit history or prune revisions? - -Etherpad keeps the full revision history of every pad, so the database grows -over time. To reclaim space, use the pad-compaction CLI tools, which collapse or -trim revision history for one pad, every pad, or only stale pads: - -```bash -# Collapse all history of one pad -pnpm run --filter bin compactPad - -# Keep only the last 50 revisions of one pad -pnpm run --filter bin compactPad --keep 50 - -# Compact every pad on the instance -pnpm run --filter bin compactAllPads - -# Compact only pads not edited in the last 90 days, keeping the last 50 revisions -pnpm run --filter bin compactStalePads --older-than 90 --keep 50 -``` - -These tools require `cleanup.enabled = true` in `settings.json` and are -**destructive** — history is collapsed or trimmed. Export anything you can't -afford to lose via the pad's `/export/etherpad` route first. The same primitive -is available over the wire as the `compactPad` HTTP API method. See the [CLI chapter](./cli.md) for full details. diff --git a/doc/package.json b/doc/package.json index a03388bac..a766817da 100644 --- a/doc/package.json +++ b/doc/package.json @@ -1,7 +1,7 @@ { "devDependencies": { - "oxc-minify": "^0.141.0", - "vitepress": "^2.0.0-alpha.18" + "oxc-minify": "^0.137.0", + "vitepress": "^2.0.0-alpha.17" }, "scripts": { "docs:dev": "vitepress dev", diff --git a/package.json b/package.json index cfdb24cd6..b8a44bf13 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "node": ">=24.0.0", "pnpm": ">=11.1.2" }, - "packageManager": "pnpm@11.10.0", + "packageManager": "pnpm@11.1.2", "repository": { "type": "git", "url": "https://github.com/ether/etherpad.git" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6404a8a88..fd0ff755e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,14 +50,14 @@ importers: admin: dependencies: '@radix-ui/react-switch': - specifier: ^1.3.7 - version: 1.3.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^1.3.1 + version: 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/react-query': - specifier: ^5.101.4 - version: 5.101.4(react@19.2.8) + specifier: ^5.101.0 + version: 5.101.0(react@19.2.7) '@tanstack/react-query-devtools': - specifier: ^5.101.4 - version: 5.101.4(@tanstack/react-query@5.101.4(react@19.2.8))(react@19.2.8) + specifier: ^5.101.0 + version: 5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(react@19.2.7) jsonc-parser: specifier: ^3.3.1 version: 3.3.1 @@ -66,17 +66,17 @@ importers: version: 0.17.0 openapi-react-query: specifier: ^0.5.4 - version: 0.5.4(@tanstack/react-query@5.101.4(react@19.2.8))(openapi-fetch@0.17.0) + version: 0.5.4(@tanstack/react-query@5.101.0(react@19.2.7))(openapi-fetch@0.17.0) devDependencies: '@radix-ui/react-dialog': - specifier: ^1.1.23 - version: 1.1.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^1.1.17 + version: 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-toast': - specifier: ^1.2.23 - version: 1.2.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^1.2.17 + version: 1.2.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@radix-ui/react-visually-hidden': - specifier: ^1.2.11 - version: 1.2.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/react': specifier: ^19.2.17 version: 19.2.17 @@ -84,71 +84,71 @@ importers: specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.17) '@typescript-eslint/eslint-plugin': - specifier: ^8.65.0 - version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3))(eslint@10.8.0)(typescript@6.0.3) + specifier: ^8.61.1 + version: 8.61.1(@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.65.0 - version: 8.65.0(eslint@10.8.0)(typescript@6.0.3) + specifier: ^8.61.1 + version: 8.61.1(eslint@10.5.0)(typescript@6.0.3) '@vitejs/plugin-react': - specifier: ^6.0.4 - version: 6.0.4(babel-plugin-react-compiler@19.1.0-rc.3)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)) + specifier: ^6.0.2 + version: 6.0.2(babel-plugin-react-compiler@19.1.0-rc.3)(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)) babel-plugin-react-compiler: specifier: 19.1.0-rc.3 version: 19.1.0-rc.3 eslint: - specifier: ^10.7.0 - version: 10.8.0 + specifier: ^10.5.0 + version: 10.5.0 eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@10.8.0) + version: 7.1.1(eslint@10.5.0) eslint-plugin-react-refresh: specifier: ^0.5.3 - version: 0.5.3(eslint@10.8.0) + version: 0.5.3(eslint@10.5.0) i18next: - specifier: ^26.3.6 - version: 26.3.6(typescript@6.0.3) + specifier: ^26.3.1 + version: 26.3.1(typescript@6.0.3) i18next-browser-languagedetector: specifier: ^8.2.1 version: 8.2.1 lucide-react: - specifier: ^1.26.0 - version: 1.27.0(react@19.2.8) + specifier: ^1.21.0 + version: 1.21.0(react@19.2.7) openapi-typescript: specifier: ^7.13.0 version: 7.13.0(typescript@6.0.3) react: - specifier: ^19.2.8 - version: 19.2.8 + specifier: ^19.2.7 + version: 19.2.7 react-dom: - specifier: ^19.2.8 - version: 19.2.8(react@19.2.8) + specifier: ^19.2.7 + version: 19.2.7(react@19.2.7) react-hook-form: - specifier: ^7.82.0 - version: 7.83.0(react@19.2.8) + specifier: ^7.80.0 + version: 7.80.0(react@19.2.7) react-i18next: - specifier: ^17.0.11 - version: 17.0.11(i18next@26.3.6(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + specifier: ^17.0.8 + version: 17.0.8(i18next@26.3.1(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3) react-router-dom: - specifier: ^7.18.1 - version: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^7.18.0 + version: 7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) socket.io-client: specifier: ^4.8.3 - version: 4.8.3(supports-color@8.1.1) + version: 4.8.3 tsx: - specifier: ^4.23.1 - version: 4.23.1 + specifier: ^4.22.4 + version: 4.22.4 typescript: specifier: ^6.0.3 version: 6.0.3 vite: - specifier: ^8.1.5 - version: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + specifier: ^8.0.16 + version: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) vite-plugin-babel: specifier: ^1.7.3 - version: 1.7.3(@babel/core@8.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)) + version: 1.7.3(@babel/core@7.29.7)(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)) zustand: specifier: ^5.0.14 - version: 5.0.14(@types/react@19.2.17)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)) + version: 5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) bin: dependencies: @@ -157,26 +157,26 @@ importers: version: link:../src log4js: specifier: ^6.9.1 - version: 6.9.1(supports-color@8.1.1) + version: 6.9.1 semver: - specifier: ^7.8.5 - version: 7.8.5 + specifier: ^7.8.4 + version: 7.8.4 tsx: - specifier: ^4.23.1 - version: 4.23.1 + specifier: ^4.22.4 + version: 4.22.4 ueberdb2: - specifier: 6.1.16 - version: 6.1.16(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.9.0)(dirty-ts@1.1.8)(mongodb@7.4.0(socks@2.8.9))(mssql@12.7.0)(mysql2@3.23.1(@types/node@26.1.1))(nano@11.0.6)(pg@8.22.0)(redis@6.1.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.8(tslib@2.8.1)(typescript@7.0.2)) + specifier: 6.1.13 + version: 6.1.13(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.8.0)(dirty-ts@1.1.8)(mongodb@7.3.0)(mssql@12.5.5(@azure/core-client@1.10.1))(mysql2@3.22.5(@types/node@26.0.0))(nano@11.0.5)(pg@8.22.0)(redis@6.0.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.3(tslib@2.8.1)(typescript@6.0.3)) devDependencies: '@types/node': - specifier: ^26.1.1 - version: 26.1.1 + specifier: ^26.0.0 + version: 26.0.0 '@types/semver': specifier: ^7.7.1 version: 7.7.1 typescript: - specifier: ^7.0.0 - version: 7.0.2 + specifier: ^6.0.3 + version: 6.0.3 doc: dependencies: @@ -185,11 +185,11 @@ importers: version: 2.17.3 devDependencies: oxc-minify: - specifier: ^0.141.0 - version: 0.141.0 + specifier: ^0.137.0 + version: 0.137.0 vitepress: - specifier: ^2.0.0-alpha.18 - version: 2.0.0-alpha.18(@types/node@26.1.1)(change-case@5.4.4)(esbuild@0.28.1)(jwt-decode@4.0.0)(postcss@8.5.16)(tsx@4.23.1)(typescript@6.0.3) + specifier: ^2.0.0-alpha.17 + version: 2.0.0-alpha.17(@types/node@26.0.0)(change-case@5.4.4)(esbuild@0.28.1)(jwt-decode@4.0.0)(oxc-minify@0.137.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3) src: dependencies: @@ -201,7 +201,7 @@ importers: version: 3.2.6 cassandra-driver: specifier: ^4.8.0 - version: 4.9.0 + version: 4.8.0 cookie-parser: specifier: ^1.4.7 version: 1.4.7 @@ -222,13 +222,16 @@ importers: version: 0.28.1 express: specifier: ^5.2.1 - version: 5.2.1(supports-color@8.1.1) + version: 5.2.1 express-rate-limit: - specifier: ^8.6.0 - version: 8.6.0(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1) + specifier: ^8.5.1 + version: 8.5.1(express@5.2.1) express-session: specifier: ^1.19.0 version: 1.19.0 + find-root: + specifier: 1.1.0 + version: 1.1.0 formidable: specifier: ^3.5.4 version: 3.5.4 @@ -242,17 +245,17 @@ importers: specifier: ^2.0.1 version: 2.0.1 jose: - specifier: ^6.2.4 - version: 6.2.4 + specifier: ^6.2.3 + version: 6.2.3 js-cookie: specifier: ^3.0.8 version: 3.0.8 jsdom: specifier: ^29.1.1 version: 29.1.1(@noble/hashes@1.8.0) - jsonc-parser: - specifier: ^3.3.1 - version: 3.3.1 + jsonminify: + specifier: 0.4.2 + version: 0.4.2 jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 @@ -264,16 +267,16 @@ importers: version: 0.1.3 live-plugin-manager: specifier: ^1.1.0 - version: 1.1.0(supports-color@8.1.1) + version: 1.1.0 lodash.clonedeep: specifier: 4.5.0 version: 4.5.0 log4js: specifier: ^6.9.1 - version: 6.9.1(supports-color@8.1.1) + version: 6.9.1 lru-cache: - specifier: ^11.5.2 - version: 11.5.2 + specifier: ^11.5.1 + version: 11.5.1 mammoth: specifier: ^1.12.0 version: 1.12.0 @@ -284,26 +287,26 @@ importers: specifier: ^3.0.2 version: 3.0.2 mongodb: - specifier: ^7.4.0 - version: 7.4.0(socks@2.8.9) + specifier: ^7.3.0 + version: 7.3.0 mssql: - specifier: ^12.6.0 - version: 12.7.0 + specifier: ^12.5.5 + version: 12.5.5(@azure/core-client@1.10.1) mysql2: - specifier: ^3.23.1 - version: 3.23.1(@types/node@26.1.1) + specifier: ^3.22.5 + version: 3.22.5(@types/node@26.0.0) nano: - specifier: ^11.0.6 - version: 11.0.6 + specifier: ^11.0.5 + version: 11.0.5 nodemailer: - specifier: ^9.0.3 - version: 9.0.3 + specifier: ^9.0.1 + version: 9.0.1 oidc-provider: - specifier: 9.10.0 - version: 9.10.0(supports-color@8.1.1) + specifier: 9.8.5 + version: 9.8.5 openapi-backend: - specifier: ^5.18.0 - version: 5.18.0 + specifier: ^5.17.0 + version: 5.17.0 pdfkit: specifier: ^0.19.1 version: 0.19.1 @@ -320,8 +323,8 @@ importers: specifier: ^11.2.0 version: 11.2.0 redis: - specifier: ^6.1.0 - version: 6.1.0(@opentelemetry/api@1.9.1) + specifier: ^6.0.0 + version: 6.0.0(@opentelemetry/api@1.9.1) rehype: specifier: ^13.0.2 version: 13.0.2 @@ -337,43 +340,49 @@ importers: rusty-store-kv: specifier: ^1.3.1 version: 1.3.1 + security: + specifier: 1.0.0 + version: 1.0.0 semver: - specifier: ^7.8.5 - version: 7.8.5 + specifier: ^7.8.4 + version: 7.8.4 socket.io: specifier: ^4.8.3 - version: 4.8.3(supports-color@8.1.1) + version: 4.8.3 socket.io-client: specifier: ^4.8.3 - version: 4.8.3(supports-color@8.1.1) + version: 4.8.3 superagent: specifier: 10.3.0 version: 10.3.0 surrealdb: - specifier: ^2.0.8 - version: 2.0.8(tslib@2.8.1)(typescript@7.0.2) + specifier: ^2.0.3 + version: 2.0.3(tslib@2.8.1)(typescript@6.0.3) tinycon: specifier: 0.6.8 version: 0.6.8 tsx: - specifier: 4.23.1 - version: 4.23.1 + specifier: 4.22.4 + version: 4.22.4 ueberdb2: - specifier: 6.1.16 - version: 6.1.16(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.9.0)(dirty-ts@1.1.8)(mongodb@7.4.0(socks@2.8.9))(mssql@12.7.0)(mysql2@3.23.1(@types/node@26.1.1))(nano@11.0.6)(pg@8.22.0)(redis@6.1.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.8(tslib@2.8.1)(typescript@7.0.2)) + specifier: 6.1.13 + version: 6.1.13(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.8.0)(dirty-ts@1.1.8)(mongodb@7.3.0)(mssql@12.5.5(@azure/core-client@1.10.1))(mysql2@3.22.5(@types/node@26.0.0))(nano@11.0.5)(pg@8.22.0)(redis@6.0.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.3(tslib@2.8.1)(typescript@6.0.3)) underscore: specifier: 1.13.8 version: 1.13.8 undici: - specifier: ^8.9.0 - version: 8.9.0 + specifier: ^8.5.0 + version: 8.5.0 + unorm: + specifier: 1.6.0 + version: 1.6.0 wtfnode: specifier: ^0.10.1 version: 0.10.1 devDependencies: '@playwright/test': - specifier: ^1.61.1 - version: 1.61.1 + specifier: ^1.61.0 + version: 1.61.0 '@types/async': specifier: ^3.2.25 version: 3.2.25 @@ -407,6 +416,9 @@ importers: '@types/jsdom': specifier: ^28.0.3 version: 28.0.3 + '@types/jsonminify': + specifier: ^0.4.3 + version: 0.4.3 '@types/jsonwebtoken': specifier: ^9.0.10 version: 9.0.10 @@ -417,8 +429,8 @@ importers: specifier: ^10.0.9 version: 10.0.10 '@types/node': - specifier: ^26.1.1 - version: 26.1.1 + specifier: ^26.0.0 + version: 26.0.0 '@types/nodemailer': specifier: ^8.0.1 version: 8.0.1 @@ -432,11 +444,11 @@ importers: specifier: ^7.7.1 version: 7.7.1 '@types/sinon': - specifier: ^22.0.0 - version: 22.0.0 + specifier: ^21.0.1 + version: 21.0.1 '@types/supertest': - specifier: ^7.2.1 - version: 7.2.1 + specifier: ^7.2.0 + version: 7.2.0 '@types/underscore': specifier: ^1.13.0 version: 1.13.0 @@ -447,11 +459,11 @@ importers: specifier: ^5.0.0 version: 5.0.0 eslint: - specifier: ^10.7.0 - version: 10.8.0 + specifier: ^10.5.0 + version: 10.5.0 eslint-config-etherpad: specifier: ^4.0.5 - version: 4.0.5(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) + version: 4.0.5(eslint@10.5.0)(typescript@6.0.3) etherpad-cli-client: specifier: ^4.0.3 version: 4.0.3 @@ -468,11 +480,11 @@ importers: specifier: ^0.4.2 version: 0.4.2 set-cookie-parser: - specifier: ^3.1.2 - version: 3.1.2 + specifier: ^3.1.0 + version: 3.1.0 sinon: - specifier: ^22.1.0 - version: 22.1.0 + specifier: ^22.0.0 + version: 22.0.0 split-grid: specifier: ^1.0.11 version: 1.0.11 @@ -480,11 +492,11 @@ importers: specifier: ^7.2.2 version: 7.2.2 typescript: - specifier: ^7.0.0 - version: 7.0.2 + specifier: ^6.0.3 + version: 6.0.3 vitest: - specifier: ^4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)) + specifier: ^4.1.9 + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.0.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)) ui: devDependencies: @@ -495,8 +507,8 @@ importers: specifier: ^6.0.3 version: 6.0.3 vite: - specifier: ^8.1.5 - version: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + specifier: ^8.0.16 + version: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) packages: @@ -527,8 +539,8 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@azure-rest/core-client@2.7.0': - resolution: {integrity: sha512-rL0lJqh1E8HLXNgjIw8cRyGAV/v+m6p1xRu/8OhsnmN8XHhwkyYJkAoGM+zrew96v7jZYPmVfy7pv7v4Iccfsg==} + '@azure-rest/core-client@2.6.0': + resolution: {integrity: sha512-iuFKDm8XPzNxPfRjhyU5/xKZmcRDzSuEghXDHHk4MjBV/wFL34GmYVBZnn9wmuoLBeS1qAw9ceMdaeJBPcB1QQ==} engines: {node: '>=20.0.0'} '@azure/abort-controller@2.1.2': @@ -539,10 +551,17 @@ packages: resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} engines: {node: '>=20.0.0'} - '@azure/core-client@1.10.2': - resolution: {integrity: sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==} + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} engines: {node: '>=20.0.0'} + '@azure/core-http-compat@2.4.0': + resolution: {integrity: sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@azure/core-client': ^1.10.0 + '@azure/core-rest-pipeline': ^1.22.0 + '@azure/core-lro@2.7.2': resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} engines: {node: '>=18.0.0'} @@ -551,8 +570,8 @@ packages: resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-rest-pipeline@1.24.0': - resolution: {integrity: sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==} + '@azure/core-rest-pipeline@1.23.0': + resolution: {integrity: sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==} engines: {node: '>=20.0.0'} '@azure/core-tracing@1.3.1': @@ -571,125 +590,147 @@ packages: resolution: {integrity: sha512-aCDidWuKY06LWQ4x7/8TIXK6iRqTaRWRL3t7T+LC+j1b07HtoIsOxP/tU90G4jCSBn5TAyUTCtA4MS/y5Hudaw==} engines: {node: '>=20.0.0'} - '@azure/keyvault-keys@4.10.2': - resolution: {integrity: sha512-VmUSLbXRAbSzDD8grXHGPaknYs0SKr3yuf6U+d4XMpX4XuVYskNqbTTwXce0zR1LyxfTZm9rWEBcvs3vdYwCmQ==} - engines: {node: '>=20.0.0'} + '@azure/keyvault-keys@4.10.0': + resolution: {integrity: sha512-eDT7iXoBTRZ2n3fLiftuGJFD+yjkiB1GNqzU2KbY1TLYeXeSPVTVgn2eJ5vmRTZ11978jy2Kg2wI7xa9Tyr8ag==} + engines: {node: '>=18.0.0'} '@azure/logger@1.3.0': resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@5.16.0': - resolution: {integrity: sha512-Wc75FGnQgYpsm5jsOqn1H8AXsh8vXruA6vwip1nhjrJxwby7juxKAIVLr7csepmHiwdZGr6EwI5BlSc3PizEtQ==} + '@azure/msal-browser@5.11.0': + resolution: {integrity: sha512-zkGNYS3TwY8lUpPIafAmsFCYZbgFixY9y/LZB9GUg0IILoHTqpN26j5OrkL1AQThh/YdZsawe4iWXfp85lFVxg==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.11.0': - resolution: {integrity: sha512-UikJOtMwkFpZNzTH6Dqk8UTUPbow15zH3e0UjGYZy69lYENW/S05gMLhbxI2eonz66uALhIljvhsSMEb6+O30g==} + '@azure/msal-common@16.6.2': + resolution: {integrity: sha512-hQjjsekAjB00cM1EmatWJlzhEoK2Qhz7Rj5gvM6tYf8iL7RM3tkxlpU9fG0+ofkulzg9AEEA6dIEnSmDr5ZqUA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@5.3.1': - resolution: {integrity: sha512-sqqv3L1UOI4KDXonNtbxPYUgbSWVXqxvmmb6BUw9n4P/UXgG+cVur3dLWQN4Cz7qQ+UJROCCxMXlksm7gIq0Sw==} + '@azure/msal-node@5.2.2': + resolution: {integrity: sha512-toS+2AePxqyzb0YOKttDOOiSl3jrkK9aiqIvpurpis0O34QcIS5gToqrgT39p04Dpxw3YoUU0lxJKTpSFFfA6Q==} engines: {node: '>=20'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/code-frame@8.0.0': - resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} - '@babel/compat-data@8.0.0': - resolution: {integrity: sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} - '@babel/core@8.0.1': - resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} - '@babel/generator@8.0.0': - resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@8.0.0': - resolution: {integrity: sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} - '@babel/helper-globals@8.0.0': - resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': '>=7.29.6' + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0': - resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.2': - resolution: {integrity: sha512-9Fr9QeyCAyi1BR1jKZ6uYQ24EIhQUx5ReHfQU7drOE+TPOb+w11/dsqLkMOT2U29OdCT71XajrOT8xDc1C7orA==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@8.0.0': - resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} - '@babel/helpers@8.0.0': - resolution: {integrity: sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + engines: {node: '>=6.0.0'} + hasBin: true '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0': - resolution: {integrity: sha512-aLxAE+imI9bCcyaPrUDjBv3uSkWieifjLe0kuFOZF0zli0L6GCsTmsePnTr55adbIAgYz2zhN1vnFimCBUYcRQ==} - engines: {node: ^22.18.0 || >=24.11.0} - hasBin: true - - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/template@8.0.0': - resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} - '@babel/traverse@8.0.0': - resolution: {integrity: sha512-bxTj/W2VclGE6CctlfQOpxg8MPDzXArRqkOBePw8EHfebcjF7fETWSS3BriEECo+UiU/Yblq+xUtSImFu7cTbw==} - engines: {node: ^22.18.0 || >=24.11.0} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0': - resolution: {integrity: sha512-K8ponJDxBwDHigkeFqaqT5wLGl4bTlwMafR8k7b5CPxr6Ww+UG9ls8Yx6Tcpboxu97eeGVEEyKcHmEyOwN1vSw==} - engines: {node: ^22.18.0 || >=24.11.0} - '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@csstools/color-helpers@6.1.0': - resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.1': - resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + '@csstools/css-calc@3.2.0': + resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.9': - resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} + '@csstools/css-color-parser@4.1.0': + resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -701,8 +742,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.6': - resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} + '@csstools/css-syntax-patches-for-csstree@1.1.3': + resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -713,14 +754,14 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@docsearch/css@4.6.3': - resolution: {integrity: sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==} + '@docsearch/css@4.6.0': + resolution: {integrity: sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==} - '@docsearch/js@4.6.3': - resolution: {integrity: sha512-qUIX2b4Apew3tv4F0qhmgShsl/Lfw4m6mqv/5/5dWNxwTcDdLMp2s3YwZ+NMGh3IKCg0pBaXm7Q5VdyU5Rj+cQ==} + '@docsearch/js@4.6.0': + resolution: {integrity: sha512-9/rbgkm/BgTq46cwxIohvSAz3koOFjnPpg0mwkJItAfzKbQIj+310PvwtgUY1YITDuGCag6yOL50GW2DBkaaBw==} - '@docsearch/sidepanel-js@4.6.3': - resolution: {integrity: sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==} + '@docsearch/sidepanel-js@4.6.0': + resolution: {integrity: sha512-lFT5KLwlzUmpoGArCScNoK41l9a22JYsEPwBzMrz+/ILVR5Ax87UphCuiyDFQWEvEmbwzn/kJx5W/O5BUlN1Rw==} '@elastic/elasticsearch@9.4.2': resolution: {integrity: sha512-H9myMlLUeotkZhZ4ppinoMGDFxmW3lY8/s+4TIk1vFHyCvWU1Ej4T7azX5buCzemyFApgN0ywnEuvOtpel2VZg==} @@ -731,21 +772,24 @@ packages: apache-arrow: optional: true - '@elastic/transport@9.3.7': - resolution: {integrity: sha512-L38Ax21uF2OPUmCRWycZ/dZdMYf7gMrtClcxvVrqJVFmn8ET2M++GYmFGJpLqOHS1beATxOXLWe7y2ijSQz/ng==} + '@elastic/transport@9.3.6': + resolution: {integrity: sha512-1r0kXXOkKPhmHycpdZTzRlr2d6l0m16b+ug1iJDMS84Ml0t6w7m26BKjFYbZ2Ng7kX50wyqgUTFqxln1ygvMUw==} engines: {node: '>=20'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} - '@emnapi/core@1.11.2': - resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - '@emnapi/runtime@1.11.2': - resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} @@ -923,8 +967,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.7.0': - resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -939,8 +983,8 @@ packages: resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.1': - resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -968,8 +1012,8 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/simple-icons@1.2.89': - resolution: {integrity: sha512-hRaCY5s2G5oWAIhc4LCGYn6g6RrwLL4zhoLOT+KUO3joVCxVlZKA+839bv/47Nbe9/ZD4UA6dznZ4XPYcI53wA==} + '@iconify-json/simple-icons@1.2.74': + resolution: {integrity: sha512-yqaohfY6jnYjTVpuTkaBQHrWbdUrQyWXhau0r/0EZiNWYXPX/P8WWwl1DoLH5CbvDjjcWQw5J0zADhgCUklOqA==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -981,6 +1025,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -991,8 +1038,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@js-joda/core@6.0.1': - resolution: {integrity: sha512-Iev3Cfa3MC+06JXXeFzSLew/7yeCXLMhjesyH/BD4EQYlUUDV49Ln3s8hd7p5XK5UesO/dO3K1LFJ7RT7v0Ddg==} + '@js-joda/core@5.7.0': + resolution: {integrity: sha512-WBu4ULVVxySLLzK1Ppq+OdfP+adRS4ntmDQT915rzDJ++i95gc2jZkM5B6LWEAwN3lGXpfie3yPABozdD3K3Vg==} '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} @@ -1001,20 +1048,26 @@ packages: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} - '@koa/router@15.7.0': - resolution: {integrity: sha512-WaAlk4TOl/O0rhTpOR0l052gz03syPMmI6Pe2gd7v3ubjfv5UcSGcnb0Y/J5NNC/ln+5FiUqPJTc/a15I+XqAA==} + '@koa/router@15.6.0': + resolution: {integrity: sha512-iEOXlvGIBqSNkGXrg0XtMARAOm5zA24oedXxiTGEkrD4JgwVjfRDddCQvW1s4WEcwDYvyecRbf8BikXsuEEj8w==} engines: {node: '>= 20'} peerDependencies: koa: ^2.0.0 || ^3.0.0 - '@mongodb-js/saslprep@1.4.12': - resolution: {integrity: sha512-QAfAMwNgnYxZ2C6D1HgeP7Gc4i/uvJRim415PCIL9ptRxWMNbWeLBYb2/9R4pGKny/s1FVu2JA2cxCUBUOggrA==} + '@mongodb-js/saslprep@1.4.11': + resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==} '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 @@ -1083,163 +1136,167 @@ packages: resolution: {integrity: sha512-6gH/bLQJSJEg7OEpkH4wGQdA8KXHRbzL1YkGyUO12YNAgV3jxKy4K9kvfXj4+9T0OLug5k58cnPCKSSIKzp7pg==} engines: {node: '>=8.0'} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.9.0': - resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.42.0': - resolution: {integrity: sha512-icc5xCzndZfhuJMy5oqk5AvloWquR7jtae74qzpkKkhGp8BivK+oCcEXgGnjCdTfp8hA44l+w8gE8yYJbocJJw==} + '@opentelemetry/semantic-conventions@1.41.1': + resolution: {integrity: sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==} engines: {node: '>=14'} - '@oxc-minify/binding-android-arm-eabi@0.141.0': - resolution: {integrity: sha512-tt3ekadMhd/Q+9/mU1RaZWCUAJhOQgHsUD9tn0btFhEkZyeTg1rKt2+wzv+wjBE3QXlxVdV6sYMLKnbt8XdR+g==} + '@oxc-minify/binding-android-arm-eabi@0.137.0': + resolution: {integrity: sha512-L9qvMdn3PCvZSjVdKYdQypGgfpw/YTLO99hx9agH/L7ekwN5PjbVy0sklcuKFUMPdqu/hpXwidJkRK1GGEVEvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-minify/binding-android-arm64@0.141.0': - resolution: {integrity: sha512-i7OGI2bFipaSlgwap/qiXcCmPbZMhlYdKAQvUtNziX8CJamNzhlqMNw4jz7wYdVNfcKuQ1eoyi7XMYCbNnKRtg==} + '@oxc-minify/binding-android-arm64@0.137.0': + resolution: {integrity: sha512-OjsHxnabbs9JTcKpET+X5GRpJGeJ+w+3MVGkWiyU+7Lg1qedz2l3cqH4Mcvp6tA/zlNowz3vBH0dY62gs5Ou0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-minify/binding-darwin-arm64@0.141.0': - resolution: {integrity: sha512-YOp5tcQRkLUbvII+EVwDss+Ww16b/V8XfrqNRDOTaLb/azGTb87iyS5drXfRosONv7Jp8/t8qRFC9K0aj1yYZA==} + '@oxc-minify/binding-darwin-arm64@0.137.0': + resolution: {integrity: sha512-gvSLNiAq78CO4cVpPPkQaolnVJY4wMbFD+6hSNjkolbAe2JPZgSVoTcULq8BR9nxyuRQ59aB+gwlbyt6N3IF/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-minify/binding-darwin-x64@0.141.0': - resolution: {integrity: sha512-9Z25dRX02krxcFXTIoZ3ym0+CF3gZ6RiU+bbckFT4l+d5LcQePfM1tR12zEW+GDTl0atCNG2TuEu61tT4L2LIQ==} + '@oxc-minify/binding-darwin-x64@0.137.0': + resolution: {integrity: sha512-MVRaUH325fJ87dQQK2kumQM3RKpNdLUv9KnDzKXQILF7mufmtxqwtsCm0zDz0HQegbNcTmruJEVzGzjchx5wTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-minify/binding-freebsd-x64@0.141.0': - resolution: {integrity: sha512-QtFX48viQb3Di8GkxhH9SPYZaafIwyEa51iFBALXz2x1WdYvZeAxgl33GjETq5/YXS7MiPYrZ7FNs3UHtPsTdg==} + '@oxc-minify/binding-freebsd-x64@0.137.0': + resolution: {integrity: sha512-baMrT+nmjiMH/Vemvj4TFb6tY4aCJw3mEJ5ysBH4uczijZSJVjt6I/YYVKhT8OcOrJJognVzufoNEev1+FwntA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-minify/binding-linux-arm-gnueabihf@0.141.0': - resolution: {integrity: sha512-HcgqdmJY+0qWnolOTxrvzilDTvs3q7RF2XcvO0q0iDld8SZBNARVqrWY9k5WwCMTZSJKCWfL/QqpUMBnyIHQAA==} + '@oxc-minify/binding-linux-arm-gnueabihf@0.137.0': + resolution: {integrity: sha512-O1sDkIIW2OR1knoN+zboHmV16YYIeOl32YbwbftdCd9pKb/fEmUb0ZHxUNVHqopOxnKRJlPGUHGrxeR8JOeEqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-minify/binding-linux-arm-musleabihf@0.141.0': - resolution: {integrity: sha512-u8c4OPT8A6lx+mnFkMczIHCQQNqbqdEGwep2PlOoCgQhwsWR3auvs4cyD1JJW6huZQjeq0gJJ0dJtvJq3yLy+w==} + '@oxc-minify/binding-linux-arm-musleabihf@0.137.0': + resolution: {integrity: sha512-9pVdFYTgHasOQlmAOyI1HKC6biqyQdg2fwzSZapSVJJm808j0mTiUPZbGJVoLWlda92j+rQeWqYWDqrK9UJdQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-minify/binding-linux-arm64-gnu@0.141.0': - resolution: {integrity: sha512-n+ljU1cOCpIqVDxYiYmNimXGKNYlPIkdWVrkC4hOQF3B7YqkSRtEWbHcvedinBqNCwUF+azynDWor5Bq3/BdDw==} + '@oxc-minify/binding-linux-arm64-gnu@0.137.0': + resolution: {integrity: sha512-QmaIoG8RouuFR22IbMgAdtgSF5JbW65KUfA9WKtcOqueoQ++jGirR4+J97hqLuOi43REWwHiH8u0TPXadCN4Qg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-arm64-musl@0.141.0': - resolution: {integrity: sha512-Xkb5QCOywz/YbL+8LVQSzOxuz2jhRweBjr4BnQO7CQXAtQLLCNoll7v2qLg9OCzdqdhFw9uNgZ6aTBVADBhiPg==} + '@oxc-minify/binding-linux-arm64-musl@0.137.0': + resolution: {integrity: sha512-8699hkSLlNjgk0+y63Z2qmM3CUtlj0VlEESwsz1U6zf/wuXQOY4g5J2wUhdxi5vH3p6KOZyEmNGTrTm1R2aWKw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-minify/binding-linux-ppc64-gnu@0.141.0': - resolution: {integrity: sha512-IbVb+m0iL053WitFNnQbtmd8OjYGr4Xn5NTuAiYz8tJBtn82okEZFi0OgaeaHQE4aPZGOKPcSVlt1OMPtMoPCw==} + '@oxc-minify/binding-linux-ppc64-gnu@0.137.0': + resolution: {integrity: sha512-/GZYyq6ljOc1FfMQr5MdDC3MCbBT4lQNJF4uSpkorVcLOCDYeok1H9DRDKifJ/HVB+kmuLLixd9efPLmbb1skA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-riscv64-gnu@0.141.0': - resolution: {integrity: sha512-Sc/GAiyelxg8oXlBgmJI6OuKKHmg4rF0RvTLC8eL5V3qKDXrMdVWiJziwVBqN5oiFEog35ZM1/YNF63IZOdZjw==} + '@oxc-minify/binding-linux-riscv64-gnu@0.137.0': + resolution: {integrity: sha512-nG+C+xZ3k7uNs9zqT0QEte5jC3JJF2TzrWTh5L1iT5BLrTjBkTR9Nds3JGICq3OiSC7ISD8IrC/6+EmuKHS4MQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-riscv64-musl@0.141.0': - resolution: {integrity: sha512-KHYS3oQJ5r1QBVAVubUy6UPRWYghqkjCOfNlGeH/sWlmfeM2OD74+Stc8eHmVm7QI2wDooOIlZfUso0Yz0jyRg==} + '@oxc-minify/binding-linux-riscv64-musl@0.137.0': + resolution: {integrity: sha512-LJ542BS6wntybDD9H69qLNhTSDENj0CPgl4uLMz4SnLUnptNuoOd1T64EX1nfxmPaxxt5en2lR5R54aewwjcdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-minify/binding-linux-s390x-gnu@0.141.0': - resolution: {integrity: sha512-WyacIrs13ewOnGngxNmPF00xn0+aOYHTMSSMljNN3VShSbqB0A7ZEikR7q9fmmnBTf/jloQUO6bjzK85BFfl0w==} + '@oxc-minify/binding-linux-s390x-gnu@0.137.0': + resolution: {integrity: sha512-Gav3Q3MKU4xYpDKHSEjZS0PPxKMcm3YUHHP8oLPk3owRdAFRc+EJ0aNGL6xuzryzShDjkl0U4chsdwz96RpVWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-x64-gnu@0.141.0': - resolution: {integrity: sha512-mP69bh2L/VVq10UEQ3wb0EsO0472TzOIZUfS/ADmxnr4gSxAzhRbO8w5QryL3BNyyyjSaXIlrAnAKO6G3srGwg==} + '@oxc-minify/binding-linux-x64-gnu@0.137.0': + resolution: {integrity: sha512-LV6kLxEv1ybaz+p9otVIttA22GGCEnLwCY//FFaAToqznO9OfA8RCaPVJiY3UpXjCyKyPQnShRyTEgM9rXR/8A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-minify/binding-linux-x64-musl@0.141.0': - resolution: {integrity: sha512-B4w1uz+GPVD5iRNn9StLSG0ug5DNAy5YQVswjPy5fXNNO6JyADvmu4KZyE6tWCA6Kbz/84icD6RJ1TKVis2HSg==} + '@oxc-minify/binding-linux-x64-musl@0.137.0': + resolution: {integrity: sha512-eX91M3g+QFsBEYeCYci6HAtI9yqt6CTAgMSs4gRtEX2WGP+gSAlmBv/89ILUjANlulekIKCIWR5TVK13uxx7eQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxc-minify/binding-openharmony-arm64@0.141.0': - resolution: {integrity: sha512-p3nU1bo2t+QRvvqOPUqI8aEk8puhYdMq5cnjulovfKykWRi8cMcJJvuLp+RPkf45lUcTQdNG/YMFqR5eYGZfwA==} + '@oxc-minify/binding-openharmony-arm64@0.137.0': + resolution: {integrity: sha512-22nO65Lk/975R0XHtxxE7h2Yp+XYX4URm95IHyN1dwvQUOS6B4hxrWblGbvGLqh4YtlUaqP39p46wnDdkQfN4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-minify/binding-wasm32-wasi@0.141.0': - resolution: {integrity: sha512-Qb72fqFRs2Xu+KvAwisc1Fxn/rd/KROnFIdkFv77dTVmrKsq2HOCjWvxlPzjHcxNIgGUUJtpmNolrs7GYcopKg==} + '@oxc-minify/binding-wasm32-wasi@0.137.0': + resolution: {integrity: sha512-z1MjC2uUzyi4tWnhpHifEGqSNKfWHLoKzrF+057NzMMhvdi14uGJSOFHFXzzyBLns0JxCgp0huJq0Vi3Y8AP9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-minify/binding-win32-arm64-msvc@0.141.0': - resolution: {integrity: sha512-C+lcoyJycCgq4MIgGe2K/xYZHKjaSfRMa+Bm88UoPK7U/mFHYoAnICbftkLh3IVnIuQAr9vGItp0w/m39VajgQ==} + '@oxc-minify/binding-win32-arm64-msvc@0.137.0': + resolution: {integrity: sha512-P0EbyspXEH4mNXpv3z9Zq+uQCKkz4Iaij3ie3jNCR4phY7fKXKbsatKLKoVVrgJ920C+ZhemmbZjcB3FtL+a+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-minify/binding-win32-ia32-msvc@0.141.0': - resolution: {integrity: sha512-MAtLZpArekuD94sTmQYz7YAn3xDrq4wqT/71CUrv8ij2TSbYZGqDtA44ujP3977180ITcffPQYfHKXYX7arsgg==} + '@oxc-minify/binding-win32-ia32-msvc@0.137.0': + resolution: {integrity: sha512-Lo0AIHKL/It+xxnkpNKRDetkPVPa/AFT+7G8pM29Eo5cDWn7HvHl3OUadwcKEiMRtKQ/2Vu2xk59RbULuolpEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-minify/binding-win32-x64-msvc@0.141.0': - resolution: {integrity: sha512-9B0SzKsstTUETz2SblLd2gZJ2H36GyBmZmwcZVwEaFOYW+luVm78yCSjZwja/xyl+PV6JsLhxQv+rgH46rpxQw==} + '@oxc-minify/binding-win32-x64-msvc@0.137.0': + resolution: {integrity: sha512-wPoXpXofwwB0P8ndU7CEKZa/JhmfU7ixaBKcfDkoBT7TFeNrZj7yWxaV4SDAMRYymFW8eCJgzbWESpTXjH1YVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.139.0': - resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} - '@paralleldrive/cuid2@2.3.1': - resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@playwright/test@1.61.1': - resolution: {integrity: sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==} + '@playwright/test@1.61.0': + resolution: {integrity: sha512-cKA5B6lpFEMyMGjxF54QihfYpB4FkEGH+qZhtArDEG+wezQAJY8Pq6C7T1SjWz+FFzt3TbyoXBQYk/0292TdJA==} engines: {node: '>=18'} hasBin: true - '@radix-ui/primitive@1.1.7': - resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + '@radix-ui/primitive@1.1.4': + resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==} - '@radix-ui/react-collection@1.1.15': - resolution: {integrity: sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==} + '@radix-ui/react-collection@1.1.10': + resolution: {integrity: sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1251,8 +1308,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.1.5': - resolution: {integrity: sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==} + '@radix-ui/react-compose-refs@1.1.3': + resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1260,8 +1317,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.2.2': - resolution: {integrity: sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==} + '@radix-ui/react-context@1.1.4': + resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1269,8 +1326,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.23': - resolution: {integrity: sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==} + '@radix-ui/react-dialog@1.1.17': + resolution: {integrity: sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1282,8 +1339,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dismissable-layer@1.1.19': - resolution: {integrity: sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==} + '@radix-ui/react-dismissable-layer@1.1.13': + resolution: {integrity: sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1295,8 +1352,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.6': - resolution: {integrity: sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==} + '@radix-ui/react-focus-guards@1.1.4': + resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1304,8 +1361,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.16': - resolution: {integrity: sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==} + '@radix-ui/react-focus-scope@1.1.10': + resolution: {integrity: sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1317,8 +1374,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-id@1.1.4': - resolution: {integrity: sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==} + '@radix-ui/react-id@1.1.2': + resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1326,8 +1383,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-portal@1.1.17': - resolution: {integrity: sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==} + '@radix-ui/react-portal@1.1.12': + resolution: {integrity: sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1339,8 +1396,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.10': - resolution: {integrity: sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==} + '@radix-ui/react-presence@1.1.6': + resolution: {integrity: sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1352,8 +1409,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.10': - resolution: {integrity: sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==} + '@radix-ui/react-primitive@2.1.6': + resolution: {integrity: sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1365,8 +1422,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.3.3': - resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} + '@radix-ui/react-slot@1.3.0': + resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1374,8 +1431,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.3.7': - resolution: {integrity: sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==} + '@radix-ui/react-switch@1.3.1': + resolution: {integrity: sha512-55bQtCnOB0BohomSHi6qvQXpJEEqUGDm6hRrM0Bph5OXwhSegqkd8IqgBAQkM1IlgUlWZIxpxRcpOEfRIgimyw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1387,8 +1444,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toast@1.2.23': - resolution: {integrity: sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==} + '@radix-ui/react-toast@1.2.17': + resolution: {integrity: sha512-uL4kyyWy000pPL43fGGCV5qT6ZchCWEQZOSlkYiPwPt8Hy1iW38RjeptIvz1/SZesrW6Vn58Ct3sV7tfEfiAbw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1400,8 +1457,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.1.4': - resolution: {integrity: sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==} + '@radix-ui/react-use-callback-ref@1.1.2': + resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1409,8 +1466,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.6': - resolution: {integrity: sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==} + '@radix-ui/react-use-controllable-state@1.2.3': + resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1418,8 +1475,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-effect-event@0.0.5': - resolution: {integrity: sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==} + '@radix-ui/react-use-effect-event@0.0.3': + resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1427,8 +1484,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.4': - resolution: {integrity: sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==} + '@radix-ui/react-use-escape-keydown@1.1.2': + resolution: {integrity: sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1436,8 +1493,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-size@1.1.4': - resolution: {integrity: sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==} + '@radix-ui/react-use-layout-effect@1.1.2': + resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1445,8 +1502,26 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.2.11': - resolution: {integrity: sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==} + '@radix-ui/react-use-previous@1.1.2': + resolution: {integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.2': + resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.6': + resolution: {integrity: sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1458,14 +1533,14 @@ packages: '@types/react-dom': optional: true - '@redis/bloom@6.1.0': - resolution: {integrity: sha512-Rzascjd9J9bJsM45T/Z9CTg1QY/B63B6YO8QorLVMeXnbBDsKiSCVR/+GQ061hYPk8FpTzWmPY8tAv2sT+JEtQ==} + '@redis/bloom@6.0.0': + resolution: {integrity: sha512-P0n5NkV9IIdT6nYXOfMHG83sho8pE7Nay7yw27wOGVLv4DthgvzebpGz6m7VuMTizeJmw3LPw2Xek5wFUhGpVw==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.1.0 + '@redis/client': ^6.0.0 - '@redis/client@6.1.0': - resolution: {integrity: sha512-7u1LefkezJF0HESlhO7ZFLEPfyY+NejP3SGv+Z4pGaT3oM5GVVLa0u3f4rDLUrcw+SRo8IlX9Y8JAONeDdg1Ag==} + '@redis/client@6.0.0': + resolution: {integrity: sha512-NS4iIT25r24sAjNQ2nSRdCW5jPJoV0rxkBee27oTeR+RXaOu89cjIsrww5rPBaYVGVdL1QCx9uz9141gZiSKdQ==} engines: {node: '>= 20.0.0'} peerDependencies: '@node-rs/xxhash': ^1.1.0 @@ -1476,23 +1551,23 @@ packages: '@opentelemetry/api': optional: true - '@redis/json@6.1.0': - resolution: {integrity: sha512-/GFjQA6bu5pG9ClCJAI5Xx4bNXe7UTpxBBlIupBNTrn1+nY860apGnYJuaSCDV2BmEbTidpa7O2qa28oxKx+rg==} + '@redis/json@6.0.0': + resolution: {integrity: sha512-F+eqFfgPcy57Zs1KW7UtLnBtRk6lxAUIoe7dyZerpm6e+ssYXG/dWJrbrHFYs0b7tt6QBtYpVuukBuM9XqhUAg==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.1.0 + '@redis/client': ^6.0.0 - '@redis/search@6.1.0': - resolution: {integrity: sha512-kS5agg+3yZbrdrt8omrew7FLCD8eOm7tarG1CROekPBRe+QGDR9aOpnHIQaYsYi6wPRTH70nQiF06AIjgURefQ==} + '@redis/search@6.0.0': + resolution: {integrity: sha512-VHuCJ2W0YWFixGZh/l//8JiyOsD4gN+NhjdRAGIoUe0UQ4mtq1NyY2ZJ973XT+vYhaU21XdK8r8oNrd5n7wbzQ==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.1.0 + '@redis/client': ^6.0.0 - '@redis/time-series@6.1.0': - resolution: {integrity: sha512-uIDBtV8MmG/xpJsRqbGSO4iX6ryj37MLMP82lRpFvI7ykAVe5GyqgxigEbU+uZNv9kDPNMKw3dvI/S/J1BNBzA==} + '@redis/time-series@6.0.0': + resolution: {integrity: sha512-QWhkYsg+3lhBrBf+cbzybtV8LQcSrk7iXIgTaGU+pHNFTkql7TpVRE24ROS6M2ybVIV6O/zxTqfxgxxYiqyw0Q==} engines: {node: '>= 20.0.0'} peerDependencies: - '@redis/client': ^6.1.0 + '@redis/client': ^6.0.0 '@redocly/ajv@8.11.2': resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} @@ -1500,105 +1575,108 @@ packages: '@redocly/config@0.22.0': resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} - '@redocly/openapi-core@1.34.17': - resolution: {integrity: sha512-wsV2keCt6B806XpSdezbWZ9aFJYf14YVh+XQf0ESt7M90yqVuxH9//PxvtC70sgj9OCkRM3nRaLfu4MsGQZRig==} + '@redocly/openapi-core@1.34.14': + resolution: {integrity: sha512-y+xFx+Zz54Xhr8jUdnLENYnt7Y7GEDL6Q03ga7rTtX8DVwefX9H+hQEPgJp1nda7vdH+wJ9/HBVvyfBuW9x6rA==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@rolldown/binding-android-arm64@1.1.5': - resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.1.5': - resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.1.5': - resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.1.5': - resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': - resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.1.5': - resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.1.5': - resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.1.5': - resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.1.5': - resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.1.5': - resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.1.5': - resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.1.5': - resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.1.5': - resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.1.5': - resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.1.5': - resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} @@ -1608,37 +1686,26 @@ packages: '@rushstack/eslint-patch@1.16.1': resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} - '@shikijs/core@4.3.1': - resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} - engines: {node: '>=20'} + '@shikijs/core@3.23.0': + resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - '@shikijs/engine-javascript@4.3.1': - resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} - engines: {node: '>=20'} + '@shikijs/engine-javascript@3.23.0': + resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} - '@shikijs/engine-oniguruma@4.3.1': - resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} - engines: {node: '>=20'} + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - '@shikijs/langs@4.3.1': - resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} - engines: {node: '>=20'} + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - '@shikijs/primitive@4.3.1': - resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} - engines: {node: '>=20'} + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - '@shikijs/themes@4.3.1': - resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} - engines: {node: '>=20'} + '@shikijs/transformers@3.23.0': + resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==} - '@shikijs/transformers@4.3.1': - resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} - engines: {node: '>=20'} - - '@shikijs/types@4.3.1': - resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} - engines: {node: '>=20'} + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1662,29 +1729,23 @@ packages: resolution: {integrity: sha512-l/hNZ3ZCOJq8rzwx1y5ZV/8b2bYCWdhGqRVY33Pu50NAHyAW5qLsMn3ZBkZow77mAKwNCsbDsRGnyYEuU95mjw==} engines: {node: '>=18.0.0'} - '@surrealdb/sqon@0.1.0': - resolution: {integrity: sha512-pooKLZ0W6mN8XHzJQavGOdfZOZksycmIjhwFwvG0kdCAt4I5U6KKPHcXQwFkTDNKFKFKdufczLRnzHapPIslQw==} - peerDependencies: - tslib: ^2.6.3 - typescript: ^5.0.0 - '@swc/helpers@0.5.23': resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - '@tanstack/query-core@5.101.4': - resolution: {integrity: sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==} + '@tanstack/query-core@5.101.0': + resolution: {integrity: sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow==} - '@tanstack/query-devtools@5.101.4': - resolution: {integrity: sha512-z5IPHnDX3aUWeTWlRKLyooBQekaCAw4xRpZqPQ390RiWTDBcTynjpPT221BArw0u2+pnQMdGvPQI9YNNubBcmA==} + '@tanstack/query-devtools@5.101.0': + resolution: {integrity: sha512-MVqw17k08RQtGGLEL654+dX/btbX9p/8WjkznO//zusLTMaObxi3Q+MoFwGVkC9K3tqjn8qrrNhJevXx4fJTeQ==} - '@tanstack/react-query-devtools@5.101.4': - resolution: {integrity: sha512-VeK2gtmfj7kvRBjtxS7TKxt/6qKhn8VzabY4UiYMr7NV9CddjSRYRgeYyld+NpjAkgMV9dd+2Qdr8ah5I03NeA==} + '@tanstack/react-query-devtools@5.101.0': + resolution: {integrity: sha512-cpZA0+WqKXwrwMfiWZEGGF6QrIWVQFbhBtxqDF5sQsAfrFf47HIE6fiPbQU3wyAUEN2+7UNqLCQe7oG6m3f93w==} peerDependencies: - '@tanstack/react-query': ^5.101.4 + '@tanstack/react-query': ^5.101.0 react: ^18 || ^19 - '@tanstack/react-query@5.101.4': - resolution: {integrity: sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==} + '@tanstack/react-query@5.101.0': + resolution: {integrity: sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==} peerDependencies: react: ^18 || ^19 @@ -1694,8 +1755,8 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} @@ -1723,8 +1784,8 @@ packages: '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cookies@0.9.2': - resolution: {integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==} + '@types/cookies@0.9.1': + resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} @@ -1732,8 +1793,8 @@ packages: '@types/cross-spawn@6.0.6': resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/debug@4.1.13': - resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -1747,8 +1808,8 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} '@types/express-session@1.19.0': resolution: {integrity: sha512-GbypG0bog68UbOq2tSAp7SclvCUm3ha1uDi58OPRGK1NfRvCIu7Gz0M7fTGtpNG1T9a29GpuurQj9zEcT/lMXQ==} @@ -1762,9 +1823,6 @@ packages: '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - '@types/gensync@1.0.5': - resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} - '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1783,26 +1841,26 @@ packages: '@types/jsdom@28.0.3': resolution: {integrity: sha512-/HQ2uFoetFTXuye8vzIcHw2z6Fwi7Hi/qcgC+RoS9NCyewiqxhVGqlG+ViGB6lkax481R6dmhf1I7lIGlzJStQ==} - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonminify@0.4.3': + resolution: {integrity: sha512-+oz7EbPz1Nwmn/sr3UztgXpRhdFpvFrjGi5ictEYxUri5ZvQMTcdTi36MTfD/gCb1A5xhJKdH8Hwz2uz5k6s9A==} + '@types/jsonwebtoken@9.0.10': resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} '@types/keygrip@1.0.6': resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} - '@types/koa-compose@3.2.9': - resolution: {integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==} + '@types/koa-compose@3.2.8': + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} - '@types/koa@3.0.3': - resolution: {integrity: sha512-TdtNEJ7sYSrFQcVuS2ySsVqnq5EyE3oJbnfFJvkC9UtGP4Kpem5KE7r+ivHIbIAQAofSqnlB5D3vkfYO69TQpg==} + '@types/koa@3.0.0': + resolution: {integrity: sha512-MOcVYdVYmkSutVHZZPh8j3+dAjLyR5Tl59CN0eKgpkE1h/LBSmPAsQQuWs+bKu7WtGNn+hKfJH9Gzml+PulmDg==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1831,14 +1889,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node-fetch@2.6.13': - resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node@20.19.43': - resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@26.1.1': - resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} + '@types/node@26.0.0': + resolution: {integrity: sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==} '@types/nodemailer@8.0.1': resolution: {integrity: sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==} @@ -1849,8 +1907,8 @@ packages: '@types/pdfkit@0.17.6': resolution: {integrity: sha512-tIwzxk2uWKp0Cq9JIluQXJid77lYhF52EsIOwhsMF4iWLA6YneoBR1xVKYYdAysHuepUB0OX4tdwMiUDdGKmig==} - '@types/qs@6.15.1': - resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -1863,8 +1921,8 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} - '@types/readable-stream@4.0.24': - resolution: {integrity: sha512-NRvUNC/JFGPJvqdAfEve8oginbM6V08u5NzLWpG8MwA2kTPOLnqk+wpwuPT+mp3aUsxyuT6m2gnrPuHYCruzEg==} + '@types/readable-stream@4.0.23': + resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1875,17 +1933,17 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/sinon@22.0.0': - resolution: {integrity: sha512-TDbVpbccc2HfiqHR09Argj3mHV1KMW7sCCKj52fsl8lbRLkEn7fB1966EWhOKWUBcqfBueZuPoA7/OK1CKiy3g==} + '@types/sinon@21.0.1': + resolution: {integrity: sha512-5yoJSqLbjH8T9V2bksgRayuhpZy+723/z6wBOR+Soe4ZlXC0eW8Na71TeaZPUWDQvM7LYKa9UGFc6LRqxiR5fQ==} '@types/sinonjs__fake-timers@15.0.1': resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} - '@types/superagent@8.1.10': - resolution: {integrity: sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==} + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} - '@types/supertest@7.2.1': - resolution: {integrity: sha512-4CbBvoYVLHL7+yhbYrZET0vsvuyXTC05aRe7dNQkwMzm56auceoy6Yu3K50uZmwfHna1os3CMSgM/3QVkUtPTw==} + '@types/supertest@7.2.0': + resolution: {integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==} '@types/tar@6.1.13': resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} @@ -1914,9 +1972,6 @@ packages: '@types/whatwg-url@13.0.0': resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -1928,11 +1983,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.65.0': - resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + '@typescript-eslint/eslint-plugin@8.61.1': + resolution: {integrity: sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.65.0 + '@typescript-eslint/parser': ^8.61.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' @@ -1946,15 +2001,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.65.0': - resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + '@typescript-eslint/parser@8.61.1': + resolution: {integrity: sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.65.0': - resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + '@typescript-eslint/project-service@8.61.1': + resolution: {integrity: sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -1963,12 +2018,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.65.0': - resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + '@typescript-eslint/scope-manager@8.61.1': + resolution: {integrity: sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.65.0': - resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + '@typescript-eslint/tsconfig-utils@8.61.1': + resolution: {integrity: sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -1983,8 +2038,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.65.0': - resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + '@typescript-eslint/type-utils@8.61.1': + resolution: {integrity: sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1994,8 +2049,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.65.0': - resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + '@typescript-eslint/types@8.61.1': + resolution: {integrity: sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -2007,8 +2062,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.65.0': - resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + '@typescript-eslint/typescript-estree@8.61.1': + resolution: {integrity: sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2019,8 +2074,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.65.0': - resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + '@typescript-eslint/utils@8.61.1': + resolution: {integrity: sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2030,136 +2085,17 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.65.0': - resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + '@typescript-eslint/visitor-keys@8.61.1': + resolution: {integrity: sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/typescript-aix-ppc64@7.0.2': - resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [aix] - - '@typescript/typescript-darwin-arm64@7.0.2': - resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [darwin] - - '@typescript/typescript-darwin-x64@7.0.2': - resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [darwin] - - '@typescript/typescript-freebsd-arm64@7.0.2': - resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [freebsd] - - '@typescript/typescript-freebsd-x64@7.0.2': - resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [freebsd] - - '@typescript/typescript-linux-arm64@7.0.2': - resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [linux] - - '@typescript/typescript-linux-arm@7.0.2': - resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} - engines: {node: '>=16.20.0'} - cpu: [arm] - os: [linux] - - '@typescript/typescript-linux-loong64@7.0.2': - resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} - engines: {node: '>=16.20.0'} - cpu: [loong64] - os: [linux] - - '@typescript/typescript-linux-mips64el@7.0.2': - resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} - engines: {node: '>=16.20.0'} - cpu: [mips64el] - os: [linux] - - '@typescript/typescript-linux-ppc64@7.0.2': - resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [linux] - - '@typescript/typescript-linux-riscv64@7.0.2': - resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} - engines: {node: '>=16.20.0'} - cpu: [riscv64] - os: [linux] - - '@typescript/typescript-linux-s390x@7.0.2': - resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} - engines: {node: '>=16.20.0'} - cpu: [s390x] - os: [linux] - - '@typescript/typescript-linux-x64@7.0.2': - resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [linux] - - '@typescript/typescript-netbsd-arm64@7.0.2': - resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [netbsd] - - '@typescript/typescript-netbsd-x64@7.0.2': - resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [netbsd] - - '@typescript/typescript-openbsd-arm64@7.0.2': - resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [openbsd] - - '@typescript/typescript-openbsd-x64@7.0.2': - resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [openbsd] - - '@typescript/typescript-sunos-x64@7.0.2': - resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [sunos] - - '@typescript/typescript-win32-arm64@7.0.2': - resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [win32] - - '@typescript/typescript-win32-x64@7.0.2': - resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [win32] - - '@typespec/ts-http-runtime@0.3.6': - resolution: {integrity: sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==} + '@typespec/ts-http-runtime@0.3.5': + resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} engines: {node: '>=20.0.0'} - '@ungap/structured-clone@1.3.2': - resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/rspack-resolver-binding-darwin-arm64@1.3.0': resolution: {integrity: sha512-EcjI0Hh2HiNOM0B9UuYH1PfLWgE6/SBQ4dKoHXWNloERfveha/n6aUZSBThtPGnJenmdfaJYXXZtqyNbWtJAFw==} @@ -2242,8 +2178,8 @@ packages: cpu: [x64] os: [win32] - '@vitejs/plugin-react@6.0.4': - resolution: {integrity: sha512-XcCQz0TBpBgljhj0gMuuDj49i6Ytqh5q1osT/Gp5uAVJUCTWxyskk/l1jwYYiu2xcNHHipdMz40EGfM1VdamVg==} + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 @@ -2255,18 +2191,18 @@ packages: babel-plugin-react-compiler: optional: true - '@vitejs/plugin-vue@6.0.7': - resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} + '@vitejs/plugin-vue@6.0.5': + resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: '>=7.3.2' vue: ^3.2.25 - '@vitest/expect@4.1.10': - resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - '@vitest/mocker@4.1.10': - resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} peerDependencies: msw: ^2.4.9 vite: '>=7.3.2' @@ -2276,66 +2212,66 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.10': - resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - '@vitest/runner@4.1.10': - resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - '@vitest/snapshot@4.1.10': - resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - '@vitest/spy@4.1.10': - resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - '@vitest/utils@4.1.10': - resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} - '@vue/compiler-core@3.5.39': - resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==} + '@vue/compiler-core@3.5.30': + resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==} - '@vue/compiler-dom@3.5.39': - resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==} + '@vue/compiler-dom@3.5.30': + resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==} - '@vue/compiler-sfc@3.5.39': - resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==} + '@vue/compiler-sfc@3.5.30': + resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==} - '@vue/compiler-ssr@3.5.39': - resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + '@vue/compiler-ssr@3.5.30': + resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==} - '@vue/devtools-api@8.1.5': - resolution: {integrity: sha512-YJipMVAKe5wT5CWf5kTYCaNV7NMNjFVxJkIkJaJ4W/nCxEBzlZzrOsYKeCymdCrFZmBS/+wTWFoUs3Jf/Q6XSQ==} + '@vue/devtools-api@8.1.0': + resolution: {integrity: sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==} - '@vue/devtools-kit@8.1.5': - resolution: {integrity: sha512-FcSAxsi4eWuXLCB7Rv9lj0aIVHHPNVQ2BazGf4RJTc2JCqb4BQg0hk87ZFhminCfl+mD5OUI0rX2cgyu4kJOGA==} + '@vue/devtools-kit@8.1.0': + resolution: {integrity: sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==} - '@vue/devtools-shared@8.1.5': - resolution: {integrity: sha512-mhT4zcPFhF+Xk1O4BfhhrbXzpmfqY03fS6xGpcllbQG7lDjhQf8pQHcTIhqQIYx1hfwtHmk/6jM96ele0UxPqQ==} + '@vue/devtools-shared@8.1.0': + resolution: {integrity: sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==} - '@vue/reactivity@3.5.39': - resolution: {integrity: sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==} + '@vue/reactivity@3.5.30': + resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==} - '@vue/runtime-core@3.5.39': - resolution: {integrity: sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==} + '@vue/runtime-core@3.5.30': + resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==} - '@vue/runtime-dom@3.5.39': - resolution: {integrity: sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==} + '@vue/runtime-dom@3.5.30': + resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==} - '@vue/server-renderer@3.5.39': - resolution: {integrity: sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==} + '@vue/server-renderer@3.5.30': + resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==} peerDependencies: - vue: 3.5.39 + vue: 3.5.30 - '@vue/shared@3.5.39': - resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==} + '@vue/shared@3.5.30': + resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==} - '@vueuse/core@14.3.0': - resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + '@vueuse/core@14.2.1': + resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} peerDependencies: vue: ^3.5.0 - '@vueuse/integrations@14.3.0': - resolution: {integrity: sha512-76I5FT2ESvCmCaSwapI+a/u/CFtNXmzl9f9lNp1hRtx8vKB8hfiokJr8IvQqcQG5ckGXElyXK516b54ozV3MvA==} + '@vueuse/integrations@14.2.1': + resolution: {integrity: sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==} peerDependencies: async-validator: ^4 axios: ^1 @@ -2376,11 +2312,11 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@14.3.0': - resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + '@vueuse/metadata@14.2.1': + resolution: {integrity: sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==} - '@vueuse/shared@14.3.0': - resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + '@vueuse/shared@14.2.1': + resolution: {integrity: sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==} peerDependencies: vue: ^3.5.0 @@ -2410,10 +2346,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.5.18: - resolution: {integrity: sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==} + adm-zip@0.5.17: + resolution: {integrity: sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==} engines: {node: '>=12.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -2535,8 +2475,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.42: - resolution: {integrity: sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==} + baseline-browser-mapping@2.10.21: + resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==} engines: {node: '>=6.0.0'} hasBin: true @@ -2568,15 +2508,15 @@ packages: bluebird@3.4.7: resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} engines: {node: '>=18'} brace-expansion@1.1.15: resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -2595,13 +2535,13 @@ packages: browserify-zlib@0.2.0: resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - browserslist@4.28.5: - resolution: {integrity: sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bson@7.3.1: - resolution: {integrity: sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==} + bson@7.2.0: + resolution: {integrity: sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==} engines: {node: '>=20.19.0'} buffer-equal-constant-time@1.0.1: @@ -2637,12 +2577,12 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001802: - resolution: {integrity: sha512-vmv8ub2xwTNmljSKf82mtCk5JH7hC+YgzLj3P5zotvA0tPQ9016tdNNOG8WRca1IxOnhSsivB+J0z5FeE5LOUw==} + caniuse-lite@1.0.30001790: + resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} - cassandra-driver@4.9.0: - resolution: {integrity: sha512-svYpdkLIGjD0WmuuwkkeYbfBdPX1zksK2cDyT1mWjX53OVTzuWBOVy54K6PPij8GgYpIG+K82OryrBv/xNeuWg==} - engines: {node: '>=20'} + cassandra-driver@4.8.0: + resolution: {integrity: sha512-HritfMGq9V7SuESeSodHvArs0mLuMk7uh+7hQK2lqdvXrvm50aWxb4RPxkK3mPDdsgHjJ427xNRFITMH2ei+Sw==} + engines: {node: '>=18'} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2722,10 +2662,6 @@ packages: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} - content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} - content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -2769,8 +2705,8 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} cross-env@10.1.0: @@ -2829,6 +2765,24 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -2992,16 +2946,12 @@ packages: engines: {node: '>=0.12.18'} hasBin: true - electron-to-chromium@1.5.387: - resolution: {integrity: sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==} + electron-to-chromium@1.5.343: + resolution: {integrity: sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - empathic@2.0.1: - resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} - engines: {node: '>=14'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3009,19 +2959,19 @@ packages: enforce-range@1.0.0: resolution: {integrity: sha512-iOYthPljA5P/S823In8avtTbeUl8/uTP1+pqy08ryb8jeMO2enuIO/f72QFFqT4GTNiOe0yWPIzXB9nR3u6O5A==} - engine.io-client@6.6.6: - resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.9: - resolution: {integrity: sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==} + engine.io@6.6.5: + resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.24.2: - resolution: {integrity: sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} ent@2.2.2: @@ -3049,10 +2999,6 @@ packages: error@4.4.0: resolution: {integrity: sha512-SNDKualLUtT4StGFP7xNfuFybL2f6iJujFtrWuvJqGbVQGaN+adE23veqzPz1hjUjTunLi2EnJ+0SJxtbJreKw==} - es-abstract-get@1.0.0: - resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} - engines: {node: '>= 0.4'} - es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -3065,11 +3011,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.3.0: - resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: @@ -3080,8 +3026,8 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.4: - resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} esbuild@0.28.1: @@ -3135,8 +3081,8 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.14.0: - resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3243,8 +3189,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.8.0: - resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} + eslint@10.5.0: + resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -3308,12 +3254,12 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - expect-type@1.4.0: - resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - express-rate-limit@8.6.0: - resolution: {integrity: sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==} + express-rate-limit@8.5.1: + resolution: {integrity: sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -3345,8 +3291,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.1.3: - resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -3380,6 +3326,9 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3395,8 +3344,8 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - focus-trap@8.2.2: - resolution: {integrity: sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==} + focus-trap@8.0.0: + resolution: {integrity: sha512-Aa84FOGHs99vVwufDMdq2qgOwXPC2e9U66GcqBhn1/jEHPDhJaP8PYhkIbqG9lhfL5Kddk/567lj46LLHYCRUw==} fontkit@2.0.4: resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} @@ -3450,8 +3399,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.2.0: - resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -3491,8 +3440,8 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} glob-parent@5.1.2: @@ -3562,6 +3511,14 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -3617,8 +3574,8 @@ packages: html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-parse-stringify@4.0.1: - resolution: {integrity: sha512-0zHsZJrK7S3K2aucXWL6ycoYJ/iNtIcFHC/nYQgFklPtrv5LpJctIiSCroWZWeuoXvuyFdzp6KzjJQ+OT5MfFw==} + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} html-to-docx@1.8.0: resolution: {integrity: sha512-IiMBWIqXM4+cEsW//RKoonWV7DlXAJBmmKI73XJSVWTIXjGUaxSr2ck1jqzVRZknpvO8xsFnVicldKVAWrBYBA==} @@ -3659,16 +3616,16 @@ packages: i18next-browser-languagedetector@8.2.1: resolution: {integrity: sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==} - i18next@26.3.6: - resolution: {integrity: sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==} + i18next@26.3.1: + resolution: {integrity: sha512-txQqd5EULsqEh9OJqRH15aCaOuy/nLJyhw5EHCSKLKJE1aBbb3Zve2+uQIxgWhPm1QqUQoWyQBm2kfmmIrzkcQ==} peerDependencies: - typescript: ^5 || ^6 || ^7 + typescript: ^5 || ^6 peerDependenciesMeta: typescript: optional: true - iconv-lite@0.7.3: - resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -3693,9 +3650,6 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -3745,8 +3699,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -3762,10 +3716,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - is-document.all@1.0.0: - resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3887,8 +3837,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jose@6.2.4: - resolution: {integrity: sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} js-cookie@3.0.8: resolution: {integrity: sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==} @@ -3903,9 +3853,6 @@ packages: js-md5@0.8.3: resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==} - js-tokens@10.0.0: - resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3913,10 +3860,6 @@ packages: resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} hasBin: true - js-yaml@5.2.1: - resolution: {integrity: sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==} - hasBin: true - jsdom@29.1.1: resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} @@ -3958,8 +3901,12 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonminify@0.4.2: + resolution: {integrity: sha512-mEtP5ECD0293D+s45JhDutqF5mFCkWY8ClrPFxjSFR2KUoantofky7noSzyKnAnD9Gd8pXHZSUd5bgzLDUBbfA==} + engines: {node: '>=0.8.0', npm: '>=1.1.0'} jsonschema-draft4@1.0.0: resolution: {integrity: sha512-sBV3UnQPRiyCTD6uzY/Oao2Yohv6KKgQq7zjPwjFHeR6scg/QSXnzDxdugsGaLQDmFUrUlTbMYdEE+72PizhGA==} @@ -4145,10 +4092,17 @@ packages: lop@0.4.2: resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} - lru-cache@11.5.2: - resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + lru-cache@11.5.0: + resolution: {integrity: sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==} engines: {node: 20 || >=22} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -4157,8 +4111,8 @@ packages: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} - lucide-react@1.27.0: - resolution: {integrity: sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw==} + lucide-react@1.21.0: + resolution: {integrity: sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4293,8 +4247,8 @@ packages: resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} engines: {node: '>=20.19.0'} - mongodb@7.4.0: - resolution: {integrity: sha512-giySkkdYiwoBFo/oCc8nzov3xOYZ/sB8OpAYk5GINRLEjVw0LDsm8xgQL0XMTyU4extQlDZjhdUr1ZEwKFaazw==} + mongodb@7.3.0: + resolution: {integrity: sha512-WpCqSx7JAU9vcyjm/SU7ydnHls2YrfU3Y3sx4Ml9D7sPe4mXPlaapndiurDXrQ7/VvJkB4/i7b7WovHb8bd8sg==} engines: {node: '>=20.19.0'} peerDependencies: '@aws-sdk/credential-providers': ^3.806.0 @@ -4326,13 +4280,13 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mssql@12.7.0: - resolution: {integrity: sha512-J6SJKXi1jYbhHjjooLNtPnX7+s3cq5IJ701Wgy/UW1SXRpgFlJJsYi3IPve9RVgCUkq0Cqv2aaaSJ4IXtIF3mg==} + mssql@12.5.5: + resolution: {integrity: sha512-kQYghNfnnx+jX0Wyl8g+MtP6Z3DtOajINNx6pEgaG8K/MGlB3LCtU8Bmoje4zeEwukI35yCfpJQa+5AEUcNf1g==} engines: {node: '>=18.19.0'} hasBin: true - mysql2@3.23.1: - resolution: {integrity: sha512-tTuRnC7qCet2IOfSNMYZ5SwXuBnfvBPAcIA28P0gtruXyZlU1LMxA6uha32kYypoFgyYklMqhLWwt4laYwXR/Q==} + mysql2@3.22.5: + resolution: {integrity: sha512-95uZ2TrPWAZdwpB3vvvDbmEMcNG8yIeNCyu6GUcr/QnWEE/wXm7+mhOCsdQfWQDTV7qYT/PDUZ4U4UPP4AsXqQ==} engines: {node: '>= 8.0'} peerDependencies: '@types/node': '>= 8' @@ -4341,23 +4295,23 @@ packages: resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} engines: {node: '>=8.0.0'} - nano@11.0.6: - resolution: {integrity: sha512-3yEfcEaBBhdmYXQRP6nztbuRQAcArdjrb2Vkrvx61+b5bzML34ztUy/b9zDXyhW4h4EESpZzf01A8JNRGo+Jlw==} + nano@11.0.5: + resolution: {integrity: sha512-yLYmFH7S33OWYPAG12wNqMR6l9hC3qOWLbr7hZPqKBVKO8BYhAaLlWENeJEpPY8Rm12lGvzKWBp8LGEgWhEqmw==} engines: {node: '>=20.0'} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@6.0.0: - resolution: {integrity: sha512-mkUH+rPkwU2qPadJ0oJZOjeZ5Mxn8Q1UhevwkTRWNuUZzyia3h4rhzK39hxaHTk0o2OxB8W2SQ6A8k23ZDi1pQ==} - engines: {node: ^22 || ^24 || >=26} + nanoid@5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} hasBin: true native-duplexpair@1.0.0: @@ -4374,8 +4328,8 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - netmask@2.1.1: - resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} next-tick@0.2.2: @@ -4386,8 +4340,8 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead - node-exports-info@1.6.2: - resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} node-fetch-commonjs@3.3.2: @@ -4403,15 +4357,14 @@ packages: encoding: optional: true - node-releases@2.0.50: - resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} - engines: {node: '>=18'} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} nodeify@1.0.1: resolution: {integrity: sha512-n7C2NyEze8GCo/z73KdbjRsBiLbv6eBn1FxwYKQ23IqGo7pQY3mhQan61Sv7eEDJCiyUjTVrVkXTzJCo1dW7Aw==} - nodemailer@9.0.3: - resolution: {integrity: sha512-n+YP+NKwR5zRWa60k3GiQ6Q3B4KXCoAw40dAKeCtYn020iNN74aWK2liXIC3ZEATeGql7we3tE3t8QwhY0eskw==} + nodemailer@9.0.1: + resolution: {integrity: sha512-Gwv8SQewT616ZM/URn0H54b8PWo/Wum7md3EW2aWy1lO27+WZCX+Xyak3J+NlmHUjDh5ME+uesJUDRbR3Ye8Bw==} engines: {node: '>=6.0.0'} object-assign@4.1.1: @@ -4450,8 +4403,8 @@ packages: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} - oidc-provider@9.10.0: - resolution: {integrity: sha512-Olmg6oxgHIviZnrf9yaey6vdaWG1f19UiyvpSj0gCgj6wl9YMcOw3uDv3FHj+x62EXeFj7GfZeTL09MCgIEKnw==} + oidc-provider@9.8.5: + resolution: {integrity: sha512-07Wqkea8jdfPI8GvbVwf9rMNNitLUzzDqPua7hWbqZreFNpfnlNVdqmllaripVmgDZS2tHHLYQYLW0Ay7yux9w==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -4464,18 +4417,18 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oniguruma-parser@0.12.2: - resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@4.3.6: - resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + oniguruma-to-es@4.3.5: + resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} open@10.2.0: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - openapi-backend@5.18.0: - resolution: {integrity: sha512-I3ipDN/JJxLch4ZyPv+Y7xskFcWiT5l0FnUvzNr/YWF4wh6BbcYjM5CGrll80w4ATeVX5/4SfrGmxF+NNUbiPQ==} + openapi-backend@5.17.0: + resolution: {integrity: sha512-wyimPBoz/Gx+pqh4QwvMQRIJiZQHZkLdiyFXwfjiLwS5Jhbm7gCI+T0WTXmx7HXAYXL5Cr+016dR3CV3T/dPmQ==} engines: {node: '>=20.0.0'} openapi-fetch@0.17.0: @@ -4519,8 +4472,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-minify@0.141.0: - resolution: {integrity: sha512-+T/r+nBaKTT7UL5WDZHH8+l0bz+IZ495jHXiY2J6DWYkJXKrBCQRBS+u+hmlnhRfC5b0Uq1poZs0FLVMiDAmbw==} + oxc-minify@0.137.0: + resolution: {integrity: sha512-uu8j2YjPoRUqk4CMkb1+BszzeAZTiVWyPBZczSxL9POc+q6OECDa6eRscKXoNOqOxceTFoIJHnDlBsgxK3fYng==} engines: {node: ^20.19.0 || >=22.12.0} p-limit@3.1.0: @@ -4635,17 +4588,17 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - playwright-core@1.61.1: - resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + playwright-core@1.61.0: + resolution: {integrity: sha512-caX7TrY3Ml6egyDX0WUcTHDxodl/b51y5wJOdCEA36QviK/s2g081hvmGs8eaE3DWb6NYZQ6BjO/QkNRPenoPA==} engines: {node: '>=18'} hasBin: true - playwright@1.61.1: - resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + playwright@1.61.0: + resolution: {integrity: sha512-Z+7BeeqQPRRzklHsVFP4KTGIyMxKUmfeRA4WisM6G3/XW6nwGeX6fX9qYaDa+CiUqpOkb2f6X3nar05R3kSuJQ==} engines: {node: '>=18'} hasBin: true @@ -4660,12 +4613,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.23: - resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -4702,8 +4651,8 @@ packages: promise@1.3.0: resolution: {integrity: sha512-R9WrbTF3EPkVtWjp7B7umQGVndpsi+rsDAfrR4xAALQpFLa/+2OriecLhawxzvii2gd9+DZFwROWDuUUaqS5yA==} - property-information@7.2.0: - resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -4723,8 +4672,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -4744,8 +4693,8 @@ packages: resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} engines: {node: '>= 0.8'} - range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} rate-limiter-flexible@11.2.0: @@ -4755,29 +4704,25 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - raw-body@4.0.0: - resolution: {integrity: sha512-TMHtwexrgOt9VJ2E5JF9RO8mRXGNgC5wXvKkc5AVSJUt1L5gxvjg7eiCQl96EqUEpCWrnNEkCnbAplYtyuq1IA==} - engines: {node: '>=22'} - - react-dom@19.2.8: - resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: ^19.2.8 + react: ^19.2.7 - react-hook-form@7.83.0: - resolution: {integrity: sha512-AXt8cMCmx5a7u4uvpb2uRFVrWQhllI4pV+LSykxIac/hjt44TnQkmX9BKuQi2i+LDC62esmiLpilkav+kjVf/A==} + react-hook-form@7.80.0: + resolution: {integrity: sha512-4P+fk6oXsxY+6xSj7Euhc2sumQD8zQqCuVHoJwoyp9EchP+IUW9OESB7uHFJOKsIBQ4MQqYE84INJFqUCYNoOg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@17.0.11: - resolution: {integrity: sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==} + react-i18next@17.0.8: + resolution: {integrity: sha512-0ooKbGLU8JXhe1zwpQUWIeXSgLPOfwJmgheWRIUpcoA0CpyabpGhayjdG+/eA5esC1AQ8h2jWpXjJfzQzeDOCw==} peerDependencies: i18next: '>= 26.2.0' react: '>= 16.8.0' react-dom: '*' react-native: '*' - typescript: ^5 || ^6 || ^7 + typescript: ^5 || ^6 peerDependenciesMeta: react-dom: optional: true @@ -4806,15 +4751,15 @@ packages: '@types/react': optional: true - react-router-dom@7.18.1: - resolution: {integrity: sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==} + react-router-dom@7.18.0: + resolution: {integrity: sha512-Fi0yY6kgtKae/Th2xibdWK0KSdYZ4B53Gyf6wRtomOKWgpNm7H7+DyfDhncdz9FKbpS+1jmDhg3F4WoGJ+yFOA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.18.1: - resolution: {integrity: sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==} + react-router@7.18.0: + resolution: {integrity: sha512-pTTGt8J+ji1NOmYnjzT+bAJy/1zD+Jp4ziO6cL7T3ZLvXKtusO7BpFqlRXitqpcPVqllsIXFHRMt+2/k3Xn6HQ==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -4833,8 +4778,8 @@ packages: '@types/react': optional: true - react@19.2.8: - resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} readable-stream@2.3.8: @@ -4856,8 +4801,8 @@ packages: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} - redis@6.1.0: - resolution: {integrity: sha512-0kvUPM8RHP/ZMa0xYaDTcG5e8tIGW6kz6MToVT0V8iOnk6bkXp2jncGRGe2bZEk41lZwiDspUqjZCSk5ohjcKw==} + redis@6.0.0: + resolution: {integrity: sha512-n9Thfc39OXleEoPT2k5gwKsqY+HfCww3YS71ofcr9KKbkn89bpjU9dToIlD+JRdM3/GYQkwMtVgTxLyed+LptQ==} engines: {node: '>= 20.0.0'} reflect.getprototypeof@1.0.10: @@ -4905,8 +4850,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.7: - resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + resolve@2.0.0-next.6: + resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} engines: {node: '>= 0.4'} hasBin: true @@ -4924,8 +4869,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.1.5: - resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -5012,8 +4957,8 @@ packages: resolution: {integrity: sha512-Kk+55VwQ5qLWcSD6R0RrxFOEF70SH7BjYj60MCskJvRkuY7MFlAPEn3hY4WzRodWXj5cCOJ4AsDr+4OvtaW/SQ==} engines: {node: '>= 10'} - safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -5046,32 +4991,35 @@ packages: secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + security@1.0.0: + resolution: {integrity: sha512-5qfoAgfRWS1sUn+fUJtdbbqM1BD/LoQGa+smPTDjf9OqHyuJqi6ewtbYL0+V1S1RaU6OCOCMWGZocIfz2YK4uw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.8.5: - resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} - serialize-javascript@7.0.7: - resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} + serialize-javascript@7.0.5: + resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} engines: {node: '>=20.0.0'} - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - set-cookie-parser@3.1.2: - resolution: {integrity: sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==} + set-cookie-parser@3.1.0: + resolution: {integrity: sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -5099,9 +5047,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@4.3.1: - resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} - engines: {node: '>=20'} + shiki@3.23.0: + resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} @@ -5115,8 +5062,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -5125,8 +5072,8 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - sinon@22.1.0: - resolution: {integrity: sha512-n1ajF2rBWMTtEwbKcw4UdFg4nCnDdq/U6RDoxtOd7oapOlRoJ5ynwFx60owROyhDpA9QhMZi0pCO/xtmwFjG7w==} + sinon@22.0.0: + resolution: {integrity: sha512-sq/6DpdXOrLyfbKlXLg/Usc7xu8YXPeLkOFZRvA3bNUSA2lhbrZ06yuXbH1fkzBPCbz9O10+7hznzUsjaYNm0Q==} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -5136,8 +5083,8 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.8: - resolution: {integrity: sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==} + socket.io-adapter@2.5.6: + resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} socket.io-client@4.8.3: resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} @@ -5155,8 +5102,8 @@ packages: resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.9: - resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + socks@2.8.5: + resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} source-map-js@1.2.1: @@ -5186,8 +5133,8 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sql-escaper@1.5.1: - resolution: {integrity: sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==} + sql-escaper@1.3.3: + resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==} engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} stable-hash@0.0.5: @@ -5222,12 +5169,12 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.trim@1.2.11: - resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.10: - resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -5279,11 +5226,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - surrealdb@2.0.8: - resolution: {integrity: sha512-nkoTAdnfJYc0EvB2Hut0MET/UiWTOT6+TJODoubHzoC952gJvjEbHMx5TLrecUYo1vIN3/qBgwMIcLKK0WC7zQ==} + surrealdb@2.0.3: + resolution: {integrity: sha512-60dXe7K+7M5EUr6VyIgd/SEUCKFXqc54JHUhCTG8IDlqp7pmuuQQWs2wpgulp2oSXpy+9jwKhgNR/mP3wrEgfw==} peerDependencies: tslib: ^2.6.3 - typescript: ^5.0.0 || ^6.0.0 + typescript: ^5.0.0 swagger-schema-official@2.0.0-bab6bed: resolution: {integrity: sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==} @@ -5291,27 +5238,27 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.5.0: - resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} - tar@7.5.19: - resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} + tar@7.5.16: + resolution: {integrity: sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==} engines: {node: '>=18'} - tarn@3.1.0: - resolution: {integrity: sha512-QDihlHbXxQ4SnuQcRd1TPNBHUYo/hafDRDP82COYSVfRcx/3qnfGDkn1WFjozVl+AYr8ZyDKSQ/kIgHH1ri1yg==} + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - tedious@20.0.0: - resolution: {integrity: sha512-bTR0aou0Ghucf0ytvZUJjnKHGKDV8tT57jPYtEkSpfTWFe++4uR1wxJLQ4mh5wlSvAYXzmgBxbI0vaE56qigXw==} - engines: {node: '>=22'} + tedious@19.2.1: + resolution: {integrity: sha512-pk1Q16Yl62iocuQB+RWbg6rFUFkIyzqOFQ6NfysCltRvQqKwfurgj8v/f2X+CKvDhSL4IJ0cCOfCHDg9PWEEYA==} + engines: {node: '>=18.17'} tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -5334,11 +5281,11 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tldts-core@7.4.6: - resolution: {integrity: sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==} + tldts-core@7.0.29: + resolution: {integrity: sha512-W99NuU7b1DcG3uJ3v9k9VztCH3WialNbBkBft5wCs8V8mexu0XQqaZEYb9l9RNNzK8+3EJ9PKWB0/RUtTQ/o+Q==} - tldts@7.4.6: - resolution: {integrity: sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==} + tldts@7.0.29: + resolution: {integrity: sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==} hasBin: true to-regex-range@5.0.1: @@ -5397,8 +5344,8 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - tsx@4.23.1: - resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5422,6 +5369,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + type-is@2.1.0: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} @@ -5438,8 +5389,8 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.8: - resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typescript@6.0.3: @@ -5447,13 +5398,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@7.0.2: - resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} - engines: {node: '>=16.20.0'} - hasBin: true - - ueberdb2@6.1.16: - resolution: {integrity: sha512-2VlpUIjperGGzZzH2AqrhZfviA3BmA3qgw+LHbDxXgOoiBRMV1P9IFkFK4wBDf3gMyj9/jBNoil5QOwkvXLj4A==} + ueberdb2@6.1.13: + resolution: {integrity: sha512-Pf49qzENW/PttW05NJTWshsjsVk1BLnYnr5oMw/BECCTMwLfXYdfPCkSM1k4zZIyxKbzZZ0+FsVTHDnKYE8VxA==} engines: {node: '>=24.0.0'} peerDependencies: '@elastic/elasticsearch': ^9.0.0 @@ -5511,21 +5457,21 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@7.28.0: - resolution: {integrity: sha512-LJAfY+2w6HGeT8d8J1wNQsUGUEGio6NWWpwdwurQe4f6oojzCFuGLizl1KSve4irsTxyLly1QhEeE6iapdaIvQ==} + undici-types@7.24.5: + resolution: {integrity: sha512-kNh333UBSbgK35OIW7FwJTr9tTfVIG51Fm1tSVT7m8foPHfDVjsb7OIee/q/rs3bB2aV/3qOPgG5mHNWl1odiA==} undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + undici@7.27.2: + resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} engines: {node: '>=20.18.1'} - undici@8.9.0: - resolution: {integrity: sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==} + undici@8.5.0: + resolution: {integrity: sha512-xamtWoB1EshgjpmlXd7GGm2VfdDtw1+rD8uhry8pSNW3If6S8E0m2T2+orSKeZXEn/aPJMviCpDBA65WJt8zhg==} engines: {node: '>=22.19.0'} unicode-properties@1.4.1: @@ -5537,6 +5483,9 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -5560,6 +5509,10 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unorm@1.6.0: + resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: '>= 0.4.0'} + unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -5618,8 +5571,8 @@ packages: vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} @@ -5633,13 +5586,13 @@ packages: '@babel/core': '>=7.29.6' vite: '>=7.3.2' - vite@8.1.4: - resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==} + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 + '@vitejs/devtools': ^0.1.18 esbuild: '>=0.28.1' jiti: '>=1.21.0' less: ^4.0.0 @@ -5676,75 +5629,35 @@ packages: yaml: optional: true - vite@8.1.5: - resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.3.0 - esbuild: '>=0.28.1' - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitepress@2.0.0-alpha.18: - resolution: {integrity: sha512-Lk1G2/QqSf+MwNLICl9fmzWOtoCEwjZoWgaQy41QvWTfcGpLE9XwJDbcCyES/9rj6R2g1zFqFvLVkYKLLDALFw==} + vitepress@2.0.0-alpha.17: + resolution: {integrity: sha512-Z3VPUpwk/bHYqt1uMVOOK1/4xFiWQov1GNc2FvMdz6kvje4JRXEOngVI9C+bi5jeedMSHiA4dwKkff1NCvbZ9Q==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 + oxc-minify: '*' postcss: ^8 peerDependenciesMeta: markdown-it-mathjax3: optional: true + oxc-minify: + optional: true postcss: optional: true - vitest@4.1.10: - resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.10 - '@vitest/browser-preview': 4.1.10 - '@vitest/browser-webdriverio': 4.1.10 - '@vitest/coverage-istanbul': 4.1.10 - '@vitest/coverage-v8': 4.1.10 - '@vitest/ui': 4.1.10 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 happy-dom: '*' jsdom: '*' vite: '>=7.3.2' @@ -5772,8 +5685,12 @@ packages: jsdom: optional: true - vue@3.5.39: - resolution: {integrity: sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==} + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vue@3.5.30: + resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -5829,8 +5746,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.22: - resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} which@2.0.2: @@ -5911,6 +5828,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -5926,8 +5846,8 @@ packages: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} - yargs@17.7.3: - resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} yocto-queue@0.1.0: @@ -5940,8 +5860,8 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} zustand@5.0.14: resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} @@ -5978,13 +5898,13 @@ snapshots: dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 - js-yaml: 5.2.1 + js-yaml: 4.2.0 '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -6000,13 +5920,13 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@azure-rest/core-client@2.7.0': + '@azure-rest/core-client@2.6.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 - '@typespec/ts-http-runtime': 0.3.6 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -6023,11 +5943,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/core-client@1.10.2': + '@azure/core-client@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -6035,6 +5955,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@azure/core-http-compat@2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0)': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-lro@2.7.2': dependencies: '@azure/abort-controller': 2.1.2 @@ -6048,14 +5974,14 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-rest-pipeline@1.24.0': + '@azure/core-rest-pipeline@1.23.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.6 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -6067,7 +5993,7 @@ snapshots: '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.6 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -6076,13 +6002,13 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.2 - '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.16.0 - '@azure/msal-node': 5.3.1 + '@azure/msal-browser': 5.11.0 + '@azure/msal-node': 5.2.2 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -6090,10 +6016,10 @@ snapshots: '@azure/keyvault-common@2.1.0': dependencies: - '@azure-rest/core-client': 2.7.0 + '@azure-rest/core-client': 2.6.0 '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -6101,157 +6027,187 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/keyvault-keys@4.10.2': + '@azure/keyvault-keys@4.10.0(@azure/core-client@1.10.1)': dependencies: - '@azure-rest/core-client': 2.7.0 + '@azure-rest/core-client': 2.6.0 '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 + '@azure/core-http-compat': 2.4.0(@azure/core-client@1.10.1)(@azure/core-rest-pipeline@1.23.0) '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/keyvault-common': 2.1.0 '@azure/logger': 1.3.0 tslib: 2.8.1 transitivePeerDependencies: + - '@azure/core-client' - supports-color '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.6 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.16.0': + '@azure/msal-browser@5.11.0': dependencies: - '@azure/msal-common': 16.11.0 + '@azure/msal-common': 16.6.2 - '@azure/msal-common@16.11.0': {} + '@azure/msal-common@16.6.2': {} - '@azure/msal-node@5.3.1': + '@azure/msal-node@5.2.2': dependencies: - '@azure/msal-common': 16.11.0 + '@azure/msal-common': 16.6.2 jsonwebtoken: 9.0.3 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@8.0.0': - dependencies: - '@babel/helper-validator-identifier': 8.0.2 - js-tokens: 10.0.0 + '@babel/compat-data@7.29.7': {} - '@babel/compat-data@8.0.0': {} - - '@babel/core@8.0.1': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/generator': 8.0.0 - '@babel/helper-compilation-targets': 8.0.0 - '@babel/helpers': 8.0.0 - '@babel/parser': 8.0.0 - '@babel/template': 8.0.0 - '@babel/traverse': 8.0.0 - '@babel/types': 8.0.0 - '@types/gensync': 1.0.5 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - empathic: 2.0.1 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 - import-meta-resolve: 4.2.0 json5: 2.2.3 - obug: 2.1.3 - semver: 7.8.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/generator@8.0.0': + '@babel/generator@7.29.7': dependencies: - '@babel/parser': 8.0.0 - '@babel/types': 8.0.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@types/jsesc': 2.5.1 jsesc: 3.1.0 - '@babel/helper-compilation-targets@8.0.0': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 8.0.0 - '@babel/helper-validator-option': 8.0.0 - browserslist: 4.28.5 - lru-cache: 11.5.2 - semver: 7.8.5 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 - '@babel/helper-globals@8.0.0': {} + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-identifier@8.0.2': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-validator-option@8.0.0': {} - - '@babel/helpers@8.0.0': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 8.0.0 - '@babel/types': 8.0.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.2': + dependencies: + '@babel/types': 7.29.0 '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 - '@babel/parser@8.0.0': - dependencies: - '@babel/types': 8.0.0 + '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.7': {} + '@babel/runtime@7.29.2': {} - '@babel/template@8.0.0': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/parser': 8.0.0 - '@babel/types': 8.0.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@8.0.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 8.0.0 - '@babel/generator': 8.0.0 - '@babel/helper-globals': 8.0.0 - '@babel/parser': 8.0.0 - '@babel/template': 8.0.0 - '@babel/types': 8.0.0 - obug: 2.1.3 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/types@8.0.0': - dependencies: - '@babel/helper-string-parser': 8.0.0 - '@babel/helper-validator-identifier': 8.0.2 - '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 - '@csstools/color-helpers@6.1.0': {} + '@csstools/color-helpers@6.0.2': {} - '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.1.0 - '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -6259,47 +6215,52 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 '@csstools/css-tokenizer@4.0.0': {} - '@docsearch/css@4.6.3': {} + '@docsearch/css@4.6.0': {} - '@docsearch/js@4.6.3': {} + '@docsearch/js@4.6.0': {} - '@docsearch/sidepanel-js@4.6.3': {} + '@docsearch/sidepanel-js@4.6.0': {} '@elastic/elasticsearch@9.4.2': dependencies: - '@elastic/transport': 9.3.7 + '@elastic/transport': 9.3.6 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@elastic/transport@9.3.7': + '@elastic/transport@9.3.6': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) debug: 4.4.3(supports-color@8.1.1) hpagent: 1.2.0 ms: 2.1.3 secure-json-parse: 4.1.0 tslib: 2.8.1 - undici: 7.28.0 + undici: 7.27.2 transitivePeerDependencies: - supports-color + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/core@1.11.2': + '@emnapi/runtime@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true @@ -6308,7 +6269,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.11.2': + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true @@ -6398,9 +6359,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.8.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0)': dependencies: - eslint: 10.8.0 + eslint: 10.5.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -6413,7 +6374,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.7.0': + '@eslint/config-helpers@0.6.0': dependencies: '@eslint/core': 1.2.1 @@ -6428,7 +6389,7 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.1(@noble/hashes@1.8.0)': + '@exodus/bytes@1.15.0(@noble/hashes@1.8.0)': optionalDependencies: '@noble/hashes': 1.8.0 @@ -6448,7 +6409,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/simple-icons@1.2.89': + '@iconify-json/simple-icons@1.2.74': dependencies: '@iconify/types': 2.0.0 @@ -6463,6 +6424,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -6472,7 +6438,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@js-joda/core@6.0.1': {} + '@js-joda/core@5.7.0': {} '@jsdevtools/ono@7.1.3': {} @@ -6480,7 +6446,7 @@ snapshots: dependencies: vary: 1.1.2 - '@koa/router@15.7.0(koa@3.2.1)(supports-color@8.1.1)': + '@koa/router@15.6.0(koa@3.2.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 @@ -6490,29 +6456,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@mongodb-js/saslprep@1.4.12': + '@mongodb-js/saslprep@1.4.11': dependencies: sparse-bitfield: 3.0.3 '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@tybys/wasm-util': 0.10.3 + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': - dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@tybys/wasm-util': 0.10.3 + '@tybys/wasm-util': 0.10.2 optional: true '@noble/ciphers@1.3.0': {} @@ -6568,309 +6534,323 @@ snapshots: '@oozcitak/util@8.3.4': {} + '@opentelemetry/api@1.9.0': {} + '@opentelemetry/api@1.9.1': {} - '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.42.0 + '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/semantic-conventions@1.42.0': {} + '@opentelemetry/semantic-conventions@1.41.1': {} - '@oxc-minify/binding-android-arm-eabi@0.141.0': + '@oxc-minify/binding-android-arm-eabi@0.137.0': optional: true - '@oxc-minify/binding-android-arm64@0.141.0': + '@oxc-minify/binding-android-arm64@0.137.0': optional: true - '@oxc-minify/binding-darwin-arm64@0.141.0': + '@oxc-minify/binding-darwin-arm64@0.137.0': optional: true - '@oxc-minify/binding-darwin-x64@0.141.0': + '@oxc-minify/binding-darwin-x64@0.137.0': optional: true - '@oxc-minify/binding-freebsd-x64@0.141.0': + '@oxc-minify/binding-freebsd-x64@0.137.0': optional: true - '@oxc-minify/binding-linux-arm-gnueabihf@0.141.0': + '@oxc-minify/binding-linux-arm-gnueabihf@0.137.0': optional: true - '@oxc-minify/binding-linux-arm-musleabihf@0.141.0': + '@oxc-minify/binding-linux-arm-musleabihf@0.137.0': optional: true - '@oxc-minify/binding-linux-arm64-gnu@0.141.0': + '@oxc-minify/binding-linux-arm64-gnu@0.137.0': optional: true - '@oxc-minify/binding-linux-arm64-musl@0.141.0': + '@oxc-minify/binding-linux-arm64-musl@0.137.0': optional: true - '@oxc-minify/binding-linux-ppc64-gnu@0.141.0': + '@oxc-minify/binding-linux-ppc64-gnu@0.137.0': optional: true - '@oxc-minify/binding-linux-riscv64-gnu@0.141.0': + '@oxc-minify/binding-linux-riscv64-gnu@0.137.0': optional: true - '@oxc-minify/binding-linux-riscv64-musl@0.141.0': + '@oxc-minify/binding-linux-riscv64-musl@0.137.0': optional: true - '@oxc-minify/binding-linux-s390x-gnu@0.141.0': + '@oxc-minify/binding-linux-s390x-gnu@0.137.0': optional: true - '@oxc-minify/binding-linux-x64-gnu@0.141.0': + '@oxc-minify/binding-linux-x64-gnu@0.137.0': optional: true - '@oxc-minify/binding-linux-x64-musl@0.141.0': + '@oxc-minify/binding-linux-x64-musl@0.137.0': optional: true - '@oxc-minify/binding-openharmony-arm64@0.141.0': + '@oxc-minify/binding-openharmony-arm64@0.137.0': optional: true - '@oxc-minify/binding-wasm32-wasi@0.141.0': + '@oxc-minify/binding-wasm32-wasi@0.137.0': dependencies: - '@emnapi/core': 1.11.2 - '@emnapi/runtime': 1.11.2 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@oxc-minify/binding-win32-arm64-msvc@0.141.0': + '@oxc-minify/binding-win32-arm64-msvc@0.137.0': optional: true - '@oxc-minify/binding-win32-ia32-msvc@0.141.0': + '@oxc-minify/binding-win32-ia32-msvc@0.137.0': optional: true - '@oxc-minify/binding-win32-x64-msvc@0.141.0': + '@oxc-minify/binding-win32-x64-msvc@0.137.0': optional: true - '@oxc-project/types@0.139.0': {} + '@oxc-project/types@0.133.0': {} - '@paralleldrive/cuid2@2.3.1': + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.8.0 - '@playwright/test@1.61.1': + '@playwright/test@1.61.0': dependencies: - playwright: 1.61.1 + playwright: 1.61.0 - '@radix-ui/primitive@1.1.7': {} + '@radix-ui/primitive@1.1.4': {} - '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-collection@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.8 + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-context@1.2.2(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-context@1.1.4(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.8 + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dialog@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) aria-hidden: 1.2.6 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.8) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dismissable-layer@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.8 + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-focus-scope@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-id@1.1.4(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-portal@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-presence@1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-primitive@2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-slot@1.3.3(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-switch@1.3.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-switch@1.3.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-size': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-toast@1.2.23(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-toast@1.2.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.8 + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.17)(react@19.2.8) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.8 + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-use-size@1.1.4(@types/react@19.2.17)(react@19.2.8)': + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.17)(react@19.2.8) - react: 19.2.8 + react: 19.2.7 optionalDependencies: '@types/react': 19.2.17 - '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-use-previous@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-size@1.1.2(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-visually-hidden@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@redis/bloom@6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1))': + '@redis/bloom@6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.1.0(@opentelemetry/api@1.9.1) + '@redis/client': 6.0.0(@opentelemetry/api@1.9.1) - '@redis/client@6.1.0(@opentelemetry/api@1.9.1)': + '@redis/client@6.0.0(@opentelemetry/api@1.9.1)': dependencies: cluster-key-slot: 1.1.2 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@redis/json@6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1))': + '@redis/json@6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.1.0(@opentelemetry/api@1.9.1) + '@redis/client': 6.0.0(@opentelemetry/api@1.9.1) - '@redis/search@6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1))': + '@redis/search@6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.1.0(@opentelemetry/api@1.9.1) + '@redis/client': 6.0.0(@opentelemetry/api@1.9.1) - '@redis/time-series@6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1))': + '@redis/time-series@6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 6.1.0(@opentelemetry/api@1.9.1) + '@redis/client': 6.0.0(@opentelemetry/api@1.9.1) '@redocly/ajv@8.11.2': dependencies: @@ -6881,7 +6861,7 @@ snapshots: '@redocly/config@0.22.0': {} - '@redocly/openapi-core@1.34.17(supports-color@10.2.2)': + '@redocly/openapi-core@1.34.14(supports-color@10.2.2)': dependencies: '@redocly/ajv': 8.11.2 '@redocly/config': 0.22.0 @@ -6895,100 +6875,95 @@ snapshots: transitivePeerDependencies: - supports-color - '@rolldown/binding-android-arm64@1.1.5': + '@rolldown/binding-android-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-arm64@1.1.5': + '@rolldown/binding-darwin-arm64@1.0.3': optional: true - '@rolldown/binding-darwin-x64@1.1.5': + '@rolldown/binding-darwin-x64@1.0.3': optional: true - '@rolldown/binding-freebsd-x64@1.1.5': + '@rolldown/binding-freebsd-x64@1.0.3': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.5': + '@rolldown/binding-linux-arm64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.5': + '@rolldown/binding-linux-arm64-musl@1.0.3': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.5': + '@rolldown/binding-linux-ppc64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-s390x-gnu@1.1.5': + '@rolldown/binding-linux-s390x-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-gnu@1.1.5': + '@rolldown/binding-linux-x64-gnu@1.0.3': optional: true - '@rolldown/binding-linux-x64-musl@1.1.5': + '@rolldown/binding-linux-x64-musl@1.0.3': optional: true - '@rolldown/binding-openharmony-arm64@1.1.5': + '@rolldown/binding-openharmony-arm64@1.0.3': optional: true - '@rolldown/binding-wasm32-wasi@1.1.5': + '@rolldown/binding-wasm32-wasi@1.0.3': dependencies: - '@emnapi/core': 1.11.1 - '@emnapi/runtime': 1.11.1 - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-win32-arm64-msvc@1.1.5': + '@rolldown/binding-win32-arm64-msvc@1.0.3': optional: true - '@rolldown/binding-win32-x64-msvc@1.1.5': + '@rolldown/binding-win32-x64-msvc@1.0.3': optional: true + '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rolldown/pluginutils@1.0.1': {} '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.16.1': {} - '@shikijs/core@4.3.1': + '@shikijs/core@3.23.0': dependencies: - '@shikijs/primitive': 4.3.1 - '@shikijs/types': 4.3.1 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@4.3.1': + '@shikijs/engine-javascript@3.23.0': dependencies: - '@shikijs/types': 4.3.1 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.6 + oniguruma-to-es: 4.3.5 - '@shikijs/engine-oniguruma@4.3.1': + '@shikijs/engine-oniguruma@3.23.0': dependencies: - '@shikijs/types': 4.3.1 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@4.3.1': + '@shikijs/langs@3.23.0': dependencies: - '@shikijs/types': 4.3.1 + '@shikijs/types': 3.23.0 - '@shikijs/primitive@4.3.1': + '@shikijs/themes@3.23.0': dependencies: - '@shikijs/types': 4.3.1 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + '@shikijs/types': 3.23.0 - '@shikijs/themes@4.3.1': + '@shikijs/transformers@3.23.0': dependencies: - '@shikijs/types': 4.3.1 + '@shikijs/core': 3.23.0 + '@shikijs/types': 3.23.0 - '@shikijs/transformers@4.3.1': - dependencies: - '@shikijs/core': 4.3.1 - '@shikijs/types': 4.3.1 - - '@shikijs/types@4.3.1': + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -7014,51 +6989,44 @@ snapshots: '@surrealdb/cbor@2.0.0-alpha.4': {} - '@surrealdb/sqon@0.1.0(tslib@2.8.1)(typescript@7.0.2)': - dependencies: - '@surrealdb/cbor': 2.0.0-alpha.4 - tslib: 2.8.1 - typescript: 7.0.2 - uuidv7: 1.2.1 - '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 - '@tanstack/query-core@5.101.4': {} + '@tanstack/query-core@5.101.0': {} - '@tanstack/query-devtools@5.101.4': {} + '@tanstack/query-devtools@5.101.0': {} - '@tanstack/react-query-devtools@5.101.4(@tanstack/react-query@5.101.4(react@19.2.8))(react@19.2.8)': + '@tanstack/react-query-devtools@5.101.0(@tanstack/react-query@5.101.0(react@19.2.7))(react@19.2.7)': dependencies: - '@tanstack/query-devtools': 5.101.4 - '@tanstack/react-query': 5.101.4(react@19.2.8) - react: 19.2.8 + '@tanstack/query-devtools': 5.101.0 + '@tanstack/react-query': 5.101.0(react@19.2.7) + react: 19.2.7 - '@tanstack/react-query@5.101.4(react@19.2.8)': + '@tanstack/react-query@5.101.0(react@19.2.7)': dependencies: - '@tanstack/query-core': 5.101.4 - react: 19.2.8 + '@tanstack/query-core': 5.101.0 + react: 19.2.7 '@tediousjs/connection-string@1.1.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} - '@tybys/wasm-util@0.10.3': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true '@types/accepts@1.3.7': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/async@3.2.25': {} '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/chai@5.2.3': dependencies: @@ -7067,7 +7035,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/content-disposition@0.5.9': {} @@ -7077,22 +7045,22 @@ snapshots: '@types/cookiejar@2.1.5': {} - '@types/cookies@0.9.2': + '@types/cookies@0.9.1': dependencies: '@types/connect': 3.4.38 '@types/express': 5.0.6 '@types/keygrip': 1.0.6 - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/cors@2.8.19': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/cross-spawn@6.0.6': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 - '@types/debug@4.1.13': + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -7104,10 +7072,10 @@ snapshots: '@types/estree@1.0.9': {} - '@types/express-serve-static-core@5.1.1': + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 26.1.1 - '@types/qs': 6.15.1 + '@types/node': 26.0.0 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -7118,18 +7086,16 @@ snapshots: '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.1.1 + '@types/express-serve-static-core': 5.1.0 '@types/serve-static': 2.2.0 '@types/formidable@3.5.1': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 26.1.1 - - '@types/gensync@1.0.5': {} + '@types/node': 26.0.0 '@types/hast@3.0.4': dependencies: @@ -7145,38 +7111,38 @@ snapshots: '@types/jsdom@28.0.3': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/tough-cookie': 4.0.5 parse5: 8.0.1 - undici-types: 7.28.0 - - '@types/jsesc@2.5.1': {} + undici-types: 7.24.5 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/jsonminify@0.4.3': {} + '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/keygrip@1.0.6': {} - '@types/koa-compose@3.2.9': + '@types/koa-compose@3.2.8': dependencies: - '@types/koa': 3.0.3 + '@types/koa': 3.0.0 - '@types/koa@3.0.3': + '@types/koa@3.0.0': dependencies: '@types/accepts': 1.3.7 '@types/content-disposition': 0.5.9 - '@types/cookies': 0.9.2 + '@types/cookies': 0.9.1 '@types/http-assert': 1.5.6 '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 - '@types/koa-compose': 3.2.9 - '@types/node': 26.1.1 + '@types/koa-compose': 3.2.8 + '@types/node': 26.0.0 '@types/linkify-it@5.0.0': {} @@ -7201,34 +7167,34 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node-fetch@2.6.13': + '@types/node-fetch@2.6.12': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 form-data: 4.0.6 - '@types/node@20.19.43': + '@types/node@18.19.130': dependencies: - undici-types: 6.21.0 + undici-types: 5.26.5 - '@types/node@26.1.1': + '@types/node@26.0.0': dependencies: undici-types: 8.3.0 '@types/nodemailer@8.0.1': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/oidc-provider@9.5.0': dependencies: '@types/keygrip': 1.0.6 - '@types/koa': 3.0.3 - '@types/node': 26.1.1 + '@types/koa': 3.0.0 + '@types/node': 26.0.0 '@types/pdfkit@0.17.6': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 - '@types/qs@6.15.1': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} @@ -7240,42 +7206,42 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/readable-stream@4.0.24': + '@types/readable-stream@4.0.23': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/semver@7.7.1': {} '@types/send@1.2.1': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 26.1.1 + '@types/node': 26.0.0 - '@types/sinon@22.0.0': + '@types/sinon@21.0.1': dependencies: '@types/sinonjs__fake-timers': 15.0.1 '@types/sinonjs__fake-timers@15.0.1': {} - '@types/superagent@8.1.10': + '@types/superagent@8.1.9': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 26.1.1 + '@types/node': 26.0.0 form-data: 4.0.6 - '@types/supertest@7.2.1': + '@types/supertest@7.2.0': dependencies: '@types/methods': 1.1.4 - '@types/superagent': 8.1.10 + '@types/superagent': 8.1.9 '@types/tar@6.1.13': dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 minipass: 4.2.8 '@types/tough-cookie@4.0.5': {} @@ -7296,37 +7262,33 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@types/ws@8.18.1': - dependencies: - '@types/node': 26.1.1 - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) + '@typescript-eslint/parser': 7.18.0(eslint@10.5.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) - '@typescript-eslint/utils': 7.18.0(eslint@10.8.0)(typescript@7.0.2) + '@typescript-eslint/type-utils': 7.18.0(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/utils': 7.18.0(eslint@10.5.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 10.8.0 + eslint: 10.5.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@7.0.2) + ts-api-utils: 1.4.3(typescript@6.0.3) optionalDependencies: - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3))(eslint@10.8.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.61.1(@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.8.0 + '@typescript-eslint/parser': 8.61.1(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/type-utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.61.1 + eslint: 10.5.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -7334,35 +7296,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2)': + '@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@7.0.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.8.0 + eslint: 10.5.0 optionalDependencies: - typescript: 7.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.65.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 10.8.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)': + '@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) - '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.61.1 + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.5.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.61.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) + '@typescript-eslint/types': 8.61.1 debug: 4.4.3(supports-color@8.1.1) typescript: 6.0.3 transitivePeerDependencies: @@ -7373,34 +7335,34 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.65.0': + '@typescript-eslint/scope-manager@8.61.1': dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/visitor-keys': 8.61.1 - '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.61.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2)': + '@typescript-eslint/type-utils@7.18.0(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@7.0.2) - '@typescript-eslint/utils': 7.18.0(eslint@10.8.0)(typescript@7.0.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.3) + '@typescript-eslint/utils': 7.18.0(eslint@10.5.0)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.8.0 - ts-api-utils: 1.4.3(typescript@7.0.2) + eslint: 10.5.0 + ts-api-utils: 1.4.3(typescript@6.0.3) optionalDependencies: - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.61.1(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.8.0 + eslint: 10.5.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -7408,9 +7370,9 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.65.0': {} + '@typescript-eslint/types@8.61.1': {} - '@typescript-eslint/typescript-estree@7.18.0(supports-color@8.1.1)(typescript@7.0.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -7418,46 +7380,46 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 10.2.5 - semver: 7.8.5 - ts-api-utils: 1.4.3(typescript@7.0.2) + semver: 7.8.4 + ts-api-utils: 1.4.3(typescript@6.0.3) optionalDependencies: - typescript: 7.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.61.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/visitor-keys': 8.65.0 + '@typescript-eslint/project-service': 8.61.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/visitor-keys': 8.61.1 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 - semver: 7.8.5 + semver: 7.8.4 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@10.8.0)(typescript@7.0.2)': + '@typescript-eslint/utils@7.18.0(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@7.0.2) - eslint: 10.8.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.3) + eslint: 10.5.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.61.1(eslint@10.5.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) - '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/types': 8.65.0 - '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) - eslint: 10.8.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) + '@typescript-eslint/scope-manager': 8.61.1 + '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) + eslint: 10.5.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7467,72 +7429,12 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.65.0': + '@typescript-eslint/visitor-keys@8.61.1': dependencies: - '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/types': 8.61.1 eslint-visitor-keys: 5.0.1 - '@typescript/typescript-aix-ppc64@7.0.2': - optional: true - - '@typescript/typescript-darwin-arm64@7.0.2': - optional: true - - '@typescript/typescript-darwin-x64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-x64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm@7.0.2': - optional: true - - '@typescript/typescript-linux-loong64@7.0.2': - optional: true - - '@typescript/typescript-linux-mips64el@7.0.2': - optional: true - - '@typescript/typescript-linux-ppc64@7.0.2': - optional: true - - '@typescript/typescript-linux-riscv64@7.0.2': - optional: true - - '@typescript/typescript-linux-s390x@7.0.2': - optional: true - - '@typescript/typescript-linux-x64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-sunos-x64@7.0.2': - optional: true - - '@typescript/typescript-win32-arm64@7.0.2': - optional: true - - '@typescript/typescript-win32-x64@7.0.2': - optional: true - - '@typespec/ts-http-runtime@0.3.6': + '@typespec/ts-http-runtime@0.3.5': dependencies: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -7540,7 +7442,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@ungap/structured-clone@1.3.2': {} + '@ungap/structured-clone@1.3.0': {} '@unrs/rspack-resolver-binding-darwin-arm64@1.3.0': optional: true @@ -7589,149 +7491,149 @@ snapshots: '@unrs/rspack-resolver-binding-win32-x64-msvc@1.3.0': optional: true - '@vitejs/plugin-react@6.0.4(babel-plugin-react-compiler@19.1.0-rc.3)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1))': + '@vitejs/plugin-react@6.0.2(babel-plugin-react-compiler@19.1.0-rc.3)(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) optionalDependencies: babel-plugin-react-compiler: 19.1.0-rc.3 - '@vitejs/plugin-vue@6.0.7(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1))(vue@3.5.39(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.5(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4))(vue@3.5.30(typescript@6.0.3))': dependencies: - '@rolldown/pluginutils': 1.0.1 - vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) - vue: 3.5.39(typescript@6.0.3) + '@rolldown/pluginutils': 1.0.0-rc.2 + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) + vue: 3.5.30(typescript@6.0.3) - '@vitest/expect@4.1.10': + '@vitest/expect@4.1.9': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1))': + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4))': dependencies: - '@vitest/spy': 4.1.10 + '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) - '@vitest/pretty-format@4.1.10': + '@vitest/pretty-format@4.1.9': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.10': + '@vitest/runner@4.1.9': dependencies: - '@vitest/utils': 4.1.10 + '@vitest/utils': 4.1.9 pathe: 2.0.3 - '@vitest/snapshot@4.1.10': + '@vitest/snapshot@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.10 - '@vitest/utils': 4.1.10 + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.10': {} + '@vitest/spy@4.1.9': {} - '@vitest/utils@4.1.10': + '@vitest/utils@4.1.9': dependencies: - '@vitest/pretty-format': 4.1.10 + '@vitest/pretty-format': 4.1.9 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@vue/compiler-core@3.5.39': + '@vue/compiler-core@3.5.30': dependencies: - '@babel/parser': 7.29.7 - '@vue/shared': 3.5.39 + '@babel/parser': 7.29.2 + '@vue/shared': 3.5.30 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.39': + '@vue/compiler-dom@3.5.30': dependencies: - '@vue/compiler-core': 3.5.39 - '@vue/shared': 3.5.39 + '@vue/compiler-core': 3.5.30 + '@vue/shared': 3.5.30 - '@vue/compiler-sfc@3.5.39': + '@vue/compiler-sfc@3.5.30': dependencies: - '@babel/parser': 7.29.7 - '@vue/compiler-core': 3.5.39 - '@vue/compiler-dom': 3.5.39 - '@vue/compiler-ssr': 3.5.39 - '@vue/shared': 3.5.39 + '@babel/parser': 7.29.2 + '@vue/compiler-core': 3.5.30 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.16 + postcss: 8.5.15 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.39': + '@vue/compiler-ssr@3.5.30': dependencies: - '@vue/compiler-dom': 3.5.39 - '@vue/shared': 3.5.39 + '@vue/compiler-dom': 3.5.30 + '@vue/shared': 3.5.30 - '@vue/devtools-api@8.1.5': + '@vue/devtools-api@8.1.0': dependencies: - '@vue/devtools-kit': 8.1.5 + '@vue/devtools-kit': 8.1.0 - '@vue/devtools-kit@8.1.5': + '@vue/devtools-kit@8.1.0': dependencies: - '@vue/devtools-shared': 8.1.5 + '@vue/devtools-shared': 8.1.0 birpc: 2.9.0 hookable: 5.5.3 perfect-debounce: 2.1.0 - '@vue/devtools-shared@8.1.5': {} + '@vue/devtools-shared@8.1.0': {} - '@vue/reactivity@3.5.39': + '@vue/reactivity@3.5.30': dependencies: - '@vue/shared': 3.5.39 + '@vue/shared': 3.5.30 - '@vue/runtime-core@3.5.39': + '@vue/runtime-core@3.5.30': dependencies: - '@vue/reactivity': 3.5.39 - '@vue/shared': 3.5.39 + '@vue/reactivity': 3.5.30 + '@vue/shared': 3.5.30 - '@vue/runtime-dom@3.5.39': + '@vue/runtime-dom@3.5.30': dependencies: - '@vue/reactivity': 3.5.39 - '@vue/runtime-core': 3.5.39 - '@vue/shared': 3.5.39 + '@vue/reactivity': 3.5.30 + '@vue/runtime-core': 3.5.30 + '@vue/shared': 3.5.30 csstype: 3.2.3 - '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@6.0.3))': + '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@6.0.3))': dependencies: - '@vue/compiler-ssr': 3.5.39 - '@vue/shared': 3.5.39 - vue: 3.5.39(typescript@6.0.3) + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 + vue: 3.5.30(typescript@6.0.3) - '@vue/shared@3.5.39': {} + '@vue/shared@3.5.30': {} - '@vueuse/core@14.3.0(vue@3.5.39(typescript@6.0.3))': + '@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.3.0 - '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) - vue: 3.5.39(typescript@6.0.3) + '@vueuse/metadata': 14.2.1 + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.3)) + vue: 3.5.30(typescript@6.0.3) - '@vueuse/integrations@14.3.0(change-case@5.4.4)(focus-trap@8.2.2)(jwt-decode@4.0.0)(vue@3.5.39(typescript@6.0.3))': + '@vueuse/integrations@14.2.1(change-case@5.4.4)(focus-trap@8.0.0)(jwt-decode@4.0.0)(vue@3.5.30(typescript@6.0.3))': dependencies: - '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) - '@vueuse/shared': 14.3.0(vue@3.5.39(typescript@6.0.3)) - vue: 3.5.39(typescript@6.0.3) + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.3)) + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.3)) + vue: 3.5.30(typescript@6.0.3) optionalDependencies: change-case: 5.4.4 - focus-trap: 8.2.2 + focus-trap: 8.0.0 jwt-decode: 4.0.0 - '@vueuse/metadata@14.3.0': {} + '@vueuse/metadata@14.2.1': {} - '@vueuse/shared@14.3.0(vue@3.5.39(typescript@6.0.3))': + '@vueuse/shared@14.2.1(vue@3.5.30(typescript@6.0.3))': dependencies: - vue: 3.5.39(typescript@6.0.3) + vue: 3.5.30(typescript@6.0.3) '@xmldom/xmldom@0.8.13': {} @@ -7755,7 +7657,9 @@ snapshots: acorn@8.17.0: {} - adm-zip@0.5.18: {} + adm-zip@0.5.17: {} + + agent-base@7.1.3: {} agent-base@7.1.4: {} @@ -7773,7 +7677,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.3 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7806,7 +7710,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -7820,7 +7724,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: @@ -7869,7 +7773,7 @@ snapshots: babel-plugin-react-compiler@19.1.0-rc.3: dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.28.4 bail@2.0.2: {} @@ -7883,7 +7787,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.10.42: {} + baseline-browser-mapping@2.10.21: {} basic-ftp@5.3.1: {} @@ -7901,7 +7805,7 @@ snapshots: bl@6.1.6: dependencies: - '@types/readable-stream': 4.0.24 + '@types/readable-stream': 4.0.23 buffer: 6.0.3 inherits: 2.0.4 readable-stream: 4.7.0 @@ -7910,17 +7814,17 @@ snapshots: bluebird@3.4.7: {} - body-parser@2.3.0(supports-color@8.1.1): + body-parser@2.2.1: dependencies: bytes: 3.1.2 - content-type: 2.0.0 + content-type: 1.0.5 debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 - iconv-lite: 0.7.3 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.3 + qs: 6.15.2 raw-body: 3.0.2 - type-is: 2.1.0 + type-is: 2.0.1 transitivePeerDependencies: - supports-color @@ -7929,7 +7833,7 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@5.0.7: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -7949,15 +7853,15 @@ snapshots: dependencies: pako: 1.0.11 - browserslist@4.28.5: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.42 - caniuse-lite: 1.0.30001802 - electron-to-chromium: 1.5.387 - node-releases: 2.0.50 - update-browserslist-db: 1.2.3(browserslist@4.28.5) + baseline-browser-mapping: 2.10.21 + caniuse-lite: 1.0.30001790 + electron-to-chromium: 1.5.343 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) - bson@7.3.1: {} + bson@7.2.0: {} buffer-equal-constant-time@1.0.1: {} @@ -7993,12 +7897,12 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001802: {} + caniuse-lite@1.0.30001790: {} - cassandra-driver@4.9.0: + cassandra-driver@4.8.0: dependencies: - '@types/node': 20.19.43 - adm-zip: 0.5.18 + '@types/node': 18.19.130 + adm-zip: 0.5.17 long: 5.2.5 ccount@2.0.1: {} @@ -8060,8 +7964,6 @@ snapshots: content-disposition@1.0.1: {} - content-disposition@1.1.0: {} - content-type@1.0.5: {} content-type@2.0.0: {} @@ -8092,7 +7994,7 @@ snapshots: core-util-is@1.0.3: {} - cors@2.8.6: + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 @@ -8152,6 +8054,14 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 @@ -8302,19 +8212,17 @@ snapshots: ejs@6.0.1: {} - electron-to-chromium@1.5.387: {} + electron-to-chromium@1.5.343: {} emoji-regex@8.0.0: {} - empathic@2.0.1: {} - encodeurl@2.0.0: {} enforce-range@1.0.0: dependencies: '2': 1.0.2 - engine.io-client@6.6.6(supports-color@8.1.1): + engine.io-client@6.6.4: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@8.1.1) @@ -8328,15 +8236,14 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.9(supports-color@8.1.1): + engine.io@6.6.5: dependencies: '@types/cors': 2.8.19 - '@types/node': 26.1.1 - '@types/ws': 8.18.1 + '@types/node': 26.0.0 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 - cors: 2.8.6 + cors: 2.8.5 debug: 4.4.3(supports-color@8.1.1) engine.io-parser: 5.2.3 ws: 8.21.0 @@ -8345,10 +8252,10 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.24.2: + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.3 + tapable: 2.3.2 ent@2.2.2: dependencies: @@ -8373,13 +8280,6 @@ snapshots: string-template: 0.2.1 xtend: 4.0.2 - es-abstract-get@1.0.0: - dependencies: - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - is-callable: 1.2.7 - object-inspect: 1.13.4 - es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -8392,10 +8292,10 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.4 - function.prototype.name: 1.2.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 @@ -8404,7 +8304,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.4 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -8422,28 +8322,28 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.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.11 - string.prototype.trimend: 1.0.10 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 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.8 + typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.22 + which-typed-array: 1.1.20 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@2.3.0: {} + es-module-lexer@2.1.0: {} - es-object-atoms@1.1.2: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -8452,17 +8352,14 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.4 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.4 + hasown: 2.0.3 - es-to-primitive@1.3.4: + es-to-primitive@1.3.0: dependencies: - es-abstract-get: 1.0.0 - es-define-property: 1.0.1 - es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 @@ -8512,24 +8409,24 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@10.8.0): + eslint-compat-utils@0.5.1(eslint@10.5.0): dependencies: - eslint: 10.8.0 - semver: 7.8.5 + eslint: 10.5.0 + semver: 7.8.4 - eslint-config-etherpad@4.0.5(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2): + eslint-config-etherpad@4.0.5(eslint@10.5.0)(typescript@6.0.3): dependencies: '@rushstack/eslint-patch': 1.16.1 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) - '@typescript-eslint/parser': 7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) - eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1) - eslint-plugin-cypress: 2.15.2(eslint@10.8.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@10.8.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1))(eslint@10.8.0) - eslint-plugin-mocha: 10.5.0(eslint@10.8.0) - eslint-plugin-n: 17.24.0(eslint@10.8.0)(typescript@7.0.2) - eslint-plugin-prefer-arrow: 1.2.3(eslint@10.8.0) - eslint-plugin-promise: 6.6.0(eslint@10.8.0) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/parser': 7.18.0(eslint@10.5.0)(typescript@6.0.3) + eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0))(eslint@10.5.0) + eslint-plugin-cypress: 2.15.2(eslint@10.5.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@10.5.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.9.1)(eslint@10.5.0) + eslint-plugin-mocha: 10.5.0(eslint@10.5.0) + eslint-plugin-n: 17.24.0(eslint@10.5.0)(typescript@6.0.3) + eslint-plugin-prefer-arrow: 1.2.3(eslint@10.5.0) + eslint-plugin-promise: 6.6.0(eslint@10.5.0) eslint-plugin-you-dont-need-lodash-underscore: 6.14.0 transitivePeerDependencies: - eslint @@ -8541,56 +8438,56 @@ snapshots: eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.2 - resolve: 2.0.0-next.7 + is-core-module: 2.16.1 + resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1): + eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0))(eslint@10.5.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.8.0 + eslint: 10.5.0 get-tsconfig: 4.14.0 is-bun-module: 1.3.0 rspack-resolver: 1.3.0 stable-hash: 0.0.5 tinyglobby: 0.2.17 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1))(eslint@10.8.0) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.9.1)(eslint@10.5.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1))(eslint@10.8.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0))(eslint@10.5.0))(eslint@10.5.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) - eslint: 10.8.0 + '@typescript-eslint/parser': 7.18.0(eslint@10.5.0)(typescript@6.0.3) + eslint: 10.5.0 eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1) + eslint-import-resolver-typescript: 3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0))(eslint@10.5.0) transitivePeerDependencies: - supports-color - eslint-plugin-cypress@2.15.2(eslint@10.8.0): + eslint-plugin-cypress@2.15.2(eslint@10.5.0): dependencies: - eslint: 10.8.0 + eslint: 10.5.0 globals: 13.24.0 - eslint-plugin-es-x@7.8.0(eslint@10.8.0): + eslint-plugin-es-x@7.8.0(eslint@10.5.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) '@eslint-community/regexpp': 4.12.2 - eslint: 10.8.0 - eslint-compat-utils: 0.5.1(eslint@10.8.0) + eslint: 10.5.0 + eslint-compat-utils: 0.5.1(eslint@10.5.0) - eslint-plugin-eslint-comments@3.2.0(eslint@10.8.0): + eslint-plugin-eslint-comments@3.2.0(eslint@10.5.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 10.8.0 + eslint: 10.5.0 ignore: 5.3.2 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1))(eslint@10.8.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint-import-resolver-typescript@3.9.1)(eslint@10.5.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -8599,68 +8496,70 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.8.0 + eslint: 10.5.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.14.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2))(eslint@10.8.0))(eslint@10.8.0)(supports-color@8.1.1))(eslint@10.8.0) - hasown: 2.0.4 - is-core-module: 2.16.2 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.9.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0))(eslint@10.5.0))(eslint@10.5.0) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.10 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@10.8.0)(supports-color@8.1.1)(typescript@7.0.2) + '@typescript-eslint/parser': 7.18.0(eslint@10.5.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-mocha@10.5.0(eslint@10.8.0): + eslint-plugin-mocha@10.5.0(eslint@10.5.0): dependencies: - eslint: 10.8.0 - eslint-utils: 3.0.0(eslint@10.8.0) + eslint: 10.5.0 + eslint-utils: 3.0.0(eslint@10.5.0) globals: 13.24.0 rambda: 7.5.0 - eslint-plugin-n@17.24.0(eslint@10.8.0)(typescript@7.0.2): + eslint-plugin-n@17.24.0(eslint@10.5.0)(typescript@6.0.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) - enhanced-resolve: 5.24.2 - eslint: 10.8.0 - eslint-plugin-es-x: 7.8.0(eslint@10.8.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) + enhanced-resolve: 5.20.1 + eslint: 10.5.0 + eslint-plugin-es-x: 7.8.0(eslint@10.5.0) get-tsconfig: 4.14.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.8.5 - ts-declaration-location: 1.0.7(typescript@7.0.2) + semver: 7.8.4 + ts-declaration-location: 1.0.7(typescript@6.0.3) transitivePeerDependencies: - typescript - eslint-plugin-prefer-arrow@1.2.3(eslint@10.8.0): + eslint-plugin-prefer-arrow@1.2.3(eslint@10.5.0): dependencies: - eslint: 10.8.0 + eslint: 10.5.0 - eslint-plugin-promise@6.6.0(eslint@10.8.0): + eslint-plugin-promise@6.6.0(eslint@10.5.0): dependencies: - eslint: 10.8.0 + eslint: 10.5.0 - eslint-plugin-react-hooks@7.1.1(eslint@10.8.0): + eslint-plugin-react-hooks@7.1.1(eslint@10.5.0): dependencies: - '@babel/core': 8.0.1 - '@babel/parser': 7.29.7 - eslint: 10.8.0 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.2 + eslint: 10.5.0 hermes-parser: 0.25.1 - zod: 4.4.3 - zod-validation-error: 4.0.2(zod@4.4.3) + zod: 4.3.6 + zod-validation-error: 4.0.2(zod@4.3.6) + transitivePeerDependencies: + - supports-color - eslint-plugin-react-refresh@0.5.3(eslint@10.8.0): + eslint-plugin-react-refresh@0.5.3(eslint@10.5.0): dependencies: - eslint: 10.8.0 + eslint: 10.5.0 eslint-plugin-you-dont-need-lodash-underscore@6.14.0: dependencies: @@ -8673,9 +8572,9 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@10.8.0): + eslint-utils@3.0.0(eslint@10.5.0): dependencies: - eslint: 10.8.0 + eslint: 10.5.0 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} @@ -8684,12 +8583,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.8.0: + eslint@10.5.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.7.0 + '@eslint/config-helpers': 0.6.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -8751,7 +8650,7 @@ snapshots: etherpad-cli-client@4.0.3: dependencies: - socket.io-client: 4.8.3(supports-color@8.1.1) + socket.io-client: 4.8.3 superagent: 10.3.0 transitivePeerDependencies: - bufferutil @@ -8766,15 +8665,12 @@ snapshots: events@3.3.0: {} - expect-type@1.4.0: {} + expect-type@1.3.0: {} - express-rate-limit@8.6.0(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1): + express-rate-limit@8.5.1(express@5.2.1): dependencies: - debug: 4.4.3(supports-color@8.1.1) - express: 5.2.1(supports-color@8.1.1) + express: 5.2.1 ip-address: 10.2.0 - transitivePeerDependencies: - - supports-color express-session@1.19.0: dependencies: @@ -8789,11 +8685,11 @@ snapshots: transitivePeerDependencies: - supports-color - express@5.2.1(supports-color@8.1.1): + express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.3.0(supports-color@8.1.1) - content-disposition: 1.1.0 + body-parser: 2.2.1 + content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 @@ -8802,7 +8698,7 @@ snapshots: encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.1(supports-color@8.1.1) + finalhandler: 2.1.1 fresh: 2.0.0 http-errors: 2.0.1 merge-descriptors: 2.0.0 @@ -8811,13 +8707,13 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.3 - range-parser: 1.3.0 - router: 2.2.0(supports-color@8.1.1) - send: 1.2.1(supports-color@8.1.1) - serve-static: 2.2.1 + qs: 6.15.2 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 statuses: 2.0.2 - type-is: 2.1.0 + type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -8840,15 +8736,15 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.1.3: {} + fast-uri@3.1.2: {} fastq@1.20.1: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.5): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.5 + picomatch: 4.0.4 fetch-blob@3.2.0: dependencies: @@ -8867,7 +8763,7 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.1(supports-color@8.1.1): + finalhandler@2.1.1: dependencies: debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 @@ -8878,6 +8774,8 @@ snapshots: transitivePeerDependencies: - supports-color + find-root@1.1.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -8892,9 +8790,9 @@ snapshots: flatted@3.4.2: {} - focus-trap@8.2.2: + focus-trap@8.0.0: dependencies: - tabbable: 6.5.0 + tabbable: 6.4.0 fontkit@2.0.4: dependencies: @@ -8926,7 +8824,7 @@ snapshots: formidable@3.5.4: dependencies: - '@paralleldrive/cuid2': 2.3.1 + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 once: 1.4.0 @@ -8939,7 +8837,7 @@ snapshots: fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.1 + jsonfile: 6.1.0 universalify: 2.0.1 fs-extra@8.1.0: @@ -8956,17 +8854,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.2.0: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - es-define-property: 1.0.1 - es-errors: 1.3.0 + define-properties: 1.2.1 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - hasown: 2.0.4 + hasown: 2.0.3 is-callable: 1.2.7 - is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -8985,12 +8880,12 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.4 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-nonce@1.0.1: {} @@ -8998,7 +8893,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-symbol-description@1.1.0: dependencies: @@ -9010,7 +8905,7 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.5(supports-color@8.1.1): + get-uri@6.0.4: dependencies: basic-ftp: 5.3.1 data-uri-to-buffer: 6.0.2 @@ -9083,6 +8978,14 @@ snapshots: dependencies: has-symbols: 1.1.0 + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -9099,7 +9002,7 @@ snapshots: hast-util-from-parse5: 8.0.3 parse5: 7.3.0 vfile: 6.0.3 - vfile-message: 4.0.3 + vfile-message: 4.0.2 hast-util-from-parse5@8.0.3: dependencies: @@ -9107,7 +9010,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.2.0 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -9122,7 +9025,7 @@ snapshots: hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.1 + unist-util-is: 6.0.0 hast-util-parse-selector@4.0.0: dependencies: @@ -9137,7 +9040,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 - property-information: 7.2.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -9151,7 +9054,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.2.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 he@1.2.0: {} @@ -9168,13 +9071,15 @@ snapshots: html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0): dependencies: - '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) transitivePeerDependencies: - '@noble/hashes' html-entities@2.6.0: {} - html-parse-stringify@4.0.1: {} + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 html-to-docx@1.8.0: dependencies: @@ -9188,7 +9093,7 @@ snapshots: jszip: 3.10.1 lodash: 4.18.1 mime-types: 2.1.35 - nanoid: 3.3.15 + nanoid: 3.3.11 virtual-dom: 2.1.1 xmlbuilder2: 2.1.2 transitivePeerDependencies: @@ -9261,13 +9166,13 @@ snapshots: i18next-browser-languagedetector@8.2.1: dependencies: - '@babel/runtime': 7.29.7 + '@babel/runtime': 7.28.6 - i18next@26.3.6(typescript@6.0.3): + i18next@26.3.1(typescript@6.0.3): optionalDependencies: typescript: 6.0.3 - iconv-lite@0.7.3: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -9289,8 +9194,6 @@ snapshots: immediate@3.0.6: {} - import-meta-resolve@4.2.0: {} - imurmurhash@0.1.4: {} index-to-position@1.2.0: {} @@ -9302,8 +9205,8 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.4 - side-channel: 1.1.1 + hasown: 2.0.3 + side-channel: 1.1.0 ip-address@10.2.0: {} @@ -9334,13 +9237,13 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.8.5 + semver: 7.8.4 is-callable@1.2.7: {} - is-core-module@2.16.2: + is-core-module@2.16.1: dependencies: - hasown: 2.0.4 + hasown: 2.0.2 is-data-view@1.0.2: dependencies: @@ -9355,10 +9258,6 @@ snapshots: is-docker@3.0.0: {} - is-document.all@1.0.0: - dependencies: - call-bound: 1.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -9415,7 +9314,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.4 + hasown: 2.0.3 is-set@2.0.3: {} @@ -9436,7 +9335,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.22 + which-typed-array: 1.1.20 is-unicode-supported@0.1.0: {} @@ -9461,7 +9360,7 @@ snapshots: isexe@2.0.0: {} - jose@6.2.4: {} + jose@6.2.3: {} js-cookie@3.0.8: {} @@ -9471,36 +9370,30 @@ snapshots: js-md5@0.8.3: {} - js-tokens@10.0.0: {} - js-tokens@4.0.0: {} js-yaml@4.2.0: dependencies: argparse: 2.0.1 - js-yaml@5.2.1: - dependencies: - argparse: 2.0.1 - jsdom@29.1.1(@noble/hashes@1.8.0): dependencies: '@asamuzakjp/css-color': 5.1.11 '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) - '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) css-tree: 3.2.1 data-urls: 7.0.0(@noble/hashes@1.8.0) decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) is-potential-custom-element-name: 1.0.1 - lru-cache: 11.5.2 + lru-cache: 11.5.0 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 6.0.1 - undici: 7.28.0 + undici: 7.27.2 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 whatwg-mimetype: 5.0.0 @@ -9531,12 +9424,14 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.2.1: + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + jsonminify@0.4.2: {} + jsonschema-draft4@1.0.0: {} jsonschema@1.2.4: {} @@ -9552,7 +9447,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.8.5 + semver: 7.8.4 jszip@3.10.1: dependencies: @@ -9672,24 +9567,24 @@ snapshots: base64-js: 0.0.8 unicode-trie: 2.0.0 - live-plugin-manager@1.1.0(supports-color@8.1.1): + live-plugin-manager@1.1.0: dependencies: - '@types/debug': 4.1.13 + '@types/debug': 4.1.12 '@types/fs-extra': 9.0.13 '@types/lockfile': 1.0.4 - '@types/node-fetch': 2.6.13 + '@types/node-fetch': 2.6.12 '@types/semver': 7.7.1 '@types/tar': 6.1.13 '@types/url-join': 4.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1 fetch-blob: 4.0.0 formdata-polyfill: 4.0.10 fs-extra: 10.1.0 lockfile: 1.0.4 node-fetch-commonjs: 3.3.2 - proxy-agent: 6.5.0(supports-color@8.1.1) - semver: 7.8.5 - tar: 7.5.19 + proxy-agent: 6.5.0 + semver: 7.8.4 + tar: 7.5.16 url-join: 4.0.1 transitivePeerDependencies: - supports-color @@ -9727,13 +9622,13 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log4js@6.9.1(supports-color@8.1.1): + log4js@6.9.1: dependencies: date-format: 4.0.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.0 flatted: 3.4.2 rfdc: 1.4.1 - streamroller: 3.1.5(supports-color@8.1.1) + streamroller: 3.1.5 transitivePeerDependencies: - supports-color @@ -9747,15 +9642,21 @@ snapshots: option: 0.2.4 underscore: 1.13.8 - lru-cache@11.5.2: {} + lru-cache@11.5.0: {} + + lru-cache@11.5.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 lru-cache@7.18.3: {} lru.min@1.1.4: {} - lucide-react@1.27.0(react@19.2.8): + lucide-react@1.21.0(react@19.2.7): dependencies: - react: 19.2.8 + react: 19.2.7 magic-string@0.30.21: dependencies: @@ -9782,7 +9683,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.2 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -9849,7 +9750,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.6 minimatch@3.1.5: dependencies: @@ -9857,7 +9758,7 @@ snapshots: minimatch@5.1.9: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.6 minimist@1.2.8: {} @@ -9884,16 +9785,16 @@ snapshots: glob: 13.0.6 he: 1.2.0 is-path-inside: 3.0.3 - js-yaml: 5.2.1 + js-yaml: 4.2.0 log-symbols: 4.1.0 minimatch: 10.2.5 ms: 2.1.3 picocolors: 1.1.1 - serialize-javascript: 7.0.7 + serialize-javascript: 7.0.5 strip-json-comments: 3.1.1 supports-color: 8.1.1 workerpool: 9.3.4 - yargs: 17.7.3 + yargs: 17.7.2 yargs-parser: 21.1.1 yargs-unparser: 2.0.0 @@ -9906,51 +9807,50 @@ snapshots: '@types/whatwg-url': 13.0.0 whatwg-url: 14.2.0 - mongodb@7.4.0(socks@2.8.9): + mongodb@7.3.0: dependencies: - '@mongodb-js/saslprep': 1.4.12 - bson: 7.3.1 + '@mongodb-js/saslprep': 1.4.11 + bson: 7.2.0 mongodb-connection-string-url: 7.0.1 - optionalDependencies: - socks: 2.8.9 ms@2.0.0: {} ms@2.1.3: {} - mssql@12.7.0: + mssql@12.5.5(@azure/core-client@1.10.1): dependencies: '@tediousjs/connection-string': 1.1.0 commander: 11.1.0 debug: 4.4.3(supports-color@8.1.1) - tarn: 3.1.0 - tedious: 20.0.0 + tarn: 3.0.2 + tedious: 19.2.1(@azure/core-client@1.10.1) transitivePeerDependencies: + - '@azure/core-client' - supports-color - mysql2@3.23.1(@types/node@26.1.1): + mysql2@3.22.5(@types/node@26.0.0): dependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.7.3 + iconv-lite: 0.7.2 long: 5.3.2 lru.min: 1.1.4 named-placeholders: 1.1.6 - sql-escaper: 1.5.1 + sql-escaper: 1.3.3 named-placeholders@1.1.6: dependencies: lru.min: 1.1.4 - nano@11.0.6: {} + nano@11.0.5: {} - nanoid@3.3.15: {} + nanoid@3.3.11: {} - nanoid@3.3.16: {} + nanoid@3.3.12: {} - nanoid@6.0.0: {} + nanoid@5.1.11: {} native-duplexpair@1.0.0: {} @@ -9960,13 +9860,13 @@ snapshots: negotiator@1.0.0: {} - netmask@2.1.1: {} + netmask@2.0.2: {} next-tick@0.2.2: {} node-domexception@1.0.0: {} - node-exports-info@1.6.2: + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -9982,14 +9882,14 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.50: {} + node-releases@2.0.38: {} nodeify@1.0.1: dependencies: is-promise: 1.0.1 promise: 1.3.0 - nodemailer@9.0.3: {} + nodemailer@9.0.1: {} object-assign@4.1.1: {} @@ -10002,7 +9902,7 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -10011,14 +9911,14 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: @@ -10031,22 +9931,22 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 obug@2.1.3: {} - oidc-provider@9.10.0(supports-color@8.1.1): + oidc-provider@9.8.5: dependencies: '@koa/cors': 5.0.0 - '@koa/router': 15.7.0(koa@3.2.1)(supports-color@8.1.1) + '@koa/router': 15.6.0(koa@3.2.1) debug: 4.4.3(supports-color@8.1.1) eta: 4.6.0 - jose: 6.2.4 + jose: 6.2.3 jsesc: 3.1.0 koa: 3.2.1 - nanoid: 6.0.0 + nanoid: 5.1.11 quick-lru: 7.3.0 - raw-body: 4.0.0 + raw-body: 3.0.2 transitivePeerDependencies: - supports-color @@ -10060,11 +9960,11 @@ snapshots: dependencies: wrappy: 1.0.2 - oniguruma-parser@0.12.2: {} + oniguruma-parser@0.12.1: {} - oniguruma-to-es@4.3.6: + oniguruma-to-es@4.3.5: dependencies: - oniguruma-parser: 0.12.2 + oniguruma-parser: 0.12.1 regex: 6.1.0 regex-recursion: 6.0.2 @@ -10075,7 +9975,7 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - openapi-backend@5.18.0: + openapi-backend@5.17.0: dependencies: '@apidevtools/json-schema-ref-parser': 11.9.3 ajv: 8.20.0 @@ -10086,15 +9986,15 @@ snapshots: mock-json-schema: 1.1.2 openapi-schema-validator: 12.1.3 openapi-types: 12.1.3 - qs: 6.15.3 + qs: 6.15.2 openapi-fetch@0.17.0: dependencies: openapi-typescript-helpers: 0.1.0 - openapi-react-query@0.5.4(@tanstack/react-query@5.101.4(react@19.2.8))(openapi-fetch@0.17.0): + openapi-react-query@0.5.4(@tanstack/react-query@5.101.0(react@19.2.7))(openapi-fetch@0.17.0): dependencies: - '@tanstack/react-query': 5.101.4(react@19.2.8) + '@tanstack/react-query': 5.101.0(react@19.2.7) openapi-fetch: 0.17.0 openapi-typescript-helpers: 0.1.0 @@ -10117,7 +10017,7 @@ snapshots: openapi-typescript@7.13.0(typescript@6.0.3): dependencies: - '@redocly/openapi-core': 1.34.17(supports-color@10.2.2) + '@redocly/openapi-core': 1.34.14(supports-color@10.2.2) ansi-colors: 4.1.3 change-case: 5.4.4 parse-json: 8.3.0 @@ -10144,28 +10044,28 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-minify@0.141.0: + oxc-minify@0.137.0: optionalDependencies: - '@oxc-minify/binding-android-arm-eabi': 0.141.0 - '@oxc-minify/binding-android-arm64': 0.141.0 - '@oxc-minify/binding-darwin-arm64': 0.141.0 - '@oxc-minify/binding-darwin-x64': 0.141.0 - '@oxc-minify/binding-freebsd-x64': 0.141.0 - '@oxc-minify/binding-linux-arm-gnueabihf': 0.141.0 - '@oxc-minify/binding-linux-arm-musleabihf': 0.141.0 - '@oxc-minify/binding-linux-arm64-gnu': 0.141.0 - '@oxc-minify/binding-linux-arm64-musl': 0.141.0 - '@oxc-minify/binding-linux-ppc64-gnu': 0.141.0 - '@oxc-minify/binding-linux-riscv64-gnu': 0.141.0 - '@oxc-minify/binding-linux-riscv64-musl': 0.141.0 - '@oxc-minify/binding-linux-s390x-gnu': 0.141.0 - '@oxc-minify/binding-linux-x64-gnu': 0.141.0 - '@oxc-minify/binding-linux-x64-musl': 0.141.0 - '@oxc-minify/binding-openharmony-arm64': 0.141.0 - '@oxc-minify/binding-wasm32-wasi': 0.141.0 - '@oxc-minify/binding-win32-arm64-msvc': 0.141.0 - '@oxc-minify/binding-win32-ia32-msvc': 0.141.0 - '@oxc-minify/binding-win32-x64-msvc': 0.141.0 + '@oxc-minify/binding-android-arm-eabi': 0.137.0 + '@oxc-minify/binding-android-arm64': 0.137.0 + '@oxc-minify/binding-darwin-arm64': 0.137.0 + '@oxc-minify/binding-darwin-x64': 0.137.0 + '@oxc-minify/binding-freebsd-x64': 0.137.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.137.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.137.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.137.0 + '@oxc-minify/binding-linux-arm64-musl': 0.137.0 + '@oxc-minify/binding-linux-ppc64-gnu': 0.137.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.137.0 + '@oxc-minify/binding-linux-riscv64-musl': 0.137.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.137.0 + '@oxc-minify/binding-linux-x64-gnu': 0.137.0 + '@oxc-minify/binding-linux-x64-musl': 0.137.0 + '@oxc-minify/binding-openharmony-arm64': 0.137.0 + '@oxc-minify/binding-wasm32-wasi': 0.137.0 + '@oxc-minify/binding-win32-arm64-msvc': 0.137.0 + '@oxc-minify/binding-win32-ia32-msvc': 0.137.0 + '@oxc-minify/binding-win32-x64-msvc': 0.137.0 p-limit@3.1.0: dependencies: @@ -10175,12 +10075,12 @@ snapshots: dependencies: p-limit: 3.1.0 - pac-proxy-agent@7.2.0(supports-color@8.1.1): + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) - get-uri: 6.0.5(supports-color@8.1.1) + get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 pac-resolver: 7.0.1 @@ -10191,7 +10091,7 @@ snapshots: pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - netmask: 2.1.1 + netmask: 2.0.2 pako@0.2.9: {} @@ -10199,7 +10099,7 @@ snapshots: parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.29.7 + '@babel/code-frame': 7.29.0 index-to-position: 1.2.0 type-fest: 4.41.0 @@ -10223,7 +10123,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.5.2 + lru-cache: 11.5.0 minipass: 7.1.3 path-to-regexp@8.4.2: {} @@ -10282,13 +10182,13 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.5: {} + picomatch@4.0.4: {} - playwright-core@1.61.1: {} + playwright-core@1.61.0: {} - playwright@1.61.1: + playwright@1.61.0: dependencies: - playwright-core: 1.61.1 + playwright-core: 1.61.0 optionalDependencies: fsevents: 2.3.2 @@ -10300,15 +10200,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.16: + postcss@8.5.15: dependencies: - nanoid: 3.3.15 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.23: - dependencies: - nanoid: 3.3.16 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -10330,28 +10224,28 @@ snapshots: prom-client@15.1.3: dependencies: - '@opentelemetry/api': 1.9.1 + '@opentelemetry/api': 1.9.0 tdigest: 0.1.2 promise@1.3.0: dependencies: is-promise: 1.0.1 - property-information@7.2.0: {} + property-information@7.1.0: {} proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.5.0(supports-color@8.1.1): + proxy-agent@6.5.0: dependencies: - agent-base: 7.1.4 + agent-base: 7.1.3 debug: 4.4.3(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0(supports-color@8.1.1) + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 socks-proxy-agent: 8.0.5 transitivePeerDependencies: @@ -10363,10 +10257,9 @@ snapshots: punycode@2.3.1: {} - qs@6.15.3: + qs@6.15.2: dependencies: - es-define-property: 1.0.1 - side-channel: 1.1.1 + side-channel: 1.1.0 queue-microtask@1.2.3: {} @@ -10380,7 +10273,7 @@ snapshots: random-bytes@1.0.0: {} - range-parser@1.3.0: {} + range-parser@1.2.1: {} rate-limiter-flexible@11.2.0: {} @@ -10388,76 +10281,71 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.3 + iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-body@4.0.0: + react-dom@19.2.7(react@19.2.7): dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - - react-dom@19.2.8(react@19.2.8): - dependencies: - react: 19.2.8 + react: 19.2.7 scheduler: 0.27.0 - react-hook-form@7.83.0(react@19.2.8): + react-hook-form@7.80.0(react@19.2.7): dependencies: - react: 19.2.8 + react: 19.2.7 - react-i18next@17.0.11(i18next@26.3.6(typescript@6.0.3))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3): + react-i18next@17.0.8(i18next@26.3.1(typescript@6.0.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@6.0.3): dependencies: - '@babel/runtime': 7.29.7 - html-parse-stringify: 4.0.1 - i18next: 26.3.6(typescript@6.0.3) - react: 19.2.8 - use-sync-external-store: 1.6.0(react@19.2.8) + '@babel/runtime': 7.29.2 + html-parse-stringify: 3.0.1 + i18next: 26.3.1(typescript@6.0.3) + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) optionalDependencies: - react-dom: 19.2.8(react@19.2.8) + react-dom: 19.2.7(react@19.2.7) typescript: 6.0.3 - react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.8): + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7): dependencies: - react: 19.2.8 - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.8) + react: 19.2.7 + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7) tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.17 - react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.8): + react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.7): dependencies: - react: 19.2.8 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.8) - react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.8) + react: 19.2.7 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.7) + react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.8) - use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.8) + use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.7) + use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.7) optionalDependencies: '@types/react': 19.2.17 - react-router-dom@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-router-dom@7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-router: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-router: 7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + react-router@7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: cookie: 1.1.1 - react: 19.2.8 + react: 19.2.7 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 19.2.8(react@19.2.8) + react-dom: 19.2.7(react@19.2.7) - react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.8): + react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.7): dependencies: get-nonce: 1.0.1 - react: 19.2.8 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.17 - react@19.2.8: {} + react@19.2.7: {} readable-stream@2.3.8: dependencies: @@ -10487,13 +10375,13 @@ snapshots: readdirp@5.0.0: {} - redis@6.1.0(@opentelemetry/api@1.9.1): + redis@6.0.0(@opentelemetry/api@1.9.1): dependencies: - '@redis/bloom': 6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1)) - '@redis/client': 6.1.0(@opentelemetry/api@1.9.1) - '@redis/json': 6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1)) - '@redis/search': 6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1)) - '@redis/time-series': 6.1.0(@redis/client@6.1.0(@opentelemetry/api@1.9.1)) + '@redis/bloom': 6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1)) + '@redis/client': 6.0.0(@opentelemetry/api@1.9.1) + '@redis/json': 6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1)) + '@redis/search': 6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1)) + '@redis/time-series': 6.0.0(@redis/client@6.0.0(@opentelemetry/api@1.9.1)) transitivePeerDependencies: - '@node-rs/xxhash' - '@opentelemetry/api' @@ -10504,7 +10392,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -10561,15 +10449,15 @@ snapshots: resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.2 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.7: + resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.2 - node-exports-info: 1.6.2 + is-core-module: 2.16.1 + node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10584,28 +10472,28 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.1.5: + rolldown@1.0.3: dependencies: - '@oxc-project/types': 0.139.0 + '@oxc-project/types': 0.133.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.5 - '@rolldown/binding-darwin-arm64': 1.1.5 - '@rolldown/binding-darwin-x64': 1.1.5 - '@rolldown/binding-freebsd-x64': 1.1.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 - '@rolldown/binding-linux-arm64-gnu': 1.1.5 - '@rolldown/binding-linux-arm64-musl': 1.1.5 - '@rolldown/binding-linux-ppc64-gnu': 1.1.5 - '@rolldown/binding-linux-s390x-gnu': 1.1.5 - '@rolldown/binding-linux-x64-gnu': 1.1.5 - '@rolldown/binding-linux-x64-musl': 1.1.5 - '@rolldown/binding-openharmony-arm64': 1.1.5 - '@rolldown/binding-wasm32-wasi': 1.1.5 - '@rolldown/binding-win32-arm64-msvc': 1.1.5 - '@rolldown/binding-win32-x64-msvc': 1.1.5 + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 - router@2.2.0(supports-color@8.1.1): + router@2.2.0: dependencies: debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 @@ -10682,7 +10570,7 @@ snapshots: rusty-store-kv-win32-arm64-msvc: 1.3.1 rusty-store-kv-win32-x64-msvc: 1.3.1 - safe-array-concat@1.1.4: + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -10717,11 +10605,13 @@ snapshots: secure-json-parse@4.1.0: {} + security@1.0.0: {} + semver@6.3.1: {} - semver@7.8.5: {} + semver@7.8.4: {} - send@1.2.1(supports-color@8.1.1): + send@1.2.0: dependencies: debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 @@ -10732,25 +10622,25 @@ snapshots: mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 - range-parser: 1.3.0 + range-parser: 1.2.1 statuses: 2.0.2 transitivePeerDependencies: - supports-color - serialize-javascript@7.0.7: {} + serialize-javascript@7.0.5: {} - serve-static@2.2.1: + serve-static@2.2.0: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1(supports-color@8.1.1) + send: 1.2.0 transitivePeerDependencies: - supports-color set-cookie-parser@2.7.2: {} - set-cookie-parser@3.1.2: {} + set-cookie-parser@3.1.0: {} set-function-length@1.2.2: dependencies: @@ -10772,7 +10662,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 setimmediate@1.0.5: {} @@ -10784,14 +10674,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@4.3.1: + shiki@3.23.0: dependencies: - '@shikijs/core': 4.3.1 - '@shikijs/engine-javascript': 4.3.1 - '@shikijs/engine-oniguruma': 4.3.1 - '@shikijs/langs': 4.3.1 - '@shikijs/themes': 4.3.1 - '@shikijs/types': 4.3.1 + '@shikijs/core': 3.23.0 + '@shikijs/engine-javascript': 3.23.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -10815,7 +10705,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.1: + side-channel@1.1.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -10827,7 +10717,7 @@ snapshots: signal-exit@3.0.7: {} - sinon@22.1.0: + sinon@22.0.0: dependencies: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 15.4.0 @@ -10838,7 +10728,7 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.8(supports-color@8.1.1): + socket.io-adapter@2.5.6: dependencies: debug: 4.4.3(supports-color@8.1.1) ws: 8.21.0 @@ -10847,33 +10737,33 @@ snapshots: - supports-color - utf-8-validate - socket.io-client@4.8.3(supports-color@8.1.1): + socket.io-client@4.8.3: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@8.1.1) - engine.io-client: 6.6.6(supports-color@8.1.1) - socket.io-parser: 4.2.6(supports-color@8.1.1) + engine.io-client: 6.6.4 + socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.6(supports-color@8.1.1): + socket.io-parser@4.2.6: dependencies: '@socket.io/component-emitter': 3.1.2 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - socket.io@4.8.3(supports-color@8.1.1): + socket.io@4.8.3: dependencies: accepts: 1.3.8 base64id: 2.0.0 - cors: 2.8.6 + cors: 2.8.5 debug: 4.4.3(supports-color@8.1.1) - engine.io: 6.6.9(supports-color@8.1.1) - socket.io-adapter: 2.5.8(supports-color@8.1.1) - socket.io-parser: 4.2.6(supports-color@8.1.1) + engine.io: 6.6.5 + socket.io-adapter: 2.5.6 + socket.io-parser: 4.2.6 transitivePeerDependencies: - bufferutil - supports-color @@ -10883,11 +10773,11 @@ snapshots: dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) - socks: 2.8.9 + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.8.9: + socks@2.8.5: dependencies: ip-address: 10.2.0 smart-buffer: 4.2.0 @@ -10911,7 +10801,7 @@ snapshots: sprintf-js@1.1.3: {} - sql-escaper@1.5.1: {} + sql-escaper@1.3.3: {} stable-hash@0.0.5: {} @@ -10928,10 +10818,10 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - streamroller@3.1.5(supports-color@8.1.1): + streamroller@3.1.5: dependencies: date-format: 4.0.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.0 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -10944,29 +10834,28 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.trim@1.2.11: + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 - safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.10: + string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.2 + es-object-atoms: 1.1.1 string_decoder@1.1.1: dependencies: @@ -10999,7 +10888,7 @@ snapshots: formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.15.3 + qs: 6.15.2 transitivePeerDependencies: - supports-color @@ -11023,21 +10912,22 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - surrealdb@2.0.8(tslib@2.8.1)(typescript@7.0.2): + surrealdb@2.0.3(tslib@2.8.1)(typescript@6.0.3): dependencies: - '@surrealdb/sqon': 0.1.0(tslib@2.8.1)(typescript@7.0.2) + '@surrealdb/cbor': 2.0.0-alpha.4 tslib: 2.8.1 - typescript: 7.0.2 + typescript: 6.0.3 + uuidv7: 1.2.1 swagger-schema-official@2.0.0-bab6bed: {} symbol-tree@3.2.4: {} - tabbable@6.5.0: {} + tabbable@6.4.0: {} - tapable@2.3.3: {} + tapable@2.3.2: {} - tar@7.5.19: + tar@7.5.16: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -11045,25 +10935,26 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - tarn@3.1.0: {} + tarn@3.0.2: {} tdigest@0.1.2: dependencies: bintrees: 1.0.2 - tedious@20.0.0: + tedious@19.2.1(@azure/core-client@1.10.1): dependencies: '@azure/core-auth': 1.10.1 '@azure/identity': 4.13.1 - '@azure/keyvault-keys': 4.10.2 - '@js-joda/core': 6.0.1 - '@types/node': 26.1.1 + '@azure/keyvault-keys': 4.10.0(@azure/core-client@1.10.1) + '@js-joda/core': 5.7.0 + '@types/node': 26.0.0 bl: 6.1.6 - iconv-lite: 0.7.3 + iconv-lite: 0.7.2 js-md4: 0.3.2 native-duplexpair: 1.0.0 sprintf-js: 1.1.3 transitivePeerDependencies: + - '@azure/core-client' - supports-color tiny-inflate@1.0.3: {} @@ -11076,16 +10967,16 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinyrainbow@3.1.0: {} - tldts-core@7.4.6: {} + tldts-core@7.0.29: {} - tldts@7.4.6: + tldts@7.0.29: dependencies: - tldts-core: 7.4.6 + tldts-core: 7.0.29 to-regex-range@5.0.1: dependencies: @@ -11095,7 +10986,7 @@ snapshots: tough-cookie@6.0.1: dependencies: - tldts: 7.4.6 + tldts: 7.0.29 tr46@0.0.3: {} @@ -11111,18 +11002,18 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@7.0.2): + ts-api-utils@1.4.3(typescript@6.0.3): dependencies: - typescript: 7.0.2 + typescript: 6.0.3 ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 - ts-declaration-location@1.0.7(typescript@7.0.2): + ts-declaration-location@1.0.7(typescript@6.0.3): dependencies: - picomatch: 4.0.5 - typescript: 7.0.2 + picomatch: 4.0.4 + typescript: 6.0.3 tsconfig-paths@3.15.0: dependencies: @@ -11135,7 +11026,7 @@ snapshots: tsscmp@1.0.6: {} - tsx@4.23.1: + tsx@4.22.4: dependencies: esbuild: 0.28.1 optionalDependencies: @@ -11153,6 +11044,12 @@ snapshots: type-fest@4.41.0: {} + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + type-is@2.1.0: dependencies: content-type: 2.0.0 @@ -11183,7 +11080,7 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.8: + typed-array-length@1.0.7: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -11194,44 +11091,21 @@ snapshots: typescript@6.0.3: {} - typescript@7.0.2: - optionalDependencies: - '@typescript/typescript-aix-ppc64': 7.0.2 - '@typescript/typescript-darwin-arm64': 7.0.2 - '@typescript/typescript-darwin-x64': 7.0.2 - '@typescript/typescript-freebsd-arm64': 7.0.2 - '@typescript/typescript-freebsd-x64': 7.0.2 - '@typescript/typescript-linux-arm': 7.0.2 - '@typescript/typescript-linux-arm64': 7.0.2 - '@typescript/typescript-linux-loong64': 7.0.2 - '@typescript/typescript-linux-mips64el': 7.0.2 - '@typescript/typescript-linux-ppc64': 7.0.2 - '@typescript/typescript-linux-riscv64': 7.0.2 - '@typescript/typescript-linux-s390x': 7.0.2 - '@typescript/typescript-linux-x64': 7.0.2 - '@typescript/typescript-netbsd-arm64': 7.0.2 - '@typescript/typescript-netbsd-x64': 7.0.2 - '@typescript/typescript-openbsd-arm64': 7.0.2 - '@typescript/typescript-openbsd-x64': 7.0.2 - '@typescript/typescript-sunos-x64': 7.0.2 - '@typescript/typescript-win32-arm64': 7.0.2 - '@typescript/typescript-win32-x64': 7.0.2 - - ueberdb2@6.1.16(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.9.0)(dirty-ts@1.1.8)(mongodb@7.4.0(socks@2.8.9))(mssql@12.7.0)(mysql2@3.23.1(@types/node@26.1.1))(nano@11.0.6)(pg@8.22.0)(redis@6.1.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.8(tslib@2.8.1)(typescript@7.0.2)): + ueberdb2@6.1.13(@elastic/elasticsearch@9.4.2)(async@3.2.6)(cassandra-driver@4.8.0)(dirty-ts@1.1.8)(mongodb@7.3.0)(mssql@12.5.5(@azure/core-client@1.10.1))(mysql2@3.22.5(@types/node@26.0.0))(nano@11.0.5)(pg@8.22.0)(redis@6.0.0(@opentelemetry/api@1.9.1))(rethinkdb@2.4.2)(rusty-store-kv@1.3.1)(surrealdb@2.0.3(tslib@2.8.1)(typescript@6.0.3)): optionalDependencies: '@elastic/elasticsearch': 9.4.2 async: 3.2.6 - cassandra-driver: 4.9.0 + cassandra-driver: 4.8.0 dirty-ts: 1.1.8 - mongodb: 7.4.0(socks@2.8.9) - mssql: 12.7.0 - mysql2: 3.23.1(@types/node@26.1.1) - nano: 11.0.6 + mongodb: 7.3.0 + mssql: 12.5.5(@azure/core-client@1.10.1) + mysql2: 3.22.5(@types/node@26.0.0) + nano: 11.0.5 pg: 8.22.0 - redis: 6.1.0(@opentelemetry/api@1.9.1) + redis: 6.0.0(@opentelemetry/api@1.9.1) rethinkdb: 2.4.2 rusty-store-kv: 1.3.1 - surrealdb: 2.0.8(tslib@2.8.1)(typescript@7.0.2) + surrealdb: 2.0.3(tslib@2.8.1)(typescript@6.0.3) uid-safe@2.1.5: dependencies: @@ -11246,15 +11120,15 @@ snapshots: underscore@1.13.8: {} - undici-types@6.21.0: {} + undici-types@5.26.5: {} - undici-types@7.28.0: {} + undici-types@7.24.5: {} undici-types@8.3.0: {} - undici@7.28.0: {} + undici@7.27.2: {} - undici@8.9.0: {} + undici@8.5.0: {} unicode-properties@1.4.1: dependencies: @@ -11276,6 +11150,10 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -11303,11 +11181,13 @@ snapshots: universalify@2.0.1: {} + unorm@1.6.0: {} + unpipe@1.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.5): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.5 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -11319,24 +11199,24 @@ snapshots: url-join@4.0.1: {} - use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.8): + use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7): dependencies: - react: 19.2.8 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.17 - use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.8): + use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.7): dependencies: detect-node-es: 1.1.0 - react: 19.2.8 + react: 19.2.7 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.17 - use-sync-external-store@1.6.0(react@19.2.8): + use-sync-external-store@1.6.0(react@19.2.7): dependencies: - react: 19.2.8 + react: 19.2.7 util-deprecate@1.0.2: {} @@ -11349,7 +11229,7 @@ snapshots: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-message@4.0.3: + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -11357,7 +11237,7 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.3 + vfile-message: 4.0.2 virtual-dom@2.1.1: dependencies: @@ -11370,60 +11250,48 @@ snapshots: x-is-array: 0.1.0 x-is-string: 0.1.0 - vite-plugin-babel@1.7.3(@babel/core@8.0.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)): + vite-plugin-babel@1.7.3(@babel/core@7.29.7)(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)): dependencies: - '@babel/core': 8.0.1 - vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + '@babel/core': 7.29.7 + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) - vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1): + vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4): dependencies: lightningcss: 1.32.0 - picomatch: 4.0.5 - postcss: 8.5.16 - rolldown: 1.1.5 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.1.1 + '@types/node': 26.0.0 esbuild: 0.28.1 fsevents: 2.3.3 - tsx: 4.23.1 + tsx: 4.22.4 - vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1): + vitepress@2.0.0-alpha.17(@types/node@26.0.0)(change-case@5.4.4)(esbuild@0.28.1)(jwt-decode@4.0.0)(oxc-minify@0.137.0)(postcss@8.5.15)(tsx@4.22.4)(typescript@6.0.3): dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.5 - postcss: 8.5.23 - rolldown: 1.1.5 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 26.1.1 - esbuild: 0.28.1 - fsevents: 2.3.3 - tsx: 4.23.1 - - vitepress@2.0.0-alpha.18(@types/node@26.1.1)(change-case@5.4.4)(esbuild@0.28.1)(jwt-decode@4.0.0)(postcss@8.5.16)(tsx@4.23.1)(typescript@6.0.3): - dependencies: - '@docsearch/css': 4.6.3 - '@docsearch/js': 4.6.3 - '@docsearch/sidepanel-js': 4.6.3 - '@iconify-json/simple-icons': 1.2.89 - '@shikijs/core': 4.3.1 - '@shikijs/transformers': 4.3.1 - '@shikijs/types': 4.3.1 + '@docsearch/css': 4.6.0 + '@docsearch/js': 4.6.0 + '@docsearch/sidepanel-js': 4.6.0 + '@iconify-json/simple-icons': 1.2.74 + '@shikijs/core': 3.23.0 + '@shikijs/transformers': 3.23.0 + '@shikijs/types': 3.23.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.7(vite@8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1))(vue@3.5.39(typescript@6.0.3)) - '@vue/devtools-api': 8.1.5 - '@vue/shared': 3.5.39 - '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3)) - '@vueuse/integrations': 14.3.0(change-case@5.4.4)(focus-trap@8.2.2)(jwt-decode@4.0.0)(vue@3.5.39(typescript@6.0.3)) - focus-trap: 8.2.2 + '@vitejs/plugin-vue': 6.0.5(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4))(vue@3.5.30(typescript@6.0.3)) + '@vue/devtools-api': 8.1.0 + '@vue/shared': 3.5.30 + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.3)) + '@vueuse/integrations': 14.2.1(change-case@5.4.4)(focus-trap@8.0.0)(jwt-decode@4.0.0)(vue@3.5.30(typescript@6.0.3)) + focus-trap: 8.0.0 mark.js: 8.11.1 minisearch: 7.2.0 - shiki: 4.3.1 - vite: 8.1.4(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) - vue: 3.5.39(typescript@6.0.3) + shiki: 3.23.0 + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) + vue: 3.5.30(typescript@6.0.3) optionalDependencies: - postcss: 8.5.16 + oxc-minify: 0.137.0 + postcss: 8.5.15 transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -11450,42 +11318,44 @@ snapshots: - universal-cookie - yaml - vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.0.0)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)): dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.3.0 - expect-type: 1.4.0 + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.3 pathe: 2.0.3 - picomatch: 4.0.5 + picomatch: 4.0.4 std-env: 4.1.0 tinybench: 2.9.0 tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(tsx@4.23.1) + vite: 8.0.16(@types/node@26.0.0)(esbuild@0.28.1)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 26.1.1 + '@types/node': 26.0.0 jsdom: 29.1.1(@noble/hashes@1.8.0) transitivePeerDependencies: - msw - vue@3.5.39(typescript@6.0.3): + void-elements@3.1.0: {} + + vue@3.5.30(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.39 - '@vue/compiler-sfc': 3.5.39 - '@vue/runtime-dom': 3.5.39 - '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@6.0.3)) - '@vue/shared': 3.5.39 + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-sfc': 3.5.30 + '@vue/runtime-dom': 3.5.30 + '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@6.0.3)) + '@vue/shared': 3.5.30 optionalDependencies: typescript: 6.0.3 @@ -11512,7 +11382,7 @@ snapshots: whatwg-url@16.0.1(@noble/hashes@1.8.0): dependencies: - '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + '@exodus/bytes': 1.15.0(@noble/hashes@1.8.0) tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -11534,7 +11404,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.2.0 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -11545,7 +11415,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.22 + which-typed-array: 1.1.20 which-collection@1.0.2: dependencies: @@ -11554,7 +11424,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.22: + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -11615,6 +11485,8 @@ snapshots: y18n@5.0.8: {} + yallist@3.1.1: {} + yallist@5.0.0: {} yaml-ast-parser@0.0.43: {} @@ -11628,7 +11500,7 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@17.7.3: + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -11640,16 +11512,16 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.4.3): + zod-validation-error@4.0.2(zod@4.3.6): dependencies: - zod: 4.4.3 + zod: 4.3.6 - zod@4.4.3: {} + zod@4.3.6: {} - zustand@5.0.14(@types/react@19.2.17)(react@19.2.8)(use-sync-external-store@1.6.0(react@19.2.8)): + zustand@5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): optionalDependencies: '@types/react': 19.2.17 - react: 19.2.8 - use-sync-external-store: 1.6.0(react@19.2.8) + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a23cc8768..3e6b40fbf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -44,36 +44,3 @@ overrides: uuid@<14.0.0: '>=14.0.0' vite@>=7.0.0 <7.3.2: '>=7.3.2' ws@>=8.0.0 <8.21.0: '>=8.21.0' -minimumReleaseAgeExclude: - - '@radix-ui/primitive@1.1.5' - - '@radix-ui/react-collection@1.1.12' - - '@radix-ui/react-context@1.2.0' - - '@radix-ui/react-dialog@1.1.19' - - '@radix-ui/react-dismissable-layer@1.1.15' - - '@radix-ui/react-focus-scope@1.1.12' - - '@radix-ui/react-presence@1.1.7' - - '@radix-ui/react-toast@1.2.19' - - mysql2@3.22.6 - - oidc-provider@9.9.0 - - sql-escaper@1.4.0 - - '@typescript/typescript-aix-ppc64@7.0.2' - - '@typescript/typescript-darwin-arm64@7.0.2' - - '@typescript/typescript-darwin-x64@7.0.2' - - '@typescript/typescript-freebsd-arm64@7.0.2' - - '@typescript/typescript-freebsd-x64@7.0.2' - - '@typescript/typescript-linux-arm64@7.0.2' - - '@typescript/typescript-linux-arm@7.0.2' - - '@typescript/typescript-linux-loong64@7.0.2' - - '@typescript/typescript-linux-mips64el@7.0.2' - - '@typescript/typescript-linux-ppc64@7.0.2' - - '@typescript/typescript-linux-riscv64@7.0.2' - - '@typescript/typescript-linux-s390x@7.0.2' - - '@typescript/typescript-linux-x64@7.0.2' - - '@typescript/typescript-netbsd-arm64@7.0.2' - - '@typescript/typescript-netbsd-x64@7.0.2' - - '@typescript/typescript-openbsd-arm64@7.0.2' - - '@typescript/typescript-openbsd-x64@7.0.2' - - '@typescript/typescript-sunos-x64@7.0.2' - - '@typescript/typescript-win32-arm64@7.0.2' - - '@typescript/typescript-win32-x64@7.0.2' - - typescript@7.0.2 diff --git a/settings.json.template b/settings.json.template index 5c01460a6..5f5ae29f2 100644 --- a/settings.json.template +++ b/settings.json.template @@ -966,14 +966,6 @@ "sso": { "issuer": "${SSO_ISSUER:http://localhost:9001}", - /* - * Signing keys for the embedded OIDC provider's cookies. Leave empty and - * Etherpad derives a secret key from the persisted session secret - * (SESSIONKEY.txt), which is stable across restarts and shared across - * horizontally-scaled pods. Set an explicit ordered array to rotate: the - * first key signs, the rest are still accepted for verify. - */ - "cookieKeys": ["${OIDC_COOKIE_KEY:}"], "clients": [ { "client_id": "${ADMIN_CLIENT:admin_client}", diff --git a/src/locales/ar.json b/src/locales/ar.json index 907920f12..882e1e618 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -124,7 +124,7 @@ "pad.importExport.exportword": "مايكروسوفت وورد", "pad.importExport.exportpdf": "صيغة المستندات المحمولة", "pad.importExport.exportopen": "ODF (نسق المستند المفتوح)", - "pad.importExport.noConverter.innerHTML": "يمكنك استيراد النصوص العادية، وملفات HTML، وملفات Microsoft Word (.docx)، وملفات Etherpad مباشرةً. لاستيراد تنسيقات أخرى مثل PDF، وODT، وDOC، وRTF، يحتاج مسؤول الخادم إلى تثبيت LibreOffice - راجع وثائق Etherpad .", + "pad.importExport.noConverter.innerHTML": "لا يمكنك الاستيراد إلا من تنسيقات النصوص العادية أو تنسيقات HTML. لمزيد من ميزات الاستيراد المتقدمة، يرجى تثبيت LibreOffice .", "pad.modals.connected": "متصل.", "pad.modals.reconnecting": "إعادة الاتصال ببادك..", "pad.modals.forcereconnect": "فرض إعادة الاتصال", diff --git a/src/locales/cs.json b/src/locales/cs.json index 7b73fc01f..e5f73c784 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -16,80 +16,13 @@ ] }, "admin.page-title": "Ovládací panel Správce - Etherpad", - "admin.loading": "Načítám…", - "admin.loading_description": "Počkejte prosím, než se stránka načte.", - "admin.toggle_sidebar": "Přepnout postranní panel", - "admin.shout": "Komunikace", - "admin_shout.online_one": "Aktuálně je online {{count}} uživatelů", - "admin_shout.online_other": "Aktuálně je online {{count}} uživatelů", - "admin_shout.sticky_toggle": "Změnit připevněnou zprávu", - "admin_login.title": "Etherpad", - "admin_login.username": "Uživatelské jméno", - "admin_login.password": "Heslo", - "admin_login.submit": "Přihlásit se", - "admin_login.failed": "Přihlášení se nezdařilo", - "admin_pads.all_pads": "Všechny Pady", - "admin_pads.bulk.cleanup_history": "Vyčistit historii", - "admin_pads.bulk.clear_selection": "Vymazat výběr", - "admin_pads.bulk.delete": "Smazat", - "admin_pads.cancel": "Zrušit", - "admin_pads.col.pad": "Pad", - "admin_pads.col.revisions": "Revize", - "admin_pads.col.users": "Uživatelé", - "admin_pads.confirm_button": "OK", - "admin_pads.create_pad_dialog_description": "Vyberte název pro nový Pad.", - "admin_pads.delete_pad_dialog_description": "Potvrdit nebo zrušit smazání Padu.", - "admin_pads.delete_pad_dialog_title": "Smazat pad", - "admin_pads.empty_never_edited": "prázdné · nikdy neupravené", - "admin_pads.error_dialog_description": "Došlo k chybě.", - "admin_pads.error_prefix": "Chyba", - "admin_pads.filter.active": "Aktivní", - "admin_pads.filter.all": "Vše", - "admin_pads.filter.empty": "Prázdné", - "admin_pads.filter.recent": "Tento týden", - "admin_pads.filter.stale": "Zastaralé (>1 rok)", - "admin_pads.open": "Otevřít", - "admin_pads.pagination.next": "Další", - "admin_pads.pagination.previous": "Předchozí", - "admin_pads.refresh": "Obnovit", - "admin_pads.relative.days": "před {{count}} dny", - "admin_pads.relative.hours": "před {{count}}h", - "admin_pads.relative.just_now": "právě teď", - "admin_pads.relative.minutes": "před {{count}} minutami", - "admin_pads.relative.months": "před {{count}} měsíci", - "admin_pads.relative.weeks": "před {{count}} týdny", - "admin_pads.relative.years": "před {{count}} lety", - "admin_pads.revisions_count": "{{count}} revizí", - "admin_pads.selected_count": "Vybráno {{count}}", - "admin_pads.show": "Zobrazit", - "admin_pads.sort.name": "Jméno (A–Z)", - "admin_pads.sort.revision_number": "Revize", - "admin_pads.sort.user_count": "Uživatelé", - "admin_pads.stats.across_pads": "napříč všemi pady", - "admin_pads.stats.active_users": "Aktivní uživatelé", - "admin_pads.stats.empty_pads": "Prázdné pady", - "admin_pads.stats.last_activity": "Poslední aktivita:", - "admin_pads.stats.no_active_users": "Žádní aktivní uživatelé", - "admin_pads.stats.revisions_zero": "0 revizí", - "admin_pads.stats.total": "Celkový počet padů", - "admin_pads.stats.users_active": "{{count}} aktuálně aktivních", - "admin_pads.subtitle": "Přehled všech padů na této instanci Etherpadu. Vyhledat, vyčistit, otevřít.", "admin_plugins": "Správce zásuvných moodulů", "admin_plugins.available": "Dostupné zásuvné moduly", "admin_plugins.available_not-found": "Nejsou žádné zásuvné moduly", "admin_plugins.available_fetching": "Načítání...", "admin_plugins.available_install.value": "Instalovat", "admin_plugins.available_search.placeholder": "Vyhledat zásuvné moduly k instalaci", - "admin_plugins.check_updates": "Zkontrolovat aktualizace", - "admin_plugins.core_count": "{{count}} jádro", - "admin_plugins.catalog_disabled": "Katalog pluginů je zakázán vaším operátorem (privacy.pluginCatalog=false). Chcete-li plugin nainstalovat, spusťte příkaz `pnpm run plugins i ep_ ` ze serveru.", - "admin_plugins.crumbs": "Pluginy", "admin_plugins.description": "Popis", - "admin_plugins.disables.label": "Vypnuto:", - "admin_plugins.disables.warning_title": "Tento plugin záměrně odstraňuje uvedené funkce Etherpadu.", - "admin_plugins.error_retrieving": "Chyba při načítání pluginů", - "admin_plugins.install_error": "Instalace pluginu {{plugin}} se nezdařila: {{error}}", - "admin_plugins.install_error_requires_newer_etherpad": "Nelze nainstalovat {{plugin}}: vyžaduje novější verzi Etherpadu. Prosím, aktualizujte Etherpad a zkuste to znovu.", "admin_plugins.installed": "Nainstalované zásuvné moduly", "admin_plugins.installed_fetching": "Načítání instalovaných zásuvných modulů...", "admin_plugins.installed_nothing": "Dosud jste nenainstalovali žádné zásuvné moduly.", @@ -97,61 +30,23 @@ "admin_plugins.last-update": "Poslední aktualizace", "admin_plugins.name": "Název", "admin_plugins.page-title": "Správce zásuvných modulů - Etherpad", - "admin_plugins.reload_catalog": "Obnovit katalog", - "admin_plugins.search_npm": "Hledat na npm", - "admin_plugins.sort_ascending": "Seřadit vzestupně", - "admin_plugins.sort_descending": "Seřadit sestupně", - "admin_plugins.sort.last_updated": "Naposledy aktualizováno", - "admin_plugins.sort.name": "Jméno (A–Z)", - "admin_plugins.sort.version": "Verze", - "admin_plugins.source": "Zdroj pluginu", - "admin_plugins.subtitle": "Instalace, aktualizace a odebrání pluginů Etherpad. Změny vyžadují restart serveru.", - "admin_plugins.tag_core": "Jádro", - "admin_plugins.update_tooltip": "Aktualizovat", - "admin_plugins.updates_available": "Dostupné aktualizace", - "admin_plugins.update_now": "Aktualizovat", "admin_plugins.version": "Verze", "admin_plugins_info": "Informace o řešení problému", - "admin_plugins_info.bindings_label": "{{count}} vazeb", - "admin_plugins_info.copy_diagnostics": "Diagnostika kopírování", - "admin_plugins_info.copy_value": "Kopírovat {{label}}", - "admin_plugins_info.git_sha": "SHA v Gitu", "admin_plugins_info.hooks": "Instalované hooks", "admin_plugins_info.hooks_client": "hooks na straně klienta", "admin_plugins_info.hooks_server": "hooks na straně serveru", "admin_plugins_info.parts": "Nainstalované součásti", "admin_plugins_info.plugins": "Nainstalované zásuvné moduly", "admin_plugins_info.page-title": "Informace o zásuvných modulech - Etherpad", - "admin_plugins_info.tab_client": "Klient", - "admin_plugins_info.tab_server": "Server", - "admin_plugins_info.up_to_date": "Aktuální", - "admin_plugins_info.update_available": "Aktualizace k dispozici: {{version}}", "admin_plugins_info.version": "Verze Etherpad", "admin_plugins_info.version_latest": "Poslední dostupná verze", "admin_plugins_info.version_number": "Číslo verze", "admin_settings": "Nastavení", - "admin_settings.create_pad": "Vytvořit pad", "admin_settings.current": "Aktuální konfugurace", "admin_settings.current_example-devel": "Příklad ukázkové vývojové šablony", "admin_settings.current_example-prod": "Příklad šablony nastavení výroby", "admin_settings.current_restart.value": "Restartovat Etherpad", "admin_settings.current_save.value": "Uložit nastavení", - "admin_settings.invalid_json": "Neplatný JSON", - "admin_settings.current_test.value": "Ověření JSON", - "admin_settings.current_prettify.value": "Zkrášlit JSON", - "admin_settings.toast.saved": "Nastavení bylo úspěšně uloženo.", - "admin_settings.toast.save_failed": "Uložení se nezdařilo: soubor settings.json se nepodařilo zapsat.", - "admin_settings.toast.json_invalid": "Syntaktická chyba: zkontrolujte čárky, závorky a uvozovky.", - "admin_settings.toast.disconnected": "Nelze uložit: nejsem připojen k serveru.", - "admin_settings.toast.validation_ok": "JSON je platný.", - "admin_settings.toast.validation_failed": "JSON je neplatný: opravte syntaktické chyby.", - "admin_settings.toast.prettify_failed": "Nelze upravovat: nejprve opravte syntaktické chyby.", - "admin_settings.prettify_confirm": "Zkrášlováním odstraníte všechny komentáře. Pokračovat?", - "admin_settings.mode.form": "Formulář", - "admin_settings.mode.effective": "Efektivní", - "admin_settings.mode.effective_tooltip": "Zobrazení hodnot, které Etherpad aktuálně používá, pouze pro čtení, po substituci proměnných prostředí. Tajné kódy jsou redigovány.", - "admin_settings.mode.aria_label": "Režim editoru", - "admin_settings.envvar_banner.title": "Tento soubor je šablona, nikoli živá konfigurace.", "admin_settings.page-title": "Nastavení - Etherpad", "index.newPad": "Založ nový Pad", "index.settings": "Nastavení", diff --git a/src/locales/fr.json b/src/locales/fr.json index a32f6381e..ae4910385 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -7,7 +7,6 @@ "Chpol", "Cquoi", "Crochet.david", - "Crowwhailord", "Derugon", "Envlh", "Framafan", @@ -260,7 +259,7 @@ "pad.importExport.exportetherpada.title": "Exporter au format Etherpad", "pad.importExport.exporthtmla.title": "Exporter au format HTML", "pad.importExport.exportplaina.title": "Exporter en texte brut", - "pad.importExport.noConverter.innerHTML": "Vous pouvez importer directement du texte brut, du HTML,Microsoft Word (.docx) et des fichiers Etherpad. Pour importer d'autres formats tels que PDF, ODT, DOC ou RTF, l'administrateur du serveur doit installer LibreOffice ; consultez la documentation Etherpad .", + "pad.importExport.noConverter.innerHTML": "Vous pouvez uniquement importer du texte brut ou du HTML. Pour des fonctionnalités d'importation plus avancées, veuillez installer LibreOffice.", "pad.modals.connected": "Connecté.", "pad.modals.reconnecting": "Reconnexion à votre bloc-notes en cours...", "pad.modals.forcereconnect": "Forcer la reconnexion", diff --git a/src/locales/it.json b/src/locales/it.json index f02c55c33..e485e82c3 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -302,7 +302,7 @@ "pad.importExport.exportworda.title": "Esporta come Microsoft Word", "pad.importExport.exportpdfa.title": "Esporta in formato PDF", "pad.importExport.exportopena.title": "Esporta in formato ODF (Open Document Format)", - "pad.importExport.noConverter.innerHTML": "È possibile importare direttamente file di testo semplice, HTML, Microsoft Word (.docx) e file Etherpad. Per importare altri formati come PDF, ODT, DOC o RTF, l'amministratore del server deve installare LibreOffice: consulta la documentazione di Etherpad.", + "pad.importExport.noConverter.innerHTML": "È possibile importare solo file di testo semplice o in formato HTML. Per funzionalità di importazione più avanzate, si prega di installare LibreOffice .", "pad.modals.connected": "Connesso.", "pad.modals.reconnecting": "Riconnessione al pad in corso…", "pad.modals.forcereconnect": "Forza la riconnessione", diff --git a/src/locales/ja.json b/src/locales/ja.json index 5003a5ddd..54bec1704 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -6,7 +6,6 @@ "Chqaz", "Omotecho", "Shirayuki", - "Tensama0415", "Torinky" ] }, @@ -31,7 +30,7 @@ "admin_plugins_info.hooks_client": "クライアント側のフック", "admin_plugins_info.hooks_server": "サーバー側のフック", "index.newPad": "新規作成", - "index.createOpenPad": "編集するパッド名を入力", + "index.createOpenPad": "または作成/編集するパッド名を入力:", "index.openPad": "次の名称の既存の Pad を開く:", "pad.toolbar.bold.title": "太字 (Ctrl+B)", "pad.toolbar.italic.title": "斜体 (Ctrl+I)", @@ -40,7 +39,7 @@ "pad.toolbar.ol.title": "番号付きリスト (Ctrl+Shift+N)", "pad.toolbar.ul.title": "番号なしリスト (Ctrl+Shift+L)", "pad.toolbar.indent.title": "インデント (Tab)", - "pad.toolbar.unindent.title": "アウトデント (Shift+Tab)", + "pad.toolbar.unindent.title": "インデント解除 (Shift+Tab)", "pad.toolbar.undo.title": "元に戻す (Ctrl+Z)", "pad.toolbar.redo.title": "やり直し (Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "作者の色分けを消去(Ctrl+Shift+C)", @@ -55,7 +54,7 @@ "pad.loading": "読み込み中...", "pad.noCookie": "Cookie could not be found. Please allow cookies in your browser! Your session and settings will not be saved between visits. \n\nクッキーが見つかりません。ブラウザの設定でクッキーの使用を許可するまで、アクセスの記録や設定は引き継がれません。原因はブラウザによって Etherpad が iFrame に組み込まれたからと考えられます。親ドメインの iFrame と同じドメイン/サブドメインに置かれているかどうか、Etherpad の設定を確認してください。", "pad.permissionDenied": "あなたにはこのパッドへのアクセス許可がありません", - "pad.settings.padSettings": "全パッドの設定", + "pad.settings.padSettings": "パッドの設定", "pad.settings.myView": "個人設定", "pad.settings.stickychat": "画面にチャットを常に表示", "pad.settings.chatandusers": "チャットとユーザーを表示", @@ -78,7 +77,7 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.modals.connected": "接続されました。", - "pad.modals.reconnecting": "パッドに再接続中…", + "pad.modals.reconnecting": "パッドに再接続中...", "pad.modals.forcereconnect": "強制的に再接続", "pad.modals.reconnecttimer": "再接続を試行中", "pad.modals.cancel": "中止", diff --git a/src/locales/ko.json b/src/locales/ko.json index b7fe03e71..33d1105d7 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -145,14 +145,14 @@ "admin_settings.current_save.value": "설정 저장", "admin_settings.invalid_json": "잘못된 JSON", "admin_settings.current_test.value": "JSON 검증", - "admin_settings.current_prettify.value": "JSON를 보기 좋게 정리", + "admin_settings.current_prettify.value": "JSON 정리", "admin_settings.toast.saved": "설정을 성공적으로 저장했습니다.", "admin_settings.toast.save_failed": "저장 실패: settings.json에 쓰기 할 수 없습니다.", "admin_settings.toast.json_invalid": "구문 오류: 쉼표, 중괄호, 따옴표를 확인하세요.", "admin_settings.toast.disconnected": "저장할 수 없음: 서버에 연결되어 있지 않습니다.", "admin_settings.toast.validation_ok": "JSON이 유효합니다.", "admin_settings.toast.validation_failed": "JSON이 유효하지 않습니다. 구문 오류를 수정하세요.", - "admin_settings.toast.prettify_failed": "보기 좋게 정리할 수 없습니다. 먼저 구문 오류를 수정하세요.", + "admin_settings.toast.prettify_failed": "정리할 수 없습니다. 먼저 구문 오류를 수정하세요.", "admin_settings.prettify_confirm": "정리하면 모든 의견이 제거됩니다. 계속하시겠습니까?", "admin_settings.mode.form": "형태", "admin_settings.mode.raw": "원본", @@ -325,7 +325,7 @@ "pad.importExport.exportworda.title": "Microsoft Word 파일로 내보내기", "pad.importExport.exportpdfa.title": "PDF로 내보내기", "pad.importExport.exportopena.title": "ODF(Open Document Format) 형식으로 내보내기", - "pad.importExport.noConverter.innerHTML": "일반 텍스트, HTML, 마이크로소프트 워드 (.docx) 또는 이더패드 파일을 직접 가져올 수 있습니다. PDF, ODT, DOC 또는 RTF와 같은 다른 형식을 가져오려면 서버 관리자가 리브레오피스를 설치해야 합니다. 자세한 내용은 이더패드 설명서를 참고하세요.", + "pad.importExport.noConverter.innerHTML": "일반 텍스트나 HTML 형식으로만 가져올 수 있습니다. 고급 가져오기 기능에 대해서는 리브레오피스를 설치하세요.", "pad.modals.connected": "연결함.", "pad.modals.reconnecting": "내 패드에 다시 연결하는 중...", "pad.modals.forcereconnect": "강제로 다시 연결", diff --git a/src/locales/lb.json b/src/locales/lb.json index 92635e6be..b868f6307 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -56,11 +56,8 @@ "admin_plugins_info.version_latest": "Lescht disponibel Versioun", "admin_plugins_info.version_number": "Versiounsnummer", "admin_settings": "Astellungen", - "admin_settings.current": "Aktuell Konfiguratioun", "admin_settings.current_save.value": "Astellunge späicheren", "admin_settings.invalid_json": "Ongültegen JSON", - "admin_settings.toast.validation_ok": "Den JSON ass gülteg.", - "admin_settings.toast.validation_failed": "Den JSON ass ongülteg: Verbessert wgl. d'Syntaxfeeler.", "admin_settings.toast.auth_error": "Dir sidd net als Admin authentifizéiert. Loggt Iech wgl. nei an.", "admin_settings.env_pill.runtime_label": "aktive Wäert", "admin_settings.page-title": "Astellungen - Etherpad", @@ -71,7 +68,6 @@ "index.newPad": "Neie Pad", "index.settings": "Astellungen", "index.copyLink": "2. Link kopéieren", - "index.copyLinkDescription": "Klickt op de Knäppchen ënnen, fir de Link an Ären Tëschespäicher ze kopéieren.", "index.copyLinkButton": "Link an den Tëschespäicher kopéieren", "index.createOpenPad": "oder maacht ee Pad mat dësem Numm op:", "pad.toolbar.bold.title": "Fett (Strg-B)", diff --git a/src/locales/nah.json b/src/locales/nah.json index a3ee77470..a5c40db10 100644 --- a/src/locales/nah.json +++ b/src/locales/nah.json @@ -28,17 +28,17 @@ "pad.modals.cancel": "Xikxolewa", "pad.modals.deleted": "Omopohpoloh.", "pad.modals.deleted.explanation": "Ōmopoloh inīn Pad.", - "timeslider.version": "Inic {{version}} Tlacepaliztli", - "timeslider.month.january": "Enero", - "timeslider.month.february": "Febrero", - "timeslider.month.march": "Marzo", - "timeslider.month.april": "Abril", - "timeslider.month.may": "Mayo", - "timeslider.month.june": "Junio", - "timeslider.month.july": "Julio", - "timeslider.month.august": "Agosto", - "timeslider.month.september": "Septiembre", - "timeslider.month.october": "Octubre", - "timeslider.month.november": "Noviembre", - "timeslider.month.december": "Diciembre" + "timeslider.version": "Inīc {{version}} Cuepaliztli", + "timeslider.month.january": "Eneroh", + "timeslider.month.february": "Febreroh", + "timeslider.month.march": "Marsoh", + "timeslider.month.april": "April", + "timeslider.month.may": "Mayoh", + "timeslider.month.june": "Honioh", + "timeslider.month.july": "Holioh", + "timeslider.month.august": "Ahostoh", + "timeslider.month.september": "Septiempreh", + "timeslider.month.october": "Oktopreh", + "timeslider.month.november": "Noviempreh", + "timeslider.month.december": "Tisiempreh" } diff --git a/src/locales/ne.json b/src/locales/ne.json index bea3e2eac..9ba6b3f6e 100644 --- a/src/locales/ne.json +++ b/src/locales/ne.json @@ -11,243 +11,12 @@ "हिमाल सुबेदी" ] }, - "admin.page-title": "प्रबन्धक ड्यासबोर्ड - इथरप्याड", - "admin.loading": "लोड हुँदैछ...", - "admin.loading_description": "कृपया पृष्ठ लोड हुदै गर्दा प्रतिक्षा गर्नुहोस् ।", - "admin.toggle_sidebar": "छेउपट्टी टगल गर्नुहोस्", - "admin.shout": "सञ्चार", - "admin_shout.online_one": "हाल {{count}} प्रयोगकर्ता अनलाइन छ", - "admin_shout.online_other": "हाल {{count}} प्रयोगकर्ताहरू अनलाइन छन्", - "admin_shout.sticky_toggle": "टाँसिने सन्देश परिवर्तन गर्नुहोस्", - "admin_login.title": "इथरप्याड", - "admin_login.username": "प्रयोगकर्ता नाम", - "admin_login.password": "पासवर्ड", - "admin_login.submit": "लगइन", - "admin_login.failed": "लगइन असफल भयो", - "admin_pads.all_pads": "सबै प्याडहरू", - "admin_pads.bulk.cleanup_history": "इतिहास खाली गर्नुहोस्", - "admin_pads.bulk.clear_selection": "चयन खाली गर्नुहोस्", - "admin_pads.bulk.delete": "मेट्नुहोस्", - "admin_pads.cancel": "रद्द गर्नुहोस्", - "admin_pads.col.pad": "प्याड", - "admin_pads.col.revisions": "संशोधनहरू", - "admin_pads.col.users": "प्रयोगकर्ताहरू", - "admin_pads.confirm_button": "ठीक छ", - "admin_pads.create_pad_dialog_description": "नयाँ प्याडका लागि नाम रोज्नुहोस् ।", - "admin_pads.delete_pad_dialog_description": "प्याड मेटाइ यकीन गर्नुहोस् वा रद्द गर्नुहोस् ।", - "admin_pads.delete_pad_dialog_title": "प्याड मेट्नुहोस्", - "admin_pads.empty_never_edited": "खाली · कहिल्यै सम्पादन गरिएन", - "admin_pads.error_dialog_description": "एउटा त्रुटि देखापर्यो ।", - "admin_pads.error_prefix": "त्रुटि", - "admin_pads.filter.active": "सक्रिय", - "admin_pads.filter.all": "सबै", - "admin_pads.filter.empty": "खाली", - "admin_pads.filter.recent": "यो हप्ता", - "admin_pads.filter.stale": "स्थिर (>1y)", - "admin_pads.open": "खोल्नुहोस्", - "admin_pads.pagination.next": "पछिल्लो", - "admin_pads.pagination.previous": "अघिल्लो", - "admin_pads.refresh": "ताजा पार्नुहोस्", - "admin_pads.relative.days": "{{count}}दिन अगाडि", - "admin_pads.relative.hours": "{{count}}घण्टा अगाडि", - "admin_pads.relative.just_now": "अहिले", - "admin_pads.relative.minutes": "{{count}}मिनेट अगाडि", - "admin_pads.relative.months": "{{count}}mo पहिले", - "admin_pads.relative.weeks": "{{count}}w अगाडि", - "admin_pads.relative.years": "{{county}} पहिले", - "admin_pads.revisions_count": "{{count}} संशोधनहरू", - "admin_pads.selected_count": "{{count}} चयन गरियो", - "admin_pads.show": "देखाउनुहोस्", - "admin_pads.sort.name": "नाम (AZ)", - "admin_pads.sort.revision_number": "संशोधनहरू", - "admin_pads.sort.user_count": "प्रयोगकर्ताहरू", - "admin_pads.stats.across_pads": "सबै प्याडहरूमा", - "admin_pads.stats.active_users": "सक्रिय प्रयोगकर्ताहरू", - "admin_pads.stats.empty_pads": "खाली प्याडहरू", - "admin_pads.stats.last_activity": "अन्तिम क्रियाकलाप", - "admin_pads.stats.no_active_users": "सक्रिय प्रयोगकर्ता छैन", - "admin_pads.stats.revisions_zero": "0 पुनरावलोकन", - "admin_pads.stats.total": "जम्मा प्याडहरू", - "admin_pads.stats.users_active": "{{count}} हाल सक्रिय", - "admin_pads.subtitle": "यस इथरप्याड दृष्टान्तमा सबै प्याडहरूको सिंहावलोकन । खोजी गर्नुहोस्, सफा गर्नुहोस्, खोल्नुहोस् ।", - "admin_plugins": "प्लगइन प्रबन्धक", - "admin_plugins.available": "उपलब्ध प्लगइनहरू", - "admin_plugins.available_not-found": "कुनै प्लगइन फेला परेन ।", - "admin_plugins.available_fetching": "तान्दै...", - "admin_plugins.available_install.value": "स्थापना गर्नुहोस्", - "admin_plugins.available_search.placeholder": "स्थापना गर्नका लागि प्लगइन खोजी गर्नुहोस्", - "admin_plugins.check_updates": "अद्यावधिकका लागि जाँच गर्नुहोस्", - "admin_plugins.core_count": "{{count}} कोर", - "admin_plugins.catalog_disabled": "प्लगइन विवरणिका तपाईँको सञ्चालकद्वारा अक्षम पारिएको छ (privacy.pluginCatalog=false) । प्लगइन स्थापना गर्न, `pnpm run plugins i ep_` सर्भरबाट चलाउनुहोस् ।", - "admin_plugins.crumbs": "प्लगइनहरू", "admin_plugins.description": "विवरण", - "admin_plugins.disables.label": "अक्षम पार्दछ:", - "admin_plugins.disables.warning_title": "यो प्लगइनले जानेर सूचीकृत इथरप्याड सुविधाहरू हटाउँछ ।", - "admin_plugins.error_retrieving": "प्लगइन पुन: प्राप्त गर्दा त्रुटि", - "admin_plugins.install_error": "{{plugin}} स्थापना गर्न असफल: {{error}}", - "admin_plugins.install_error_requires_newer_etherpad": "{{plugin}} स्थापना गर्न सकिँदैन: यसलाई इथरप्याडको नयाँ संस्करण चाहिन्छ । कृपया इथरप्याड स्तरवृद्धि गर्नुहोस् र फेरि प्रयास गर्नुहोस् ।", - "admin_plugins.installed": "स्थापित प्लगइनहरू", - "admin_plugins.installed_fetching": "स्थापित प्लगइनहरू तान्दैछ...", - "admin_plugins.installed_nothing": "तपाईँले अहिलेसम्म कुनै पनि प्लगइन स्थापना गर्नुभएको छैन ।", - "admin_plugins.installed_uninstall.value": "स्थापना रद्द गर्नुहोस्", - "admin_plugins.last-update": "अन्तिम अद्यावधिक", "admin_plugins.name": "नाम", - "admin_plugins.page-title": "प्लगइन प्रबन्धक - इथरप्याड", - "admin_plugins.reload_catalog": "क्याटलग पुन: लोड गर्नुहोस्", - "admin_plugins.search_npm": "npm मा खोजी गर्नुहोस्", - "admin_plugins.sort_ascending": "बढ्दो क्रममा क्रमबद्ध गर्नुहोस्", - "admin_plugins.sort_descending": "घट्दो क्रममा क्रमबद्ध गर्नुहोस्", - "admin_plugins.sort.last_updated": "अन्तिम अद्यावधिक", - "admin_plugins.sort.name": "नाम (AZ)", - "admin_plugins.sort.version": "संस्करण", - "admin_plugins.source": "प्लगइन स्रोत", - "admin_plugins.subtitle": "इथरप्याड प्लगइनहरू स्थापना, अद्यावधिक, र हटाउनुहोस् । परिवर्तनका लागि सर्भर पुनः सुरु गर्नु आवश्यक हुन्छ ।", - "admin_plugins.tag_core": "कोर", - "admin_plugins.update_tooltip": "अद्यतन", - "admin_plugins.updates_available": "अद्यावधिकहरू उपलब्ध छन्", - "admin_plugins.update_now": "अद्यतन", "admin_plugins.version": "संस्करण", - "admin_plugins_info": "समस्या निवारण सूचना", - "admin_plugins_info.bindings_label": "{{count}} बाइन्डिङ", - "admin_plugins_info.copy_diagnostics": "डायग्नोस्टिक्स प्रतिलिपि गर्नुहोस्", - "admin_plugins_info.copy_value": "{{label}} प्रतिलिपि बनाउनुहोस्", - "admin_plugins_info.git_sha": "Git SHA", - "admin_plugins_info.hook_bindings": "हुक बाइन्डिङ", - "admin_plugins_info.hooks": "स्थापित हुकहरू", - "admin_plugins_info.hooks_client": "क्लाइन्ट-साइड हुक", - "admin_plugins_info.hooks_server": "सर्भर-साइड हुकहरू", - "admin_plugins_info.no_hooks": "कुनै हुक फेला परेन", - "admin_plugins_info.parts": "स्थापना गरिएका भागहरू", - "admin_plugins_info.plugins": "स्थापित प्लगइनहरू", - "admin_plugins_info.page-title": "प्लगइन सूचना - इथरप्याड", - "admin_plugins_info.search_placeholder": "हुक वा भाग खोजी गर्नुहोस्...", - "admin_plugins_info.subtitle": "प्रणाली निदान: स्थापित संस्करण, दर्ता गरिएका भागहरू र हुकहरू।", - "admin_plugins_info.tab_client": "ग्राहक", - "admin_plugins_info.tab_server": "सर्भर", - "admin_plugins_info.up_to_date": "अद्यावधिक", - "admin_plugins_info.update_available": "अद्यावधिक उपलब्ध: {{version}}", - "admin_plugins_info.version": "इथरप्याड संस्करण", - "admin_plugins_info.version_latest": "नवीनतम उपलब्ध संस्करण", - "admin_plugins_info.version_number": "संस्करण नम्बर", - "admin_settings": "सेटिङ", - "admin_settings.create_pad": "प्याड सिर्जना गर्नुहोस्", - "admin_settings.current": "हालको कन्फिगरेसन", - "admin_settings.current_example-devel": "उदाहरण विकास सेटिङ टेम्प्लेट", - "admin_settings.current_example-prod": "उदाहरण उत्पादन सेटिङ टेम्प्लेट", - "admin_settings.current_restart.value": "इथरप्याड फेरि सुरु गर्नुहोस्", - "admin_settings.current_save.value": "सेटिङ बचत गर्नुहोस्", - "admin_settings.invalid_json": "अवैध JSON", - "admin_settings.current_test.value": "JSON प्रमाणित गर्नुहोस्", - "admin_settings.current_prettify.value": "JSON सुन्दर बनाउनुहोस्", - "admin_settings.toast.saved": "सेटिङ सफलतापूर्वक बचत गरियो ।", - "admin_settings.toast.save_failed": "बचत असफल भयो: settings.json लेख्न सकिएन ।", - "admin_settings.toast.json_invalid": "वाक्य संरचना त्रुटि: अल्पविरामहरू, जुँगे कोष्ठकहरू, र उद्धरणहरू जाँच गर्नुहोस् ।", - "admin_settings.toast.disconnected": "बचत गर्न सकिँदैन: सर्भरमा जडान भएको छैन ।", - "admin_settings.toast.validation_ok": "JSON वैध छ ।", - "admin_settings.toast.validation_failed": "JSON अवैध छ: कृपया वाक्य संरचना त्रुटिहरू समाधान गर्नुहोस् ।", - "admin_settings.toast.prettify_failed": "प्रशोधन गर्न सकिँदैन: कृपया पहिले वाक्य संरचना त्रुटिहरू समाधान गर्नुहोस् ।", - "admin_settings.prettify_confirm": "सुन्दरताले सबै टिप्पणीहरू हटाउनेछ । जारी राख्नुहुन्छ ?", - "admin_settings.mode.form": "फाराम", - "admin_settings.mode.raw": "कच्चा", - "admin_settings.mode.effective": "प्रभावकारी", - "admin_settings.mode.effective_tooltip": "वातावरण-चल प्रतिस्थापन पछि, इथरप्याडले अहिले प्रयोग गरिरहेको मानहरूको पढ्ने-मात्र दृश्य । गोप्यहरू सम्पादन गरिएका छन् ।", - "admin_settings.mode.aria_label": "सम्पादक मोड", - "admin_settings.envvar_banner.title": "यो फाइल टेम्प्लेट हो, प्रत्यक्ष कन्फिग होइन ।", - "admin_settings.envvar_banner.body": "${VAR:default} जस्ता प्लेसहोल्डरहरू सुरुआतमा स्मृतिमा प्रतिस्थापन गरिन्छ; तिनीहरू कहिले पनि यो फाइलमा लेखिँदैन । समाधान गरिएको मान परिवर्तन गर्न तपाईँको वातावरणमा env vars सम्पादन गर्नुहोस् (Docker compose, systemd, .env) वा यहाँको प्लेसहोल्डरलाई शाब्दिकसँग बदल्नुहोस् । इथरप्याडले अहिले के प्रयोग गरिरहेको छ हेर्न प्रभावकारी ट्याबमा स्विच गर्नुहोस् ।", - "admin_settings.toast.auth_error": "तपाईं प्रशासकको रूपमा प्रमाणित हुनुहुन्न । कृपया पुनः लगइन गर्नुहोस् ।", - "admin_settings.section.general": "सामान्य", - "admin_settings.parse_error.title": "सेटिङ्स.json पद वर्णन गर्न सकिँदैन", - "admin_settings.parse_error.cta": "सम्पादन गर्न कच्चामा स्विच गर्नुहोस्", - "admin_settings.env_pill.tooltip": "{{variable}} परिवेश चलबाट पढिन्छ । तलको मान {{variable}} सेट नगरिएको बेला प्रयोग गरिन्छ ।", - "admin_settings.env_pill.default_label": "पूर्वनिर्धारित", - "admin_settings.env_pill.input_aria": "{{variable}}का लागि पूर्वनिर्धारित मान", - "admin_settings.env_pill.runtime_label": "सक्रिय मान", - "admin_settings.env_pill.runtime_tooltip": "इथरप्याडले हाल यो मान प्रयोग गरिरहेको छ, {{variable}} वा यसको पूर्वनिर्धारितबाट समाधान गरिएको छ ।", - "admin_settings.env_pill.redacted_tooltip": "इथरप्याडले {{variable}}का लागि एउटा मान प्रयोग गरिरहेको छ, तर यो लुकेको छ किनभने यो गोप्य छ ।", - "admin_settings.page-title": "सेटिङ - इथरप्याड", - "admin_settings.save_error": "सेटिङ बचत गर्दा त्रुटि", - "admin_settings.saved_success": "सेटिङ सफलतापूर्वक बचत गरियो", - "update.banner.title": "अद्यावधिक उपलब्ध छ", - "update.banner.body": "इथरप्याड {{latest}} उपलब्ध छ (तपाईँ {{current}} चलाउँदै हुनुहुन्छ)।", - "update.banner.cta": "अद्यावधिक हेर्नुहोस्", - "update.page.title": "इथरप्याड अद्यावधिकहरू", - "update.page.current": "हालको संस्करण", - "update.page.latest": "नवीनतम संस्करण", - "update.page.last_check": "अन्तिम जाँच गरियो", - "update.page.install_method": "स्थापना विधि", - "update.page.tier": "तह अद्यावधिक गर्नुहोस्", - "update.page.changelog": "परिवर्तन लग", - "update.page.up_to_date": "तपाईँ नयाँ संस्करण चलाइरहनु भएको छ ।", - "update.page.disabled": "अद्यावधिक जाँचहरू अक्षम पारिएको छ (updates.tier = \"off\") ।", - "update.page.unauthorized": "तपाईंलाई अद्यावधिक स्थिति हेर्न अधिकार छैन ।", - "update.page.error": "अद्यावधिक स्थिति (स्थिति {{status}}) लोड गर्न सकेन ।", - "update.badge.severe": "यस सर्भरको ईथरप्याड गम्भीर रूपमा अप्रचलित छ । आफ्नो प्रशासकलाई बताउनुहोस् ।", - "update.badge.vulnerable": "यस सर्भरमा इथरप्याडले ज्ञात सुरक्षा समस्याहरूको साथमा संस्करण चलाइरहेको छ। आफ्नो प्रशासकलाई बताउनुहोस्।", - "update.page.apply": "अद्यावधिक लागू गर्नुहोस्", - "update.page.cancel": "रद्द गर्नुहोस्", - "update.page.acknowledge": "स्वीकृति", - "update.page.log": "अद्यावधिक लग (अन्तिम २०० पङ्क्तिहरू)", - "update.page.execution": "वस्तुस्थिति", - "update.page.policy.install-method-not-writable": "प्रबन्धक यूआईबाट अद्यावधिक गर्न गिट स्थापना आवश्यक पर्दछ । तपाईँको प्याकेज प्रबन्धक मार्फत अद्यावधिक गर्नुहोस् ।", - "update.page.policy.rollback-failed-terminal": "अघिल्लो अद्यावधिक असफल भयो र पछाडि रोल गर्न सकिएन। लक खाली गर्न स्थापना स्वस्थ भएपछि स्वीकृति थिच्नुहोस्।", - "update.page.policy.up-to-date": "तपाईँ नयाँ संस्करण चलाइरहनु भएको छ ।", - "update.page.policy.tier-off": "अद्यावधिकहरू अक्षम पारिएको छ (updates.tier = \"off\") ।", - "update.page.policy.maintenance-window-missing": "टियर ४ (स्वतन्त्र) लाई मर्मत सञ्झ्याल चाहिन्छ । स्वायत्त अद्यावधिक सक्षम पार्न settings.json मा अद्यावधिकहरू.मर्मत सञ्झ्याल सेट गर्नुहोस् ।", - "update.page.policy.maintenance-window-invalid": "टियर ४ (स्वतन्त्र) अक्षम पारिएको छ किनभने अद्यावधिकहरू.मर्मत सञ्झ्याल विकृत छ । अपेक्षित {start, end, tz} HH:MM पटक र \"local\" वा \"utc\" को tz सँग ।", - "update.page.last_result.verified": "{{tag}}को अन्तिम अद्यावधिक प्रमाणित भयो ।", - "update.page.last_result.rolled-back": "{{tag}}मा अन्तिम पटक प्रयास गरिएको अद्यावधिक पछाडि सारियो: {{reason}}।", - "update.page.last_result.rollback-failed": "अन्तिम अद्यावधिक प्रयास असफल भयो र रोलब्याक असफल भयो: {{reason}}। म्यानुअल हस्तक्षेप आवश्यक छ।", - "update.page.last_result.preflight-failed": "{{tag}}मा अन्तिम पटक प्रयास गरिएको अद्यावधिक असफल पूर्व उड्डाण: {{reason}}।", - "update.page.last_result.cancelled": "{{tag}} लाई अद्यावधिक गर्ने अन्तिम प्रयास प्रशासकद्वारा रद्द गरियो ।", - "update.execution.idle": "निष्क्रिय", - "update.execution.scheduled": "अद्यावधिक कार्यतालिका", - "update.execution.preflight": "पूर्व-उडान जाँच", - "update.execution.preflight-failed": "पूर्व-फ्लाइट असफल भयो", - "update.execution.draining": "निकास सत्रहरू", - "update.execution.executing": "अद्यावधिक गर्दै...", - "update.execution.pending-verification": "विचाराधिन प्रमाणीकरण", - "update.execution.verified": "प्रमाणित", - "update.execution.rolling-back": "पछाडि घुम्दै", - "update.execution.rolled-back": "पछाडि घुमाइएको", - "update.execution.rollback-failed": "रोलब्याक असफल भयो", - "update.banner.terminal.rollback-failed": "अद्यावधिक प्रयास असफल भयो र पछाडि रोल गर्न सकिएन । म्यानुअल हस्तक्षेप आवश्यक छ ।", - "update.banner.scheduled": "{{tag}} तालिकामा स्वत: अद्यावधिक - {{remaining}} मा लागू हुन्छ।", - "update.banner.maintenance-window-missing": "मर्मत सञ्झ्याल कन्फिगर नभएसम्म स्वायत्त अद्यावधिकहरू अक्षम गरिन्छ ।", - "update.banner.maintenance-window-invalid": "स्वायत्त अद्यावधिकहरू अक्षम पारिएको छ किनभने मर्मत सञ्झ्याल विकृत छ ।", - "update.page.scheduled.title": "अद्यावधिक कार्यतालिका", - "update.page.scheduled.countdown": "इथरप्याडले {{tag}} लाई {{remaining}} मा अद्यावधिक गर्न सुरु गर्नेछ।", - "update.page.scheduled.deferred_until": "मर्मत सञ्झ्याल बाहिर । {{at}} मा सञ्झ्याल खुल्दा अद्यावधिक सुरु हुनेछ ।", - "update.page.scheduled.apply_now": "अहिले लागू गर्नुहोस्", - "update.window.title": "मर्मत सञ्झ्याल", - "update.window.summary": "{{start}}{{end}} ({{tz}})", - "update.window.unset": "कन्फिगर गरिएको छैन ।", - "update.window.next_opens_at": "पछिल्लो सञ्झ्याल {{at}} मा खुल्नेछ ।", - "update.drain.t60": "अद्यावधिक लागू गर्न ईथरप्याड ६० सेकेन्डमा पुनःसुरु हुनेछ ।", - "update.drain.t30": "इथरप्याड अद्यावधिक लागू गर्न ३० सेकेन्डमा पुनः सुरु हुनेछ ।", - "update.drain.t10": "अद्यावधिक लागू गर्न 10 सेकेन्डमा इथरप्याड पुनः सुरु हुनेछ ।", "index.newPad": "नयाँ प्याड", "index.settings": "अभिरुचिहरू", - "index.transferSessionTitle": "सत्र स्थानान्तरण गर्नुहोस्", - "index.receiveSessionTitle": "सत्र प्राप्त गर्नुहोस्", - "index.receiveSessionDescription": "यहाँ तपाईँले अर्को ब्राउजर वा यन्त्रबाट इथरप्याड सत्र प्राप्त गर्न सक्नुहुन्छ । यद्यपि, यदि कुनै भएमा, यसले तपाईँको हालको सत्र मेट्नेछ भन्ने कृपया याद राख्नुहोस् ।", - "index.transferSession": "1. सत्र स्थानान्तरण गर्नुहोस्", - "index.transferSessionNow": "अहिले सत्र स्थानान्तरण गर्नुहोस्", - "index.copyLink": "२. लिङ्क प्रतिलिपि गर्नुहोस्", - "index.copyLinkDescription": "तपाईँको क्लिपबोर्डमा लिङ्क प्रतिलिपि गर्न तलको बटनमा क्लिक गर्नुहोस् ।", - "index.copyLinkButton": "क्लिपबोर्डमा लिङ्क प्रतिलिपि गर्नुहोस्", - "index.transferToSystem": "३. नयाँ प्रणालीमा सत्र प्रतिलिपि गर्नुहोस्", - "index.transferToSystemDescription": "तपाईँको सत्र स्थानान्तरण गर्न लक्षित ब्राउजर वा यन्त्रमा प्रतिलिपि गरिएको लिङ्क खोल्नुहोस् ।", - "index.code": "कोड", - "index.transferSessionDescription": "तलको बटन क्लिक गरेर तपाईँको हालको सत्र ब्राउजर वा यन्त्रमा स्थानान्तरण गर्नुहोस् । यसले पृष्ठमा लिङ्क प्रतिलिपि गर्नेछ जसले लक्षित ब्राउजर वा यन्त्रमा खोल्दा तपाईँको सत्र स्थानान्तरण गर्नेछ ।", "index.createOpenPad": "नाम सहितको नयाँ प्याड सिर्जना गर्ने / खोल्ने :", - "index.openPad": "नामसँग अवस्थित प्याड खोल्नुहोस्:", - "index.recentPads": "हालका प्याडहरू", - "index.recentPadsEmpty": "कुनै पनि हालैका प्याडहरू फेला परेन ।", - "index.generateNewPad": "अनियमित प्याड नाम उत्पन्न गर्नुहोस्", - "index.labelPad": "प्याड नाम (वैकल्पिक)", - "index.placeholderPadEnter": "कृपया प्याड नाम प्रविष्ट गर्नुहोस्...", - "index.createAndShareDocuments": "वास्तविक समयमा कागजातहरू सिर्जना गर्नुहोस् र साझेदारी गर्नुहोस्", - "index.createAndShareDocumentsDescription": "इथरप्याडले तपाईँलाई तपाईँको ब्राउजरमा चलिरहेको प्रत्यक्ष बहु-खेलाडी सम्पादक जस्तै वास्तविक समयमा सहकार्यपूर्वक कागजातहरू सम्पादन गर्न अनुमति दिन्छ ।", "pad.toolbar.bold.title": "मोटो (Ctrl-B)", "pad.toolbar.italic.title": "ढल्के (Ctrl-I)", "pad.toolbar.underline.title": "निम्न रेखाङ्कन (Ctrl-U)", @@ -259,47 +28,25 @@ "pad.toolbar.undo.title": "रद्द (Ctrl-Z)", "pad.toolbar.redo.title": "पुन:लागु (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "लेखकत्व रङहरू खाली गर्नुहोस् (Ctrl + Shift + C)", - "pad.toolbar.import_export.title": "फरक फाइल ढाँचाबाट/मा आयात/निर्यात गर्नुहोस्", "pad.toolbar.timeslider.title": "टाइमस्लाइडर", "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने", "pad.toolbar.settings.title": "अभिरुचिहरू", "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", - "pad.toolbar.home.title": "घर फर्कनुहोस्", "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", "pad.colorpicker.save": "सङ्ग्रह गर्नुहोस्", "pad.colorpicker.cancel": "रद्द गर्नुहोस्", "pad.loading": "खुल्दै छ…", - "pad.noCookie": "कुकी फेला पार्न सकिएन । कृपया तपाईँको ब्राउजरमा कुकीहरू अनुमति दिनुहोस् ! तपाईँको सत्र र सेटिङ भ्रमणको बीचमा बचत गरिने छैन । यो केही ब्राउजरहरूमा आइफ्रेममा ईथरप्याड समावेश भएको कारणले हुन सक्छ । कृपया ईथरप्याड प्रमूल आईफ्रेमको रूपमा उही उपडोमेन/डोमेनमा छ भनी सुनिश्चित गर्नुहोस्", "pad.permissionDenied": "तपाईंलाई यो प्याड खोल्न अनुमति छैन", - "pad.settings.title": "सेटिङ", "pad.settings.padSettings": "प्याड अभिरुचिहरू", - "pad.settings.userSettings": "प्रयोगकर्ता सेटिङ", "pad.settings.myView": "मेरो दृष्य", - "pad.settings.disablechat": "कुराकानी अक्षम पार्नुहोस्", - "pad.settings.darkMode": "गाढा मोड", "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", "pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने", "pad.settings.colorcheck": "लेखकका रङहरू", - "pad.settings.fadeInactiveAuthorColors": "निष्क्रिय लेखक रङ फेड गर्नुहोस्", "pad.settings.linenocheck": "हरफ संख्या", "pad.settings.rtlcheck": "के सामग्री दाहिने देखि देब्रे पढ्ने हो ?", - "pad.settings.enforceSettings": "अन्य प्रयोगकर्ताका लागि सेटिङहरू लागू गर्नुहोस्", - "pad.settings.enforcedNotice": "यी सेटिङहरू यस प्याडको सर्जकद्वारा तपाईँका लागि ताल्चा लगाइएको छ। यदि तपाईँलाई परिवर्तन गर्न आवश्यक छ भने प्याड सर्जकलाई सोध्नुहोस्।", "pad.settings.fontType": "लिपि प्रकार:", "pad.settings.fontType.normal": "सामान्य", "pad.settings.language": "भाषा:", - "pad.settings.deletePad": "प्याड मेट्नुहोस्", - "pad.delete.confirm": "के तपाईँ साँच्चिकै यो प्याड मेट्न चाहनुहुन्छ?", - "pad.deletionToken.modalTitle": "तपाईँको प्याड मेटाइ टोकन बचत गर्नुहोस्", - "pad.deletionToken.modalBody": "यदि तपाईँले आफ्नो ब्राउजर सत्र वा स्विच यन्त्र गुमाउनु भयो भने यो टोकन प्याड मेटाउने एक मात्र तरिका हो । यसलाई सुरक्षित स्थानमा बचत गर्नुहोस् - यो यहाँ ठ्याक्कै एक पटक देखाइएको छ ।", - "pad.deletionToken.copy": "प्रतिलिपि गर्नुहोस्", - "pad.deletionToken.copied": "प्रतिलिपि गरिएको", - "pad.deletionToken.acknowledge": "मैले यसलाई सङ्ग्रह गरेको छु", - "pad.deletionToken.deleteWithToken": "टोकनसँग प्याड मेट्नुहोस्", - "pad.deletionToken.tokenFieldLabel": "प्याड मेट्ने टोकन", - "pad.deletionToken.tokenValueLabel": "तपाईँको प्याड मेटाइ टोकन (पढ्ने-मात्र)", - "pad.deletionToken.invalid": "त्यो टोकन यो प्याडका लागि वैध छैन ।", - "pad.deletionToken.notCreator": "तपाईँ यो प्याडको सिर्जनाकर्ता हुनुहुन्न, त्यसैले तपाईँले यसलाई मेट्न सक्नुहुन्न ।", "pad.settings.about": "बारेमा", "pad.settings.poweredBy": "प्रवर्धक", "pad.importExport.import_export": "आयात/निर्यात", @@ -312,45 +59,18 @@ "pad.importExport.exportword": "माइक्रोसफ्ट वर्ड", "pad.importExport.exportpdf": "पिडिएफ", "pad.importExport.exportopen": "ओडिएफ(खुल्ला कागजात ढाँचा)", - "pad.importExport.exportetherpada.title": "इथरप्याडको रूपमा निर्यात गर्नुहोस्", - "pad.importExport.exporthtmla.title": "HTML को रूपमा निर्यात गर्नुहोस्", - "pad.importExport.exportplaina.title": "सादा पाठको रूपमा निर्यात गर्नुहोस्", - "pad.importExport.exportworda.title": "माइक्रोसफ्ट वर्डको रूपमा निर्यात गर्नुहोस्", - "pad.importExport.exportpdfa.title": "PDF को रूपमा निर्यात गर्नुहोस्", - "pad.importExport.exportopena.title": "ODF (खुला कागजात ढाँचा) को रूपमा निर्यात गर्नुहोस्", - "pad.importExport.noConverter.innerHTML": "तपाईँले सादा पाठ, HTML, Microsoft Word (.docx) र Etherpad फाइलहरू सिधै आयात गर्न सक्नुहुन्छ । PDF, ODT, DOC वा RTF जस्ता अन्य ढाँचाहरू आयात गर्न, सर्भर प्रशासकले LibreOffice स्थापना गर्न आवश्यक छ - Etherpad मिसिलीकरण हेर्नुहोस् ।", "pad.modals.connected": "जोडीएको।", "pad.modals.reconnecting": "तपाईंको प्याडमा पुन: जडान गर्दै", "pad.modals.forcereconnect": "जडानको लागि जोडगर्ने", - "pad.modals.reconnecttimer": "पुन: जडान गर्न प्रयास गर्दै", "pad.modals.cancel": "रद्द गर्नुहोस्", "pad.modals.userdup": "अर्को सन्झ्यालमा खोल्ने", - "pad.modals.userdup.explanation": "यो प्याड यस कम्प्युटरमा एक भन्दा बढी ब्राउजर सञ्झ्यालमा खोलिएको देखिन्छ ।", - "pad.modals.userdup.advice": "सट्टामा यो विन्डो प्रयोग गर्न पुन: जडान गर्नुहोस् ।", "pad.modals.unauth": "अनुमती नदिइएको", - "pad.modals.unauth.explanation": "यो पृष्ठ हेर्दा तपाईँको अनुमति परिवर्तन भएको छ। पुन: जडान गर्ने प्रयास गर्नुहोस्।", - "pad.modals.looping.explanation": "त्यहाँ समक्रमण सर्भरसँग सञ्चार समस्याहरू छन्।", - "pad.modals.looping.cause": "सायद तपाईँले अमिल्दो फायरवाल वा प्रोक्सी मार्फत जडान गर्नुभयो ।", "pad.modals.initsocketfail": "सर्भरमा पहुँच पुर्‍याउन सकिएन ।", - "pad.modals.initsocketfail.explanation": "समक्रमण सर्भरमा जडान गर्न सकेन ।", - "pad.modals.initsocketfail.cause": "यो सम्भवतः तपाईँको ब्राउजर वा इन्टरनेट जडानमा समस्या भएको कारणले हो।", "pad.modals.slowcommit.explanation": "सर्भरसँग सम्पर्क हुने सकेन ।", - "pad.modals.slowcommit.cause": "यो नेटवर्क जडानमा समस्याको कारणले हुन सक्छ।", - "pad.modals.badChangeset.explanation": "तपाईँले बनाउनु भएको सम्पादन समक्रमण सर्भरद्वारा अवैध वर्गीकरण गरिएको थियो ।", - "pad.modals.badChangeset.cause": "यो गलत सर्भर कन्फिगरेसन वा केही अन्य अनपेक्षित व्यवहारको कारणले हुन सक्छ। यदि तपाईँलाई यो त्रुटि हो जस्तो लाग्छ भने, कृपया सेवा प्रशासकलाई सम्पर्क गर्नुहोस्। सम्पादन जारी राख्न पुन: जडान प्रयास गर्नुहोस्।", - "pad.modals.corruptPad.explanation": "तपाईँले पहुँच गर्न खोज्नु भएको प्याड बिग्रिएको छ।", - "pad.modals.corruptPad.cause": "यो गलत सर्भर कन्फिगरेसन वा केही अन्य अनपेक्षित व्यवहारको कारणले हुन सक्छ। कृपया सेवा प्रशासकलाई सम्पर्क गर्नुहोस्।", "pad.modals.deleted": "मेटिएको ।", "pad.modals.deleted.explanation": "यो प्याड हटाइसकेको छ ।", - "pad.modals.rateLimited": "दर सिमित ।", - "pad.modals.rateLimited.explanation": "तपाईँले यो प्याडमा धेरै सन्देशहरू पठाउनुभयो त्यसैले यसले तपाईँलाई विच्छेदन गर्यो।", - "pad.modals.rejected.explanation": "सर्भरले तपाईँको ब्राउजरद्वारा पठाइएको सन्देश अस्वीकार गर्यो ।", - "pad.modals.rejected.cause": "तपाईँले प्याड हेरिरहनुभएको बेलामा सर्भर अद्यावधिक भएको हुन सक्छ, वा त्यहाँ इथरप्याडमा बग हुन सक्छ । पृष्ठ पुन: लोड गर्ने प्रयास गर्नुहोस् ।", "pad.modals.disconnected": "तपाईंको जडान अवरुद्ध भयो ।", "pad.modals.disconnected.explanation": "तपाईंको सर्भरसँगको जडान अवरुद्ध भयो", - "pad.modals.disconnected.cause": "सर्भर अनुपलब्ध हुन सक्छ । यदि यो हुन जारी छ भने कृपया सेवा प्रशासकलाई सूचित गर्नुहोस् ।", - "pad.gritter.unacceptedCommit.title": "बचत नगरिएको सम्पादन", - "pad.gritter.unacceptedCommit.text": "तपाईँको हालको सम्पादन अझै पनि बचत गरिएको छैन । पुन: जडान गर्नुहोस् र फेरि प्रयास गर्नुहोस् ।", "pad.share": "यस प्यडलाई बाड्ने", "pad.share.readonly": "पढ्ने मात्र", "pad.share.link": "कडी", @@ -358,41 +78,14 @@ "pad.chat": "कुराकानी", "pad.chat.title": "यस प्याडको लागि कुराकानी खोल्ने", "pad.chat.loadmessages": "थप सन्देशहरू खोल्ने", - "pad.chat.stick.title": "स्क्रिनमा कुराकानी टाँस्नुहोस्", - "pad.chat.writeMessage.placeholder": "तपाईँको सन्देश यहाँ लेख्नुहोस्", - "timeslider.followContents": "प्याड सामग्री अद्यावधिकहरू पछ्याउनुहोस्", "timeslider.pageTitle": "{{appTitle}} समय रेखा", "timeslider.toolbar.returnbutton": "प्याडमा फर्कनुहोस्", - "pad.historyMode.banner": "इतिहास हेर्दै", - "pad.historyMode.return": "प्रत्यक्षमा फर्कनुहोस्", - "pad.historyMode.revisionLabel": "संशोधन {{rev}}", - "pad.historyMode.controlsLabel": "प्याड इतिहास नियन्त्रणहरू", - "pad.historyMode.sliderLabel": "प्याड संशोधन", - "pad.historyMode.settings.title": "इतिहास प्लेब्याक", - "pad.historyMode.settings.follow": "प्याड सामग्री अद्यावधिकहरू पछ्याउनुहोस्", - "pad.historyMode.settings.followShort": "अनुशरण गर्नुहोस्", - "pad.historyMode.followOn": "प्याड परिवर्तनहरू पछ्याउँदै पछ्याउन रोक्न क्लिक गर्नुहोस्", - "pad.historyMode.followOff": "प्याड परिवर्तनहरू पछ्याइरहेको छैन पछ्याउन क्लिक गर्नुहोस्", - "pad.historyMode.settings.playbackSpeed": "प्लेब्याक गति:", - "pad.historyMode.chat.replayHeader": "{{time}} सम्मको कुराकानी", - "pad.historyMode.users.authorsHeader": "यस संशोधनका लेखकहरू", - "pad.editor.skipToContent": "सम्पादकमा फड्काउनुहोस्", - "pad.editor.keyboardHint": "सम्पादकबाट बाहिरिनका लागि Escape थिच्नुहोस् । उपकरणपट्टी पहुँच गर्न Alt+F9 थिच्नुहोस् ।", - "pad.editor.toolbar.formatting": "उपकरणपट्टी ढाँचा गर्दा", - "pad.editor.toolbar.actions": "प्याड कार्य उपकरणपट्टी", - "pad.editor.toolbar.showMore": "थप उपकरणपट्टी बटनहरू देखाउनुहोस्", "timeslider.toolbar.authors": "लेखकहरु:", "timeslider.toolbar.authorsList": "कुनै पनि लेखकहरू छैनन्", "timeslider.toolbar.exportlink.title": "निर्यात", "timeslider.exportCurrent": "हालको संस्करण निम्म रुपमा निर्यात गर्ने :", "timeslider.version": "संस्करण {{version}}", "timeslider.saved": "सङ्ग्रह गरिएको {{month}} {{day}}, {{year}}", - "timeslider.settings.playbackSpeed": "प्लेब्याक गति:", - "timeslider.settings.playbackSpeed.original": "मौलिक गति", - "timeslider.settings.playbackSpeed.realtime": "वास्तविक समय", - "timeslider.settings.playbackSpeed.200ms": "२०० ms", - "timeslider.settings.playbackSpeed.500ms": "५०० ms", - "timeslider.settings.playbackSpeed.1000ms": "१००० ms", "timeslider.playPause": "प्याडको सामग्रीहरूलाई चालु / बन्द गर्नुहोस्", "timeslider.backRevision": "यो प्याडको एक संस्करण पहिले जानुहोस्", "timeslider.forwardRevision": "यो प्याडको एक संस्करण पछि जानुहोस्", @@ -411,20 +104,11 @@ "timeslider.month.december": "डिसेम्बर", "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) one: author, other: authors ]}", "pad.savedrevs.marked": "यस संस्करणलाई संग्रहितको रुपमा चिनो लगाइएको छैन", - "pad.savedrevs.timeslider": "समय स्लाइडरमा गएर तपाईँले बचत गरिएका संशोधनहरू हेर्न सक्नुहुन्छ", "pad.userlist.entername": "तपाईंको नाम लेख्नुहोस्", "pad.userlist.unnamed": "नाम नखुलाइएको", - "pad.userlist.onlineCount": "{[ plural(count) one: {{count}} connected user, other: {{count}} connected users ]}", - "pad.editbar.clearcolors": "सम्पूर्ण कागजातमा लेखकता रङ खाली गर्नुहोस्? यो पूर्वस्थितिमा फर्काउन सकिँदैन", "pad.impexp.importbutton": "अहिले आयात गर्ने", "pad.impexp.importing": "आयात गर्ने...", - "pad.impexp.confirmimport": "फाइल आयात गर्दा प्याडको हालको पाठ अधिलेखन हुनेछ । तपाईँ अगाडि बढ्न निश्चित हुनुहुन्छ ?", - "pad.impexp.convertFailed": "हामी यो फाइल आयात गर्न असक्षम भयौँ । कृपया फरक कागजात ढाँचा प्रयोग गर्नुहोस् वा म्यानुअली टाँस्नुहोस्", - "pad.impexp.padHasData": "यो प्याडमा पहिले नै परिवर्तन भएकाले हामी यो फाइल आयात गर्न असक्षम भयौँ, कृपया नयाँ प्याडमा आयात गर्नुहोस्", "pad.impexp.uploadFailed": "अपलोड असफल भयो , कृपया पुन: प्रयास गर्नुहोस् ।", "pad.impexp.importfailed": "आयात असफल भयो", - "pad.impexp.copypaste": "कृपया कपी पेस्ट गर्नुहोस", - "pad.impexp.exportdisabled": "{{type}} ढाँचाको रूपमा निर्यात गर्न अक्षम पारिएको छ। कृपया विस्तृत जानकारीको लागि तपाईँको प्रणाली प्रशासकलाई सम्पर्क गर्नुहोस्।", - "pad.impexp.maxFileSize": "फाइल अति ठूलो छ। आयातका लागि अनुमति प्राप्त फाइल साइज बढाउन आफ्नो साइट प्रशासकलाई सम्पर्क गर्नुहोस्", - "pad.social.description": "सबैजनाले वास्तविक समयमा सम्पादन गर्न सक्ने सहयोगी कागजात ।" + "pad.impexp.copypaste": "कृपया कपी पेस्ट गर्नुहोस" } diff --git a/src/locales/sk.json b/src/locales/sk.json index d408a7360..6f608cc56 100644 --- a/src/locales/sk.json +++ b/src/locales/sk.json @@ -7,85 +7,17 @@ "Mark", "Rudko", "Teslaton", - "Wizzard", "Yardom78" ] }, "admin.page-title": "Ovládací panel správu - Etherpad", - "admin.loading": "Načítava sa…", - "admin.loading_description": "Počkajte, prosím, kým sa stránka načíta.", - "admin.toggle_sidebar": "Prepnúť bočný panel", - "admin.shout": "Komunikácia", - "admin_shout.online_one": "Momentálne je online {{count}} používateľ", - "admin_shout.online_other": "Momentálne je online {{count}} používateľov", - "admin_shout.sticky_toggle": "Zmeniť pripnutú správu", - "admin_login.title": "Etherpad", - "admin_login.username": "Používateľské meno", - "admin_login.password": "Heslo", - "admin_login.submit": "Prihlásiť sa", - "admin_login.failed": "Prihlásenie zlyhalo", - "admin_pads.all_pads": "Všetky pady", - "admin_pads.bulk.cleanup_history": "Vyčistiť históriu", - "admin_pads.bulk.clear_selection": "Zrušiť výber", - "admin_pads.bulk.delete": "Zmazať", - "admin_pads.cancel": "Zrušiť", - "admin_pads.col.pad": "Pad", - "admin_pads.col.revisions": "Revízie", - "admin_pads.col.users": "Používatelia", - "admin_pads.confirm_button": "OK", - "admin_pads.create_pad_dialog_description": "Zvoľte názov nového padu.", - "admin_pads.delete_pad_dialog_description": "Potvrďte alebo zrušte zmazanie padu.", - "admin_pads.delete_pad_dialog_title": "Zmazať pad", - "admin_pads.empty_never_edited": "prázdny · nikdy neupravovaný", - "admin_pads.error_dialog_description": "Vyskytla sa chyba.", - "admin_pads.error_prefix": "Chyba", - "admin_pads.filter.active": "Aktívne", - "admin_pads.filter.all": "Všetky", - "admin_pads.filter.empty": "Prázdne", - "admin_pads.filter.recent": "Tento týždeň", - "admin_pads.filter.stale": "Neaktívne (>1 r.)", - "admin_pads.open": "Otvoriť", - "admin_pads.pagination.next": "Ďalej", - "admin_pads.pagination.previous": "Späť", - "admin_pads.refresh": "Obnoviť", - "admin_pads.relative.days": "pred {{count}} d", - "admin_pads.relative.hours": "pred {{count}} h", - "admin_pads.relative.just_now": "práve teraz", - "admin_pads.relative.minutes": "pred {{count}} min", - "admin_pads.relative.months": "pred {{count}} mes.", - "admin_pads.relative.weeks": "pred {{count}} týž.", - "admin_pads.relative.years": "pred {{count}} r.", - "admin_pads.revisions_count": "{{count}} revízií", - "admin_pads.selected_count": "Vybraté: {{count}}", - "admin_pads.show": "Zobraziť", - "admin_pads.sort.name": "Názov (A – Z)", - "admin_pads.sort.revision_number": "Revízie", - "admin_pads.sort.user_count": "Používatelia", - "admin_pads.stats.across_pads": "vo všetkých padoch", - "admin_pads.stats.active_users": "Aktívni používatelia", - "admin_pads.stats.empty_pads": "Prázdne pady", - "admin_pads.stats.last_activity": "Posledná aktivita", - "admin_pads.stats.no_active_users": "Žiadni aktívni používatelia", - "admin_pads.stats.revisions_zero": "0 revízií", - "admin_pads.stats.total": "Pady spolu", - "admin_pads.stats.users_active": "Momentálne aktívnych: {{count}}", - "admin_pads.subtitle": "Prehľad všetkých padov na tejto inštancii Etherpadu. Vyhľadávajte, čistite, otvárajte.", "admin_plugins": "Správca doplnkov", "admin_plugins.available": "Dostupné doplnky", "admin_plugins.available_not-found": "Doplnky neboli nájdené.", "admin_plugins.available_fetching": "Načítavanie...", "admin_plugins.available_install.value": "Inštalovať", "admin_plugins.available_search.placeholder": "Vyhľadať doplnky na inštaláciu", - "admin_plugins.check_updates": "Skontrolovať aktualizácie", - "admin_plugins.core_count": "{{count}} základných", - "admin_plugins.catalog_disabled": "Katalóg zásuvných modulov je vypnutý vaším prevádzkovateľom (privacy.pluginCatalog=false). Zásuvný modul nainštalujete spustením `pnpm run plugins i ep_` na serveri.", - "admin_plugins.crumbs": "Zásuvné moduly", "admin_plugins.description": "Popis", - "admin_plugins.disables.label": "Vypína:", - "admin_plugins.disables.warning_title": "Tento zásuvný modul zámerne odstraňuje uvedené funkcie Etherpadu.", - "admin_plugins.error_retrieving": "Chyba pri získavaní zásuvných modulov", - "admin_plugins.install_error": "Nepodarilo sa nainštalovať {{plugin}}: {{error}}", - "admin_plugins.install_error_requires_newer_etherpad": "Nemožno nainštalovať {{plugin}}: vyžaduje novšiu verziu Etherpadu. Aktualizujte Etherpad a skúste to znova.", "admin_plugins.installed": "Nainštalované doplnky", "admin_plugins.installed_fetching": "Načítavanie nainštalovaných doplnkov...", "admin_plugins.installed_nothing": "Ešte ste nenainštalovali žiadne doplnky.", @@ -93,161 +25,27 @@ "admin_plugins.last-update": "Posledná aktualizácia", "admin_plugins.name": "Názov", "admin_plugins.page-title": "Správca doplnkov - Etherpad", - "admin_plugins.reload_catalog": "Znovu načítať katalóg", - "admin_plugins.search_npm": "Hľadať na npm", - "admin_plugins.sort_ascending": "Zoradiť vzostupne", - "admin_plugins.sort_descending": "Zoradiť zostupne", - "admin_plugins.sort.last_updated": "Naposledy aktualizované", - "admin_plugins.sort.name": "Názov (A – Z)", - "admin_plugins.sort.version": "Verzia", - "admin_plugins.source": "Zdroj zásuvného modulu", - "admin_plugins.subtitle": "Inštalujte, aktualizujte a odstraňujte zásuvné moduly Etherpadu. Zmeny si vyžadujú reštart servera.", - "admin_plugins.tag_core": "Základné", - "admin_plugins.update_tooltip": "Aktualizovať", - "admin_plugins.updates_available": "Dostupné aktualizácie", - "admin_plugins.update_now": "Aktualizovať", "admin_plugins.version": "Verzia", "admin_plugins_info": "Informácie k riešeniu problémov", - "admin_plugins_info.bindings_label": "{{count}} väzieb", - "admin_plugins_info.copy_diagnostics": "Kopírovať diagnostiku", - "admin_plugins_info.copy_value": "Kopírovať {{label}}", - "admin_plugins_info.git_sha": "Git SHA", - "admin_plugins_info.hook_bindings": "Väzby hookov", "admin_plugins_info.hooks": "Nainštalované súčasti", "admin_plugins_info.hooks_client": "Súčasti na strane klienta", "admin_plugins_info.hooks_server": "Súčasti na strane servera", - "admin_plugins_info.no_hooks": "Nenašli sa žiadne hooky", "admin_plugins_info.parts": "Nainštalované súčasti", "admin_plugins_info.plugins": "Nainštalované doplnky", "admin_plugins_info.page-title": "Informácie o doplnkoch - Etherpad", - "admin_plugins_info.search_placeholder": "Hľadať hook alebo časť…", - "admin_plugins_info.subtitle": "Diagnostika systému: nainštalovaná verzia, registrované časti a hooky.", - "admin_plugins_info.tab_client": "Klient", - "admin_plugins_info.tab_server": "Server", - "admin_plugins_info.up_to_date": "Aktuálne", - "admin_plugins_info.update_available": "Dostupná aktualizácia: {{version}}", "admin_plugins_info.version": "Verzia Etherpadu", "admin_plugins_info.version_latest": "Posledná dostupná verzia", "admin_plugins_info.version_number": "Číslo verzie", "admin_settings": "Nastavenia", - "admin_settings.create_pad": "Vytvoriť pad", "admin_settings.current": "Aktuálne nastavenia", "admin_settings.current_example-devel": "Príklad šablóny vývojárskeho nastavenia", "admin_settings.current_example-prod": "Príklad šablóny výrobného nastavenia", "admin_settings.current_restart.value": "Reštartovať Etherpad", "admin_settings.current_save.value": "Uložiť nastavenia", - "admin_settings.invalid_json": "Neplatný JSON", - "admin_settings.current_test.value": "Overiť JSON", - "admin_settings.current_prettify.value": "Sformátovať JSON", - "admin_settings.toast.saved": "Nastavenia boli úspešne uložené.", - "admin_settings.toast.save_failed": "Uloženie zlyhalo: súbor settings.json sa nepodarilo zapísať.", - "admin_settings.toast.json_invalid": "Syntaktická chyba: skontrolujte čiarky, zátvorky a úvodzovky.", - "admin_settings.toast.disconnected": "Nemožno uložiť: bez pripojenia k serveru.", - "admin_settings.toast.validation_ok": "JSON je platný.", - "admin_settings.toast.validation_failed": "JSON je neplatný: opravte syntaktické chyby.", - "admin_settings.toast.prettify_failed": "Nemožno sformátovať: najprv opravte syntaktické chyby.", - "admin_settings.prettify_confirm": "Formátovaním sa odstránia všetky komentáre. Pokračovať?", - "admin_settings.mode.form": "Formulár", - "admin_settings.mode.raw": "Surový", - "admin_settings.mode.effective": "Efektívny", - "admin_settings.mode.effective_tooltip": "Zobrazenie hodnôt, ktoré Etherpad práve teraz skutočne používa (po dosadení premenných prostredia), iba na čítanie. Tajné hodnoty sú skryté.", - "admin_settings.mode.aria_label": "Režim editora", - "admin_settings.envvar_banner.title": "Tento súbor je šablóna, nie živá konfigurácia.", - "admin_settings.envvar_banner.body": "Zástupné výrazy ako ${VAR:default} sa pri štarte dosadia do pamäte; nikdy sa nezapisujú späť do tohto súboru. Ak chcete zmeniť výslednú hodnotu, upravte premenné prostredia vo svojom prostredí (Docker compose, systemd, .env), alebo tu nahraďte zástupný výraz konkrétnou hodnotou. Prepnutím na kartu Efektívny zistíte, čo Etherpad práve používa.", - "admin_settings.toast.auth_error": "Nie ste overený ako správca. Prihláste sa, prosím, znova.", - "admin_settings.section.general": "Všeobecné", - "admin_settings.parse_error.title": "Nemožno spracovať settings.json", - "admin_settings.parse_error.cta": "Prepnite na surový režim na úpravu", - "admin_settings.env_pill.tooltip": "Číta sa z premennej prostredia {{variable}}. Hodnota nižšie sa použije, keď {{variable}} nie je nastavená.", - "admin_settings.env_pill.default_label": "predvolené", - "admin_settings.env_pill.input_aria": "Predvolená hodnota pre {{variable}}", - "admin_settings.env_pill.runtime_label": "aktívna hodnota", - "admin_settings.env_pill.runtime_tooltip": "Etherpad práve používa túto hodnotu, určenú z {{variable}} alebo jej predvolenej hodnoty.", - "admin_settings.env_pill.redacted_tooltip": "Etherpad používa hodnotu pre {{variable}}, je však skrytá, pretože ide o tajnú hodnotu.", "admin_settings.page-title": "Nastavenia - Etherpad", - "admin_settings.save_error": "Chyba pri ukladaní nastavení", - "admin_settings.saved_success": "Nastavenia boli úspešne uložené", - "update.banner.title": "Dostupná aktualizácia", - "update.banner.body": "Je dostupný Etherpad {{latest}} (používate {{current}}).", - "update.banner.cta": "Zobraziť aktualizáciu", - "update.page.title": "Aktualizácie Etherpadu", - "update.page.current": "Aktuálna verzia", - "update.page.latest": "Najnovšia verzia", - "update.page.last_check": "Naposledy skontrolované", - "update.page.install_method": "Spôsob inštalácie", - "update.page.tier": "Úroveň aktualizácií", - "update.page.changelog": "Zoznam zmien", - "update.page.up_to_date": "Používate najnovšiu verziu.", - "update.page.disabled": "Kontroly aktualizácií sú vypnuté (updates.tier = „off“).", - "update.page.unauthorized": "Nemáte oprávnenie zobraziť stav aktualizácií.", - "update.page.error": "Nepodarilo sa načítať stav aktualizácií (stav {{status}}).", - "update.badge.severe": "Etherpad na tomto serveri je vážne zastaraný. Upozornite správcu.", - "update.badge.vulnerable": "Etherpad na tomto serveri používa verziu so známymi bezpečnostnými problémami. Upozornite správcu.", - "update.page.apply": "Použiť aktualizáciu", - "update.page.cancel": "Zrušiť", - "update.page.acknowledge": "Potvrdiť", - "update.page.log": "Záznam aktualizácie (posledných 200 riadkov)", - "update.page.execution": "Stav", - "update.page.policy.install-method-not-writable": "Aktualizácie zo správcovského rozhrania vyžadujú inštaláciu cez git. Aktualizujte cez svojho správcu balíkov.", - "update.page.policy.rollback-failed-terminal": "Predchádzajúca aktualizácia zlyhala a nepodarilo sa ju vrátiť späť. Po uvedení inštalácie do poriadku stlačte Potvrdiť, čím sa zámok zruší.", - "update.page.policy.up-to-date": "Používate najnovšiu verziu.", - "update.page.policy.tier-off": "Aktualizácie sú vypnuté (updates.tier = „off“).", - "update.page.policy.maintenance-window-missing": "Úroveň 4 (autonómna) vyžaduje okno údržby. Autonómne aktualizácie zapnete nastavením updates.maintenanceWindow v settings.json.", - "update.page.policy.maintenance-window-invalid": "Úroveň 4 (autonómna) je vypnutá, pretože updates.maintenanceWindow má nesprávny formát. Očakáva sa {start, end, tz} s časmi vo formáte HH:MM a tz „local“ alebo „utc“.", - "update.page.last_result.verified": "Posledná aktualizácia na {{tag}} bola overená.", - "update.page.last_result.rolled-back": "Posledná pokusná aktualizácia na {{tag}} bola vrátená späť: {{reason}}.", - "update.page.last_result.rollback-failed": "Posledný pokus o aktualizáciu zlyhal A zlyhalo aj vrátenie späť: {{reason}}. Vyžaduje sa ručný zásah.", - "update.page.last_result.preflight-failed": "Posledná pokusná aktualizácia na {{tag}} zlyhala pri kontrole pred spustením: {{reason}}.", - "update.page.last_result.cancelled": "Poslednú pokusnú aktualizáciu na {{tag}} zrušil správca.", - "update.execution.idle": "Nečinné", - "update.execution.scheduled": "Aktualizácia naplánovaná", - "update.execution.preflight": "Kontroly pred spustením", - "update.execution.preflight-failed": "Kontrola pred spustením zlyhala", - "update.execution.draining": "Ukončovanie relácií", - "update.execution.executing": "Aktualizuje sa…", - "update.execution.pending-verification": "Čaká sa na overenie", - "update.execution.verified": "Overené", - "update.execution.rolling-back": "Vracia sa späť", - "update.execution.rolled-back": "Vrátené späť", - "update.execution.rollback-failed": "Vrátenie späť zlyhalo", - "update.banner.terminal.rollback-failed": "Pokus o aktualizáciu zlyhal a nepodarilo sa ho vrátiť späť. Vyžaduje sa ručný zásah.", - "update.banner.scheduled": "Automatická aktualizácia na {{tag}} je naplánovaná — použije sa o {{remaining}}.", - "update.banner.maintenance-window-missing": "Autonómne aktualizácie sú vypnuté, kým sa nenastaví okno údržby.", - "update.banner.maintenance-window-invalid": "Autonómne aktualizácie sú vypnuté, pretože okno údržby má nesprávny formát.", - "update.page.scheduled.title": "Aktualizácia naplánovaná", - "update.page.scheduled.countdown": "Etherpad sa začne aktualizovať na {{tag}} o {{remaining}}.", - "update.page.scheduled.deferred_until": "Mimo okna údržby. Aktualizácia sa spustí, keď sa okno otvorí o {{at}}.", - "update.page.scheduled.apply_now": "Použiť teraz", - "update.window.title": "Okno údržby", - "update.window.summary": "{{start}} – {{end}} ({{tz}})", - "update.window.unset": "Nie je nastavené.", - "update.window.next_opens_at": "Ďalšie okno sa otvorí o {{at}}.", - "update.drain.t60": "Etherpad sa o 60 sekúnd reštartuje, aby použil aktualizáciu.", - "update.drain.t30": "Etherpad sa o 30 sekúnd reštartuje, aby použil aktualizáciu.", - "update.drain.t10": "Etherpad sa o 10 sekúnd reštartuje, aby použil aktualizáciu.", "index.newPad": "Nový poznámkový blok", - "index.settings": "Nastavenia", - "index.transferSessionTitle": "Preniesť reláciu", - "index.receiveSessionTitle": "Prijať reláciu", - "index.receiveSessionDescription": "Tu môžete prijať reláciu Etherpadu z iného prehliadača alebo zariadenia. Upozorňujeme však, že tým sa odstráni vaša súčasná relácia, ak nejakú máte.", - "index.transferSession": "1. Preniesť reláciu", - "index.transferSessionNow": "Preniesť reláciu teraz", - "index.copyLink": "2. Kopírovať odkaz", - "index.copyLinkDescription": "Kliknutím na tlačidlo nižšie skopírujete odkaz do schránky.", - "index.copyLinkButton": "Kopírovať odkaz do schránky", - "index.transferToSystem": "3. Skopírovať reláciu do nového systému", - "index.transferToSystemDescription": "Otvorením skopírovaného odkazu v cieľovom prehliadači alebo zariadení prenesiete svoju reláciu.", - "index.code": "Kód", - "index.transferSessionDescription": "Kliknutím na tlačidlo nižšie prenesiete svoju súčasnú reláciu do prehliadača alebo zariadenia. Skopíruje sa odkaz na stránku, ktorá po otvorení v cieľovom prehliadači alebo zariadení prenesie vašu reláciu.", - "index.createOpenPad": "Otvoriť pad podľa názvu", + "index.createOpenPad": "alebo vytvoriť/otvoriť poznámkový blok s názvom:", "index.openPad": "otvoriť poznámkový blok s názvom:", - "index.recentPads": "Nedávne pady", - "index.recentPadsEmpty": "Nenašli sa žiadne nedávne pady.", - "index.generateNewPad": "Vygenerovať náhodný názov padu", - "index.labelPad": "Názov padu (nepovinné)", - "index.placeholderPadEnter": "Zadajte názov padu…", - "index.createAndShareDocuments": "Vytvárajte a zdieľajte dokumenty v reálnom čase", - "index.createAndShareDocumentsDescription": "Etherpad vám umožňuje spoločne upravovať dokumenty v reálnom čase, podobne ako živý viacpoužívateľský editor, ktorý beží vo vašom prehliadači.", "pad.toolbar.bold.title": "Tučné (Ctrl+B)", "pad.toolbar.italic.title": "Kurzíva (Ctrl+I)", "pad.toolbar.underline.title": "Podčiarknuté (Ctrl+U)", @@ -264,42 +62,22 @@ "pad.toolbar.savedRevision.title": "Uložiť revíziu", "pad.toolbar.settings.title": "Nastavenia", "pad.toolbar.embed.title": "Zdieľať alebo vložiť tento poznámkový blok", - "pad.toolbar.home.title": "Späť na domovskú stránku", "pad.toolbar.showusers.title": "Zobraziť používateľov tohoto poznámkového bloku", "pad.colorpicker.save": "Uložiť", "pad.colorpicker.cancel": "Zrušiť", "pad.loading": "Načítava sa...", "pad.noCookie": "Cookie nebolo možné nájsť. Povoľte prosím cookies vo vašom prehliadači. Vaše sedenie a nastavenia sa medzi návštevami stránky neuložia. To môže byť spôsobené tým že Etherpad je zahrnutý do iFrame v niektorých prehliadačoch. Prosím uistite sa, že Etherpad sa nachádza na tej istej doméne ako hlavný iFrame", "pad.permissionDenied": "Ľutujeme, nemáte oprávnenie pristupovať k tomuto poznámkovému bloku", - "pad.settings.title": "Nastavenia", - "pad.settings.padSettings": "Nastavenia pre celý pad", - "pad.settings.userSettings": "Používateľské nastavenia", + "pad.settings.padSettings": "Nastavenia poznámkového bloku", "pad.settings.myView": "Vlastný pohľad", - "pad.settings.disablechat": "Vypnúť chat", - "pad.settings.darkMode": "Tmavý režim", "pad.settings.stickychat": "Rozhovor stále na obrazovke", "pad.settings.chatandusers": "Zobraziť rozhovor a používateľov", "pad.settings.colorcheck": "Farby autorov", - "pad.settings.fadeInactiveAuthorColors": "Stlmiť farby neaktívnych autorov", "pad.settings.linenocheck": "Čísla riadkov", "pad.settings.rtlcheck": "Čítať obsah sprava doľava?", - "pad.settings.enforceSettings": "Vynútiť nastavenia pre ostatných používateľov", - "pad.settings.enforcedNotice": "Tieto nastavenia vám uzamkol tvorca tohto padu. Ak ich potrebujete zmeniť, požiadajte tvorcu padu.", "pad.settings.fontType": "Typ písma:", "pad.settings.fontType.normal": "Normálne", "pad.settings.language": "Jazyk:", - "pad.settings.deletePad": "Zmazať pad", - "pad.delete.confirm": "Naozaj chcete zmazať tento pad?", - "pad.deletionToken.modalTitle": "Uložte si token na zmazanie padu", - "pad.deletionToken.modalBody": "Tento token je jediný spôsob, ako zmazať tento pad, ak stratíte reláciu prehliadača alebo zmeníte zariadenie. Uložte si ho na bezpečné miesto — zobrazí sa tu iba raz.", - "pad.deletionToken.copy": "Kopírovať", - "pad.deletionToken.copied": "Skopírované", - "pad.deletionToken.acknowledge": "Uložil som si ho", - "pad.deletionToken.deleteWithToken": "Zmazať pad pomocou tokenu", - "pad.deletionToken.tokenFieldLabel": "Token na zmazanie padu", - "pad.deletionToken.tokenValueLabel": "Váš token na zmazanie padu (iba na čítanie)", - "pad.deletionToken.invalid": "Tento token nie je platný pre tento pad.", - "pad.deletionToken.notCreator": "Nie ste tvorcom tohto padu, takže ho nemôžete zmazať.", "pad.settings.about": "O Etherpade", "pad.settings.poweredBy": "Poháňané cez", "pad.importExport.import_export": "Import/Export", @@ -312,13 +90,6 @@ "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.exportetherpada.title": "Exportovať ako Etherpad", - "pad.importExport.exporthtmla.title": "Exportovať ako HTML", - "pad.importExport.exportplaina.title": "Exportovať ako čistý text", - "pad.importExport.exportworda.title": "Exportovať ako Microsoft Word", - "pad.importExport.exportpdfa.title": "Exportovať ako PDF", - "pad.importExport.exportopena.title": "Exportovať ako ODF (Open Document Format)", - "pad.importExport.noConverter.innerHTML": "Importovať môžete iba z formátov čistého textu alebo HTML. Pre pokročilejšie funkcie importu si nainštalujte LibreOffice.", "pad.modals.connected": "Pripojené.", "pad.modals.reconnecting": "Opätovné pripájanie k vášmu poznámkovému bloku...", "pad.modals.forcereconnect": "Vynútiť znovupripojenie", @@ -349,8 +120,6 @@ "pad.modals.disconnected": "Boli ste odpojení.", "pad.modals.disconnected.explanation": "Spojenie so serverom sa prerušilo", "pad.modals.disconnected.cause": "Server môže byť nedostupný. Ak by problém pretrvával, informujte správcu služby.", - "pad.gritter.unacceptedCommit.title": "Neuložená úprava", - "pad.gritter.unacceptedCommit.text": "Vaša nedávna úprava stále nie je uložená. Znova sa pripojte a skúste to ešte raz.", "pad.share": "Zdieľať tento poznámkový blok", "pad.share.readonly": "Len na čítanie", "pad.share.link": "Odkaz", @@ -363,36 +132,12 @@ "timeslider.followContents": "Sledovať aktualizácie obsahu poznámkového bloku", "timeslider.pageTitle": "Časová os {{appTitle}}", "timeslider.toolbar.returnbutton": "Späť do poznámkového bloku", - "pad.historyMode.banner": "Prezeranie histórie", - "pad.historyMode.return": "Návrat k živej verzii", - "pad.historyMode.revisionLabel": "Revízia {{rev}}", - "pad.historyMode.controlsLabel": "Ovládanie histórie padu", - "pad.historyMode.sliderLabel": "Revízia padu", - "pad.historyMode.settings.title": "Prehrávanie histórie", - "pad.historyMode.settings.follow": "Sledovať zmeny obsahu padu", - "pad.historyMode.settings.followShort": "Sledovať", - "pad.historyMode.followOn": "Sledujú sa zmeny padu — kliknutím sledovanie ukončíte", - "pad.historyMode.followOff": "Zmeny padu sa nesledujú — kliknutím začnete sledovať", - "pad.historyMode.settings.playbackSpeed": "Rýchlosť prehrávania:", - "pad.historyMode.chat.replayHeader": "Chat k {{time}}", - "pad.historyMode.users.authorsHeader": "Autori v tejto revízii", - "pad.editor.skipToContent": "Preskočiť na editor", - "pad.editor.keyboardHint": "Stlačením Escape opustíte editor. Stlačením Alt+F9 sa dostanete na panel nástrojov.", - "pad.editor.toolbar.formatting": "Panel nástrojov formátovania", - "pad.editor.toolbar.actions": "Panel akcií padu", - "pad.editor.toolbar.showMore": "Zobraziť viac tlačidiel panela", "timeslider.toolbar.authors": "Autori:", "timeslider.toolbar.authorsList": "Bez autorov", "timeslider.toolbar.exportlink.title": "Export", "timeslider.exportCurrent": "Exportovať aktuálnu verziu ako:", "timeslider.version": "Verzia {{version}}", "timeslider.saved": "Uložené {{day}}. {{month}} {{year}}", - "timeslider.settings.playbackSpeed": "Rýchlosť prehrávania:", - "timeslider.settings.playbackSpeed.original": "Pôvodná rýchlosť", - "timeslider.settings.playbackSpeed.realtime": "Reálny čas", - "timeslider.settings.playbackSpeed.200ms": "200 ms", - "timeslider.settings.playbackSpeed.500ms": "500 ms", - "timeslider.settings.playbackSpeed.1000ms": "1000 ms", "timeslider.playPause": "Pustiť / Pozastaviť obsah poznámkového bloku", "timeslider.backRevision": "Ísť v tomto poznámkovom bloku o jednu revíziu späť", "timeslider.forwardRevision": "Ísť v tomto poznámkovom bloku o jednu revíziu vpred", @@ -414,7 +159,6 @@ "pad.savedrevs.timeslider": "Návštevou časovej osi môžete zobraziť uložené revízie", "pad.userlist.entername": "Zadajte svoje meno", "pad.userlist.unnamed": "nemenovaný", - "pad.userlist.onlineCount": "{[ plural(count) one: {{count}} pripojený používateľ, few: {{count}} pripojení používatelia, many: {{count}} pripojených používateľov, other: {{count}} pripojených používateľov ]}", "pad.editbar.clearcolors": "Odstrániť farby autorov z celého dokumentu? Táto akcia sa nedá vrátiť", "pad.impexp.importbutton": "Importovať teraz", "pad.impexp.importing": "Prebieha import...", @@ -425,6 +169,5 @@ "pad.impexp.importfailed": "Import zlyhal", "pad.impexp.copypaste": "Vložte prosím kópiu cez schránku", "pad.impexp.exportdisabled": "Export do formátu {{type}} nie je povolený. Kontaktujte prosím administrátora pre zistenie detailov.", - "pad.impexp.maxFileSize": "Súbor je príliš veľký. Kontaktujte správcu pre zväčšenie povolenej veľkosti súborov pre import", - "pad.social.description": "Kolaboratívny dokument, ktorý môže každý upravovať v reálnom čase." + "pad.impexp.maxFileSize": "Súbor je príliš veľký. Kontaktujte správcu pre zväčšenie povolenej veľkosti súborov pre import" } diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index 865b36a5f..67e1549f4 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -29,19 +29,9 @@ "admin.page-title": "管理员面板 - Etherpad", "admin.loading": "正在加载…", "admin.loading_description": "页面加载中,请稍安勿躁。", - "admin.toggle_sidebar": "开关侧边栏", - "admin.shout": "通讯", - "admin_shout.online_one": "目前有{{count}}位用户在线", - "admin_shout.online_other": "目前有{{count}}位用户在线", - "admin_shout.sticky_toggle": "更改置顶消息", - "admin_login.title": "Etherpad", "admin_login.username": "用户名", "admin_login.password": "密码", "admin_login.submit": "登录", - "admin_login.failed": "登录失败", - "admin_pads.all_pads": "所有记事本", - "admin_pads.bulk.cleanup_history": "清理历史", - "admin_pads.bulk.clear_selection": "清除选择", "admin_pads.bulk.delete": "删除", "admin_pads.cancel": "取消", "admin_pads.col.users": "用户", diff --git a/src/node/db/Pad.ts b/src/node/db/Pad.ts index d879f9eae..8ab3ac9d9 100644 --- a/src/node/db/Pad.ts +++ b/src/node/db/Pad.ts @@ -632,15 +632,6 @@ class Pad { } async copy(destinationID: string, force: boolean) { - // Reject a destinationID that isn't a valid pad id BEFORE any db write. The - // copy path writes `pad:${destinationID}...` records directly (bypassing - // getPad), so a destinationID carrying the ueberdb delimiter `:` would - // otherwise clobber another pad's internal sub-records and slip past the - // force=false existence guard. (GHSA-wg58-mhwv-35pq.) - if (!padManager.isValidPadId(destinationID)) { - throw new CustomError('destinationID is not a valid padId', 'apierror'); - } - // Kick everyone from this pad. // This was commented due to https://github.com/ether/etherpad-lite/issues/3183. // Do we really need to kick everyone out? @@ -738,12 +729,6 @@ class Pad { } async copyPadWithoutHistory(destinationID: string, force: string|boolean, authorId = '') { - // See copy(): reject an invalid destinationID (notably one containing the - // ueberdb delimiter `:`) before any db write. (GHSA-wg58-mhwv-35pq.) - if (!padManager.isValidPadId(destinationID)) { - throw new CustomError('destinationID is not a valid padId', 'apierror'); - } - // flush the source pad this.saveToDatabase(); diff --git a/src/node/db/PadManager.ts b/src/node/db/PadManager.ts index 67a5af886..28b0588fe 100644 --- a/src/node/db/PadManager.ts +++ b/src/node/db/PadManager.ts @@ -108,15 +108,7 @@ const padList = new class { */ exports.getPad = async (id: string, text?: string|null, authorId:string|null = ''):Promise => { // check if this is a valid padId - // - // An id that is no longer valid to *create* is still served when a pad with - // that exact id already exists: `:` was accepted until GHSA-wg58-mhwv-35pq, so - // pads carrying one exist in the wild (that is why padIdTransforms maps `:` at - // all) and rejecting them here would lock their content away. doesPadExist() - // requires a top-level `atext`, which only a real pad record has — the - // `pad::revs:` / `:chat:` sub-records an injected id would address do - // not have one, so they stay unreachable. - if (!exports.isValidPadId(id) && !(await exports.doesPadExist(id))) { + if (!exports.isValidPadId(id)) { throw new CustomError(`${id} is not a valid padId`, 'apierror'); } @@ -207,13 +199,8 @@ exports.sanitizePadId = async (padId: string) => { // can never be created. const dotSegmentPadId = /^\.{1,2}$/; -// `:` is the ueberdb key-namespace delimiter (records are stored under -// `pad:`, `pad::revs:`, `pad::chat:`). A pad id containing a -// `:` can therefore address another pad's internal sub-records, so it is never -// valid — the name portion excludes `$` (group-pad separator) and `:`. -// (GHSA-wg58-mhwv-35pq: copyPad/movePad destinationID injection.) exports.isValidPadId = (padId: string) => - /^(g.[a-zA-Z0-9]{16}\$)?[^$:]{1,50}$/.test(padId) && !dotSegmentPadId.test(padId); + /^(g.[a-zA-Z0-9]{16}\$)?[^$]{1,50}$/.test(padId) && !dotSegmentPadId.test(padId); /** * Removes the pad from database and unloads it. diff --git a/src/node/db/SecurityManager.ts b/src/node/db/SecurityManager.ts index 33996c155..219d3f2be 100644 --- a/src/node/db/SecurityManager.ts +++ b/src/node/db/SecurityManager.ts @@ -75,13 +75,10 @@ exports.checkAccess = async (padID:string, sessionCookie:string, token:string, u } // Authentication and authorization checks. - // settings.loadTest just short-circuits authn/authz; the user-facing - // warning about this configuration choice is logged from Settings.ts - // during settings load/reload, not on every request. Re-logging it - // here was costing ~4% of process CPU in the 100-400 author dive - // sweep (#7756): the routed-console-warn went through log4js's - // clustering dispatch on every message. - if (!settings.loadTest && settings.requireAuthentication) { + if (settings.loadTest) { + console.warn( + 'bypassing socket.io authentication and authorization checks due to settings.loadTest'); + } else if (settings.requireAuthentication) { if (userSettings == null) { authLogger.debug('access denied: authentication is required'); return DENY; diff --git a/src/node/db/SessionManager.ts b/src/node/db/SessionManager.ts index e2f785d82..b8b1b2562 100644 --- a/src/node/db/SessionManager.ts +++ b/src/node/db/SessionManager.ts @@ -62,8 +62,18 @@ exports.findAuthorID = async (groupID:string, sessionCookie: string) => { * Also, see #3820. */ const sessionIDs = sessionCookie.replace(/^"|"$/g, '').split(','); - const sessionInfoPromises = sessionIDs.map(async (id) => - (await getSessionInfoOrNull(id)) || undefined); + const sessionInfoPromises = sessionIDs.map(async (id) => { + try { + return await exports.getSessionInfo(id); + } catch (err:any) { + if (err.message === 'sessionID does not exist') { + console.debug(`SessionManager getAuthorID: no session exists with ID ${id}`); + } else { + throw err; + } + } + return undefined; + }); const now = Math.floor(Date.now() / 1000); const isMatch = (si: { groupID: string; @@ -153,20 +163,9 @@ exports.createSession = async (groupID: string, authorID: string, validUntil: nu * @param {String} sessionID The id of the session * @return {Promise} the sessioninfos */ -// Non-throwing variant for hot-path callers. Hot path uses -// `findAuthorID` on every CLIENT_READY and `listSessionsWithDBKey` on -// session listing; both wrap getSessionInfo in try/catch and discard -// "sessionID does not exist" CustomError. Profiling against develop at -// 100-400 author sweep (ether/etherpad#7756) attributed ~6% of total -// CPU to that throw+catch pair: ~1.8% to CustomError construction and -// ~4% to the cascading `console.debug` call routed through log4js. A -// null return collapses the cost to a single nullable check. -const getSessionInfoOrNull = async (sessionID: string) => - await db.get(`session:${sessionID}`); - exports.getSessionInfo = async (sessionID:string) => { // check if the database entry of this session exists - const session = await getSessionInfoOrNull(sessionID); + const session = await db.get(`session:${sessionID}`); if (session == null) { // session does not exist @@ -251,12 +250,15 @@ const listSessionsWithDBKey = async (dbkey: string) => { // iterate through the sessions and get the sessioninfos for (const sessionID of Object.keys(sessions || {})) { - const info = await getSessionInfoOrNull(sessionID); - if (info == null) { - console.warn(`Found bad session ${sessionID} in ${dbkey}`); - sessions[sessionID] = null; - } else { - sessions[sessionID] = info; + try { + sessions[sessionID] = await exports.getSessionInfo(sessionID); + } catch (err:any) { + if (err.name === 'apierror') { + console.warn(`Found bad session ${sessionID} in ${dbkey}`); + sessions[sessionID] = null; + } else { + throw err; + } } } diff --git a/src/node/handler/ExportHandler.ts b/src/node/handler/ExportHandler.ts index d141aba67..655cf6497 100644 --- a/src/node/handler/ExportHandler.ts +++ b/src/node/handler/ExportHandler.ts @@ -163,13 +163,7 @@ exports.doExport = async (req: any, res: any, padId: string, readOnlyId: string, // for the temp path token (see matching note in ImportHandler.ts). const randNum = crypto.randomBytes(16).toString('hex'); const srcFile = `${tempDirectory}/etherpad_export_${randNum}.html`; - // Strip remote tags before handing the document to LibreOffice. - // soffice fetches remote image URLs during conversion, so any plugin/hook - // that injects an into export HTML would otherwise - // turn export into a blind SSRF sink. The native path already does this - // (see stripRemoteImages above); apply it here so both paths match. - const {stripRemoteImages} = require('../utils/ExportSanitizeHtml'); - await fsp_writeFile(srcFile, stripRemoteImages(html)); + await fsp_writeFile(srcFile, html); // ensure html can be collected by the garbage collector html = null; diff --git a/src/node/handler/PadMessageHandler.ts b/src/node/handler/PadMessageHandler.ts index 764ec2e6e..7ede7d391 100644 --- a/src/node/handler/PadMessageHandler.ts +++ b/src/node/handler/PadMessageHandler.ts @@ -204,14 +204,7 @@ class Channels { /** * A changeset queue per pad that is processed by handleUserChanges() */ -// The channel key `ch` is the pad id captured at enqueue time (see the enqueue -// call). Pass it through to handleUserChanges so the write targets the pad that -// was authorized when the message arrived — NOT whatever pad the mutable -// sessioninfos[socket.id].padId happens to point at by apply time. A concurrent -// same-socket CLIENT_READY can swap that padId between enqueue and apply, which -// otherwise redirects the queued write onto a read-only / unauthorized pad -// (GHSA-6mcx-x5h6-rpw2). -const padChannels = new Channels((ch, {socket, message}) => handleUserChanges(socket, message, ch)); +const padChannels = new Channels((ch, {socket, message}) => handleUserChanges(socket, message)); /** * This Method is called by server.ts to tell the message handler on which socket it should send @@ -512,17 +505,6 @@ exports.handleMessage = async (socket:any, message: ClientVarMessage) => { throw new Error(`pre-CLIENT_READY message from IP ${ip}: ${msg}`); } - // Pin the pad this message is authorized against — together with `auth` and - // the read-only flag — BEFORE any of the awaits below (checkAccess and the - // handleMessageSecurity/handleMessage hooks). A concurrent same-socket - // CLIENT_READY can mutate sessioninfos[socket.id] (padId/readonly/auth) IN - // PLACE during those awaits (the object identity check below does not catch an - // in-place mutation). Using these pinned values for the read-only gate, the - // queue key and the write keeps them all referring to the SAME pad, closing - // the cross-pad write TOCTOU (GHSA-6mcx-x5h6-rpw2). - const messagePadId = thisSession.padId; - const messageReadonly = thisSession.readonly; - const {session: {user} = {}} = socket.client.request as SocketClientRequest; const {accessStatus, authorID} = await securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, user); @@ -544,15 +526,14 @@ exports.handleMessage = async (socket:any, message: ClientVarMessage) => { } thisSession.author = authorID; - // Allow plugins to bypass the readonly message blocker. Base the decision on - // the value pinned above so a concurrent CLIENT_READY can't flip it mid-message. - let readOnly = messageReadonly; + // Allow plugins to bypass the readonly message blocker + let readOnly = thisSession.readonly; const context = { message, sessionInfo: { authorId: thisSession.author, - padId: messagePadId, - readOnly: messageReadonly, + padId: thisSession.padId, + readOnly: thisSession.readonly, }, socket, get client() { @@ -599,10 +580,7 @@ exports.handleMessage = async (socket:any, message: ClientVarMessage) => { switch (type) { case 'USER_CHANGES': stats.counter('pendingEdits').inc(); - // Queue key = the pinned pad, NOT the (possibly-swapped) live - // session padId. This value is forwarded to handleUserChanges as - // the write target (see the padChannels executor). - await padChannels.enqueue(messagePadId, {socket, message}); + await padChannels.enqueue(thisSession.padId, {socket, message}); break; case 'PAD_DELETE': await handlePadDelete(socket, message.data as unknown as PadDeleteMessage); break; case 'USERINFO_UPDATE': await handleUserInfoUpdate(socket, message as unknown as UserNewInfoMessage); break; @@ -845,7 +823,7 @@ const handleUserInfoUpdate = async (socket:any, {data: {userInfo: {name, colorId */ const handleUserChanges = async (socket:any, message: { data: ClientUserChangesMessage -}, authorizedPadId: string) => { +}) => { // This one's no longer pending, as we're gonna process it now stats.counter('pendingEdits').dec(); @@ -872,9 +850,7 @@ const handleUserChanges = async (socket:any, message: { if (apool == null) throw new Error('missing apool'); if (changeset == null) throw new Error('missing changeset'); const wireApool = (new AttributePool()).fromJsonable(apool); - // Use the pad id captured at enqueue time, not the (mutable) session padId, - // which a concurrent CLIENT_READY may have swapped (GHSA-6mcx-x5h6-rpw2). - const pad = await padManager.getPad(authorizedPadId, null, thisSession.author); + const pad = await padManager.getPad(thisSession.padId, null, thisSession.author); // Verify that the changeset has valid syntax and is in canonical form checkRep(changeset); @@ -1028,7 +1004,7 @@ const handleUserChanges = async (socket:any, message: { socket.emit('message', {disconnect: 'badChangeset'}); stats.meter('failedChangesets').mark(); messageLogger.warn(`Failed to apply USER_CHANGES from author ${thisSession.author} ` + - `(socket ${socket.id}) on pad ${authorizedPadId}: ${err.stack || err}`); + `(socket ${socket.id}) on pad ${thisSession.padId}: ${err.stack || err}`); } finally { stopWatch.end(); } diff --git a/src/node/hooks/express/padurlsanitize.ts b/src/node/hooks/express/padurlsanitize.ts index 650f1315e..8679bcfe3 100644 --- a/src/node/hooks/express/padurlsanitize.ts +++ b/src/node/hooks/express/padurlsanitize.ts @@ -8,32 +8,14 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio // redirects browser to the pad's sanitized url if needed. otherwise, renders the html args.app.param('pad', (req:any, res:any, next:Function, padId:string) => { (async () => { - // Reject URLs ending in `/` outright. - if (/\/$/.test(req.url)) { + // ensure the padname is valid and the url doesn't end with a / + if (!padManager.isValidPadId(padId) || /\/$/.test(req.url)) { res.status(404).send('Such a padname is forbidden'); return; } - // Sanitize FIRST, then validate the sanitized result. sanitizePadId maps - // legacy characters (whitespace and the ueberdb delimiter `:`) to `_`, so - // a URL like `/p/foo:bar` still redirects to `/p/foo_bar` even though `:` - // is not itself a valid pad id (GHSA-wg58-mhwv-35pq). An id that stays - // invalid after sanitizing (e.g. one containing `$`) is forbidden. const sanitizedPadId = await padManager.sanitizePadId(padId); - // A pad that already exists keeps its URL even if its id is no longer a - // valid one to *create*: `:` was accepted by isValidPadId until - // GHSA-wg58-mhwv-35pq, so pads carrying one exist in the wild (that is why - // padIdTransforms maps `:` in the first place) and 404ing them would lock - // their content away. Only ids that are invalid AND unknown are rejected — - // opening a pad URL creates the pad, so this is what keeps new invalid ids - // out. - if (!padManager.isValidPadId(sanitizedPadId) && - !(await padManager.doesPadExist(sanitizedPadId))) { - res.status(404).send('Such a padname is forbidden'); - return; - } - if (sanitizedPadId === padId) { // the pad id was fine, so just render it next(); diff --git a/src/node/hooks/express/specialpages.ts b/src/node/hooks/express/specialpages.ts index ca5e6e6e1..f3df19bc2 100644 --- a/src/node/hooks/express/specialpages.ts +++ b/src/node/hooks/express/specialpages.ts @@ -25,21 +25,6 @@ let ioI: { sockets: { sockets: any[]; }; } | null = null // rules. Reused by admin.ts so both call sites share one definition. import {sanitizeProxyPath} from '../../utils/sanitizeProxyPath'; -// Public routes echo the proxy-path headers into rendered URLs, social-preview -// metadata, manifest links and the legacy timeslider redirect. Advertise the -// headers in Vary so a shared cache/CDN in front of Etherpad keys on them and -// can't serve a proxy-path injected by one client to another (cache poisoning). -// Mirrors the admin-route fix in admin.ts (GHSA-fjgc-3mj7-8rg8). -// -// Only vary on the headers sanitizeProxyPath() actually consults for the -// current config: x-proxy-path is always honored, but x-forwarded-prefix and -// x-ingress-path are ignored unless trustProxy is enabled — varying on them -// then would only fragment shared caches without affecting the response. -const varyOnProxyPath = (res: any) => { - res.vary('x-proxy-path'); - if (settings.trustProxy) res.vary(['x-forwarded-prefix', 'x-ingress-path']); -}; - exports.socketio = (hookName: string, {io}: any) => { ioI = io @@ -188,7 +173,6 @@ const handleLiveReload = async (args: ArgsExpressType, padString: string, timeSl }) setRouteHandler('/', (req: any, res: any) => { const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'home', proxyPath, @@ -218,7 +202,6 @@ const handleLiveReload = async (args: ArgsExpressType, padString: string, timeSl }); const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'pad', padName: req.params.pad, proxyPath, @@ -263,7 +246,6 @@ const handleLiveReload = async (args: ArgsExpressType, padString: string, timeSl }); const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'timeslider', padName: req.params.pad, proxyPath, @@ -387,7 +369,6 @@ exports.expressCreateServer = async (_hookName: string, args: ArgsExpressType, c // serve index.html under / args.app.get('/', (req: any, res: any) => { const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'home', proxyPath, @@ -408,7 +389,6 @@ exports.expressCreateServer = async (_hookName: string, args: ArgsExpressType, c }); const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'pad', padName: req.params.pad, proxyPath, @@ -437,7 +417,6 @@ exports.expressCreateServer = async (_hookName: string, args: ArgsExpressType, c // technically well-defined but Firefox dropped a trailing-slash // case once that flaked the legacy-URL test (#7710). const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); return res.redirect(302, `${proxyPath}/p/${encodeURIComponent(req.params.pad)}`); } ensureAuthorTokenCookie(req, res, settings); @@ -446,7 +425,6 @@ exports.expressCreateServer = async (_hookName: string, args: ArgsExpressType, c }); const proxyPath = sanitizeProxyPath(req); - varyOnProxyPath(res); const socialMetaHtml = renderSocialMeta({ req, settings, availableLangs: i18n.availableLangs, locales: i18n.locales, kind: 'timeslider', padName: req.params.pad, proxyPath, diff --git a/src/node/hooks/express/webaccess.ts b/src/node/hooks/express/webaccess.ts index 440cb3525..890a6f37a 100644 --- a/src/node/hooks/express/webaccess.ts +++ b/src/node/hooks/express/webaccess.ts @@ -22,22 +22,6 @@ const aCallFirst0 = // @ts-ignore async (hookName: string, context:any, pred = null) => (await aCallFirst(hookName, context, pred))[0]; -// Rotate the express-session id while preserving the session's data. Used at the -// authentication boundary to prevent session fixation (GHSA-73h9-c5xp-gfg4). -// The freshly minted cookie for the new id is kept; all other session data -// (notably req.session.user) is carried across onto the new session. -const regenerateSessionPreservingData = (req: any) => new Promise((resolve, reject) => { - // Session prototype methods (regenerate/save/...) are non-enumerable, so the - // spread captures only data properties. Drop `cookie` so the new session keeps - // the fresh cookie regenerate() creates. - const {cookie, ...data} = req.session; - req.session.regenerate((err: any) => { - if (err) return reject(err); - Object.assign(req.session, data); - req.session.save((saveErr: any) => saveErr != null ? reject(saveErr) : resolve()); - }); -}); - exports.normalizeAuthzLevel = (level: string|boolean) => { if (!level) return false; switch (level) { @@ -174,11 +158,6 @@ const checkAccess = async (req:any, res:any, next: Function) => { if (settings.users == null) settings.users = {}; const ctx:WebAccessTypes = {req, res, users: settings.users, next}; - // Identity carried by the session BEFORE the authenticate step runs. Used - // below to decide whether authentication changed the principal (anonymous -> - // user, or a privilege/identity change such as non-admin -> admin), which is - // the point at which the session id must be rotated (see below). - const prevUser = req.session != null ? req.session.user : null; // If the HTTP basic auth header is present, extract the username and password so it can be given // to authn plugins. const httpBasicAuth = req.headers.authorization && req.headers.authorization.startsWith('Basic '); @@ -227,26 +206,6 @@ const checkAccess = async (req:any, res:any, next: Function) => { httpLogger.error('authenticate hook failed to add user settings to session'); return res.status(500).send('Internal Server Error'); } - // Session fixation defense (GHSA-73h9-c5xp-gfg4): rotate the session id - // whenever authentication changed the principal — an anonymous session - // becoming authenticated, OR an authenticated session changing identity or - // privilege level (e.g. non-admin -> admin re-authentication). This prevents a - // pre-auth / lower-privilege id (which an attacker may have planted or - // captured — e.g. one an SSO plugin persisted before redirecting to the IdP) - // from owning the resulting session. A no-op re-authentication of the same - // principal is left alone (no churn), and the rotation is skipped when the - // session store doesn't expose regenerate(). - const identityChanged = prevUser == null || - prevUser.username !== req.session.user.username || - !!prevUser.is_admin !== !!req.session.user.is_admin; - if (identityChanged && typeof req.session.regenerate === 'function') { - try { - await regenerateSessionPreservingData(req); - } catch (err) { - httpLogger.error(`failed to regenerate session on authentication: ${err}`); - return res.status(500).send('Internal Server Error'); - } - } const {username = ''} = req.session.user; httpLogger.info( `Successful authentication from IP ${anonymizeIp(req.ip, settings.ipLogging)} ` + diff --git a/src/node/security/OAuth2Provider.ts b/src/node/security/OAuth2Provider.ts index 551ca32f9..8bfb46831 100644 --- a/src/node/security/OAuth2Provider.ts +++ b/src/node/security/OAuth2Provider.ts @@ -10,12 +10,6 @@ import {format} from 'url' import {ParsedUrlQuery} from "node:querystring"; import {MapArrayType} from "../types/MapType"; import crypto from "node:crypto"; -import {resolveOidcCookieKeys, isOriginAllowedForOidcClient} from "./OidcProviderSecurity"; -import SecretRotator from "./SecretRotator"; - -// Held at module scope so the rotator (and its refresh timer) is not garbage -// collected for the lifetime of the process, mirroring express.ts. -let oidcCookieSecretRotator: SecretRotator | null = null; // Small fixed delay applied to every failed interactive login, mirroring // webaccess.authnFailureDelayMs, so failures take a consistent amount of time. @@ -74,13 +68,9 @@ const configuration: Configuration = { profile: ['name'], admin: ['admin'] }, - // NOTE: cookies.keys is deliberately NOT set here. A committed literal key - // (historically ['oidc']) lets anyone with the public source forge valid - // OIDC provider `.sig` cookies. The real key material is resolved at - // provider-construction time in expressCreateServer() via - // resolveOidcCookieKeys(), which prefers an operator-supplied - // settings.sso.cookieKeys and otherwise derives a secret, stable key from - // the persisted session secret. See OidcProviderSecurity.ts. + cookies: { + keys: ['oidc'], + }, features:{ devInteractions: {enabled: false}, }, @@ -102,39 +92,8 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp publicKeyExported = publicKey privateKeyExported = privateKey - // Resolve the OIDC provider's cookie-signing keys. Never a committed literal. - // When the operator hasn't pinned settings.sso.cookieKeys and cookie key - // rotation is enabled (the default), reuse the same DB-backed SecretRotator - // mechanism as the Express session cookies so the key is stable across - // restarts and shared across horizontally-scaled pods. `settings.sessionKey` - // is commonly null under default rotation settings, so relying on it alone - // would hand the provider an unstable per-process random key. - const operatorCookieKeys = (settings.sso as {cookieKeys?: unknown}).cookieKeys; - const hasOperatorKeys = Array.isArray(operatorCookieKeys) && - operatorCookieKeys.some((k) => typeof k === 'string' && k.length > 0); - const {keyRotationInterval, sessionLifetime} = settings.cookie; - let rotatedSecrets: string[] | null = null; - if (!hasOperatorKeys && keyRotationInterval && sessionLifetime) { - if (oidcCookieSecretRotator == null) { - oidcCookieSecretRotator = new SecretRotator( - 'oidcCookieSecrets', keyRotationInterval, sessionLifetime, settings.sessionKey); - await oidcCookieSecretRotator.start(); - } - rotatedSecrets = oidcCookieSecretRotator.secrets; - } - const oidc = new Provider(settings.sso.issuer, { - ...configuration, - cookies: { - // Secret, deployment-stable signing keys — never a committed literal. - // See resolveOidcCookieKeys(). - keys: resolveOidcCookieKeys({ - cookieKeys: operatorCookieKeys, - rotatedSecrets, - sessionKey: settings.sessionKey, - }), - }, - jwks: { + ...configuration, jwks: { keys: [ privateKeyJWK ], @@ -168,12 +127,9 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp }, jwtResponseModes: {enabled: true}, }, - clientBasedCORS: (ctx, origin, client) => - // Only allow cross-origin reads from an origin registered as one of - // the client's redirect URIs. Returning `true` unconditionally - // reflected any Origin into Access-Control-Allow-Origin. See - // isOriginAllowedForOidcClient(). - isOriginAllowedForOidcClient(origin, client as {redirectUris?: unknown}), + clientBasedCORS: (ctx, origin, client) => { + return true + }, extraParams: [], extraTokenClaims: async (ctx, token) => { if(token.kind === 'AccessToken') { diff --git a/src/node/security/OidcProviderSecurity.ts b/src/node/security/OidcProviderSecurity.ts deleted file mode 100644 index a5bfc6c1f..000000000 --- a/src/node/security/OidcProviderSecurity.ts +++ /dev/null @@ -1,96 +0,0 @@ -import crypto from 'node:crypto'; - -/** - * Security helpers for the embedded OIDC provider (`OAuth2Provider.ts`). - * - * Kept in a dependency-light module (only `node:crypto`) so the pure decisions - * can be unit-tested without constructing an `oidc-provider` instance. - */ - -// Domain-separation label so the derived cookie key is cryptographically -// unrelated to any other use of the session secret. The trailing NUL keeps the -// label from ambiguously running into the appended secret. -export const COOKIE_KEY_DERIVATION_LABEL = 'etherpad-oidc-provider-cookie-signing-key\0'; - -/** - * Resolve the cookie-signing keys for the embedded OIDC provider. - * - * oidc-provider signs its short-lived interaction/session/grant cookies - * (`_interaction`, `_interaction_resume`, `_grant`, `_session`) with an HMAC - * keyed by these values. Shipping a hardcoded key (historically `['oidc']`) let - * anyone with the public source forge valid `.sig` cookies, defeating the - * provider's cookie-integrity guarantee. Reported by `meifukun`. - * - * Resolution order: - * 1. An explicit operator-supplied `settings.sso.cookieKeys` array — use this - * for controlled rotation: `[newKey, ...oldKeys]`. - * 2. The live secrets array of a DB-backed `SecretRotator` (the same mechanism - * the Express session-cookie stack uses). This is the default path: it is - * stable across restarts, shared across horizontally-scaled pods via the - * database, and rotates automatically. The array is returned BY REFERENCE - * so a later in-place rotation propagates to oidc-provider/keygrip without - * reconstructing the provider. - * 3. A value derived from the persisted Etherpad session secret - * (`SESSIONKEY.txt`) via a domain-separated SHA-256 — used when rotation is - * disabled but a static session key exists. Stable across restarts/pods, - * never committed to source. - * 4. As a last resort (no key material at all), an ephemeral per-process - * random key. The integrity boundary holds, but interactions won't survive - * a restart or span multiple pods. - */ -export const resolveOidcCookieKeys = ( - opts: {cookieKeys?: unknown, rotatedSecrets?: string[] | null, sessionKey?: string | null}, -): string[] => { - const {cookieKeys, rotatedSecrets, sessionKey} = opts; - - if (Array.isArray(cookieKeys)) { - const usable = cookieKeys.filter((k): k is string => typeof k === 'string' && k.length > 0); - if (usable.length > 0) return usable; - } - - // Return the rotator's array by reference (do not copy/filter) so in-place - // rotation is observed live by keygrip. - if (Array.isArray(rotatedSecrets) && - rotatedSecrets.some((k) => typeof k === 'string' && k.length > 0)) { - return rotatedSecrets; - } - - if (typeof sessionKey === 'string' && sessionKey.length > 0) { - const derived = crypto.createHash('sha256') - .update(COOKIE_KEY_DERIVATION_LABEL) - .update(sessionKey) - .digest('hex'); - return [derived]; - } - - return [crypto.randomBytes(32).toString('hex')]; -}; - -/** - * Origin allow-list decision for the embedded OIDC provider's CORS-enabled - * endpoints (`/oidc/token`, `/oidc/me`, ...). oidc-provider invokes - * `clientBasedCORS(ctx, origin, client)` for every cross-origin request; - * returning `true` unconditionally (the historical behavior) reflected ANY - * `Origin` into `Access-Control-Allow-Origin`, letting unregistered origins read - * token/userinfo responses that use non-cookie credentials (Authorization - * headers, POST-body client credentials). Reported by `meifukun`. - * - * An origin is allowed only when it exactly matches the origin (scheme + host + - * port) of one of the client's registered redirect URIs. - */ -export const isOriginAllowedForOidcClient = ( - origin: string | undefined | null, - client: {redirectUris?: unknown} | undefined | null, -): boolean => { - if (!origin || !client) return false; - const uris = (client as {redirectUris?: unknown}).redirectUris; - if (!Array.isArray(uris)) return false; - return uris.some((uri: unknown) => { - if (typeof uri !== 'string') return false; - try { - return new URL(uri).origin === origin; - } catch { - return false; - } - }); -}; diff --git a/src/node/utils/AbsolutePaths.ts b/src/node/utils/AbsolutePaths.ts index f11e53d80..6423ae4d7 100644 --- a/src/node/utils/AbsolutePaths.ts +++ b/src/node/utils/AbsolutePaths.ts @@ -19,7 +19,6 @@ * limitations under the License. */ import log4js from 'log4js'; -import fs from 'fs'; import path from 'path'; import _ from 'underscore'; @@ -31,25 +30,6 @@ const absPathLogger = log4js.getLogger('AbsolutePaths'); */ let etherpadRoot: string|null = null; -/** - * Walks up the directory tree from `start`, returning the closest ancestor - * directory (including `start` itself) that contains a package.json. Replaces - * the unmaintained `find-root` package, mirroring its semantics: it throws if - * no package.json is found before reaching the filesystem root. - * - * @param {string} start - The directory to start searching from. - * @return {string} The closest ancestor directory containing a package.json. - */ -const findRoot = (start: string): string => { - let dir = start; - for (;;) { - if (fs.existsSync(path.join(dir, 'package.json'))) return dir; - const parent = path.dirname(dir); - if (parent === dir) throw new Error('package.json not found in path'); - dir = parent; - } -}; - /** * If stringArray's last elements are exactly equal to lastDesiredElements, * returns a copy in which those last elements are popped, or false otherwise. @@ -99,6 +79,7 @@ export const findEtherpadRoot = () => { return etherpadRoot; } + const findRoot = require('find-root'); const foundRoot = findRoot(__dirname); const splitFoundRoot = foundRoot.split(path.sep); diff --git a/src/node/utils/ExportSanitizeHtml.ts b/src/node/utils/ExportSanitizeHtml.ts index 91e287c88..bc2028bcd 100644 --- a/src/node/utils/ExportSanitizeHtml.ts +++ b/src/node/utils/ExportSanitizeHtml.ts @@ -208,17 +208,6 @@ export const stripRemoteImages = (html: string): string => { if (VOID_TAGS.has(name)) return; out += ``; }, - // Preserve document-level directives (notably ``) and - // comments. stripRemoteImages() runs on the FULL export document for the - // soffice path, so dropping the doctype would flip LibreOffice into quirks - // mode. htmlparser2 surfaces the doctype as a processing instruction whose - // `data` is e.g. `!doctype html`. - onprocessinginstruction(name, data) { - out += `<${data}>`; - }, - oncomment(data) { - out += ``; - }, }, {decodeEntities: false, lowerCaseTags: true}); parser.write(html); parser.end(); diff --git a/src/node/utils/Minify.ts b/src/node/utils/Minify.ts index 68e2146e9..8747ff04b 100644 --- a/src/node/utils/Minify.ts +++ b/src/node/utils/Minify.ts @@ -39,9 +39,11 @@ const ROOT_DIR = path.join(settings.root, 'src/static/'); const LIBRARY_WHITELIST = [ 'async', 'js-cookie', + 'security', 'split-grid', 'tinycon', 'underscore', + 'unorm', ]; // What follows is a terrible hack to avoid loop-back within the server. diff --git a/src/node/utils/Settings.ts b/src/node/utils/Settings.ts index f1ed4e4e0..1878e744f 100644 --- a/src/node/utils/Settings.ts +++ b/src/node/utils/Settings.ts @@ -35,7 +35,7 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import {argv} from './Cli' -import {parse as parseJsonc, printParseErrorCode, ParseError} from 'jsonc-parser'; +import jsonminify from 'jsonminify'; import log4js from 'log4js'; import {createHash} from 'node:crypto'; import randomString from './randomstring'; @@ -116,18 +116,9 @@ const parseSettings = (settingsFilename: string, isSettings: boolean) => { } try { - // jsonc-parser tolerates comments and trailing commas, so settings files - // can stay annotated. Unlike the old jsonminify + naive ',]'/',}' string - // replace, it fixes *every* trailing comma (not just the first of each - // kind) and never mangles those sequences when they appear inside strings. - const errors: ParseError[] = []; - const settings = parseJsonc(settingsStr, errors, {allowTrailingComma: true}); + settingsStr = jsonminify(settingsStr).replace(',]', ']').replace(',}', '}'); - if (errors.length > 0) { - const {error, offset} = errors[0]; - throw new Error(`${printParseErrorCode(error)} at offset ${offset}`); - } - if (settings === undefined) throw new Error('file is empty or not valid JSON'); + const settings = JSON.parse(settingsStr); logger.info(`${settingsType} loaded from: ${settingsFilename}`); @@ -304,10 +295,6 @@ export type SettingsType = { sso: { issuer: string, clients?: {client_id: string}[] - // Optional operator-supplied signing keys for the embedded OIDC provider's - // cookies. When unset, a secret key is derived from the session secret. - // Provide an ordered array `[newKey, ...oldKeys]` to rotate. - cookieKeys?: string[] }, showSettingsInAdminPage: boolean, cleanup: { @@ -1266,13 +1253,6 @@ export const reloadSettings = () => { logger.warn("logLayoutType: " + settings.logLayoutType); initLogging(settings.logconfig); - if (settings.loadTest) { - logger.warn( - 'settings.loadTest is true: SecurityManager.checkAccess() will bypass ' + - 'authentication and authorization for both HTTP and socket.io requests. ' + - 'Do NOT enable this in production.'); - } - if (!settings.skinName) { logger.warn('No "skinName" parameter found. Please check out settings.json.template and ' + 'update your settings.json. Falling back to the default "colibris".'); diff --git a/src/node/utils/tar.json b/src/node/utils/tar.json index 33949b526..08ae93f6b 100644 --- a/src/node/utils/tar.json +++ b/src/node/utils/tar.json @@ -67,6 +67,7 @@ , "skiplist.js" , "colorutils.js" , "undomodule.js" + , "$unorm/lib/unorm.js" , "contentcollector.js" , "changesettracker.js" , "linestylefilter.js" diff --git a/src/package.json b/src/package.json index 9683909d6..072b86636 100644 --- a/src/package.json +++ b/src/package.json @@ -40,54 +40,57 @@ "ejs": "^6.0.1", "esbuild": "^0.28.1", "express": "^5.2.1", - "express-rate-limit": "^8.6.0", + "express-rate-limit": "^8.5.1", "express-session": "^1.19.0", + "find-root": "1.1.0", "formidable": "^3.5.4", "html-to-docx": "^1.8.0", "htmlparser2": "^12.0.0", "http-errors": "^2.0.1", - "jose": "^6.2.4", + "jose": "^6.2.3", "js-cookie": "^3.0.8", "jsdom": "^29.1.1", - "jsonc-parser": "^3.3.1", + "jsonminify": "0.4.2", "jsonwebtoken": "^9.0.3", "jwt-decode": "^4.0.0", "languages4translatewiki": "0.1.3", "live-plugin-manager": "^1.1.0", "lodash.clonedeep": "4.5.0", "log4js": "^6.9.1", - "lru-cache": "^11.5.2", + "lru-cache": "^11.5.1", "mammoth": "^1.12.0", "measured-core": "^2.0.0", "mime-types": "^3.0.2", - "mongodb": "^7.4.0", - "mssql": "^12.6.0", - "mysql2": "^3.23.1", - "nano": "^11.0.6", - "nodemailer": "^9.0.3", - "oidc-provider": "9.10.0", - "openapi-backend": "^5.18.0", + "mongodb": "^7.3.0", + "mssql": "^12.5.5", + "mysql2": "^3.22.5", + "nano": "^11.0.5", + "nodemailer": "^9.0.1", + "oidc-provider": "9.8.5", + "openapi-backend": "^5.17.0", "pdfkit": "^0.19.1", "pg": "^8.22.0", "prom-client": "^15.1.3", "proxy-addr": "^2.0.7", "rate-limiter-flexible": "^11.2.0", - "redis": "^6.1.0", + "redis": "^6.0.0", "rehype": "^13.0.2", "rehype-minify-whitespace": "^6.0.2", "resolve": "1.22.12", "rethinkdb": "^2.4.2", "rusty-store-kv": "^1.3.1", - "semver": "^7.8.5", + "security": "1.0.0", + "semver": "^7.8.4", "socket.io": "^4.8.3", "socket.io-client": "^4.8.3", "superagent": "10.3.0", - "surrealdb": "^2.0.8", + "surrealdb": "^2.0.3", "tinycon": "0.6.8", - "tsx": "4.23.1", - "ueberdb2": "6.1.16", + "tsx": "4.22.4", + "ueberdb2": "6.1.13", "underscore": "1.13.8", - "undici": "^8.9.0", + "undici": "^8.5.0", + "unorm": "1.6.0", "wtfnode": "^0.10.1" }, "bin": { @@ -95,7 +98,7 @@ "etherpad-lite": "node/server.ts" }, "devDependencies": { - "@playwright/test": "^1.61.1", + "@playwright/test": "^1.61.0", "@types/async": "^3.2.25", "@types/cookie-parser": "^1.4.10", "@types/cross-spawn": "^6.0.6", @@ -107,32 +110,33 @@ "@types/jquery": "^4.0.1", "@types/js-cookie": "^3.0.6", "@types/jsdom": "^28.0.3", + "@types/jsonminify": "^0.4.3", "@types/jsonwebtoken": "^9.0.10", "@types/mime-types": "^3.0.1", "@types/mocha": "^10.0.9", - "@types/node": "^26.1.1", + "@types/node": "^26.0.0", "@types/nodemailer": "^8.0.1", "@types/oidc-provider": "^9.5.0", "@types/pdfkit": "^0.17.6", "@types/semver": "^7.7.1", - "@types/sinon": "^22.0.0", - "@types/supertest": "^7.2.1", + "@types/sinon": "^21.0.1", + "@types/supertest": "^7.2.0", "@types/underscore": "^1.13.0", "@types/whatwg-mimetype": "^5.0.0", "chokidar": "^5.0.0", - "eslint": "^10.7.0", + "eslint": "^10.5.0", "eslint-config-etherpad": "^4.0.5", "etherpad-cli-client": "^4.0.3", "mocha": "^11.7.6", "mocha-froth": "^0.2.10", "nodeify": "^1.0.1", "openapi-schema-validation": "^0.4.2", - "set-cookie-parser": "^3.1.2", - "sinon": "^22.1.0", + "set-cookie-parser": "^3.1.0", + "sinon": "^22.0.0", "split-grid": "^1.0.11", "supertest": "^7.2.2", - "typescript": "^7.0.0", - "vitest": "^4.1.10" + "typescript": "^6.0.3", + "vitest": "^4.1.9" }, "engines": { "node": ">=24.0.0", diff --git a/src/static/js/TextLinesMutator.ts b/src/static/js/TextLinesMutator.ts index 3cc23ebef..c6d3c9303 100644 --- a/src/static/js/TextLinesMutator.ts +++ b/src/static/js/TextLinesMutator.ts @@ -13,10 +13,7 @@ import {splitTextLines} from "./Changeset"; */ class TextLinesMutator { private _lines: string[]; - // Args for a future this._lines.splice(): [index, deleteCount, ...linesToInsert]. - // Indexing past the two leading numbers yields `string | number` to the compiler even though - // elements from index 2 on are always strings, hence the `as string` casts below. - private _curSplice: [number, number, ...string[]]; + private _curSplice: [number, number?]; private _inSplice: boolean; private _curLine: number; private _curCol: number; @@ -135,7 +132,9 @@ class TextLinesMutator { */ _putCurLineInSplice() { if (!this._isCurLineInSplice()) { + // @ts-ignore this._curSplice.push(this._linesGet(this._curSplice[0] + this._curSplice[1])); + // @ts-ignore this._curSplice[1]++; } // TODO should be the same as this._curSplice.length - 1 @@ -212,6 +211,7 @@ class TextLinesMutator { * @returns {string} joined lines */ const nextKLinesText = (k: number) => { + // @ts-ignore const m = this._curSplice[0] + this._curSplice[1]; return this._linesSlice(m, m + k).join(''); }; @@ -219,22 +219,29 @@ class TextLinesMutator { let removed = ''; if (this._isCurLineInSplice()) { if (this._curCol === 0) { - removed = this._curSplice[this._curSplice.length - 1] as string; + // @ts-ignore + removed = this._curSplice[this._curSplice.length - 1]; this._curSplice.length--; removed += nextKLinesText(L - 1); + // @ts-ignore this._curSplice[1] += L - 1; } else { removed = nextKLinesText(L - 1); + // @ts-ignore this._curSplice[1] += L - 1; const sline = this._curSplice.length - 1; - removed = (this._curSplice[sline] as string).substring(this._curCol) + removed; - this._curSplice[sline] = (this._curSplice[sline] as string).substring(0, this._curCol) + + // @ts-ignore + removed = this._curSplice[sline].substring(this._curCol) + removed; + // @ts-ignore + this._curSplice[sline] = this._curSplice[sline].substring(0, this._curCol) + + // @ts-ignore this._linesGet(this._curSplice[0] + this._curSplice[1]); + // @ts-ignore this._curSplice[1] += 1; } } else { removed = nextKLinesText(L); - this._curSplice[1] += L; + this._curSplice[1]! += L; } return removed; } @@ -253,9 +260,12 @@ class TextLinesMutator { // although the line is put into splice, curLine is not increased, because // only some chars are removed not the whole line const sline = this._putCurLineInSplice(); - const line = this._curSplice[sline] as string; - const removed = line.substring(this._curCol, this._curCol + N); - this._curSplice[sline] = line.substring(0, this._curCol) + line.substring(this._curCol + N); + // @ts-ignore + const removed = this._curSplice[sline].substring(this._curCol, this._curCol + N); + // @ts-ignore + this._curSplice[sline] = this._curSplice[sline].substring(0, this._curCol) + + // @ts-ignore + this._curSplice[sline].substring(this._curCol + N); return removed; } @@ -265,29 +275,34 @@ class TextLinesMutator { * @param {string} text - the text to insert * @param {number} L - number of newlines in text */ - insert(text: string, L: number) { + insert(text: string | any[], L: any) { if (!text) return; if (!this._inSplice) this._enterSplice(); if (L) { - const newLines = splitTextLines(text) ?? []; + // @ts-ignore + const newLines = splitTextLines(text); if (this._isCurLineInSplice()) { const sline = this._curSplice.length - 1; - const theLine = this._curSplice[sline] as string; + /** @type {string} */ + const theLine = this._curSplice[sline]; const lineCol = this._curCol; // Insert the chars up to `curCol` and the first new line. + // @ts-ignore this._curSplice[sline] = theLine.substring(0, lineCol) + newLines[0]; this._curLine++; - newLines.splice(0, 1); + newLines!.splice(0, 1); // insert the remaining new lines + // @ts-ignore this._curSplice.push(...newLines); - this._curLine += newLines.length; + this._curLine += newLines!.length; // insert the remaining chars from the "old" line (e.g. the line we were in // when we started to insert new lines) + // @ts-ignore this._curSplice.push(theLine.substring(lineCol)); this._curCol = 0; // TODO(doc) why is this not set to the length of last line? } else { this._curSplice.push(...newLines); - this._curLine += newLines.length; + this._curLine += newLines!.length; } } else { // There are no additional lines. Although the line is put into splice, curLine is not @@ -300,8 +315,10 @@ class TextLinesMutator { 'https://github.com/ether/etherpad-lite/issues/2802'); console.error(err.stack || err.toString()); } - const line = this._curSplice[sline] as string; - this._curSplice[sline] = line.substring(0, this._curCol) + text + line.substring(this._curCol); + // @ts-ignore + this._curSplice[sline] = this._curSplice[sline].substring(0, this._curCol) + text + + // @ts-ignore + this._curSplice[sline].substring(this._curCol); this._curCol += text.length; } } @@ -314,6 +331,7 @@ class TextLinesMutator { hasMore() { let docLines = this._linesLength(); if (this._inSplice) { + // @ts-ignore docLines += this._curSplice.length - 2 - this._curSplice[1]; } return this._curLine < docLines; diff --git a/src/static/js/contentcollector.ts b/src/static/js/contentcollector.ts index a0bb5878c..5538ecd5d 100644 --- a/src/static/js/contentcollector.ts +++ b/src/static/js/contentcollector.ts @@ -31,13 +31,12 @@ import Op from "./Op"; const _MAX_LIST_LEVEL = 16; import AttributeMap from './AttributeMap'; +import UNorm from 'unorm'; import {subattribution} from './Changeset'; import {SmartOpAssembler} from "./SmartOpAssembler"; const hooks = require('./pluginfw/hooks'); -// NFC-normalize via the native String API (replaces the unmaintained `unorm` -// polyfill; String.prototype.normalize is available in every supported runtime). -const sanitizeUnicode = (s: string) => s.normalize('NFC'); +const sanitizeUnicode = (s) => UNorm.nfc(s); const tagName = (n) => n.tagName && n.tagName.toLowerCase(); // supportedElems are Supported natively within Etherpad and don't require a plugin const supportedElems = new Set([ diff --git a/src/static/js/pad_utils.ts b/src/static/js/pad_utils.ts index b6f17e84c..997dd2be6 100644 --- a/src/static/js/pad_utils.ts +++ b/src/static/js/pad_utils.ts @@ -24,7 +24,7 @@ import {binarySearch} from "./ace2_common"; * limitations under the License. */ -import * as Security from './security'; +const Security = require('security'); import jsCookie, {CookiesStatic} from 'js-cookie' /** diff --git a/src/static/js/security.ts b/src/static/js/security.ts index cae83bfdb..d5f9b7266 100644 --- a/src/static/js/security.ts +++ b/src/static/js/security.ts @@ -1,73 +1,20 @@ +// @ts-nocheck 'use strict'; /** - * OWASP-style output-escaping helpers. + * Copyright 2009 Google Inc. * - * Vendored from the `security` npm package (v1.0.0), which has been - * unmaintained since 2012. The implementation below is reproduced verbatim - * (behaviour is byte-identical) so the dependency can be dropped from core. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * Original work Copyright (c) 2011 Chad Weider, MIT licensed: + * http://www.apache.org/licenses/LICENSE-2.0 * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ -const HTML_ENTITY_MAP: {[c: string]: string} = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', -}; - -// OWASP Guidelines: &, <, >, ", ' plus forward slash. -const HTML_CHARACTERS_EXPRESSION = /[&"'<>/]/gm; -export const escapeHTML = (text: string) => text && text.replace(HTML_CHARACTERS_EXPRESSION, - (c: string) => HTML_ENTITY_MAP[c] || c); - -// OWASP Guidelines: escape all non alphanumeric characters in ASCII space. -const HTML_ATTRIBUTE_CHARACTERS_EXPRESSION = /[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF]/gm; -export const escapeHTMLAttribute = (text: string) => text && text.replace(HTML_ATTRIBUTE_CHARACTERS_EXPRESSION, - (c: string) => HTML_ENTITY_MAP[c] || `&#x${(`00${c.charCodeAt(0).toString(16)}`).slice(-2)};`); - -// OWASP Guidelines: escape all non alphanumeric characters in ASCII space. -// Also include line breaks (for literal). -const JAVASCRIPT_CHARACTERS_EXPRESSION = /[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF\u2028\u2029]/gm; -export const encodeJavaScriptIdentifier = (text: string) => text && text.replace(JAVASCRIPT_CHARACTERS_EXPRESSION, - (c: string) => `\\u${(`0000${c.charCodeAt(0).toString(16)}`).slice(-4)}`); - -export const encodeJavaScriptString = (text: string) => text && `"${encodeJavaScriptIdentifier(text)}"`; - -// This is not great, but it is useful. -// NB: the original `security` package used /"(?:\\.|[^"])*"/, where `[^"]` also -// matches a backslash and so overlaps with `\\.`, causing exponential -// backtracking (ReDoS) on adversarial input. We exclude the backslash from the -// character class so the two alternatives are mutually exclusive — this matches -// exactly the same well-formed JSON string literals but in linear time. -const JSON_STRING_LITERAL_EXPRESSION = /"(?:[^"\\]|\\.)*"/gm; -export const encodeJavaScriptData = (object: any) => JSON.stringify(object).replace(JSON_STRING_LITERAL_EXPRESSION, - (string: string) => encodeJavaScriptString(JSON.parse(string))); - -// OWASP Guidelines: escape all non alphanumeric characters in ASCII space. -const CSS_CHARACTERS_EXPRESSION = /[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF]/gm; -export const encodeCSSIdentifier = (text: string) => text && text.replace(CSS_CHARACTERS_EXPRESSION, - (c: string) => `\\${(`000000${c.charCodeAt(0).toString(16)}`).slice(-6)}`); - -export const encodeCSSString = (text: string) => text && `"${encodeCSSIdentifier(text)}"`; +module.exports = require('security'); diff --git a/src/tests/backend/specs/OidcProviderSecurity.ts b/src/tests/backend/specs/OidcProviderSecurity.ts deleted file mode 100644 index 792e6013d..000000000 --- a/src/tests/backend/specs/OidcProviderSecurity.ts +++ /dev/null @@ -1,128 +0,0 @@ -'use strict'; - -/** - * Unit coverage for the embedded OIDC provider's cookie-signing key derivation - * and CORS origin allow-list. Both were reported by `meifukun`: - * - the provider historically signed its cookies with the hardcoded key - * `['oidc']`, so anyone with the public source could forge valid `.sig` - * cookies; - * - `clientBasedCORS` returned `true` for every origin, reflecting arbitrary - * `Origin` values into `Access-Control-Allow-Origin`. - */ - -const assert = require('assert').strict; -import { - resolveOidcCookieKeys, - isOriginAllowedForOidcClient, -} from '../../../node/security/OidcProviderSecurity'; - -describe(__filename, function () { - describe('resolveOidcCookieKeys', function () { - it('never returns the historical hardcoded key', function () { - const keys = resolveOidcCookieKeys({sessionKey: 'a-persisted-session-secret'}); - assert.ok(!keys.includes('oidc')); - }); - - it('uses operator-supplied cookieKeys when provided', function () { - const keys = resolveOidcCookieKeys({cookieKeys: ['k1', 'k2'], sessionKey: 'x'}); - assert.deepEqual(keys, ['k1', 'k2']); - }); - - it('ignores empty/invalid entries in cookieKeys and falls through', function () { - const keys = resolveOidcCookieKeys({cookieKeys: ['', null as any], sessionKey: 'secret'}); - assert.equal(keys.length, 1); - assert.notEqual(keys[0], 'oidc'); - assert.ok(keys[0].length >= 32); - }); - - it('prefers rotated DB-backed secrets over the session-key derivation', function () { - const rotated = ['rot-new', 'rot-old']; - const keys = resolveOidcCookieKeys({rotatedSecrets: rotated, sessionKey: 'secret'}); - assert.deepEqual(keys, ['rot-new', 'rot-old']); - }); - - it('returns the live rotatedSecrets array by reference (so rotation propagates)', function () { - // oidc-provider/keygrip holds the array by reference and reads it live on - // each sign/verify, so returning the same object means a rotation that - // mutates the array in place is picked up without reconstructing the provider. - const rotated = ['rot-new']; - const keys = resolveOidcCookieKeys({rotatedSecrets: rotated, sessionKey: 'secret'}); - assert.strictEqual(keys, rotated); - }); - - it('ignores an empty rotatedSecrets array and falls through', function () { - const keys = resolveOidcCookieKeys({rotatedSecrets: [], sessionKey: 'secret'}); - assert.equal(keys.length, 1); - assert.notEqual(keys[0], 'oidc'); - // fell through to the session-key derivation (stable, deterministic) - assert.deepEqual(keys, resolveOidcCookieKeys({sessionKey: 'secret'})); - }); - - it('lets operator cookieKeys win over rotated secrets', function () { - const keys = resolveOidcCookieKeys({ - cookieKeys: ['operator'], rotatedSecrets: ['rot'], sessionKey: 'secret', - }); - assert.deepEqual(keys, ['operator']); - }); - - it('derives a stable key from the session secret (survives restart/multi-pod)', function () { - const a = resolveOidcCookieKeys({sessionKey: 'secret'}); - const b = resolveOidcCookieKeys({sessionKey: 'secret'}); - assert.deepEqual(a, b); - }); - - it('derives different keys for different session secrets', function () { - const a = resolveOidcCookieKeys({sessionKey: 'secret-a'}); - const b = resolveOidcCookieKeys({sessionKey: 'secret-b'}); - assert.notDeepEqual(a, b); - }); - - it('does not reuse the raw session secret as the cookie key', function () { - const keys = resolveOidcCookieKeys({sessionKey: 'secret'}); - assert.ok(!keys.includes('secret')); - }); - - it('falls back to a fresh random key when no session secret exists', function () { - const a = resolveOidcCookieKeys({sessionKey: null}); - const b = resolveOidcCookieKeys({sessionKey: null}); - assert.equal(a.length, 1); - assert.notEqual(a[0], 'oidc'); - assert.ok(a[0].length >= 32); - assert.notDeepEqual(a, b); // random => different each call - }); - }); - - describe('isOriginAllowedForOidcClient', function () { - const client = { - redirectUris: ['https://app.example.com/admin/', 'https://app.example.com/'], - }; - - it('allows an origin matching a registered redirect URI', function () { - assert.equal(isOriginAllowedForOidcClient('https://app.example.com', client), true); - }); - - it('rejects an unregistered attacker origin', function () { - assert.equal(isOriginAllowedForOidcClient('https://evil.attacker.com', client), false); - }); - - it('rejects a look-alike suffix origin (no substring matching)', function () { - assert.equal(isOriginAllowedForOidcClient('https://app.example.com.evil.com', client), false); - }); - - it('rejects a scheme mismatch (http vs https)', function () { - assert.equal(isOriginAllowedForOidcClient('http://app.example.com', client), false); - }); - - it('rejects when origin is missing', function () { - assert.equal(isOriginAllowedForOidcClient(undefined, client), false); - }); - - it('rejects when client is missing', function () { - assert.equal(isOriginAllowedForOidcClient('https://app.example.com', null), false); - }); - - it('rejects when client has no redirect URIs', function () { - assert.equal(isOriginAllowedForOidcClient('https://app.example.com', {}), false); - }); - }); -}); diff --git a/src/tests/backend/specs/PadManager.ts b/src/tests/backend/specs/PadManager.ts index 39f4b476d..c4ddf79a0 100644 --- a/src/tests/backend/specs/PadManager.ts +++ b/src/tests/backend/specs/PadManager.ts @@ -44,15 +44,5 @@ describe(__filename, function () { assert.equal(padManager.isValidPadId(''), false); assert.equal(padManager.isValidPadId('a$b'), false); }); - - // `:` is the ueberdb key-namespace delimiter (`pad::revs:`). A pad id - // carrying a `:` can address another pad's internal sub-records, so it must - // never be a valid pad id. Regression for the copyPad/movePad destinationID - // injection (GHSA-wg58-mhwv-35pq). - it('rejects ids containing the ueberdb delimiter ":"', async function () { - assert.equal(padManager.isValidPadId('victim:revs:0'), false); - assert.equal(padManager.isValidPadId('a:b'), false); - assert.equal(padManager.isValidPadId('g.s8oes9dhwrvt0zif$bar:revs:0'), false); - }); }); }); diff --git a/src/tests/backend/specs/copyPadColonInjection.ts b/src/tests/backend/specs/copyPadColonInjection.ts deleted file mode 100644 index 7924e5dd3..000000000 --- a/src/tests/backend/specs/copyPadColonInjection.ts +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -/** - * Regression for GHSA-wg58-mhwv-35pq: copyPad/movePad/copyPadWithoutHistory - * accepted a `destinationID` containing the ueberdb key delimiter `:` - * (e.g. `victim:revs:0`), which bypassed the force=false overwrite guard and - * clobbered another pad's internal revision records. - */ - -const assert = require('assert').strict; -const common = require('../common'); -const api = require('../../../node/db/API'); -const padManager = require('../../../node/db/PadManager'); - -describe(__filename, function () { - this.timeout(30000); - - before(async function () { - await common.init(); - }); - - it('rejects a copyPad destinationID that targets another pad\'s revs record', async function () { - const victim = 'wg58_victim'; - const src = 'wg58_src'; - await padManager.getPad(victim, 'TOP-SECRET-victim-content\n'); - await padManager.getPad(src, 'attacker source\n'); - - const before = await api.getRevisionChangeset(victim, '0'); - assert.ok(before, 'victim rev-0 changeset exists before the attack'); - - // force=false — the whole point is that `:` bypassed the existence guard. - await assert.rejects( - api.copyPad(src, `${victim}:revs:0`, false), - /valid padId|apierror/i, - 'copyPad must reject a destinationID containing ":"'); - - const after = await api.getRevisionChangeset(victim, '0'); - assert.equal(after, before, 'victim rev-0 changeset must be untouched'); - }); - - it('rejects copyPadWithoutHistory with a ":" destinationID', async function () { - const src = 'wg58_src2'; - await padManager.getPad(src, 'src2\n'); - await assert.rejects( - api.copyPadWithoutHistory(src, 'other:revs:0', false), - /valid padId|apierror/i); - }); - - it('still allows a normal copyPad to a clean destination', async function () { - const src = 'wg58_ok_src'; - await padManager.getPad(src, 'hello\n'); - // force=true so the test is idempotent across runs (the backend DB persists - // pads between runs); the point here is that a valid destinationID copies. - await api.copyPad(src, 'wg58_ok_dst', true); - assert.ok(await padManager.doesPadExist('wg58_ok_dst'), 'destination pad exists after copy'); - }); -}); diff --git a/src/tests/backend/specs/crossPadWriteToctou.ts b/src/tests/backend/specs/crossPadWriteToctou.ts deleted file mode 100644 index ebac77fea..000000000 --- a/src/tests/backend/specs/crossPadWriteToctou.ts +++ /dev/null @@ -1,92 +0,0 @@ -'use strict'; - -/** - * Regression for GHSA-6mcx-x5h6-rpw2 (PadMessageHandler cross-pad write TOCTOU). - * - * A USER_CHANGES message is authorized (access + read-only gate) against the pad - * the session points at when the message arrives, but the write ran later off - * mutable session state. A concurrent same-socket CLIENT_READY could swap - * sessioninfos[socket.id].padId during the awaits in handleMessage(), redirecting - * the queued write onto a read-only / unauthorized pad. - * - * This test drives a real USER_CHANGES over a socket and, via a - * handleMessageSecurity hook (which runs during those awaits), swaps the - * session's padId to a victim pad — exactly the concurrent-CLIENT_READY race. - * The change must still land on the pad the message was authorized against, and - * never on the victim. - */ - -import {MapArrayType} from '../../../node/types/MapType'; - -const assert = require('assert').strict; -const common = require('../common'); -const padManager = require('../../../node/db/PadManager'); -const plugins = require('../../../static/js/pluginfw/plugin_defs'); -const padMessageHandler = require('../../../node/handler/PadMessageHandler'); - -describe(__filename, function () { - this.timeout(30000); - let agent: any; - const backups: MapArrayType = {}; - - before(async function () { agent = await common.init(); }); - - beforeEach(function () { - backups.hooks = {handleMessageSecurity: plugins.hooks.handleMessageSecurity}; - plugins.hooks.handleMessageSecurity = []; - }); - afterEach(function () { - Object.assign(plugins.hooks, backups.hooks); - }); - - it('a mid-message pad swap cannot redirect the write onto another pad', async function () { - // Authorized (writable) pad the client is editing. - const authorizedId = `toctou_ok_${common.randomString()}`; - const authorizedPad = await padManager.getPad(authorizedId, 'seed\n'); - await authorizedPad.setText('seed\n'); - // Victim pad with identical text, so the changeset is valid against either - // pad — the test distinguishes purely by which pad receives the write. - const victimId = `toctou_victim_${common.randomString()}`; - const victimPad = await padManager.getPad(victimId, 'seed\n'); - await victimPad.setText('seed\n'); - - const res = await agent.get(`/p/${authorizedId}`).expect(200); - const socket = await common.connect(res); - try { - const {data: clientVars} = await common.handshake(socket, authorizedId); - const rev = clientVars.collab_client_vars.rev; - const authorId = clientVars.userId; - - // Simulate the concurrent same-socket CLIENT_READY: while THIS USER_CHANGES - // is mid-flight (handleMessageSecurity runs during handleMessage's awaits), - // swap the session's padId to the victim pad in place. - plugins.hooks.handleMessageSecurity = [{ - hook_fn: (hookName: string, ctx: any) => { - if (ctx.message?.data?.type === 'USER_CHANGES') { - padMessageHandler.sessioninfos[ctx.socket.id].padId = victimId; - } - }, - hook_fn_name: 'toctou/handleMessageSecurity', - hook_name: 'handleMessageSecurity', - part: {plugin: 'toctou'}, - }]; - - const accept = common.waitForSocketEvent(socket, 'message'); - await common.sendUserChanges(socket, { - baseRev: rev, - changeset: 'Z:5>2*0+2$ZZ', - apool: {numToAttrib: {0: ['author', authorId]}, nextNum: 1}, - }); - await accept; // wait for the server to finish applying - - assert.equal(victimPad.text(), 'seed\n', - 'the victim pad (swapped session padId) must NOT be modified'); - assert.equal(authorizedPad.text(), 'ZZseed\n', - 'the change must land on the pad the message was authorized against'); - } finally { - socket.close(); - await authorizedPad.remove(); - await victimPad.remove(); - } - }); -}); diff --git a/src/tests/backend/specs/export.ts b/src/tests/backend/specs/export.ts index 0a78d27e0..b3fb94c67 100644 --- a/src/tests/backend/specs/export.ts +++ b/src/tests/backend/specs/export.ts @@ -150,26 +150,6 @@ describe(__filename, function () { const html = '

hi

body link

'; assert.strictEqual(stripRemoteImages(html), html); }); - - it('preserves the doctype directive (soffice reads a full document)', function () { - const html = '

hi

'; - const out = stripRemoteImages(html); - assert.match(out, //i); - }); - - it('preserves HTML comments', function () { - const html = '

hi

'; - const out = stripRemoteImages(html); - assert.match(out, //); - }); - - it('preserves the doctype while still dropping a remote image', function () { - const html = - 'a'; - const out = stripRemoteImages(html); - assert.match(out, //i); - assert.doesNotMatch(out, /evil\.example/); - }); }); describe('extractBody', function () { diff --git a/src/tests/backend/specs/hooks.ts b/src/tests/backend/specs/hooks.ts index be5bec4b5..07c6e262e 100644 --- a/src/tests/backend/specs/hooks.ts +++ b/src/tests/backend/specs/hooks.ts @@ -65,14 +65,7 @@ describe(__filename, function () { }); // Hook functions that should work for both synchronous and asynchronous hooks. - type HookFnTestCase = { - name: string; - fn: (hn: any, ctx: any, cb?: any) => any; - want?: unknown; - wantErr?: string; - syncOk?: boolean; - }; - const supportedSyncHookFunctions: HookFnTestCase[] = [ + const supportedSyncHookFunctions = [ { name: 'return non-Promise value, with callback parameter', fn: (hn:Function, ctx:any, cb:Function) => 'val', @@ -570,6 +563,7 @@ describe(__filename, function () { }); describe('supported hook function styles', function () { + // @ts-ignore const supportedHookFunctions = supportedSyncHookFunctions.concat([ { name: 'legacy async cb', diff --git a/src/tests/backend/specs/oidcCookieRotator.ts b/src/tests/backend/specs/oidcCookieRotator.ts deleted file mode 100644 index f252f35de..000000000 --- a/src/tests/backend/specs/oidcCookieRotator.ts +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -/** - * Integration coverage for the OIDC provider cookie-key source under the - * DEFAULT deployment config (cookie key rotation enabled, no SESSIONKEY.txt so - * `settings.sessionKey` is null). Without the DB-backed SecretRotator path the - * provider would fall back to a per-process random key, breaking OIDC cookies on - * restart and across horizontally-scaled pods. This test proves the default - * path yields a stable, non-random, DB-backed key. - */ - -const assert = require('assert').strict; -const common = require('../common'); -const SecretRotator = require('../../../node/security/SecretRotator').SecretRotator; -import {resolveOidcCookieKeys} from '../../../node/security/OidcProviderSecurity'; -import settings from '../../../node/utils/Settings'; - -describe(__filename, function () { - this.timeout(30000); - - before(async function () { - // Boots the server, which initialises the database the rotator writes to. - await common.init(); - }); - - it('default config yields DB-backed rotator secrets, not a random key', async function () { - const {keyRotationInterval, sessionLifetime} = settings.cookie; - assert.ok(keyRotationInterval && sessionLifetime, - 'precondition: cookie key rotation is enabled by default'); - - const rotator = new SecretRotator( - 'oidcCookieSecretsTest', keyRotationInterval, sessionLifetime, settings.sessionKey); - await rotator.start(); - try { - assert.ok(Array.isArray(rotator.secrets) && rotator.secrets.length > 0, - 'rotator produced at least one secret'); - assert.ok(rotator.secrets.every((s: any) => typeof s === 'string' && s.length > 0), - 'all rotator secrets are non-empty strings'); - - // The provider would select these rotated secrets (by reference) over any - // session-key derivation or random fallback. - const keys = resolveOidcCookieKeys({ - cookieKeys: (settings.sso as any).cookieKeys, - rotatedSecrets: rotator.secrets, - sessionKey: settings.sessionKey, - }); - assert.strictEqual(keys, rotator.secrets, 'resolver returns the live rotator array'); - assert.ok(!keys.includes('oidc'), 'never the historical hardcoded key'); - } finally { - // stop the refresh timer so it does not keep the event loop alive - if (typeof rotator.stop === 'function') await rotator.stop(); - } - }); -}); diff --git a/src/tests/backend/specs/padIdColonLegacyPad.ts b/src/tests/backend/specs/padIdColonLegacyPad.ts deleted file mode 100644 index eb98a9e20..000000000 --- a/src/tests/backend/specs/padIdColonLegacyPad.ts +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -/** - * GHSA-wg58-mhwv-35pq made `:` invalid in a pad id. `:` was legal before, so - * pads carrying one exist in the wild (padIdTransforms maps `:` -> `_` precisely - * to keep those reachable). Rejecting them outright would lock their content - * away, so an invalid id is only refused when no pad with that exact id exists. - * - * The injection primitive the advisory closes stays closed: doesPadExist() - * requires a top-level `atext`, which only a real pad record has — the - * `pad::revs:` sub-records an injected id addresses do not have one. - */ - -const assert = require('assert').strict; -const common = require('../common'); -const db = require('../../../node/db/DB'); -const padManager = require('../../../node/db/PadManager'); - -const LEGACY_ID = 'wg58legacy:pad'; - -let agent: any; - -describe(__filename, function () { - this.timeout(30000); - - before(async function () { - agent = await common.init(); - // Plant a legacy pad the way an old Etherpad would have stored it: `:` in the - // id is no longer creatable through getPad(), so write the record directly. - const donor = await padManager.getPad('wg58legacy_donor', 'legacy content\n'); - await donor.saveToDatabase(); - await db.set(`pad:${LEGACY_ID}`, await db.get('pad:wg58legacy_donor')); - padManager.unloadPad(LEGACY_ID); - }); - - it('getPad still serves an existing pad whose id contains ":"', async function () { - const pad = await padManager.getPad(LEGACY_ID); - assert.equal(pad.id, LEGACY_ID); - assert.match(pad.text(), /legacy content/); - }); - - it('the legacy pad URL is not 404ed', async function () { - const res = await agent.get(`/p/${encodeURIComponent(LEGACY_ID)}`); - assert.notEqual(res.status, 404, 'an existing legacy pad must stay reachable'); - }); - - it('getPad still rejects a ":" id that is not an existing pad', async function () { - // The injection target: `pad::revs:0` exists as a db record but is not - // a pad (no top-level atext), so it must not be addressable as a pad id. - const victim = await padManager.getPad('wg58legacy_victim', 'victim\n'); - await victim.saveToDatabase(); - assert.ok(await db.get('pad:wg58legacy_victim:revs:0'), 'victim rev-0 record exists'); - await assert.rejects( - padManager.getPad('wg58legacy_victim:revs:0'), - /valid padId|apierror/i); - }); -}); diff --git a/src/tests/backend/specs/padUrlColonRedirect.ts b/src/tests/backend/specs/padUrlColonRedirect.ts deleted file mode 100644 index b5f6fc30d..000000000 --- a/src/tests/backend/specs/padUrlColonRedirect.ts +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -/** - * `:` is rejected as a pad id (GHSA-wg58-mhwv-35pq), but a browser visiting a - * legacy `/p/` URL must still be redirected to the sanitized `_` - * form (padManager.sanitizePadId maps `:` -> `_`) rather than getting a 404. - * Regression guard for the padurlsanitize ordering. - */ - -const assert = require('assert').strict; -const common = require('../common'); - -let agent: any; - -describe(__filename, function () { - this.timeout(30000); - before(async function () { agent = await common.init(); }); - - it('redirects a legacy pad URL containing ":" to the sanitized "_" form', async function () { - const res = await agent.get('/p/foo:bar').expect(302); - assert.match(res.headers.location, /foo_bar/, - `expected redirect to the sanitized id, got Location: ${res.headers.location}`); - }); - - it('still 404s a pad id containing "$" (no sanitizing transform)', async function () { - await agent.get('/p/foo$bar').expect(404); - }); - - it('serves a clean pad id without redirecting', async function () { - // A valid id renders (200) or is handled normally — never a sanitize redirect. - const res = await agent.get('/p/CleanPadId123'); - assert.notEqual(res.status, 404); - }); -}); diff --git a/src/tests/backend/specs/proxyPathVary.ts b/src/tests/backend/specs/proxyPathVary.ts deleted file mode 100644 index bab9450df..000000000 --- a/src/tests/backend/specs/proxyPathVary.ts +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -/** - * Cache-poisoning hardening for the `x-proxy-path` header on public routes. - * - * Etherpad echoes the (sanitised) `x-proxy-path` prefix into rendered URLs, - * social-preview metadata, PWA manifest links, and the legacy timeslider - * redirect on `/`, `/p/:pad`, and `/p/:pad/timeslider`. If a shared cache / - * reverse proxy in front of Etherpad stores these responses keyed on URL alone, - * a value injected by one client is served to every other client. These - * responses must therefore advertise `Vary: x-proxy-path` so a conforming cache - * keeps prefixed and non-prefixed variants separate. Reported by `meifukun`; - * companion to the already-fixed admin-route variant (GHSA-fjgc-3mj7-8rg8). - */ - -const assert = require('assert').strict; -const common = require('../common'); -const padManager = require('../../../node/db/PadManager'); -import settings from '../../../node/utils/Settings'; - -let agent: any; - -const varyList = (res: any): string[] => - String(res.headers.vary || '').toLowerCase().split(',').map((s: string) => s.trim()); - -const assertVariesOnProxyPath = (res: any, where: string) => { - if (!varyList(res).includes('x-proxy-path')) { - throw new Error( - `${where}: response must advertise "Vary: x-proxy-path" so a shared ` + - `cache cannot serve a poisoned proxy-path to another user ` + - `(got Vary: "${res.headers.vary || ''}")`); - } -}; - -describe(__filename, function () { - this.timeout(30000); - const padId = 'ProxyPathVaryTest'; - let trustProxyBackup: any; - - before(async function () { - agent = await common.init(); - await padManager.getPad(padId, 'test content'); - trustProxyBackup = settings.trustProxy; - }); - - after(function () { - settings.trustProxy = trustProxyBackup; - }); - - it('sets Vary: x-proxy-path on the home page', async function () { - const res = await agent.get('/').expect(200); - assertVariesOnProxyPath(res, 'GET /'); - }); - - it('sets Vary: x-proxy-path on the pad page', async function () { - const res = await agent.get(`/p/${padId}`).expect(200); - assertVariesOnProxyPath(res, `GET /p/${padId}`); - }); - - it('sets Vary: x-proxy-path on the timeslider embed page', async function () { - const res = await agent.get(`/p/${padId}/timeslider?embed=1`).expect(200); - assertVariesOnProxyPath(res, `GET /p/${padId}/timeslider?embed=1`); - }); - - it('sets Vary: x-proxy-path on the legacy timeslider redirect', async function () { - const res = await agent.get(`/p/${padId}/timeslider`).expect(302); - assertVariesOnProxyPath(res, `GET /p/${padId}/timeslider (redirect)`); - }); - - it('does NOT vary on the trust-gated headers when trustProxy is false', async function () { - // sanitizeProxyPath ignores x-forwarded-prefix / x-ingress-path unless - // trustProxy is enabled, so varying on them would only fragment caches. - settings.trustProxy = false; - const res = await agent.get('/').expect(200); - const vary = varyList(res); - assert.ok(vary.includes('x-proxy-path'), `expected x-proxy-path, got "${res.headers.vary}"`); - assert.ok(!vary.includes('x-forwarded-prefix'), - `must not vary on x-forwarded-prefix when trustProxy=false (got "${res.headers.vary}")`); - assert.ok(!vary.includes('x-ingress-path'), - `must not vary on x-ingress-path when trustProxy=false (got "${res.headers.vary}")`); - }); - - it('varies on all proxy-path headers when trustProxy is true', async function () { - settings.trustProxy = true; - const res = await agent.get('/').expect(200); - const vary = varyList(res); - assert.ok(vary.includes('x-proxy-path'), `expected x-proxy-path, got "${res.headers.vary}"`); - assert.ok(vary.includes('x-forwarded-prefix'), - `expected x-forwarded-prefix when trustProxy=true (got "${res.headers.vary}")`); - assert.ok(vary.includes('x-ingress-path'), - `expected x-ingress-path when trustProxy=true (got "${res.headers.vary}")`); - }); -}); diff --git a/src/tests/backend/specs/security.ts b/src/tests/backend/specs/security.ts deleted file mode 100644 index 47663e223..000000000 --- a/src/tests/backend/specs/security.ts +++ /dev/null @@ -1,78 +0,0 @@ -'use strict'; - -const assert = require('assert').strict; -// The escaping helpers are a client module, but they are pure (no browser -// globals) so they can be exercised directly from a backend spec. This locks -// the byte-for-byte output of the helpers vendored from the (now removed) -// `security` npm package, so the vendoring can never silently drift. -const Security = require('../../../static/js/security'); - -describe(__filename, function () { - describe('public API', function () { - it('exposes the full set of helpers plugins may rely on', function () { - for (const fn of [ - 'escapeHTML', 'escapeHTMLAttribute', - 'encodeJavaScriptIdentifier', 'encodeJavaScriptString', 'encodeJavaScriptData', - 'encodeCSSIdentifier', 'encodeCSSString', - ]) { - assert.equal(typeof Security[fn], 'function', `Security.${fn} must be a function`); - } - }); - }); - - describe('escapeHTML', function () { - it('escapes &, <, >, ", \' and / per OWASP', function () { - assert.equal(Security.escapeHTML('/&\''), - '<a href="x">/&''); - }); - it('neutralises a script tag', function () { - assert.equal(Security.escapeHTML(''), - '<script>alert(1)</script>'); - }); - it('leaves plain alphanumerics untouched', function () { - assert.equal(Security.escapeHTML('Hello World 123'), 'Hello World 123'); - }); - it('passes falsy input straight through', function () { - assert.equal(Security.escapeHTML(''), ''); - }); - }); - - describe('escapeHTMLAttribute', function () { - it('hex-encodes non-alphanumeric ASCII not covered by named entities', function () { - assert.equal(Security.escapeHTMLAttribute('a b'), 'a b'); - // hex is lowercased, matching the original `security` package output. - assert.equal(Security.escapeHTMLAttribute('javascript:alert(1)'), - 'javascript:alert(1)'); - }); - it('prefers named entities for &, <, >, ", \', /', function () { - assert.equal(Security.escapeHTMLAttribute('<>&"\'/'), - '<>&"'/'); - }); - it('leaves alphanumerics untouched', function () { - assert.equal(Security.escapeHTMLAttribute('abcXYZ0189'), 'abcXYZ0189'); - }); - }); - - describe('javascript / css encoders', function () { - it('encodeJavaScriptString quotes and backslash-u-escapes specials', function () { - assert.equal(Security.encodeJavaScriptString('a', c: 'x"y', d: 'a\\b'}), - '{"a":"\\u003cb\\u003e","c":"x\\u0022y","d":"a\\u005cb"}'); - }); - it('encodeJavaScriptData regex is linear (ReDoS guard)', function () { - // The JSON-string-literal regex used to be /"(?:\\.|[^"])*"/, which - // backtracks exponentially on an unterminated string of `\!` repeats. - // Run the regex directly on adversarial input and assert it returns fast. - const evil = `"${'\\!'.repeat(50000)}`; // no closing quote - const start = Date.now(); - /"(?:[^"\\]|\\.)*"/gm.test(evil); - assert.ok(Date.now() - start < 1000, 'regex must not backtrack exponentially'); - }); - }); -}); diff --git a/src/tests/backend/specs/sessionFixation.ts b/src/tests/backend/specs/sessionFixation.ts deleted file mode 100644 index 26a0c8826..000000000 --- a/src/tests/backend/specs/sessionFixation.ts +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; - -/** - * Regression for GHSA-73h9-c5xp-gfg4 (SSO session fixation). Etherpad - * establishes a pre-authentication express-session (e.g. an SSO plugin persists - * OAuth state before redirecting to the IdP). If the session id is NOT rotated - * when the session becomes authenticated, an attacker who planted / captured the - * pre-auth cookie ends up owning the victim's authenticated session. - * - * webaccess must call req.session.regenerate() at the authentication boundary so - * the id issued after login differs from the one held before it. - */ - -const assert = require('assert').strict; -const common = require('../common'); -const plugins = require('../../../static/js/pluginfw/plugin_defs'); -import settings from '../../../node/utils/Settings'; - -const makeHook = (hookName: string, hookFn: Function) => ({ - hook_fn: hookFn, - hook_fn_name: `sessfix/${hookName}`, - hook_name: hookName, - part: {plugin: 'sessfix'}, -}); - -// Etherpad names the session cookie `${cookie.prefix}express_sid`. -const sessionCookieName = () => `${settings.cookie.prefix || ''}express_sid`; - -// Pull a raw Set-Cookie value (e.g. the signed `s%3A.` blob) by name. -const getSetCookie = (res: any, name: string): string | null => { - const arr: string[] = res.headers['set-cookie'] || []; - for (const c of arr) { - if (c.startsWith(`${name}=`)) return c.slice(name.length + 1).split(';')[0]; - } - return null; -}; - -describe(__filename, function () { - this.timeout(30000); - let agent: any; - const backup: any = {}; - - before(async function () { agent = await common.init(); }); - - beforeEach(function () { - backup.authenticate = plugins.hooks.authenticate; - backup.requireAuthentication = settings.requireAuthentication; - backup.requireAuthorization = settings.requireAuthorization; - settings.requireAuthentication = true; - settings.requireAuthorization = false; - // An authn plugin that: (a) always touches the session so express-session - // persists a cookie even pre-auth, and (b) only establishes req.session.user - // when the login header is present (simulating a completed SSO callback). - plugins.hooks.authenticate = [makeHook('authenticate', (hookName: string, ctx: any, cb: Function) => { - ctx.req.session.sessfixTouched = true; - if (ctx.req.headers['x-do-login'] === '1') { - ctx.req.session.user = {username: 'victim'}; - return cb([true]); - } - return cb([false]); - })]; - }); - - afterEach(function () { - plugins.hooks.authenticate = backup.authenticate; - settings.requireAuthentication = backup.requireAuthentication; - settings.requireAuthorization = backup.requireAuthorization; - }); - - it('rotates the session id when a pre-auth session authenticates', async function () { - // Step 1 — anonymous request establishes a server-issued pre-auth session. - const r1 = await agent.get('/').expect(401); - const preSid = getSetCookie(r1, sessionCookieName()); - assert.ok(preSid, 'server issued a pre-auth session cookie'); - - // Step 2 — same session cookie, now authenticate. - const r2 = await agent.get('/') - .set('Cookie', `${sessionCookieName()}=${preSid}`) - .set('x-do-login', '1') - .expect(200); - const postSid = getSetCookie(r2, sessionCookieName()); - assert.ok(postSid, - 'the authentication response must rotate the session cookie (Set-Cookie present)'); - assert.notEqual(postSid, preSid, - 'session id must change at the authentication boundary (session fixation)'); - }); - - it('rotates the session id on a privilege upgrade (non-admin -> admin)', async function () { - // Reach Step 3 (authenticate) for an ALREADY-authenticated session by making - // authorization deny unless an `x-authz` header is present. - settings.requireAuthorization = true; - const authzBackup = plugins.hooks.authorize; - plugins.hooks.authorize = [makeHook('authorize', (hookName: string, ctx: any, cb: Function) => - cb([ctx.req.headers['x-authz'] === '1']))]; - plugins.hooks.authenticate = [makeHook('authenticate', (hookName: string, ctx: any, cb: Function) => { - const login = ctx.req.headers['x-login']; - if (login === 'user') { ctx.req.session.user = {username: 'u', is_admin: false}; return cb([true]); } - if (login === 'admin') { ctx.req.session.user = {username: 'u', is_admin: true}; return cb([true]); } - return cb([false]); - })]; - try { - // Log in as a non-admin (authorization granted via x-authz). - const r1 = await agent.get('/').set('x-login', 'user').set('x-authz', '1').expect(200); - const sid1 = getSetCookie(r1, sessionCookieName()); - assert.ok(sid1, 'non-admin login issued a session cookie'); - - // Re-authenticate as admin carrying sid1 and NO x-authz, so Step 2 - // authorization denies and Step 3 runs the privilege upgrade. - const r2 = await agent.get('/') - .set('Cookie', `${sessionCookieName()}=${sid1}`) - .set('x-login', 'admin') - .expect(200); - const sid2 = getSetCookie(r2, sessionCookieName()); - assert.ok(sid2, 'the privilege upgrade rotated the session cookie'); - assert.notEqual(sid2, sid1, 'session id must change on a privilege upgrade'); - } finally { - plugins.hooks.authorize = authzBackup; - } - }); - - it('preserves the authenticated user across the rotation', async function () { - const r1 = await agent.get('/').expect(401); - const preSid = getSetCookie(r1, sessionCookieName()); - const r2 = await agent.get('/') - .set('Cookie', `${sessionCookieName()}=${preSid}`) - .set('x-do-login', '1') - .expect(200); - const postSid = getSetCookie(r2, sessionCookieName()); - // The rotated session must still be authenticated: a follow-up request with - // the NEW cookie (and no login header) is authorized, not bounced to 401. - await agent.get('/').set('Cookie', `${sessionCookieName()}=${postSid}`).expect(200); - }); -}); diff --git a/src/tests/backend/specs/settings.ts b/src/tests/backend/specs/settings.ts index 4409d0910..52d5a2dc1 100644 --- a/src/tests/backend/specs/settings.ts +++ b/src/tests/backend/specs/settings.ts @@ -278,62 +278,4 @@ describe(__filename, function () { assert.strictEqual(over!.privacy.pluginCatalog, false); }); }); - - // Regression test for the jsonminify -> jsonc-parser migration. - // The old parser was `jsonminify(str).replace(',]', ']').replace(',}', '}')`, - // which had two correctness bugs that jsonc-parser (allowTrailingComma) fixes: - // 1. String#replace with a string needle only swaps the FIRST match, so a - // file with more than one trailing comma of the same kind stayed invalid. - // 2. The blind ',]' / ',}' replace also corrupted those byte sequences when - // they appeared *inside* a string value (e.g. a URL or literal text). - describe('JSONC settings parsing (jsonminify -> jsonc-parser)', function () { - const fs = require('fs'); - const os = require('os'); - let tmpFile: string; - - const writeTmp = (contents: string) => { - tmpFile = path.join(os.tmpdir(), `ep-settings-jsonc-${process.pid}.json`); - fs.writeFileSync(tmpFile, contents); - return tmpFile; - }; - - afterEach(function () { - if (tmpFile) { try { fs.unlinkSync(tmpFile); } catch (e) { /* ignore */ } } - }); - - it('strips comments and tolerates multiple trailing commas', function () { - const file = writeTmp(`// leading line comment -/* block comment */ -{ - "list": [ - "a", - "b", - ], - "nested": [ - [1, 2,], - [3, 4,], - ], - "obj": { - "x": 1, - "y": 2, - }, -}`); - const s: any = exportedForTestingOnly.parseSettings(file, true); - assert.deepEqual(s.list, ['a', 'b']); - assert.deepEqual(s.nested, [[1, 2], [3, 4]]); - assert.deepEqual(s.obj, {x: 1, y: 2}); - }); - - it('does not corrupt ",]" / ",}" sequences inside string values', function () { - const file = writeTmp(`{ - "url": "http://example.com/a,]b,}c", - "text": "trailing-comma-like ,] and ,} must survive" -}`); - const s: any = exportedForTestingOnly.parseSettings(file, true); - // The old replace() would have stripped the comma and produced - // "http://example.com/a]b}c" here. - assert.strictEqual(s.url, 'http://example.com/a,]b,}c'); - assert.strictEqual(s.text, 'trailing-comma-like ,] and ,} must survive'); - }); - }); }); diff --git a/src/tests/backend/specs/sofficeExportRemoteImage.ts b/src/tests/backend/specs/sofficeExportRemoteImage.ts deleted file mode 100644 index 270f926b5..000000000 --- a/src/tests/backend/specs/sofficeExportRemoteImage.ts +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -/** - * SSRF regression for the LibreOffice (`soffice`) export path. - * - * The native (in-process) export path strips remote `` tags before - * rendering, but the `soffice` path historically wrote the full export HTML to - * disk verbatim and handed it to LibreOffice, which fetches remote image URLs - * during conversion — a blind SSRF sink reachable whenever a plugin/hook injects - * image tags into export HTML. Reported by `meifukun`. - * - * This test drives the real export handler with: - * - an `exportHTMLAdditionalContent` hook that injects a remote image (the - * documented plugin extension point from the PoC), and - * - an `exportConvert` hook that stands in for LibreOffice: it captures the - * exact HTML written to the temp file and writes a dummy output so the - * request completes. - * It then asserts the captured HTML contains no remote image URL. - */ - -import {MapArrayType} from "../../../node/types/MapType"; -import fs from 'node:fs'; -const fsp = fs.promises; - -const assert = require('assert').strict; -const common = require('../common'); -const padManager = require('../../../node/db/PadManager'); -const plugins = require('../../../static/js/pluginfw/plugin_defs'); -import settings from '../../../node/utils/Settings'; - -const REMOTE_IMG = 'probe'; - -describe(__filename, function () { - this.timeout(30000); - let agent: any; - const settingsBackup: MapArrayType = {}; - const hookBackup: MapArrayType = {}; - const hookNames = ['exportHTMLAdditionalContent', 'exportConvert']; - let capturedHtml = ''; - - const makeHook = (hookName: string, hookFn: Function) => ({ - hook_fn: hookFn, - hook_fn_name: `ssrf_test/${hookName}`, - hook_name: hookName, - part: {plugin: 'ssrf_test'}, - }); - - before(async function () { - agent = await common.init(); - settingsBackup.soffice = settings.soffice; - await padManager.getPad('sofficeSsrfPad', 'test content'); - }); - - beforeEach(function () { - for (const h of hookNames) { - hookBackup[h] = plugins.hooks[h]; - } - capturedHtml = ''; - // Inject a remote image the way a plugin extension point would. - plugins.hooks.exportHTMLAdditionalContent = [ - makeHook('exportHTMLAdditionalContent', () => REMOTE_IMG), - ]; - // Stand in for LibreOffice: capture what was written, produce a dummy file. - plugins.hooks.exportConvert = [ - makeHook('exportConvert', async (hookName: string, {srcFile, destFile}: any) => { - capturedHtml = await fsp.readFile(srcFile, 'utf8'); - await fsp.writeFile(destFile, 'dummy-converted-output'); - return 'handled'; - }), - ]; - // Force the soffice conversion path (non-null => sofficeAvailable() === 'yes' - // on non-Windows). The binary is never actually spawned because the - // exportConvert hook short-circuits the converter. - settings.soffice = '/usr/bin/soffice'; - }); - - afterEach(function () { - for (const h of hookNames) { - plugins.hooks[h] = hookBackup[h]; - } - }); - - after(function () { - Object.assign(settings, settingsBackup); - }); - - it('confirms the injected remote image reaches the export HTML', async function () { - // Sanity check on the harness: the raw HTML export (which is NOT run through - // the soffice temp-file path) must contain the injected image, proving the - // hook fires and the marker would otherwise be present. - const res = await agent.get('/p/sofficeSsrfPad/export/html').expect(200); - assert.ok( - res.text.includes('ssrf-marker-soffice'), - 'expected the injected remote image to appear in the html export'); - }); - - it('strips remote images from the HTML handed to the soffice converter', - async function () { - await agent.get('/p/sofficeSsrfPad/export/odt').expect(200); - assert.ok(capturedHtml.length > 0, 'exportConvert hook did not capture any HTML'); - assert.ok( - !capturedHtml.includes('ssrf-marker-soffice'), - `soffice temp file still contains the remote image URL:\n${capturedHtml}`); - assert.ok( - !/]+src\s*=\s*["']?https?:/i.test(capturedHtml), - `soffice temp file still contains a remote :\n${capturedHtml}`); - }); -}); diff --git a/src/tests/container/loadSettings.js b/src/tests/container/loadSettings.js index 7b3174503..b59ff0165 100644 --- a/src/tests/container/loadSettings.js +++ b/src/tests/container/loadSettings.js @@ -13,16 +13,15 @@ */ const fs = require('fs'); -const {parse: parseJsonc} = require('jsonc-parser'); +const jsonminify = require('jsonminify'); function loadSettings() { let settingsStr = fs.readFileSync(`${__dirname}/../../../settings.json.docker`).toString(); // try to parse the settings try { if (settingsStr) { - // jsonc-parser tolerates the comments and trailing commas in the docker - // settings file, matching node/utils/Settings.ts. - const settings = parseJsonc(settingsStr, [], {allowTrailingComma: true}); + settingsStr = jsonminify(settingsStr).replace(',]', ']').replace(',}', '}'); + const settings = JSON.parse(settingsStr); // custom settings for running in a container settings.ip = 'localhost'; diff --git a/src/tests/frontend-new/specs/pagedown_wrapped_lines.spec.ts b/src/tests/frontend-new/specs/pagedown_wrapped_lines.spec.ts deleted file mode 100644 index 6f9ed38ef..000000000 --- a/src/tests/frontend-new/specs/pagedown_wrapped_lines.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import {expect, test} from "@playwright/test"; -import {clearPadContent, goToNewPad} from "../helper/padHelper"; - -test.beforeEach(async ({page}) => { - await goToNewPad(page); -}); - -// Regression test for https://github.com/ether/etherpad/issues/4562 -// PageDown failed to scroll when the cursor was on a very long wrapped line and -// the following lines were also very long, because getVisibleLineRange returns -// indices into rep.lines (logical lines) and collapsed to [n, n] — so the -// advance count was 0 and both caret and scroll stayed put. -test.describe('PageDown on consecutive long wrapped lines (#4562)', function () { - test.describe.configure({retries: 2}); - - test('PageDown scrolls when three very long lines fill the viewport', async function ({page}) { - await clearPadContent(page); - - const innerFrame = page.frame('ace_inner')!; - - // Insert three long lines via the editor directly — each ~2000 chars, which - // wraps to many visual rows in the viewport. - await innerFrame.evaluate(() => { - const body = document.getElementById('innerdocbody')!; - const longText = 'invisible '.repeat(200).trim(); - body.innerHTML = ''; - for (let i = 0; i < 3; i++) { - const div = document.createElement('div'); - div.textContent = `${i + 1} ${longText}`; - body.appendChild(div); - } - // Trigger the editor to pick up the content - body.dispatchEvent(new Event('input', {bubbles: true})); - }); - - // Type a character at the end to make the editor register the long content - // via its normal input path (the raw innerHTML edit above is just a scaffold). - await page.keyboard.press('End'); - await page.keyboard.type('!'); - await page.waitForTimeout(300); - - // Move caret to start of pad - await page.keyboard.down('Control'); - await page.keyboard.press('Home'); - await page.keyboard.up('Control'); - await page.waitForTimeout(200); - - // Capture initial scroll position of the outer (scrollable) frame - const outerFrame = page.frame('ace_outer')!; - const before = await outerFrame.evaluate( - () => (document.getElementById('outerdocbody') as HTMLElement).scrollTop || - document.scrollingElement?.scrollTop || 0); - - // Press PageDown — the ace handler uses a 200ms setTimeout internally. - await page.keyboard.press('PageDown'); - await page.waitForTimeout(800); - - const after = await outerFrame.evaluate( - () => (document.getElementById('outerdocbody') as HTMLElement).scrollTop || - document.scrollingElement?.scrollTop || 0); - - // Either the viewport scrolled, or the caret advanced to a later logical line. - const caretLine = await innerFrame.evaluate(() => { - const sel = document.getSelection(); - if (!sel || !sel.focusNode) return 0; - let node = sel.focusNode as HTMLElement; - while (node && node.tagName !== 'DIV') node = node.parentElement!; - if (!node) return 0; - const divs = Array.from(document.getElementById('innerdocbody')!.children); - return divs.indexOf(node); - }); - - // Pre-fix behavior (#4562): after == before AND caretLine === 0. - // Fixed behavior: caret advances at least 1 logical line, or the viewport scrolls. - expect(after > before || caretLine > 0).toBe(true); - }); -}); diff --git a/ui/package.json b/ui/package.json index d66f220c7..100a3b19b 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,6 +12,6 @@ "devDependencies": { "ep_etherpad-lite": "workspace:../src", "typescript": "^6.0.3", - "vite": "^8.1.5" + "vite": "^8.0.16" } }