diff --git a/.dockerignore b/.dockerignore index f7accabfd..e05914176 100644 --- a/.dockerignore +++ b/.dockerignore @@ -25,3 +25,5 @@ Dockerfile settings.json src/node_modules admin/node_modules +ui/node_modules +node_modules diff --git a/.github/workflows/backend-tests.yml b/.github/workflows/backend-tests.yml index cb80f076b..b691a8233 100644 --- a/.github/workflows/backend-tests.yml +++ b/.github/workflows/backend-tests.yml @@ -12,8 +12,11 @@ on: permissions: contents: read + jobs: withoutpluginsLinux: + env: + PNPM_HOME: ~/.pnpm-store # run on pushes to any branch # run on PRs from external forks if: | @@ -24,53 +27,52 @@ jobs: strategy: fail-fast: false matrix: - node: [18, 20, 21] + node: [">=20.0.0 <21.0.0", ">=22.0.0 <23.0.0", ">=24.0.0 <25.0.0"] steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: ${{ matrix.node }} - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: packages: libreoffice libreoffice-pdfimport version: 1.0 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm i --frozen-lockfile --runtimeVersion="${{ matrix.node }}" - name: Install admin ui working-directory: admin - run: pnpm install + run: gnpm install --runtimeVersion="${{ matrix.node }}" - name: Build admin ui working-directory: admin - run: pnpm build + run: gnpm build --runtimeVersion="${{ matrix.node }}" - name: Run the backend tests - run: pnpm test + run: gnpm test --runtimeVersion="${{ matrix.node }}" + - name: Run the new vitest tests + working-directory: src + run: gnpm run test:vitest --runtimeVersion="${{ matrix.node }}" withpluginsLinux: + env: + PNPM_HOME: ~/.pnpm-store # run on pushes to any branch # run on PRs from external forks if: | @@ -81,112 +83,101 @@ jobs: strategy: fail-fast: false matrix: - node: [18, 20, 21] + node: [">=20.0.0 <21.0.0", ">=22.0.0 <23.0.0", ">=24.0.0 <25.0.0"] steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 name: Setup pnpm cache + if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: packages: libreoffice libreoffice-pdfimport version: 1.0 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh - - name: Install admin ui - working-directory: admin - run: pnpm install + run: gnpm install --frozen-lockfile --runtimeVersion="${{ matrix.node }}" - name: Build admin ui working-directory: admin - run: pnpm build + run: gnpm build --runtimeVersion="${{ matrix.node }}" - name: Install Etherpad plugins run: > - pnpm install --workspace-root + gnpm install --workspace-root ep_align ep_author_hover ep_cursortrace ep_font_size ep_hash_auth ep_headings2 - ep_image_upload ep_markdown ep_readonly_guest ep_set_title_on_pad ep_spellcheck ep_subscript_and_superscript - ep_table_of_contents + ep_table_of_contents --runtimeVersion="${{ matrix.node }}" - name: Run the backend tests - run: pnpm test + run: gnpm test --runtimeVersion="${{ matrix.node }}" + - name: Run the new vitest tests + working-directory: src + run: gnpm run test:vitest --runtimeVersion="${{ matrix.node }}" withoutpluginsWindows: + env: + PNPM_HOME: ~\\.pnpm-store # run on pushes to any branch # run on PRs from external forks if: | (github.event_name != 'pull_request') || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) + strategy: + fail-fast: false + matrix: + node: [">=20.0.0 <21.0.0", ">=22.0.0 <23.0.0", ">=24.0.0 <25.0.0"] name: Windows without plugins runs-on: windows-latest steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 name: Setup pnpm cache + if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + C:\gnpm\ + C:\Users\runneradmin\AppData\Roaming\gnpm\ + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installOnWindows.bat - - name: Install admin ui - working-directory: admin - run: pnpm install + run: gnpm install --frozen-lockfile --runtimeVersion="${{ matrix.node }}" - name: Build admin ui working-directory: admin - run: pnpm build + run: gnpm build --runtimeVersion="${{ matrix.node }}" - name: Fix up the settings.json run: | @@ -194,68 +185,69 @@ jobs: powershell -Command "(gc settings.json.holder) -replace '\"points\": 10', '\"points\": 1000' | Out-File -encoding ASCII settings.json" - name: Run the backend tests - run: cd src && pnpm test + working-directory: src + run: gnpm test --runtimeVersion="${{ matrix.node }}" + - name: Run the new vitest tests + working-directory: src + run: gnpm run test:vitest --runtimeVersion="${{ matrix.node }}" withpluginsWindows: + env: + PNPM_HOME: ~\\.pnpm-store # run on pushes to any branch # run on PRs from external forks if: | (github.event_name != 'pull_request') || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) + strategy: + fail-fast: false + matrix: + node: [">=20.0.0 <21.0.0", ">=22.0.0 <23.0.0", ">=24.0.0 <25.0.0"] name: Windows with Plugins runs-on: windows-latest steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 21 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 name: Setup pnpm cache + if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + C:\gnpm\ + C:\Users\runneradmin\AppData\Roaming\gnpm\ + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false - - name: Install admin ui - working-directory: admin - run: pnpm install + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 + - name: Install dependencies + run: gnpm install --runtimeVersion="${{ matrix.node }}" - name: Build admin ui working-directory: admin - run: pnpm build + run: gnpm build --runtimeVersion="${{ matrix.node }}" - name: Install Etherpad plugins # The --legacy-peer-deps flag is required to work around a bug in npm # v7: https://github.com/npm/cli/issues/2199 run: > - pnpm install --workspace-root + gnpm install --workspace-root ep_align ep_author_hover ep_cursortrace ep_font_size ep_hash_auth ep_headings2 - ep_image_upload ep_markdown ep_readonly_guest ep_set_title_on_pad ep_spellcheck ep_subscript_and_superscript - ep_table_of_contents + ep_table_of_contents --runtimeVersion="${{ matrix.node }}" # Etherpad core dependencies must be installed after installing the # plugin's dependencies, otherwise npm will try to hoist common # dependencies by removing them from src/node_modules and installing them @@ -267,7 +259,7 @@ jobs: # rules. - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installOnWindows.bat + run: gnpm install --frozen-lockfile --runtimeVersion="${{ matrix.node }}" - name: Fix up the settings.json run: | @@ -275,4 +267,8 @@ jobs: powershell -Command "(gc settings.json.holder) -replace '\"points\": 10', '\"points\": 1000' | Out-File -encoding ASCII settings.json" - name: Run the backend tests - run: cd src && pnpm test + working-directory: src + run: gnpm test --runtimeVersion="${{ matrix.node }}" + - name: Run the new vitest tests + working-directory: src + run: gnpm run test:vitest --runtimeVersion="${{ matrix.node }}" diff --git a/.github/workflows/build-and-deploy-docs.yml b/.github/workflows/build-and-deploy-docs.yml index b09f8823d..b0b87697a 100644 --- a/.github/workflows/build-and-deploy-docs.yml +++ b/.github/workflows/build-and-deploy-docs.yml @@ -32,36 +32,34 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() + with: + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Setup Pages uses: actions/configure-pages@v5 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false - name: Install dependencies - run: pnpm install + run: gnpm install - name: Build app working-directory: doc - run: pnpm run docs:build + run: gnpm run docs:build env: COMMIT_REF: ${{ github.sha }} - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v4 with: # Upload entire repository path: './doc/.vitepress/dist' diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 94dd1ac75..c6c10937b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -37,10 +37,10 @@ jobs: if: ${{ github.event_name == 'pull_request' }} - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 - name: Autobuild - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 9a9dcfebb..774c7434a 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -15,6 +15,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: 'Dependency Review' uses: actions/dependency-review-action@v4 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 80031a877..9cc63ebb3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,4 +1,4 @@ -name: Docker +name: "Docker" on: pull_request: paths-ignore: @@ -18,10 +18,15 @@ permissions: jobs: docker: runs-on: ubuntu-latest + env: + PNPM_HOME: ~/.pnpm-store steps: - name: Check out - uses: actions/checkout@v4 + uses: actions/checkout@v6 + with: + path: etherpad + - name: Set up QEMU if: github.event_name == 'push' @@ -31,37 +36,33 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Build and export to Docker - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - context: . + context: ./etherpad target: production load: true tags: ${{ env.TEST_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - - - name: Set up Node.js - uses: actions/setup-node@v4 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 'lts/*' - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Test + working-directory: etherpad run: | docker run --rm -d -p 9001:9001 --name test ${{ env.TEST_TAG }} ./bin/installDeps.sh @@ -75,7 +76,7 @@ jobs: *) printf %s\\n "unexpected status: ${status}" >&2; exit 1;; esac done - (cd src && pnpm run test-container) + (cd src && gnpm run test-container) git clean -dxf . - name: Docker meta @@ -98,20 +99,43 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push + id: build-docker if: github.event_name == 'push' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - context: . + context: ./etherpad target: production platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - name: Update repo description - uses: peter-evans/dockerhub-description@v4 + uses: peter-evans/dockerhub-description@v5 if: github.ref == 'refs/heads/master' with: + readme-filepath: ./etherpad/README.md username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} repository: etherpad/etherpad enable-url-completion: true + - name: Check out + if: github.event_name == 'push' && github.ref == 'refs/heads/develop' + uses: actions/checkout@v6 + with: + path: ether-charts + repository: ether/ether-charts + token: ${{ secrets.ETHER_CHART_TOKEN }} + - name: Update tag in values-dev.yaml + if: success() && github.ref == 'refs/heads/develop' + working-directory: ether-charts + run: | + sed -i 's/tag: ".*"/tag: "${{ steps.build-docker.outputs.digest }}"/' values-dev.yaml + - name: Commit and push changes + working-directory: ether-charts + if: success() && github.ref == 'refs/heads/develop' + run: | + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git add values-dev.yaml + git commit -m 'Update develop image tag' + git push diff --git a/.github/workflows/frontend-admin-tests.yml b/.github/workflows/frontend-admin-tests.yml index 588f5ac9d..7c980bab3 100644 --- a/.github/workflows/frontend-admin-tests.yml +++ b/.github/workflows/frontend-admin-tests.yml @@ -1,5 +1,5 @@ # Leave the powered by Sauce Labs bit in as this means we get additional concurrency -name: "Frontend admin tests powered by Sauce Labs" +name: "Frontend admin tests" on: push: @@ -11,14 +11,15 @@ permissions: jobs: withplugins: - if: ${{ github.actor != 'dependabot[bot]' }} + env: + PNPM_HOME: ~/.pnpm-store name: with plugins runs-on: ubuntu-latest strategy: fail-fast: false matrix: - node: [20, 21] + node: [20, 22, 24] steps: - @@ -29,29 +30,30 @@ jobs: printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}-node${{ matrix.node }}' - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: ${{ matrix.node }} - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 + - name: Cache playwright binaries + uses: actions/cache@v5 + id: playwright-cache + with: + path: | + ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }} #- # name: Install etherpad plugins # # We intentionally install an old ep_align version to test upgrades to @@ -69,7 +71,7 @@ jobs: # rules. - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm i --runtimeVersion="${{ matrix.node }}" #- # name: Install etherpad plugins # run: rm -Rf node_modules/ep_align/static/tests/* @@ -85,7 +87,7 @@ jobs: run: "sed -i 's/\"enableAdminUITests\": false/\"enableAdminUITests\": true,\\n\"users\":{\"admin\":{\"password\":\"changeme1\",\"is_admin\":true}}/' settings.json" - name: increase maxHttpBufferSize - run: "sed -i 's/\"maxHttpBufferSize\": 10000/\"maxHttpBufferSize\": 10000000/' settings.json" + run: "sed -i 's/\"maxHttpBufferSize\": 50000/\"maxHttpBufferSize\": 10000000/' settings.json" - name: Disable import/export rate limiting run: | @@ -93,8 +95,7 @@ jobs: - name: Build admin frontend working-directory: admin run: | - pnpm install - pnpm run build + gnpm run build --runtimeVersion="${{ matrix.node }}" # name: Run the frontend admin tests # shell: bash # env: @@ -125,7 +126,7 @@ jobs: - name: Run the frontend admin tests shell: bash run: | - pnpm run dev & + gnpm run prod --runtimeVersion="${{ matrix.node }}" & connected=false can_connect() { curl -sSfo /dev/null http://localhost:9001/ || return 1 @@ -137,10 +138,10 @@ jobs: sleep 1 done cd src - pnpm exec playwright install - pnpm exec playwright install-deps - pnpm run test-admin - - uses: actions/upload-artifact@v4 + gnpm exec playwright install --runtimeVersion="${{ matrix.node }}" + gnpm exec playwright install-deps --runtimeVersion="${{ matrix.node }}" + gnpm run test-admin --runtimeVersion="${{ matrix.node }}" + - uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-${{ matrix.node }} diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index cbd8d870e..0b95070f4 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -11,6 +11,8 @@ permissions: jobs: playwright-chrome: + env: + PNPM_HOME: ~/.pnpm-store name: Playwright Chrome runs-on: ubuntu-latest steps: @@ -22,33 +24,27 @@ jobs: printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}' - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 21 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.cache/ms-playwright + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: export GIT_HASH to env id: environment @@ -59,7 +55,7 @@ jobs: - name: Run the frontend tests shell: bash run: | - pnpm run dev & + gnpm run prod & connected=false can_connect() { curl -sSfo /dev/null http://localhost:9001/ || return 1 @@ -71,15 +67,17 @@ jobs: sleep 1 done cd src - pnpm exec playwright install chromium --with-deps - pnpm run test-ui --project=chromium - - uses: actions/upload-artifact@v4 + gnpm exec playwright install chromium --with-deps + gnpm run test-ui --project=chromium + - uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-${{ matrix.node }}-chrome path: src/playwright-report/ retention-days: 30 playwright-firefox: + env: + PNPM_HOME: ~/.pnpm-store name: Playwright Firefox runs-on: ubuntu-latest steps: @@ -89,31 +87,26 @@ jobs: printf %s\\n '::set-output name=name::${{ github.workflow }} - ${{ github.job }}' printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}' - name: Checkout repository - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 21 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: export GIT_HASH to env id: environment run: echo "::set-output name=sha_short::$(git rev-parse --short ${{ github.sha }})" @@ -122,7 +115,7 @@ jobs: - name: Run the frontend tests shell: bash run: | - pnpm run dev & + gnpm run prod & connected=false can_connect() { curl -sSfo /dev/null http://localhost:9001/ || return 1 @@ -134,9 +127,9 @@ jobs: sleep 1 done cd src - pnpm exec playwright install firefox --with-deps - pnpm run test-ui --project=firefox - - uses: actions/upload-artifact@v4 + gnpm exec playwright install firefox --with-deps + gnpm run test-ui --project=firefox + - uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-${{ matrix.node }}-firefox @@ -145,7 +138,8 @@ jobs: playwright-webkit: name: Playwright Webkit runs-on: ubuntu-latest - + env: + PNPM_HOME: ~/.pnpm-store steps: - name: Generate Sauce Labs strings @@ -155,33 +149,26 @@ jobs: printf %s\\n '::set-output name=tunnel_id::${{ github.run_id }}-${{ github.run_number }}-${{ github.job }}' - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 21 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache if: always() with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + path: | + ${{ env.PNPM_HOME }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: export GIT_HASH to env id: environment @@ -192,7 +179,7 @@ jobs: - name: Run the frontend tests shell: bash run: | - pnpm run dev & + gnpm run prod & connected=false can_connect() { curl -sSfo /dev/null http://localhost:9001/ || return 1 @@ -204,9 +191,9 @@ jobs: sleep 1 done cd src - pnpm exec playwright install webkit --with-deps - pnpm run test-ui --project=webkit || true - - uses: actions/upload-artifact@v4 + gnpm exec playwright install webkit --with-deps + gnpm run test-ui --project=webkit || true + - uses: actions/upload-artifact@v6 if: always() with: name: playwright-report-${{ matrix.node }}-webkit diff --git a/.github/workflows/handleRelease.yml b/.github/workflows/handleRelease.yml new file mode 100644 index 000000000..cbcd4e6f1 --- /dev/null +++ b/.github/workflows/handleRelease.yml @@ -0,0 +1,61 @@ +name: "Handle release" + + +on: + push: + tags: + - 'v*.*.*' + # allow manual triggering of the workflow + workflow_dispatch: + +permissions: + contents: read + +env: + PNPM_HOME: ~/.pnpm-store + +jobs: + create-release: + permissions: write-all + # run on pushes to any branch + # run on PRs from external forks + if: | + (github.event_name != 'pull_request') + || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) + name: Handle the release + runs-on: ubuntu-latest + steps: + - + name: Checkout repository + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() + with: + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 + - name: Install all dependencies and symlink for ep_etherpad-lite + run: gnpm install --frozen-lockfile + - name: Build etherpad + run: gnpm run build:etherpad + # On release, create release + - name: Generate Changelog + working-directory: bin + run: gnpm run generateChangelog ${{ github.ref }} > ${{ github.workspace }}-CHANGELOG.txt + - name: Release + uses: softprops/action-gh-release@v2 + if: ${{startsWith(github.ref, 'refs/tags/v') }} + with: + body_path: ${{ github.workspace }}-CHANGELOG.txt + make_latest: true diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml index ed98a20e7..12bacdcf8 100644 --- a/.github/workflows/load-test.yml +++ b/.github/workflows/load-test.yml @@ -12,6 +12,10 @@ on: permissions: contents: read +env: + PNPM_HOME: ~/.pnpm-store + LOG_LEVEL: DEBUG + jobs: withoutplugins: # run on pushes to any branch @@ -24,38 +28,37 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: Install etherpad-load-test run: sudo npm install -g etherpad-load-test-socket-io - name: Run load test - run: src/tests/frontend/travis/runnerLoadTest.sh 25 50 + run: | + gnpm --gnpmEnv + eval "$(gnpm --gnpmEnv)" + echo $PATH + src/tests/frontend/travis/runnerLoadTest.sh 25 50 withplugins: # run on pushes to any branch @@ -68,38 +71,33 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install etherpad-load-test - run: pnpm install -g etherpad-load-test-socket-io + run: sudo npm install -g etherpad-load-test-socket-io - name: Install etherpad plugins # The --legacy-peer-deps flag is required to work around a bug in npm v7: # https://github.com/npm/cli/issues/2199 run: > - pnpm install --workspace-root + gnpm install --workspace-root ep_align ep_author_hover ep_cursortrace @@ -123,10 +121,12 @@ jobs: # rules. - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: Run load test - run: src/tests/frontend/travis/runnerLoadTest.sh 25 50 + run: | + eval "$(gnpm --gnpmEnv)" + src/tests/frontend/travis/runnerLoadTest.sh 25 50 long: # run on pushes to any branch @@ -139,35 +139,34 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: Install etherpad-load-test run: sudo npm install -g etherpad-load-test-socket-io - name: Run load test - run: src/tests/frontend/travis/runnerLoadTest.sh 5000 5 + run: | + gnpm --gnpmEnv + eval "$(gnpm --gnpmEnv)" + echo $PATH + src/tests/frontend/travis/runnerLoadTest.sh 5000 5 diff --git a/.github/workflows/perform-type-check.yml b/.github/workflows/perform-type-check.yml index 638e75a13..a2105615e 100644 --- a/.github/workflows/perform-type-check.yml +++ b/.github/workflows/perform-type-check.yml @@ -12,6 +12,8 @@ on: permissions: contents: read +env: + PNPM_HOME: ~/.pnpm-store jobs: performTypeCheck: @@ -22,31 +24,27 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: Install all dependencies and symlink for ep_etherpad-lite - run: ./bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: Perform type check working-directory: ./src - run: npm run ts-check + run: gnpm run ts-check diff --git a/.github/workflows/rate-limit.yml b/.github/workflows/rate-limit.yml index 84e79552c..0a0699c6f 100644 --- a/.github/workflows/rate-limit.yml +++ b/.github/workflows/rate-limit.yml @@ -12,6 +12,9 @@ on: permissions: contents: read +env: + PNPM_HOME: ~/.pnpm-store + jobs: ratelimit: # run on pushes to any branch @@ -24,31 +27,28 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 + uses: actions/checkout@v6 + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | - ${{ runner.os }}-pnpm-store- + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 - name: docker network - run: docker network create --subnet=172.23.42.0/16 ep_net + run: docker network create --subnet=172.23.0.0/16 ep_net - name: build docker image run: | @@ -63,7 +63,7 @@ jobs: docker run --rm --network ep_net --ip 172.23.42.3 --name anotherip -dt anotherip - name: install dependencies and create symlink for ep_etherpad-lite - run: bin/installDeps.sh + run: gnpm install --frozen-lockfile - name: run rate limit test run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..5411e5108 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,90 @@ +permissions: + contents: read +name: Release etherpad +on: + workflow_dispatch: + inputs: + release_type: + description: 'Choose the type of release to create' + required: true + default: 'patch' + type: choice + options: + - patch + - minor + - major + +env: + PNPM_HOME: ~/.pnpm-store + +jobs: + releases: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + repository: ether/etherpad-lite + path: etherpad + token: '${{ secrets.ETHER_RELEASE_TOKEN }}' + fetch-depth: '0' + fetch-tags: 'true' + - name: Checkout master + working-directory: etherpad + run: | + git fetch origin master + git checkout master + git reset --hard origin/master + - name: Checkout develop + working-directory: etherpad + run: | + git fetch origin develop + git checkout develop + git reset --hard origin/develop + - name: Checkout repository + uses: actions/checkout@v6 + with: + repository: ether/ether.github.com + path: ether.github.com + token: '${{ secrets.ETHER_RELEASE_TOKEN }}' + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() + with: + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 + - name: Install dependencies ether.github.com + run: gnpm install --frozen-lockfile + working-directory: ether.github.com + - name: Set git user + run: | + git config --global user.name "Etherpad Release Bot" + git config --global user.email "noreply@etherpad.org" + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7 + + - uses: reitzig/actions-asciidoctor@v2.0.2 + with: + version: 2.0.18 + - name: Prepare release + working-directory: etherpad + run: | + cd bin + gnpm install + gnpm run release ${{ inputs.release_type }} + - name: Push after release + working-directory: etherpad + run: | + ./bin/push-after-release.sh diff --git a/.github/workflows/releaseEtherpad.yml b/.github/workflows/releaseEtherpad.yml new file mode 100644 index 000000000..bfe1b2556 --- /dev/null +++ b/.github/workflows/releaseEtherpad.yml @@ -0,0 +1,45 @@ +name: releaseEtherpad.yaml +permissions: + contents: read +on: + workflow_dispatch: + +env: + PNPM_HOME: ~/.pnpm-store + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v6 + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + - uses: actions/cache@v5 + name: Setup pnpm cache + if: always() + with: + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main + with: + version: 0.0.12 + - name: Install dependencies + run: gnpm install --frozen-lockfile + - name: Rename etherpad + working-directory: ./src + run: sed -i 's/ep_etherpad-lite/ep_etherpad/g' package.json + - name: Release to npm + run: gnpm publish --no-git-checks + working-directory: ./src + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_PRIVATE_TOKEN }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 60249bb15..5446694be 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -9,7 +9,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: close-issue-label: wontfix close-pr-label: wontfix diff --git a/.github/workflows/upgrade-from-latest-release.yml b/.github/workflows/upgrade-from-latest-release.yml index 44eac09c4..eb480c256 100644 --- a/.github/workflows/upgrade-from-latest-release.yml +++ b/.github/workflows/upgrade-from-latest-release.yml @@ -12,6 +12,9 @@ on: permissions: contents: read +env: + PNPM_HOME: ~/.pnpm-store + jobs: withpluginsLinux: # run on pushes to any branch @@ -24,81 +27,70 @@ jobs: strategy: fail-fast: false matrix: - node: [18, 20, 21] + node: [20, 22, 24] steps: - name: Check out latest release - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: - ref: master - - - uses: actions/setup-node@v4 + ref: develop #FIXME change to master when doing release + - uses: actions/cache@v5 + name: Setup gnpm cache + if: always() with: - node-version: ${{ matrix.node }} - - uses: pnpm/action-setup@v3 - name: Install pnpm + path: | + ${{ env.STORE_PATH }} + ~/.local/share/gnpm + ~/.cache/ms-playwright + /usr/local/bin/gnpm + /usr/local/bin/gnpm-0.0.12 + key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-gnpm-store- + - name: Setup gnpm + uses: SamTV12345/gnpm-setup@main with: - version: 9.0.4 - run_install: false - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false + version: 0.0.12 - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: packages: libreoffice libreoffice-pdfimport version: 1.0 - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false - name: Install libreoffice - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: packages: libreoffice libreoffice-pdfimport version: 1.0 - name: Install all dependencies and symlink for ep_etherpad-lite - run: bin/installDeps.sh - - name: Install admin ui - working-directory: admin - run: pnpm install + run: gnpm install --frozen-lockfile --runtimeVersion="${{ matrix.node }}" - name: Build admin ui working-directory: admin - run: pnpm build + run: gnpm build --runtimeVersion="${{ matrix.node }}" - name: Install Etherpad plugins run: > - pnpm run install-plugins + gnpm run install-plugins ep_align ep_author_hover ep_cursortrace ep_font_size ep_hash_auth ep_headings2 - ep_image_upload ep_markdown ep_readonly_guest ep_set_title_on_pad ep_spellcheck ep_subscript_and_superscript - ep_table_of_contents + ep_table_of_contents --runtimeVersion="${{ matrix.node }}" - name: Run the backend tests - run: pnpm run test + run: gnpm run test --runtimeVersion="${{ matrix.node }}" - name: Install all dependencies and symlink for ep_etherpad-lite - run: ./bin/installDeps.sh - # Because actions/checkout@v4 is called with "ref: master" and without + run: gnpm install --frozen-lockfile --runtimeVersion="${{ matrix.node }}" + # Because actions/checkout@v6 is called with "ref: master" and without # "fetch-depth: 0", the local clone does not have the ${GITHUB_SHA} # commit. Fetch ${GITHUB_REF} to get the ${GITHUB_SHA} commit. Note that a # plain "git fetch" only fetches "normal" references (refs/heads/* and @@ -114,4 +106,4 @@ jobs: # commit that merges the PR's source branch to its destination branch. run: git checkout "${GITHUB_SHA}" - name: Run the backend tests - run: pnpm run test + run: gnpm run test --runtimeVersion="${{ matrix.node }}" diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml deleted file mode 100644 index 816de3957..000000000 --- a/.github/workflows/windows.yml +++ /dev/null @@ -1,171 +0,0 @@ -name: "Windows Build" - -# any branch is useful for testing before a PR is submitted -on: - push: - paths-ignore: - - "doc/**" - pull_request: - paths-ignore: - - "doc/**" - -permissions: - contents: read - -jobs: - build-zip: - # run on pushes to any branch - # run on PRs from external forks - if: | - (github.event_name != 'pull_request') - || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) - name: Build .zip - runs-on: windows-latest - steps: - - - uses: msys2/setup-msys2@v2 - with: - path-type: inherit - install: >- - zip - - - name: Checkout repository - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 21 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false - - - name: Install all dependencies and symlink for ep_etherpad-lite - shell: msys2 {0} - run: bin/installDeps.sh - - - name: Run the backend tests - shell: msys2 {0} - run: cd src && pnpm test - - - name: Build the .zip - shell: msys2 {0} - run: bin/buildForWindows.sh - - - name: Archive production artifacts - uses: actions/upload-artifact@v4 - with: - name: etherpad-win.zip - path: etherpad-win.zip - - build-exe: - if: | - (github.event_name != 'pull_request') - || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) - name: Build .exe - needs: build-zip - runs-on: windows-latest - steps: - - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Download .zip - uses: actions/download-artifact@v4 - with: - name: etherpad-win.zip - path: .. - - - name: Extract .zip - working-directory: .. - run: 7z x etherpad-win.zip -oetherpad-zip - - - name: Create installer - uses: joncloud/makensis-action@v4.1 - with: - script-file: 'bin/nsis/etherpad.nsi' - - - name: Archive production artifacts - uses: actions/upload-artifact@v4 - with: - name: etherpad-win.exe - path: etherpad-win.exe - - deploy-zip: - # run on pushes to any branch - # run on PRs from external forks - permissions: - contents: write - if: | - (github.event_name != 'pull_request') - || (github.event.pull_request.head.repo.id != github.event.pull_request.base.repo.id) - name: Deploy - needs: build-zip - runs-on: windows-latest - steps: - - - name: Download zip - uses: actions/download-artifact@v4 - with: - name: etherpad-win.zip - - - name: Extract Etherpad - run: 7z x etherpad-win.zip -oetherpad - - - uses: actions/setup-node@v4 - with: - node-version: 20 - - uses: pnpm/action-setup@v3 - name: Install pnpm - with: - version: 9.0.4 - run_install: false - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Only install direct dependencies - run: pnpm config set auto-install-peers false - - name: Install all dependencies and symlink for ep_etherpad-lite - run: .\bin\installOnWindows.bat - working-directory: etherpad - - - name: Run Etherpad - working-directory: etherpad/src - run: | - pnpm install cypress - .\node_modules\.bin\cypress.cmd install --force - pnpm run prod & - curl --connect-timeout 10 --max-time 20 --retry 5 --retry-delay 10 --retry-max-time 60 --retry-connrefused http://127.0.0.1:9001/p/test - pnpm exec cypress run --config-file ./tests/frontend/cypress/cypress.config.js - # On release, upload windows zip to GitHub release tab - - - name: Rename to etherpad-lite-win.zip - shell: powershell - run: mv etherpad-win.zip etherpad-lite-win.zip - - name: upload binaries to release - uses: softprops/action-gh-release@v2 - if: ${{startsWith(github.ref, 'refs/tags/v') }} - with: - files: etherpad-lite-win.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a789452..29db41760 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,171 @@ +# 2.6.0 + +### Notable enhancements and fixes + +- Added native option to transfer your Etherpad session between browsers. If you use multiple browsers or different PC for Etherpad they are different sessions. Meaning typing on one PC and then switching to another one in the same pad will result in different authorship colors. With this new feature you can now transfer your session to another browser or PC. To do so, open the home page and click on the wheel icon in the top right corner. After that click through the first dialog prompting you to copy a code to your clipboard. On your second browser open the same dialog and switch to "Receive Session" tab. There you can paste the code you copied before and click on "Receive Session". After that your session is transferred, and you can continue editing with the same authorship color as before. Just be aware that you can't have two active sessions at once in a pad. +- Updated to oidc provider v2.6.0 after resolving compatibility issues. + +🎉 For all the people celebrating: Have a happy and awesome new year! 🎉 There is something big on the horizon for Etherpad in 2026. Stay tuned! + +# 2.5.3 + +### Notable enhancements and fixes +- Fixed an issue with the release script that caused the release to not be created correctly. + +# 2.5.2 + +### Notable enhancements and fixes + +- Fixes the no skin theme having an overlapping +- Adds a new setting to disable recent pads to be shown. By setting `showRecentPads` to false in the `settings.json` file you can disable the recent pads feature on the home screen. +- Sets the oidc-provider version to 9.5.1 as 9.5.2 crashes Etherpad on startup. + +# 2.5.1 + +### Notable enhancements and fixes + +- Added endpoint for prometheus scraping. You can now scrape the metrics endpoint with prometheus. It is available at /stats/prometheus if you have enableMetrics set to true in your settings.json + +- fixed exposeVersion causing the pad panel to not load correctly +- fixed admin manage pad url to also take the base path into account + +# 2.5.0 + +### Notable enhancements and fixes + +- Updated to express 5.0.0. This is a major update to express that brings a lot of improvements and fixes. Please update all your plugins to the latest version to ensure compatibility. A lot changed in the route matching, and thus old plugins will throw errors and crash Etherpad. +- Fixed an issue with the no-skin theme with cookie recentPadList feature +- Fixed layout issues with the no-skin theme + +# 2.4.2 + +### Notable enhancements and fixes +- Fixed a german translation in the english translation file. + +# 2.4.1 + +### Notable enhancements and fixes + +- Added generating release through ci cd pipeline. +- Readded temporarily disabled workflows after release generation works again + +# 2.4.0 + +### Notable enhancements and fixes +- Added home button to the pad panel. To show it in your current instance, please copy the updated "toolbar" settings from the `settings.json.template` file to your `settings.json` file. +- Added more current design for the default collibri theme. +- Added handling of recent visited pads in the collibri theme. You can now access the most recent three pads you visited in the pad panel. +- Disable stats endpoints if enableMetrics is set to false. This allows you to disable the metrics endpoints if you don't want to use them. +- Use Node LTS instead of always latest Node version. + + +# 2.3.2 + +### Notable enhancements and fixes + +- Fixed admin ui displaying incorrect text + +# 2.3.1 + +### Notable enhancements and fixes + +- Dependency updates + +# 2.3.0 + +### Notable enhancements and fixes + +- Added possibility to cluster Etherpads behind reverse proxy. There is now a new reverse proxy designed for Etherpads that handles multiple Etherpads and the created pads in them. It will assign the pad assignement to an Etherpad at random but once the choice was made it will always reverse proxy the same backend. This allows to host multiple concurrent Etherpads and benefit from multi core systems even though one Etherpad is singlethreaded. +- Added reverse proxy configuration for replacing Nginx. In the past there were some issues with nginx and its configuration. This reverse proxy allows you to handle your configuration with ease. + +If you want to find out more about the reverse proxy method check out the repository https://github.com/ether/etherpad-proxy . It also contains a sample docker-compose file with three Etherpads and one etherpad-proxy. Of course you need to adapt the settings.json.template to your liking and map it into the reverse proxy image before you are ready :). + + +- Added client authorization to work with Etherpad. Before it would get blocked because it doesn't have the required claim. As this is now fixed etherpad-proxy can also work with your new OAuth2 configuration and retrieve a token via client credentials flow. + + + + +# 2.2.7 + + +### Notable enhancements and fixes + +- We migrated all important pages to React 19 and React Router v7 + +Besides that only dependency updates. + + + -> Have a merry Christmas and a happy new year. 🎄 🎁 + + +# 2.2.6 + +### Notable enhancements and fixes + +- Added option to delete a pad by the creator. This option can be found in the settings menu. When you click on it you get a confirm dialog and after that you have the chance to completely erase the pad. + + +# 2.2.5 + +### Notable enhancements and fixes + +- Fixed timeslider not scrolling when the revision count is a multiple of 100 +- Added new Restful API for version 2 of Etherpad. It is available at /api-docs + + +# 2.2.4 + +### Notable enhancements and fixes + +- Switched to new SQLite backend +- Fixed rusty-store-kv module not found + + +# 2.2.3 + +### Notable enhancements and fixes + +- Introduced a new in process database `rustydb` that represents a fast key value store written in Rust. +- Readded window._ as a shortcut for getting text +- Added support for migrating any ueberdb database to another. You can now switch as you please. See here: https://docs.etherpad.org/cli.html +- Further Typescript movements +- A lot of security issues fixed and reviewed in this release. Please update. + + +# 2.2.2 + +### Notable enhancements and fixes + +- Removal of Etherpad require kernel: We finally managed to include esbuild to bundle our frontend code together. So no matter how many plugins your server has it is always one JavaScript file. This boosts performance dramatically. +- Added log layoutType: This lets you print the log in either colored or basic (black and white text) +- Introduced esbuild for bundling CSS files +- Cache all files to be bundled in memory for faster load speed + + +# 2.1.1 + + +### Notable enhancements and fixes + +- Fixed failing Docker build when checked out as git submodule. Thanks to @neurolabs +- Fixed: Fallback to websocket and polling when unknown(old) config is present for socket io +- Fixed: Next page disabled if zero page by @samyakj023 +- On CTRL+CLICK bring the window back to focus by Helder Sepulveda + +# 2.1.0 + +### Notable enhancements and fixes + +- Added PWA support. You can now add your Etherpad instance to your home screen on your mobile device or desktop. +- Fixed live plugin manager versions clashing. Thanks to @yacchin1205 +- Fixed a bug in the pad panel where pagination was not working correctly when sorting by pad name + +### Compatibility changes + +- Reintroduced APIKey.txt support. You can now switch between APIKey and OAuth2.0 authentication. This can be toggled with the setting authenticationMethod. The default is OAuth2. If you want to use the APIKey method you can set that to `apikey`. + + # 2.0.3 ### Notable enhancements and fixes @@ -47,8 +215,8 @@ - Bin folder: The bin folder has been moved from the src folder to the root folder. This change was necessary as the contained scripts do not represent core functionality of the user. - Starting Etherpad: Etherpad can now be started with a single command: `pnpm run prod` in the root directory. - Installing Etherpad: Etherpad no longer symlinks itself in the root directory. This is now also taken care by pnpm, and it just creates a node_modules folder with the src directory`s ep_etherpad-lite folder - - Plugins can now be installed simply via the command: `pnpm run install-plugins first-plugin second-plugin` or if you want to install from path you can do: - `pnpm run install-plugins --path ../path-to-plugin` + - Plugins can now be installed simply via the command: `pnpm run plugins i first-plugin second-plugin` or if you want to install from path you can do: + `pnpm run plugins i --path ../path-to-plugin` # 1.9.7 diff --git a/Dockerfile b/Dockerfile index 65fd6cd61..1b0a45d1a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,16 +3,17 @@ # https://github.com/ether/etherpad-lite # # Author: muxator +ARG BUILD_ENV=git -FROM node:alpine as adminBuild - +FROM node:lts-alpine AS adminbuild +RUN npm install -g pnpm@latest WORKDIR /opt/etherpad-lite -COPY ./ ./ -RUN cd ./admin && npm install -g pnpm@9.0.4 && pnpm install && pnpm run build --outDir ./dist -RUN cd ./ui && pnpm install && pnpm run build --outDir ./dist +COPY . . +RUN pnpm install +RUN pnpm run build:ui -FROM node:alpine as build +FROM node:lts-alpine AS build LABEL maintainer="Etherpad team, https://github.com/ether/etherpad-lite" # Set these arguments when building the image from behind a proxy @@ -49,6 +50,14 @@ ARG ETHERPAD_PLUGINS= # ETHERPAD_LOCAL_PLUGINS="../ep_my_plugin ../ep_another_plugin" ARG ETHERPAD_LOCAL_PLUGINS= +# github plugins to install while building the container. By default no plugins are +# installed. +# If given a value, it has to be a space-separated, quoted list of plugin names. +# +# EXAMPLE: +# ETHERPAD_GITHUB_PLUGINS="ether/ep_plugin" +ARG ETHERPAD_GITHUB_PLUGINS= + # Control whether abiword will be installed, enabling exports to DOC/PDF/ODT formats. # By default, it is not installed. # If given any value, abiword will be installed. @@ -91,53 +100,81 @@ RUN mkdir -p "${EP_DIR}" && chown etherpad:etherpad "${EP_DIR}" # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199 RUN \ mkdir -p /usr/share/man/man1 && \ - npm install pnpm@9.0.4 -g && \ + npm install pnpm@latest -g && \ apk update && apk upgrade && \ apk add --no-cache \ ca-certificates \ curl \ git \ ${INSTALL_ABIWORD:+abiword abiword-plugin-command} \ - ${INSTALL_SOFFICE:+libreoffice openjdk8-jre libreoffice-common} + ${INSTALL_SOFFICE:+libreoffice openjdk8-jre libreoffice-common} && \ + rm -rf /var/cache/apk/* USER etherpad WORKDIR "${EP_DIR}" # etherpads version feature requires this. Only copy what is really needed -COPY --chown=etherpad:etherpad ./.git/HEAD ./.git/HEAD -COPY --chown=etherpad:etherpad ./.git/refs ./.git/refs COPY --chown=etherpad:etherpad ${SETTINGS} ./settings.json COPY --chown=etherpad:etherpad ./var ./var COPY --chown=etherpad:etherpad ./bin ./bin COPY --chown=etherpad:etherpad ./pnpm-workspace.yaml ./package.json ./ -FROM build as development -COPY --chown=etherpad:etherpad ./src/package.json .npmrc ./src/ -COPY --chown=etherpad:etherpad --from=adminBuild /opt/etherpad-lite/admin/dist ./src/templates/admin -COPY --chown=etherpad:etherpad --from=adminBuild /opt/etherpad-lite/ui/dist ./src/static/oidc + +FROM build AS build_git +ONBUILD COPY --chown=etherpad:etherpad ./.git/HEA[D] ./.git/HEAD +ONBUILD COPY --chown=etherpad:etherpad ./.git/ref[s] ./.git/refs + +FROM build AS build_copy + + + + +FROM build_${BUILD_ENV} AS development + +ARG ETHERPAD_PLUGINS= +ARG ETHERPAD_LOCAL_PLUGINS= +ARG ETHERPAD_LOCAL_PLUGINS_ENV= +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 + +COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/ + +RUN bash -c ./bin/installLocalPlugins.sh RUN bin/installDeps.sh && \ - if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_LOCAL_PLUGINS}" ]; then \ - pnpm run install-plugins ${ETHERPAD_PLUGINS} ${ETHERPAD_LOCAL_PLUGINS:+--path ${ETHERPAD_LOCAL_PLUGINS}}; \ - fi + if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_GITHUB_PLUGINS}" ]; then \ + pnpm run plugins i ${ETHERPAD_PLUGINS} ${ETHERPAD_GITHUB_PLUGINS:+--github ${ETHERPAD_GITHUB_PLUGINS}}; \ + fi -FROM build as production +FROM build_${BUILD_ENV} AS production + +ARG ETHERPAD_PLUGINS= +ARG ETHERPAD_LOCAL_PLUGINS= +ARG ETHERPAD_LOCAL_PLUGINS_ENV= +ARG ETHERPAD_GITHUB_PLUGINS= ENV NODE_ENV=production ENV ETHERPAD_PRODUCTION=true COPY --chown=etherpad:etherpad ./src ./src -COPY --chown=etherpad:etherpad --from=adminBuild /opt/etherpad-lite/admin/dist ./src/templates/admin -COPY --chown=etherpad:etherpad --from=adminBuild /opt/etherpad-lite/ui/dist ./src/static/oidc +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 -RUN bin/installDeps.sh && rm -rf ~/.npm && rm -rf ~/.local && rm -rf ~/.cache && \ - if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_LOCAL_PLUGINS}" ]; then \ - pnpm run install-plugins ${ETHERPAD_PLUGINS} ${ETHERPAD_LOCAL_PLUGINS:+--path ${ETHERPAD_LOCAL_PLUGINS}}; \ - fi +COPY --chown=etherpad:etherpad ./local_plugin[s] ./local_plugins/ +RUN bash -c ./bin/installLocalPlugins.sh + +RUN bin/installDeps.sh && \ + if [ ! -z "${ETHERPAD_PLUGINS}" ] || [ ! -z "${ETHERPAD_GITHUB_PLUGINS}" ]; then \ + pnpm run plugins i ${ETHERPAD_PLUGINS} ${ETHERPAD_GITHUB_PLUGINS:+--github ${ETHERPAD_GITHUB_PLUGINS}}; \ + fi && \ + pnpm store prune # Copy the configuration file. COPY --chown=etherpad:etherpad ${SETTINGS} "${EP_DIR}"/settings.json diff --git a/README.md b/README.md index 0fb5db326..32e183081 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ services: # ports: # - "5432:5432" volumes: - - postgres_data:/var/lib/postgresql/data/pgdata + - postgres_data:/var/lib/postgresql/data volumes: postgres_data: @@ -98,76 +98,19 @@ volumes: etherpad-var: ``` - - ### Requirements [Node.js](https://nodejs.org/) >= **18.18.2**. -### GNU/Linux and other UNIX-like systems +### Windows, macOS, Linux -#### Quick install on Debian/Ubuntu - -Install the latest Node.js LTS per [official install instructions](https://github.com/nodesource/distributions#installation-instructions), then: -```sh -git clone --branch master https://github.com/ether/etherpad-lite.git && -cd etherpad-lite && -bin/run.sh -``` - -#### Manual install - -You'll need Git and [Node.js](https://nodejs.org/) installed. - -**As any user (we recommend creating a separate user called etherpad):** - - 1. Move to a folder where you want to install Etherpad. - 2. Clone the Git repository: `git clone --branch master - https://github.com/ether/etherpad-lite.git` - 3. Change into the new directory containing the cloned source code: `cd - etherpad-lite` - 4. Run `bin/run.sh` and open http://127.0.0.1:9001 in your browser. - -To update to the latest released version, execute `git pull origin`. The next -start with `bin/run.sh` will update the dependencies. - -### Windows - -#### Prebuilt Windows package - -This package runs on any Windows machine. You can perform a manual installation -via git for development purposes, but as this uses symlinks which performs -unreliably on Windows, please stick to the prebuilt package if possible. - - 1. [Download the latest Windows package](https://etherpad.org/#download) - 2. Extract the folder - -Run `start.bat` and open in your browser. - -#### Manually install on Windows - -You'll need [Node.js](https://nodejs.org) and (optionally, though recommended) -git. - - 1. Grab the source, either: - * download - * or `git clone --branch master - https://github.com/ether/etherpad-lite.git` - 2. With a "Run as administrator" command prompt execute - `bin\installOnWindows.bat` - -Now, run `start.bat` and open http://localhost:9001 in your browser. - -Update to the latest version with `git pull origin`, then run -`bin\installOnWindows.bat`, again. - -If cloning to a subdirectory within another project, you may need to do the -following: - - 1. Start the server manually (e.g. `node src/node/server.ts`) - 2. Edit the db `filename` in `settings.json` to the relative directory with - the file (e.g. `application/lib/etherpad-lite/var/dirty.db`) - 3. Add auto-generated files to the main project `.gitignore` +1. Download the latest Node.js runtime from [nodejs.org](https://nodejs.org/). +2. Install pnpm: `npm install -g pnpm` (Administrator privileges may be required). +3. Clone the repository: `git clone -b master` +4. Run `pnpm i` +5. Run `pnpm run build:etherpad` +6. Run `pnpm run prod` +7. Visit `http://localhost:9001` in your browser. ### Docker container @@ -195,7 +138,7 @@ Alternatively, you can install plugins from the command line: ```sh cd /path/to/etherpad-lite -pnpm run install-plugins ep_${plugin_name} +pnpm run plugins i ep_${plugin_name} ``` Also see [the plugin wiki @@ -207,7 +150,7 @@ Run the following command in your Etherpad folder to get all of the features visible in the above demo gif: ```sh -pnpm run install-plugins \ +pnpm run plugins i \ ep_align \ ep_comments_page \ ep_embedded_hyperlinks2 \ @@ -231,6 +174,31 @@ following plugins: that each user's chosen color, display name, comment ownership, etc. is strongly linked to their account. +### Upgrade Etherpad + +Run the following command in your Etherpad folder to upgrade + +1. Stop any running Etherpad (manual, systemd ...) +2. Get present version +```sh +git -P tag --contains +``` +3. List versions available +```sh +git -P tag --list "v*" --merged +``` +4. Select the version +```sh +git checkout v2.2.5 +git switch -c v2.2.5 +``` +5. Upgrade Etherpad +```sh +./bin/run.sh +``` +6. Stop with [CTRL-C] +7. Restart your Etherpad service + ## Next Steps ### Tweak the settings diff --git a/admin/package.json b/admin/package.json index 809f26bdd..947aa843a 100644 --- a/admin/package.json +++ b/admin/package.json @@ -1,41 +1,46 @@ { "name": "admin", "private": true, - "version": "2.0.3", + "version": "2.6.0", "type": "module", "scripts": { "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "build-copy": "tsc && vite build --outDir ../src/templates/admin --emptyOutDir", "preview": "vite preview" }, "dependencies": { - "@radix-ui/react-switch": "^1.0.3" + "@radix-ui/react-switch": "^1.2.6" }, "devDependencies": { - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-toast": "^1.1.5", - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@typescript-eslint/eslint-plugin": "^7.7.0", - "@typescript-eslint/parser": "^7.7.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "eslint": "^9.0.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.5", - "i18next": "^23.11.2", - "i18next-browser-languagedetector": "^7.2.1", - "lucide-react": "^0.372.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.51.3", - "react-i18next": "^14.1.0", - "react-router-dom": "^6.22.3", - "socket.io-client": "^4.7.5", - "typescript": "^5.4.5", - "vite": "^5.2.9", - "vite-plugin-static-copy": "^1.0.3", - "vite-plugin-svgr": "^4.2.0", - "zustand": "^4.5.2" + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-toast": "^1.2.15", + "@types/react": "^19.2.8", + "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.53.1", + "@typescript-eslint/parser": "^8.53.1", + "@vitejs/plugin-react": "^5.1.2", + "babel-plugin-react-compiler": "19.1.0-rc.3", + "eslint": "^9.39.2", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.26", + "i18next": "^25.7.4", + "i18next-browser-languagedetector": "^8.2.0", + "lucide-react": "^0.562.0", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "react-hook-form": "^7.71.1", + "react-i18next": "^16.5.3", + "react-router-dom": "^7.12.0", + "socket.io-client": "^4.8.3", + "typescript": "^5.9.3", + "vite": "npm:rolldown-vite@7.2.10", + "vite-plugin-babel": "^1.4.1", + "vite-plugin-static-copy": "^3.1.5", + "zustand": "^5.0.10" + }, + "overrides": { + "vite": "npm:rolldown-vite@7.2.10" } } diff --git a/admin/public/brand.svg b/admin/public/brand.svg new file mode 100644 index 000000000..3f42434c9 --- /dev/null +++ b/admin/public/brand.svg @@ -0,0 +1,50 @@ + + + Group 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/public/ep_admin_pads/de.json b/admin/public/ep_admin_pads/de.json index afb553caf..67dd73ddf 100644 --- a/admin/public/ep_admin_pads/de.json +++ b/admin/public/ep_admin_pads/de.json @@ -14,6 +14,7 @@ "ep_adminpads2_autoupdate.title": "Aktiviert oder deaktiviert automatische Aktualisierungen für die aktuelle Abfrage.", "ep_adminpads2_confirm": "Willst du das Pad {{padID}} wirklich löschen?", "ep_adminpads2_delete.value": "Löschen", + "ep_adminpads2_cleanup": "Historie aufräumen", "ep_adminpads2_last-edited": "Zuletzt bearbeitet", "ep_adminpads2_loading": "Lädt...", "ep_adminpads2_manage-pads": "Pads verwalten", diff --git a/admin/public/ep_admin_pads/en.json b/admin/public/ep_admin_pads/en.json index 8a9044b1b..76354c640 100644 --- a/admin/public/ep_admin_pads/en.json +++ b/admin/public/ep_admin_pads/en.json @@ -4,6 +4,7 @@ "ep_adminpads2_autoupdate.title": "Enables or disables automatic updates for the current query.", "ep_adminpads2_confirm": "Do you really want to delete the pad {{padID}}?", "ep_adminpads2_delete.value": "Delete", + "ep_adminpads2_cleanup": "Cleanup revisions", "ep_adminpads2_last-edited": "Last edited", "ep_adminpads2_loading": "Loading…", "ep_adminpads2_manage-pads": "Manage pads", diff --git a/admin/src/App.tsx b/admin/src/App.tsx index b3238ef9a..ae23ab3d3 100644 --- a/admin/src/App.tsx +++ b/admin/src/App.tsx @@ -1,4 +1,4 @@ -import {useEffect} from 'react' +import {useEffect, useState} from 'react' import './App.css' import {connect} from 'socket.io-client' import {isJSONClean} from './utils/utils.ts' @@ -6,107 +6,115 @@ import {NavLink, Outlet, useNavigate} from "react-router-dom"; import {useStore} from "./store/store.ts"; import {LoadingScreen} from "./utils/LoadingScreen.tsx"; import {Trans, useTranslation} from "react-i18next"; -import {Cable, Construction, Crown, NotepadText, Wrench, PhoneCall} from "lucide-react"; +import {Cable, Construction, Crown, NotepadText, Wrench, PhoneCall, LucideMenu} from "lucide-react"; -const WS_URL = import.meta.env.DEV? 'http://localhost:9001' : '' -export const App = ()=> { - const setSettings = useStore(state => state.setSettings); - const {t} = useTranslation() - const navigate = useNavigate() +const WS_URL = import.meta.env.DEV ? 'http://localhost:9001' : '' +export const App = () => { + const setSettings = useStore(state => state.setSettings); + const {t} = useTranslation() + const navigate = useNavigate() + const [sidebarOpen, setSidebarOpen] = useState(true) - useEffect(() => { - fetch('/admin-auth/', { - method: 'POST' - }).then((value)=>{ - if(!value.ok){ - navigate('/login') - } - }).catch(()=>{ - navigate('/login') - }) - }, []); + useEffect(() => { + fetch('/admin-auth/', { + method: 'POST' + }).then((value) => { + if (!value.ok) { + navigate('/login') + } + }).catch(() => { + navigate('/login') + }) + }, []); - useEffect(() => { - document.title = t('admin.page-title') + useEffect(() => { + document.title = t('admin.page-title') - useStore.getState().setShowLoading(true); - const settingSocket = connect(`${WS_URL}/settings`, { - transports: ['websocket'], - }); + useStore.getState().setShowLoading(true); + const settingSocket = connect(`${WS_URL}/settings`, { + transports: ['websocket'], + }); - const pluginsSocket = connect(`${WS_URL}/pluginfw/installer`, { - transports: ['websocket'], - }) + const pluginsSocket = connect(`${WS_URL}/pluginfw/installer`, { + transports: ['websocket'], + }) - pluginsSocket.on('connect', () => { - useStore.getState().setPluginsSocket(pluginsSocket); - }); + pluginsSocket.on('connect', () => { + useStore.getState().setPluginsSocket(pluginsSocket); + }); - settingSocket.on('connect', () => { - useStore.getState().setSettingsSocket(settingSocket); - useStore.getState().setShowLoading(false) - settingSocket.emit('load'); - console.log('connected'); - }); + settingSocket.on('connect', () => { + useStore.getState().setSettingsSocket(settingSocket); + useStore.getState().setShowLoading(false) + settingSocket.emit('load'); + console.log('connected'); + }); - settingSocket.on('disconnect', (reason) => { - // The settingSocket.io client will automatically try to reconnect for all reasons other than "io - // server disconnect". - useStore.getState().setShowLoading(true) - if (reason === 'io server disconnect') { - settingSocket.connect(); - } - }); + settingSocket.on('disconnect', (reason) => { + // The settingSocket.io client will automatically try to reconnect for all reasons other than "io + // server disconnect". + useStore.getState().setShowLoading(true) + if (reason === 'io server disconnect') { + settingSocket.connect(); + } + }); - settingSocket.on('settings', (settings) => { - /* Check whether the settings.json is authorized to be viewed */ - if (settings.results === 'NOT_ALLOWED') { - console.log('Not allowed to view settings.json') - return; - } + settingSocket.on('settings', (settings) => { + /* Check whether the settings.json is authorized to be viewed */ + if (settings.results === 'NOT_ALLOWED') { + console.log('Not allowed to view settings.json') + return; + } - /* Check to make sure the JSON is clean before proceeding */ - if (isJSONClean(settings.results)) { - setSettings(settings.results); - } else { - alert('Invalid JSON'); - } - useStore.getState().setShowLoading(false); - }); + /* Check to make sure the JSON is clean before proceeding */ + if (isJSONClean(settings.results)) { + setSettings(settings.results); + } else { + alert('Invalid JSON'); + } + useStore.getState().setShowLoading(false); + }); - settingSocket.on('saveprogress', (status)=>{ - console.log(status) - }) + settingSocket.on('saveprogress', (status) => { + console.log(status) + }) - return () => { - settingSocket.disconnect(); - pluginsSocket.disconnect() - } - }, []); + return () => { + settingSocket.disconnect(); + pluginsSocket.disconnect() + } + }, []); - return
- -
-
- + return
+ +
+
+

Etherpad

-
    -
  • -
  • -
  • -
  • -
  • Communication
  • -
-
-
-
- -
+
    { + if (window.innerWidth < 768) { + setSidebarOpen(false) + } + }}> +
  • +
  • +
  • +
  • +
  • Communication
  • +
+
+ +
+ +
+
} export default App diff --git a/admin/src/components/IconButton.tsx b/admin/src/components/IconButton.tsx index e91f3e914..a93c9877c 100644 --- a/admin/src/components/IconButton.tsx +++ b/admin/src/components/IconButton.tsx @@ -1,6 +1,7 @@ -import {FC, ReactElement} from "react"; +import {FC, JSX, ReactElement} from "react"; export type IconButtonProps = { + style?: React.CSSProperties, icon: JSX.Element, title: string|ReactElement, onClick: ()=>void, @@ -8,8 +9,8 @@ export type IconButtonProps = { disabled?: boolean } -export const IconButton:FC = ({icon,className,onClick,title, disabled})=>{ - return diff --git a/admin/src/index.css b/admin/src/index.css index a7330448e..3190b153d 100644 --- a/admin/src/index.css +++ b/admin/src/index.css @@ -1,281 +1,321 @@ :root { - --etherpad-color: #0f775b; - --etherpad-comp: #9C8840; - --etherpad-light: #99FF99; + --etherpad-color: #0f775b; + --etherpad-comp: #9C8840; + --etherpad-light: #99FF99; + --sidebar-width: 20em; } @font-face { - font-family: Karla; - src: url(/Karla-Regular.ttf); + font-family: Karla; + src: url(/Karla-Regular.ttf); } html, body, #root { - box-sizing: border-box; - height: 100%; - font-family: "Karla", sans-serif; + box-sizing: border-box; + height: 100%; + font-family: "Karla", sans-serif; } *, *:before, *:after { - box-sizing: inherit; - font-size: 16px; + box-sizing: inherit; + font-size: 16px; } body { - margin: 0; - color: #333; - font: 14px helvetica, sans-serif; - background: #eee; + margin: 0; + color: #333; + font: 14px helvetica, sans-serif; + background: #eee; } div.menu { - height: 100vh; - font-size: 16px; - font-weight: bolder; - display: flex; - align-items: center; - justify-content: center; - max-width: 20%; - min-width: 20%; + left: 0; + transition: left .3s; + height: 100vh; + font-size: 16px; + font-weight: bolder; + display: flex; + align-items: center; + justify-content: center; + width: var(--sidebar-width); + z-index: 99; + position: fixed; } -.icon-button{ - display: flex; - gap: 10px; - background-color: var(--etherpad-color); - color: white; - border: none; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; +[role="dialog"] h2 { + color: var(--etherpad-color); +} + +.icon-button { + display: flex; + gap: 10px; + background-color: var(--etherpad-color); + color: white; + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; +} + +.icon-button:hover { + background-color: #13a37c; +} + + +.dialog-close-button { + position: absolute; + top: 10px; + right: 10px; + background: none; + border: none; + cursor: pointer; + color: var(--etherpad-color); +} + +.icon-button:active { + background-color: #13a37c; + transform: scale(0.98); } .icon-button svg { - align-self: center; + align-self: center; } .icon-button span { - align-self: center; + align-self: center; } div.menu span:first-child { - display: flex; - justify-content: center; + display: flex; + justify-content: center; } div.menu span:first-child svg { - margin-right: 10px; - align-self: center; + margin-right: 10px; + align-self: center; } div.menu h1 { - font-size: 50px; - text-align: center; + font-size: 50px; + text-align: center; } .inner-menu { - border-radius: 0 20px 20px 0; - padding: 10px; - flex-grow: 100; - background-color: var(--etherpad-comp); - color: white; - height: 100vh; + border-radius: 0 20px 20px 0; + padding: 10px; + flex-grow: 100; + background-color: var(--etherpad-comp); + color: white; + height: 100vh; } div.menu ul { - color: white; - padding: 0; + color: white; + padding: 0; } div.menu li a { - display: flex; - gap: 10px; - margin-bottom: 20px; + display: flex; + gap: 10px; + margin-bottom: 20px; } div.menu svg { - align-self: center; + align-self: center; } div.menu li { - padding: 10px; - color: white; - list-style: none; - margin-left: 3px; - line-height: 3; + padding: 10px; + color: white; + list-style: none; + margin-left: 3px; + line-height: 3; } div.menu li:has(.active) { - background-color: #9C885C ; + background-color: #9C885C; } div.menu li a { - color: lightgray; + color: lightgray; } - div.innerwrapper { - background-color: #F0F0F0; - overflow: auto; - height: 100vh; - flex-grow: 100; - padding: 20px; + transition: margin-left .3s; + isolation: isolate; + background-color: #F0F0F0; + overflow: auto; + height: 100vh; + flex-grow: 100; + margin-left: var(--sidebar-width); + padding: 20px 20px 20px; } div.innerwrapper-err { - display: none; + display: none; } #wrapper { - display: flex; - background: none repeat scroll 0px 0px #FFFFFF; - box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.2); - min-height: 100%;/*always display a scrollbar*/ - + background: none repeat scroll 0px 0px #FFFFFF; + box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.2); + min-height: 100%; /*always display a scrollbar*/ } h1 { - font-size: 29px; + font-size: 29px; } h2 { - font-size: 24px; + font-size: 24px; } .separator { - margin: 10px 0; - height: 1px; - background: #aaa; - background: -webkit-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); - background: -moz-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); - background: -ms-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); - background: -o-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); + margin: 10px 0; + height: 1px; + background: #aaa; + background: -webkit-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); + background: -moz-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); + background: -ms-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); + background: -o-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff); } form { - margin-bottom: 0; + margin-bottom: 0; } #inner { - width: 300px; - margin: 0 auto; + width: 300px; + margin: 0 auto; } input { - font-weight: bold; - font-size: 15px; + font-weight: bold; + font-size: 15px; } .sort { - cursor: pointer; + cursor: pointer; } + .sort:after { - content: '▲▼' + content: '▲▼' } + .sort.up:after { - content:'▲' + content: '▲' } + .sort.down:after { - content:'▼' + content: '▼' } #installed-plugins thead tr th:nth-child(3) { - width: 15%; + width: 15%; } table { - border: 1px solid #ddd; - border-radius: 3px; - border-spacing: 0; - width: 100%; - margin: 20px 0; + border: 1px solid #ddd; + border-radius: 3px; + border-spacing: 0; + width: 100%; + margin: 20px 0; +} + +.table-container { + width: 100%; + overflow: auto; + max-height: 90vh; } - - - -#available-plugins th:first-child, #available-plugins th:nth-child(2){ - text-align: center; +#available-plugins th:first-child, #available-plugins th:nth-child(2) { + text-align: center; } td, th { - padding: 5px; + padding: 5px; } .template { - display: none; + display: none; } -#installed-plugins td>div { - position: relative;/* Allows us to position the loading indicator relative to this row */ - display: inline-block; /*make this fill the whole cell*/ - width:100%; +#installed-plugins td > div { + position: relative; /* Allows us to position the loading indicator relative to this row */ + display: inline-block; /*make this fill the whole cell*/ + width: 100%; } .messages { - height: 5em; + height: 5em; } + .messages * { - display: none; - text-align: center; + display: none; + text-align: center; } + .messages .fetching { - display: block; + display: block; } .progress { - position: absolute; - top: 0; left: 0; bottom:0; right:0; - padding: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + padding: auto; - background: rgb(255,255,255); - display: none; + background: rgb(255, 255, 255); + display: none; } #search-progress.progress { - padding-top: 20%; - background: rgba(255,255,255,0.3); + padding-top: 20%; + background: rgba(255, 255, 255, 0.3); } .progress * { - display: block; - margin: 0 auto; - text-align: center; - color: #666; + display: block; + margin: 0 auto; + text-align: center; + color: #666; } .settings-page { - display: flex; - flex-direction: column; - gap: 20px; - height: 100%; + display: flex; + flex-direction: column; + gap: 20px; + height: 100%; } .settings { - flex-grow: max(1, 1); - outline: none; - width: 100%; - resize: none; + flex-grow: max(1, 1); + outline: none; + width: 100%; + resize: none; + font-family: monospace; } #response { - display: inline; + display: inline; } a:link, a:visited, a:hover, a:focus { - color: #333333; - text-decoration: none; + color: #333333; + text-decoration: none; } a:focus, a:hover { - text-decoration: underline; + text-decoration: underline; } .installed-results a:link, @@ -285,519 +325,573 @@ a:focus, a:hover { .installed-results a:hover, .search-results a:hover, .installed-results a:focus, -.search-results a:focus { - text-decoration: underline; +.search-results a:focus { + text-decoration: underline; } .installed-results a:focus, .search-results a:focus, .installed-results a:hover, .search-results a:hover { - text-decoration: none; + text-decoration: none; } pre { - white-space: pre-wrap; - word-wrap: break-word; + white-space: pre-wrap; + word-wrap: break-word; +} + + +#icon-button { + color: var(--etherpad-color); + top: 10px; + background-color: transparent; + border: none; + z-index: 99; + position: absolute; + left: 10px; +} + + +.inner-menu span:nth-child(2) { + display: flex; + margin-top: 30px; +} + +#wrapper.closed .menu { + left: calc(-1 * var(--sidebar-width)); +} + +#wrapper.closed .innerwrapper { + margin-left: 0; } @media (max-width: 800px) { - div.innerwrapper { - padding: 0 15px 15px 15px; - } - div.menu { - padding: 1px 15px 0 15px; - position: static; - height: auto; - border-right: none; - width: auto; - float: left; - } + div.innerwrapper { + margin-left: 0; + } - table { - border: none; - } + .inner-menu { + border-radius: 0; + } - table, thead, tbody, td, tr { - display: block; - } + div.menu { + height: auto; + border-right: none; + --sidebar-width: 100%; + float: left; + } - thead tr { - display: none; - } + table { + border: none; + } - tr { - border: 1px solid #ccc; - margin-bottom: 5px; - border-radius: 3px; - } + table, thead, tbody, td, tr { + display: block; + } - td { - border: none; - border-bottom: 1px solid #eee; - position: relative; - padding-left: 50%; - white-space: normal; - text-align: left; - } + thead tr { + display: none; + } - td.name { - word-wrap: break-word; - } + tr { + border: 1px solid #ccc; + margin-bottom: 5px; + border-radius: 3px; + } - td:before { - position: absolute; - top: 6px; - left: 6px; - text-align: left; - padding-right: 10px; - white-space: nowrap; - font-weight: bold; - content: attr(data-label); - } + td { + border: none; + border-bottom: 1px solid #eee; + position: relative; + padding-left: 50%; + white-space: normal; + text-align: left; + } - td:last-child { - border-bottom: none; - } + td.name { + word-wrap: break-word; + } - table input[type="button"] { - float: none; - } + td:before { + position: absolute; + top: 6px; + left: 6px; + text-align: left; + padding-right: 10px; + white-space: nowrap; + font-weight: bold; + content: attr(data-label); + } + + td:last-child { + border-bottom: none; + } + + table input[type="button"] { + float: none; + } } .settings-button-bar { - margin-top: 10px; - display: flex; - gap: 10px; + margin-top: 10px; + display: flex; + gap: 10px; } .login-background { - background-image: url("/fond.jpg"); - background-repeat: no-repeat; - background-size: cover; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - background-color: #f0f0f0; + background-image: url("/fond.jpg"); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-color: #f0f0f0; } .login-inner-box div { - margin-top: 1rem; + margin-top: 1rem; } -.login-inner-box [type=submit]{ - margin-top: 2rem; +.login-inner-box [type=submit] { + margin-top: 2rem; } - .login-textinput { - width: 100%; - padding: 10px; - background-color: #fffacc; - border-radius: 5px; - border: 1px solid #ccc; - margin-bottom: 10px; + width: 100%; + padding: 10px; + background-color: #fffacc; + border-radius: 5px; + border: 1px solid #ccc; + margin-bottom: 10px; } .login-box { - width: 20%; - padding: 20px; - border-radius: 40px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - background-color: #fff; + padding: 20px; + border-radius: 40px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + background-color: #fff; } -.login-inner-box{ - position: relative; - padding: 20px; + +@media (max-width: 900px) { + .login-box { + width: 90% + } +} + +.login-inner-box { + position: relative; + padding: 20px; } .login-title { - padding: 0; - margin: 0; - text-align: center; - color: var(--etherpad-color); - font-size: 4rem; - font-weight: 1000; + padding: 0; + margin: 0; + text-align: center; + color: var(--etherpad-color); + font-size: 4rem; + font-weight: 1000; } .login-button { - padding: 10px; - background-color: var(--etherpad-color); - color: white; - border: none; - border-radius: 5px; - cursor: pointer; - width: 100%; - height: 40px; + padding: 10px; + background-color: var(--etherpad-color); + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + width: 100%; + height: 40px; } .dialog-overlay { - position: fixed; - inset: 0; - background-color: white; - z-index: 100; + position: fixed; + inset: 0; + background-color: white; + z-index: 100; } .dialog-confirm-overlay { - position: fixed; - inset: 0; - background-color: rgba(0, 0, 0, 0.5); - z-index: 100; + position: fixed; + inset: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 100; } .dialog-confirm-content { - position: fixed; - top: 50%; - left: 50%; - background-color: white; - transform: translate(-50%, -50%); - padding: 20px; - z-index: 101; + position: fixed; + top: 50%; + left: 50%; + background-color: white; + transform: translate(-50%, -50%); + padding: 20px; + z-index: 101; } .dialog-content { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - padding: 20px; - z-index: 101; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + padding: 20px; + z-index: 101; } .dialog-title { - color: var(--etherpad-color); - font-size: 2em; - margin-bottom: 20px; + color: var(--etherpad-color); + font-size: 2em; + margin-bottom: 20px; } - .ToastViewport { - position: fixed; - top: 10px; - right: 20px; - display: flex; - flex-direction: column; - gap: 10px; - width: 390px; - max-width: 100vw; - margin: 0; - list-style: none; - z-index: 2147483647; - outline: none; + position: fixed; + top: 10px; + right: 20px; + display: flex; + flex-direction: column; + gap: 10px; + width: 390px; + max-width: 100vw; + margin: 0; + list-style: none; + z-index: 2147483647; + outline: none; } .ToastRootSuccess { - background-color: lawngreen; + background-color: lawngreen; } .ToastRootFailure { - background-color: red; + background-color: red; } .ToastRootFailure > .ToastTitle { - color: white; + color: white; } .ToastRoot { - border-radius: 20px; - box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px; - padding: 15px; - display: grid; - grid-template-areas: 'title action' 'description action'; - grid-template-columns: auto max-content; - column-gap: 15px; - align-items: center; + border-radius: 20px; + box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px; + padding: 15px; + display: grid; + grid-template-areas: 'title action' 'description action'; + grid-template-columns: auto max-content; + column-gap: 15px; + align-items: center; } + .ToastRoot[data-state='open'] { - animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1); + animation: slideIn 150ms cubic-bezier(0.16, 1, 0.3, 1); } + .ToastRoot[data-state='closed'] { - animation: hide 100ms ease-in; + animation: hide 100ms ease-in; } + .ToastRoot[data-swipe='move'] { - transform: translateX(var(--radix-toast-swipe-move-x)); + transform: translateX(var(--radix-toast-swipe-move-x)); } + .ToastRoot[data-swipe='cancel'] { - transform: translateX(0); - transition: transform 200ms ease-out; + transform: translateX(0); + transition: transform 200ms ease-out; } + .ToastRoot[data-swipe='end'] { - animation: swipeOut 100ms ease-out; + animation: swipeOut 100ms ease-out; } @keyframes hide { - from { - opacity: 1; - } - to { - opacity: 0; - } + from { + opacity: 1; + } + to { + opacity: 0; + } } @keyframes slideIn { - from { - transform: translateX(calc(100% + var(--viewport-padding))); - } - to { - transform: translateX(0); - } + from { + transform: translateX(calc(100% + var(--viewport-padding))); + } + to { + transform: translateX(0); + } } @keyframes swipeOut { - from { - transform: translateX(var(--radix-toast-swipe-end-x)); - } - to { - transform: translateX(calc(100% + var(--viewport-padding))); - } + from { + transform: translateX(var(--radix-toast-swipe-end-x)); + } + to { + transform: translateX(calc(100% + var(--viewport-padding))); + } } .ToastTitle { - grid-area: title; - margin-bottom: 5px; - font-weight: 500; - color: var(--slate-12); - padding: 10px; - font-size: 15px; + grid-area: title; + margin-bottom: 5px; + font-weight: 500; + color: var(--slate-12); + padding: 10px; + font-size: 15px; } .ToastDescription { - grid-area: description; - margin: 0; - color: var(--slate-11); - font-size: 13px; - line-height: 1.3; + grid-area: description; + margin: 0; + color: var(--slate-11); + font-size: 13px; + line-height: 1.3; } .ToastAction { - grid-area: action; + grid-area: action; } .help-block { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 20px + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px } .search-field { - position: relative; + position: relative; } .search-field input { - border-color: transparent; - border-radius: 20px; - height: 2.5rem; - width: 100vh; - padding: 5px 5px 5px 30px; + border-color: transparent; + border-radius: 20px; + height: 2.5rem; + width: 100%; + padding: 5px 5px 5px 30px; } .search-field input:focus { - outline: none; + outline: none; } .send-message { - position: relative; + position: relative; } .send-message input { - width: auto; + width: auto; } .send-message { } .send-message svg { - position: absolute; - right: 3px; - bottom: -3px; - left: auto !important; + position: absolute; + right: 3px; + bottom: -3px; + left: auto !important; } .search-field svg { - position: absolute; - left: 3px; - bottom: -3px; + position: absolute; + left: 3px; + bottom: -3px; } .search-field svg { - color: gray + color: gray } table { - margin: 25px 0; - font-size: 0.9em; - font-family: sans-serif; - min-width: 400px; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); + margin: 25px 0; + font-size: 0.9em; + font-family: sans-serif; + min-width: 400px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); } th:first-child { - border-top-left-radius: 10px; + border-top-left-radius: 10px; } th:last-child { - border-top-right-radius: 10px; + border-top-right-radius: 10px; } table thead tr { - font-size: 25px; - background-color: var(--etherpad-color); - color: #ffffff; - text-align: left; + font-size: 25px; + background-color: var(--etherpad-color); + color: #ffffff; + text-align: left; } table tbody tr { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #dddddd; } table tr:nth-child(even) td { - background-color: lightgray; + background-color: lightgray; } table tr td { - padding: 12px 15px; + padding: 12px 15px; } table tbody tr:nth-of-type(even) { - background-color: #f3f3f3; + background-color: #f3f3f3; } table tbody tr:last-of-type { - border-bottom: 2px solid #009879; + border-bottom: 2px solid #009879; } table tbody tr.active-row { - font-weight: bold; - color: #009879; + font-weight: bold; + color: #009879; } -.pad-pagination{ - display: flex; - justify-content: center; - gap: 10px; - margin-top: 20px; +.pad-pagination { + display: flex; + justify-content: center; + gap: 10px; + margin-top: 20px; } .pad-pagination button { - display: flex; - padding: 10px 20px; - border-radius: 5px; - border: none; - color: black; - cursor: pointer; + display: flex; + padding: 10px 20px; + border-radius: 5px; + border: none; + color: black; + cursor: pointer; } .pad-pagination button:disabled { - background: transparent; - color: lightgrey; - cursor: not-allowed; + background: transparent; + color: lightgrey; + cursor: not-allowed; } .pad-pagination span { - align-self: center; + align-self: center; } -.pad-pagination >span { - font-size: 20px; +.pad-pagination > span { + font-size: 20px; } .login-page .login-form .input-control input[type=text], .login-page .login-form .input-control input[type=email], .login-page .login-form .input-control input[type=password], .login-page .signup-form .input-control input[type=text], .login-page .signup-form .input-control input[type=email], .login-page .signup-form .input-control input[type=password], .login-page .forgot-form .input-control input[type=text], .login-page .forgot-form .input-control input[type=email], .login-page .forgot-form .input-control input[type=password] { - width: 100%; - padding: 12px 20px; - margin: 8px 0; - display: inline-block; - border-bottom: 2px solid #ccc; - border-top: 0; - border-left: 0; - border-right: 0; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border-radius: 5px; - font-size: 14px; - color: #666; - background-color: #f8f8f8; - -webkit-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: inline-block; + border-bottom: 2px solid #ccc; + border-top: 0; + border-left: 0; + border-right: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 5px; + font-size: 14px; + color: #666; + background-color: #f8f8f8; + -webkit-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; } input, button, select, optgroup, textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; } .icon-input { - position: relative; + position: relative; } .icon-input svg { - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 10px; - color: #666; + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10px; + color: #666; } .SwitchRoot { - align-self: center; - width: 60px; - height: 30px; - background-color: black; - border-radius: 9999px; - position: relative; - box-shadow: 0 2px 10px var(--black-a7); - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + align-self: center; + width: 60px; + height: 30px; + background-color: black; + border-radius: 9999px; + position: relative; + box-shadow: 0 2px 10px var(--black-a7); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .SwitchRoot:focus { - box-shadow: 0 0 0 2px black; + box-shadow: 0 0 0 2px black; } + .SwitchRoot[data-state='checked'] { - background-color: var(--etherpad-color); + background-color: var(--etherpad-color); } .SwitchThumb { - display: block; - width: 20px; - height: 20px; - background-color: white; - border-radius: 9999px; - box-shadow: 0 2px 2px var(--black-a7); - transition: transform 100ms; - transform: translateX(2px); - will-change: transform; + display: block; + width: 20px; + height: 20px; + background-color: white; + border-radius: 9999px; + box-shadow: 0 2px 2px var(--black-a7); + transition: transform 100ms; + transform: translateX(2px); + will-change: transform; } + .SwitchThumb[data-state='checked'] { - transform: translateX(25px); + transform: translateX(25px); } .Label { - color: white; - font-size: 15px; - line-height: 1; + color: white; + font-size: 15px; + line-height: 1; } .message { - position: relative; - padding: 10px; - border: 1px solid #e0e0e0; - margin: 10px 20px 10px 10px; - border-radius: 10px 0 10px 10px; - background-color: var(--etherpad-color); - color: white + position: relative; + padding: 10px; + border: 1px solid #e0e0e0; + margin: 10px 20px 10px 10px; + border-radius: 10px 0 10px 10px; + background-color: var(--etherpad-color); + color: white +} + +.search-pads { + text-align: center; +} + +.search-pads-body tr td:last-child { + display: flex; + justify-content: center; +} + +.manage-pads-header { + display: flex; } diff --git a/admin/src/pages/HomePage.tsx b/admin/src/pages/HomePage.tsx index 889432487..f5ce0a5ab 100644 --- a/admin/src/pages/HomePage.tsx +++ b/admin/src/pages/HomePage.tsx @@ -4,16 +4,54 @@ import {InstalledPlugin, PluginDef, SearchParams} from "./Plugin.ts"; import {useDebounce} from "../utils/useDebounce.ts"; import {Trans, useTranslation} from "react-i18next"; import {SearchField} from "../components/SearchField.tsx"; -import {Download, Trash} from "lucide-react"; +import {ArrowUpFromDot, Download, Trash} from "lucide-react"; import {IconButton} from "../components/IconButton.tsx"; +import {determineSorting} from "../utils/sorting.ts"; export const HomePage = () => { const pluginsSocket = useStore(state=>state.pluginsSocket) const [plugins,setPlugins] = useState([]) - const [installedPlugins, setInstalledPlugins] = useState([]) + const installedPlugins = useStore(state=>state.installedPlugins) + const setInstalledPlugins = useStore(state=>state.setInstalledPlugins) + const [searchParams, setSearchParams] = useState({ + offset: 0, + limit: 99999, + sortBy: 'name', + sortDir: 'asc', + searchTerm: '' + }) + + const filteredInstallablePlugins = useMemo(()=>{ + return plugins.sort((a, b)=>{ + if(searchParams.sortBy === "version"){ + if(searchParams.sortDir === "asc"){ + return a.version.localeCompare(b.version) + } + return b.version.localeCompare(a.version) + } + + if(searchParams.sortBy === "last-updated"){ + if(searchParams.sortDir === "asc"){ + return a.time.localeCompare(b.time) + } + return b.time.localeCompare(a.time) + } + + + if (searchParams.sortBy === "name") { + if(searchParams.sortDir === "asc"){ + return a.name.localeCompare(b.name) + } + return b.name.localeCompare(a.name) + } + return 0 + }) + }, [plugins, searchParams]) + const sortedInstalledPlugins = useMemo(()=>{ - return installedPlugins.sort((a, b)=>{ + return useStore.getState().installedPlugins.sort((a, b)=>{ + if(a.name < b.name){ return -1 } @@ -23,14 +61,8 @@ export const HomePage = () => { return 0 }) - } ,[installedPlugins]) - const [searchParams, setSearchParams] = useState({ - offset: 0, - limit: 99999, - sortBy: 'name', - sortDir: 'asc', - searchTerm: '' - }) + } ,[installedPlugins, searchParams]) + const [searchTerm, setSearchTerm] = useState('') const {t} = useTranslation() @@ -47,17 +79,16 @@ export const HomePage = () => { }) pluginsSocket.on('results:updatable', (data) => { - data.updatable.forEach((pluginName: string) => { - setInstalledPlugins(installedPlugins.map(plugin => { - if (plugin.name === pluginName) { - return { - ...plugin, - updatable: true - } - } - return plugin - })) - }) + const newInstalledPlugins = useStore.getState().installedPlugins.map(plugin => { + if (data.updatable.includes(plugin.name)) { + return { + ...plugin, + updatable: true + } + } + return plugin + }) + setInstalledPlugins(newInstalledPlugins) }) pluginsSocket.on('finished:install', () => { @@ -93,25 +124,20 @@ export const HomePage = () => { if (!pluginsSocket) { return } - pluginsSocket?.emit('search', searchParams) - - pluginsSocket!.on('results:search', (data: { results: PluginDef[] }) => { - if (Array.isArray(data.results) && data.results.length > 0) { - setPlugins(data.results) - } else { - useStore.getState().setToastState({ - open: true, - title: "Error retrieving plugins", - success: false - }) - } + setPlugins(data.results) + }) + pluginsSocket!.on('results:searcherror', (data: {error: string}) => { + console.log(data.error) + useStore.getState().setToastState({ + open: true, + title: "Error retrieving plugins", + success: false + }) }) - - }, [searchParams, pluginsSocket]); const uninstallPlugin = (pluginName: string)=>{ @@ -125,7 +151,6 @@ export const HomePage = () => { setPlugins(plugins.filter(plugin=>plugin.name !== pluginName)) } - useDebounce(()=>{ setSearchParams({ ...searchParams, @@ -134,6 +159,7 @@ export const HomePage = () => { }) }, 500, [searchTerm]) + return

@@ -155,42 +181,67 @@ export const HomePage = () => { { plugin.updatable ? - + installPlugin(plugin.name)} icon={} title="Update"> : } title={} onClick={() => uninstallPlugin(plugin.name)}/> } })} - - + + -

- {setSearchTerm(v.target.value)}} placeholder={t('admin_plugins.available_search.placeholder')} value={searchTerm}/> +

+ {setSearchTerm(v.target.value)}} placeholder={t('admin_plugins.available_search.placeholder')} value={searchTerm}/> +
- + - - + + - {plugins.map((plugin) => { - return - - - - - - - })} + {(filteredInstallablePlugins.length > 0) ? + filteredInstallablePlugins.map((plugin) => { + return + + + + + + + }) + : + + }
{ + setSearchParams({ + ...searchParams, + sortBy: 'name', + sortDir: searchParams.sortDir === "asc"? "desc": "asc" + }) + }}> + { + setSearchParams({ + ...searchParams, + sortBy: 'version', + sortDir: searchParams.sortDir === "asc"? "desc": "asc" + }) + }}>{ + setSearchParams({ + ...searchParams, + sortBy: 'last-updated', + sortDir: searchParams.sortDir === "asc"? "desc": "asc" + }) + }}>
{plugin.name}{plugin.description}{plugin.version}{plugin.time} - } onClick={() => installPlugin(plugin.name)} title={}/> -
{plugin.name}{plugin.description}{plugin.version}{plugin.time} + } onClick={() => installPlugin(plugin.name)} title={}/> +
{searchTerm == '' ? : }
+
} diff --git a/admin/src/pages/PadPage.tsx b/admin/src/pages/PadPage.tsx index b5f2128bf..bfcbb9a14 100644 --- a/admin/src/pages/PadPage.tsx +++ b/admin/src/pages/PadPage.tsx @@ -6,8 +6,13 @@ import {useDebounce} from "../utils/useDebounce.ts"; import {determineSorting} from "../utils/sorting.ts"; import * as Dialog from "@radix-ui/react-dialog"; import {IconButton} from "../components/IconButton.tsx"; -import {ChevronLeft, ChevronRight, Eye, Trash2} from "lucide-react"; +import {ChevronLeft, ChevronRight, Eye, Trash2, FileStack, PlusIcon} from "lucide-react"; import {SearchField} from "../components/SearchField.tsx"; +import {useForm} from "react-hook-form"; + +type PadCreateProps = { + padName: string +} export const PadPage = ()=>{ const settingsSocket = useStore(state=>state.settingsSocket) @@ -23,10 +28,13 @@ export const PadPage = ()=>{ const pads = useStore(state=>state.pads) const [currentPage, setCurrentPage] = useState(0) const [deleteDialog, setDeleteDialog] = useState(false) + const [errorText, setErrorText] = useState(null) const [padToDelete, setPadToDelete] = useState('') + const [createPadDialogOpen, setCreatePadDialogOpen] = useState(false) + const {register, handleSubmit} = useForm() const pages = useMemo(()=>{ if(!pads){ - return [0] + return 0; } return Math.ceil(pads!.total / searchParams.limit) @@ -68,12 +76,66 @@ export const PadPage = ()=>{ results: newPads }) }) + + type SettingsSocketCreateReponse = { + error: string + } | { + success: string + } + + settingsSocket.on('results:createPad', (rep: SettingsSocketCreateReponse)=>{ + if ('error' in rep) { + useStore.getState().setToastState({ + open: true, + title: rep.error, + success: false + }) + } else { + useStore.getState().setToastState({ + open: true, + title: rep.success, + success: true + }) + setCreatePadDialogOpen(false) + // reload pads + settingsSocket.emit('padLoad', searchParams) + } + }) + + settingsSocket.on('results:cleanupPadRevisions', (data)=>{ + const newPads = useStore.getState().pads?.results ?? [] + + if (data.error) { + setErrorText(data.error) + return + } + + newPads.forEach((pad)=>{ + if (pad.padName === data.padId) { + pad.revisionNumber = data.keepRevisions + } + }) + + useStore.getState().setPads({ + results: newPads, + total: useStore.getState().pads!.total + }) + }) }, [settingsSocket, pads]); const deletePad = (padID: string)=>{ settingsSocket?.emit('deletePad', padID) } + const cleanupPad = (padID: string)=>{ + settingsSocket?.emit('cleanupPadRevisions', padID) + } + + const onPadCreate = (data: PadCreateProps)=>{ + settingsSocket?.emit('createPad', { + padName: data.padName + }) + } return
@@ -100,11 +162,51 @@ export const PadPage = ()=>{ -

+ + + + +
+
Error occured: {errorText}
+
+ +
+
+
+
+
+ + + + + +
+ +
+ + +
+ +
+
+
+
+ +

+ } title={} onClick={()=>{ + setCreatePadDialogOpen(true) + }}/> +
setSearchTerm(v.target.value)} placeholder={t('ep_admin_pads:ep_adminpads2_search-heading')}/> - + - + - + { pads?.results?.map((pad)=>{ return @@ -150,7 +252,10 @@ export const PadPage = ()=>{ setPadToDelete(pad.padName) setDeleteDialog(true) }}/> - } title="view" onClick={()=>window.open(`/p/${pad.padName}`, '_blank')}/> + } title={} onClick={()=>{ + cleanupPad(pad.padName) + }}/> + } title={} onClick={()=>window.open(`../../p/${pad.padName}`, '_blank')}/> @@ -166,11 +271,12 @@ export const PadPage = ()=>{ offset: (Number(currentPage)-1)*searchParams.limit}) }}>Previous Page {currentPage+1} out of {pages} - diff --git a/admin/src/pages/Plugin.ts b/admin/src/pages/Plugin.ts index 3188c247f..f5563863b 100644 --- a/admin/src/pages/Plugin.ts +++ b/admin/src/pages/Plugin.ts @@ -20,7 +20,7 @@ export type SearchParams = { searchTerm: string, offset: number, limit: number, - sortBy: 'name'|'version', + sortBy: 'name'|'version'|'last-updated', sortDir: 'asc'|'desc' } diff --git a/admin/src/pages/SettingsPage.tsx b/admin/src/pages/SettingsPage.tsx index 94d7d25ad..d17869573 100644 --- a/admin/src/pages/SettingsPage.tsx +++ b/admin/src/pages/SettingsPage.tsx @@ -1,12 +1,12 @@ import {useStore} from "../store/store.ts"; -import {isJSONClean} from "../utils/utils.ts"; +import {isJSONClean, cleanComments} from "../utils/utils.ts"; import {Trans} from "react-i18next"; import {IconButton} from "../components/IconButton.tsx"; import {RotateCw, Save} from "lucide-react"; export const SettingsPage = ()=>{ const settingsSocket = useStore(state=>state.settingsSocket) - const settings = useStore(state=>state.settings) + const settings = cleanComments(useStore(state=>state.settings)) return

@@ -21,7 +21,7 @@ export const SettingsPage = ()=>{ settingsSocket!.emit('saveSettings', settings!); useStore.getState().setToastState({ open: true, - title: "Succesfully saved settings", + title: "Successfully saved settings", success: true }) } else { diff --git a/admin/src/pages/ShoutPage.tsx b/admin/src/pages/ShoutPage.tsx index 8348e18fa..a20aa0ae7 100644 --- a/admin/src/pages/ShoutPage.tsx +++ b/admin/src/pages/ShoutPage.tsx @@ -9,22 +9,28 @@ export const ShoutPage = ()=>{ const [message, setMessage] = useState(""); const [sticky, setSticky] = useState(false); const socket = useStore(state => state.settingsSocket); + const pluginSocket = useStore(state => state.pluginsSocket); const [shouts, setShouts] = useState([]); - useEffect(() => { - fetch('/stats') - .then(response => response.json()) - .then(data => setTotalUsers(data.totalUsers)); - }, []); - useEffect(() => { - if(socket) { + if(socket && pluginSocket) { + console.log('Socket connected', socket.id); socket.on('shout', (shout) => { setShouts([...shouts, shout]) }) + pluginSocket.on('results:stats', (statData) => { + setTotalUsers(statData.totalUsers); + }) } - }, [socket, shouts]) + }, [socket, shouts, pluginSocket]) + + + useEffect(() => { + if (pluginSocket) { + pluginSocket.emit('getStats', {}); + } + }, [pluginSocket]); const sendMessage = () => { socket?.emit('shout', { diff --git a/admin/src/store/store.ts b/admin/src/store/store.ts index d662dfdf3..d4cbe7786 100644 --- a/admin/src/store/store.ts +++ b/admin/src/store/store.ts @@ -1,6 +1,7 @@ import {create} from "zustand"; import {Socket} from "socket.io-client"; import {PadSearchResult} from "../utils/PadSearch.ts"; +import {InstalledPlugin} from "../pages/Plugin.ts"; type ToastState = { description?:string, @@ -22,7 +23,9 @@ type StoreState = { toastState: ToastState, setToastState: (val: ToastState)=>void, pads: PadSearchResult|undefined, - setPads: (pads: PadSearchResult)=>void + setPads: (pads: PadSearchResult)=>void, + installedPlugins: InstalledPlugin[], + setInstalledPlugins: (plugins: InstalledPlugin[])=>void } @@ -43,5 +46,7 @@ export const useStore = create()((set) => ({ success: false }, pads: undefined, - setPads: (pads)=>set({pads}) + setPads: (pads)=>set({pads}), + installedPlugins: [], + setInstalledPlugins: (plugins)=>set({installedPlugins: plugins}) })); diff --git a/admin/src/utils/LoadingScreen.tsx b/admin/src/utils/LoadingScreen.tsx index b3ea51e13..30743fde1 100644 --- a/admin/src/utils/LoadingScreen.tsx +++ b/admin/src/utils/LoadingScreen.tsx @@ -1,6 +1,7 @@ import {useStore} from "../store/store.ts"; import * as Dialog from '@radix-ui/react-dialog'; -import ReactComponent from './brand.svg?react'; +import brand from './brand.svg' + export const LoadingScreen = ()=>{ const showLoading = useStore(state => state.showLoading) @@ -10,7 +11,7 @@ export const LoadingScreen = ()=>{
- +
diff --git a/admin/src/utils/utils.ts b/admin/src/utils/utils.ts index 2e8f52a05..960de455f 100644 --- a/admin/src/utils/utils.ts +++ b/admin/src/utils/utils.ts @@ -1,5 +1,14 @@ -const minify = (json: string)=>{ +export const cleanComments = (json: string|undefined)=>{ + if (json !== undefined){ + json = json.replace(/\/\*.*?\*\//g, ""); // remove single line comments + json = json.replace(/ *\/\*.*(.|\n)*?\*\//g, ""); // remove multi line comments + json = json.replace(/[ \t]+$/gm, ""); // trim trailing spaces + json = json.replace(/^(\n)/gm, ""); // remove empty lines + } + return json; +} +export const minify = (json: string)=>{ let tokenizer = /"|(\/\*)|(\*\/)|(\/\/)|\n|\r/g, in_string = false, in_multiline_comment = false, @@ -49,9 +58,6 @@ const minify = (json: string)=>{ return new_str.join(""); } - - - export const isJSONClean = (data: string) => { let cleanSettings = minify(data); // this is a bit naive. In theory some key/value might contain the sequences ',]' or ',}' diff --git a/admin/vite.config.ts b/admin/vite.config.ts index 23921ca85..ebe4d949d 100644 --- a/admin/vite.config.ts +++ b/admin/vite.config.ts @@ -1,18 +1,20 @@ import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc' -import svgr from 'vite-plugin-svgr' import {viteStaticCopy} from "vite-plugin-static-copy"; +import react from '@vitejs/plugin-react'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), svgr(), viteStaticCopy({ + plugins: [viteStaticCopy({ targets: [ { src: '../src/locales', dest: '' } ] - })], + }), react({ + babel: { + plugins: ['babel-plugin-react-compiler'], + }})], base: '/admin', build:{ outDir: '../src/templates/admin', @@ -28,10 +30,6 @@ export default defineConfig({ '/admin-auth/': { target: 'http://localhost:9001', changeOrigin: true, - }, - '/stats': { - target: 'http://localhost:9001', - changeOrigin: true, } } } diff --git a/bin/buildForWindows.sh b/bin/buildForWindows.sh index 67f4eeae1..99a9fcf2f 100755 --- a/bin/buildForWindows.sh +++ b/bin/buildForWindows.sh @@ -50,21 +50,13 @@ rm -rf src/node_modules || true #$(try cd ./bin/installDeps.sh) # Install admin frontend -cd admin try pnpm install -try pnpm run build -cd .. - - - +try pnpm run build:etherpad # Nuke the admin folder as it is not needed anymore :D rm -rf admin - -export NODE_ENV=production -try pnpm install --production - - +rm -rf oidc +rm -rf src/node_modules log "copy the windows settings template..." try cp settings.json.template settings.json diff --git a/bin/checkAllPads.ts b/bin/checkAllPads.ts index a967413d1..305afabab 100644 --- a/bin/checkAllPads.ts +++ b/bin/checkAllPads.ts @@ -25,4 +25,5 @@ if (process.argv.length !== 2) throw new Error('Use: node bin/checkAllPads.js'); console.log(`Pad ${padId}: OK`); })); console.log('Finished.'); + process.exit(0) })(); diff --git a/bin/checkPad.ts b/bin/checkPad.ts index 09f3d30c5..a35e08ea7 100644 --- a/bin/checkPad.ts +++ b/bin/checkPad.ts @@ -11,12 +11,19 @@ process.on('unhandledRejection', (err) => { throw err; }); if (process.argv.length !== 3) throw new Error('Use: node bin/checkPad.js $PADID'); // @ts-ignore const padId = process.argv[2]; -(async () => { + +const performCheck = async () => { const db = require('ep_etherpad-lite/node/db/DB'); await db.init(); + console.log("Checking if " + padId + " exists") const padManager = require('ep_etherpad-lite/node/db/PadManager'); if (!await padManager.doesPadExists(padId)) throw new Error('Pad does not exist'); const pad = await padManager.getPad(padId); await pad.check(); - console.log('Finished.'); -})(); + console.log('Finished checking pad.'); + process.exit(0) +} + +performCheck() + .then(e=>console.log("Finished")) + .catch(e=>console.log("Finished with errors")) diff --git a/bin/commonPlugins.ts b/bin/commonPlugins.ts new file mode 100644 index 000000000..7fc5fc1ad --- /dev/null +++ b/bin/commonPlugins.ts @@ -0,0 +1,17 @@ +import {PackageData} from "ep_etherpad-lite/node/types/PackageInfo"; +import {writeFileSync} from "fs"; +import {installedPluginsPath} from "ep_etherpad-lite/static/js/pluginfw/installer"; +const pluginsModule = require('ep_etherpad-lite/static/js/pluginfw/plugins'); + +export const persistInstalledPlugins = async () => { + const plugins:PackageData[] = [] + const installedPlugins = {plugins: plugins}; + for (const pkg of Object.values(await pluginsModule.getPackages()) as PackageData[]) { + installedPlugins.plugins.push({ + name: pkg.name, + version: pkg.version, + }); + } + installedPlugins.plugins = [...new Set(installedPlugins.plugins)]; + writeFileSync(installedPluginsPath, JSON.stringify(installedPlugins)); +}; diff --git a/bin/createUserSession.ts b/bin/createUserSession.ts index 1dbab0d69..095cebb0e 100644 --- a/bin/createUserSession.ts +++ b/bin/createUserSession.ts @@ -14,10 +14,11 @@ import path from "node:path"; import querystring from "node:querystring"; import axios from 'axios' +import process from "node:process"; process.on('unhandledRejection', (err) => { throw err; }); -const settings = require('ep_etherpad-lite/node/utils/Settings'); +import settings from 'ep_etherpad-lite/node/utils/Settings'; (async () => { axios.defaults.baseURL = `http://${settings.ip}:${settings.port}`; const api = axios; @@ -53,4 +54,5 @@ const settings = require('ep_etherpad-lite/node/utils/Settings'); if (res.data.code === 1) throw new Error(`Error creating session: ${JSON.stringify(res.data)}`); console.log('Session made: ====> create a cookie named sessionID and set the value to', res.data.data.sessionID); + process.exit(0) })(); diff --git a/bin/deleteAllGroupSessions.ts b/bin/deleteAllGroupSessions.ts index 23d21c594..6064757ec 100644 --- a/bin/deleteAllGroupSessions.ts +++ b/bin/deleteAllGroupSessions.ts @@ -49,4 +49,5 @@ const settings = require('ep_etherpad-lite/tests/container/loadSettings').loadSe } } console.log(`Deleted ${deleteCount} sessions`); + process.exit(0) })(); diff --git a/bin/deletePad.ts b/bin/deletePad.ts index 20037bb33..2f6009158 100644 --- a/bin/deletePad.ts +++ b/bin/deletePad.ts @@ -38,4 +38,5 @@ const apikey = fs.readFileSync(filePath, {encoding: 'utf-8'}); const deleteAttempt = await axios.post(uri); if (deleteAttempt.data.code === 1) throw new Error(`Error deleting pad ${deleteAttempt.data}`); console.log('Deleted pad', deleteAttempt.data); + process.exit(0) })(); diff --git a/bin/extractPadData.ts b/bin/extractPadData.ts index 3c10a3acc..466b31b89 100644 --- a/bin/extractPadData.ts +++ b/bin/extractPadData.ts @@ -60,4 +60,5 @@ const padId = process.argv[2]; } console.log('finished'); + process.exit(0) })(); diff --git a/bin/fastRun.sh b/bin/fastRun.sh index b18469edb..b67e723f6 100755 --- a/bin/fastRun.sh +++ b/bin/fastRun.sh @@ -19,4 +19,4 @@ cd "${MY_DIR}/.." || exit 1 echo "Running directly, without checking/installing dependencies" # run Etherpad main class -exec node --import tsx src/node/server.ts "$@" +exec pnpm run prod "$@" diff --git a/bin/generateReleaseNotes.ts b/bin/generateReleaseNotes.ts new file mode 100644 index 000000000..b3203c8af --- /dev/null +++ b/bin/generateReleaseNotes.ts @@ -0,0 +1,39 @@ +import {readFileSync} from "node:fs"; + +const changelog = readFileSync('../CHANGELOG.md') +const changelogText = changelog.toString() +const changelogLines = changelogText.split('\n') + + +let cliArgs = process.argv.slice(2) + +let tagVar = cliArgs[0] + +if (!tagVar) { + console.error("No tag provided") + process.exit(1) +} + +tagVar = tagVar.replace("refs/tags/v", "") + +let startNum = -1 +let endline = 0 + +let counter = 0 +for (const line of changelogLines) { + if (line.trim().startsWith("#") && (line.match(new RegExp("#", "g"))||[]).length === 1) { + if (startNum !== -1) { + endline = counter-1 + break + } + + const sanitizedLine = line.replace("#","").trim() + if(sanitizedLine.includes(tagVar)) { + startNum = counter + } + } + counter++ +} + +let currentReleaseNotes = changelogLines.slice(startNum, endline).join('\n') +console.log(currentReleaseNotes) diff --git a/bin/importSqlFile.ts b/bin/importSqlFile.ts index 23ad9b7d1..6c501fc72 100644 --- a/bin/importSqlFile.ts +++ b/bin/importSqlFile.ts @@ -3,12 +3,13 @@ // As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an // unhandled rejection into an uncaught exception, which does cause Node.js to exit. import util from "node:util"; -const fs = require('fs'); +import fs from 'node:fs'; import log4js from 'log4js'; import readline from 'readline'; -import ueberDB from "ueberdb2"; +import {Database, DatabaseType} from "ueberdb2"; +import process from "node:process"; -const settings = require('ep_etherpad-lite/node/utils/Settings'); +import settings from 'ep_etherpad-lite/node/utils/Settings'; process.on('unhandledRejection', (err) => { throw err; }); const startTime = Date.now(); @@ -56,8 +57,8 @@ const unescape = (val: string) => { writeInterval: 100, json: false, // data is already json encoded }; - const db = new ueberDB.Database( // eslint-disable-line new-cap - settings.dbType, + const db = new Database( // eslint-disable-line new-cap + settings.dbType as DatabaseType, settings.dbSettings, dbWrapperSettings, log4js.getLogger('ueberDB')); @@ -96,6 +97,8 @@ const unescape = (val: string) => { 'depended on dbms this may take some time..\n'); const closeDB = util.promisify(db.close.bind(db)); + // @ts-ignore await closeDB(null); log(`finished, imported ${keyNo} keys.`); + process.exit(0) })(); diff --git a/bin/installLocalPlugins.sh b/bin/installLocalPlugins.sh new file mode 100755 index 000000000..15442e646 --- /dev/null +++ b/bin/installLocalPlugins.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +trim() { + local var="$*" + # remove leading whitespace characters + var="${var#"${var%%[![:space:]]*}"}" + # remove trailing whitespace characters + var="${var%"${var##*[![:space:]]}"}" + printf '%s' "$var" +} + +# Move to the Etherpad base directory. +MY_DIR=$(cd "${0%/*}" && pwd -P) || exit 1 +cd "${MY_DIR}/.." || exit 1 + +# Source constants and useful functions +. bin/functions.sh + +PNPM_OPTIONS= +if [ ! -z "${NODE_ENV-}" ]; then + if [ "$NODE_ENV" == 'production' ]; then + PNPM_OPTIONS='--prod' + fi +fi + +if [ ! -z "${ETHERPAD_LOCAL_PLUGINS_ENV-}" ]; then + if [ "$ETHERPAD_LOCAL_PLUGINS_ENV" == 'production' ]; then + PNPM_OPTIONS='--prod' + elif [ "$ETHERPAD_LOCAL_PLUGINS_ENV" == 'development' ]; then + PNPM_OPTIONS='-D' + fi +fi + +if [ ! -z "${ETHERPAD_LOCAL_PLUGINS}" ]; then + readarray -d ' ' plugins <<< "${ETHERPAD_LOCAL_PLUGINS}" + for plugin in "${plugins[@]}"; do + plugin=$(trim "$plugin") + if [ -d "local_plugins/${plugin}" ]; then + echo "Installing plugin: '${plugin}'" + pnpm install -w ${PNPM_OPTIONS:-} "local_plugins/${plugin}/" + else + ( echo "Error. Directory 'local_plugins/${plugin}' for local plugin " \ + "'${plugin}' missing" >&2 ) + exit 1 + fi + done +else + echo 'No local plugings to install.' +fi diff --git a/bin/installPlugins.ts b/bin/installPlugins.ts deleted file mode 100644 index 85ae0b6b4..000000000 --- a/bin/installPlugins.ts +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -import {writeFileSync} from 'fs' -import {linkInstaller, installedPluginsPath} from "ep_etherpad-lite/static/js/pluginfw/installer"; -import {PackageData} from "ep_etherpad-lite/node/types/PackageInfo"; - -const pluginsModule = require('ep_etherpad-lite/static/js/pluginfw/plugins'); -if (process.argv.length === 2) { - console.error('Expected at least one argument!'); - process.exit(1); -} - -let args = process.argv.slice(2) - -let registryPlugins: string[] = []; -let localPlugins: string[] = []; - -if (args.indexOf('--path') !== -1) { - const indexToSplit = args.indexOf('--path'); - registryPlugins = args.slice(0, indexToSplit); - localPlugins = args.slice(indexToSplit + 1); -} else { - registryPlugins = args; -} - -const persistInstalledPlugins = async () => { - const plugins:PackageData[] = [] - const installedPlugins = {plugins: plugins}; - for (const pkg of Object.values(await pluginsModule.getPackages()) as PackageData[]) { - installedPlugins.plugins.push({ - name: pkg.name, - version: pkg.version, - }); - } - installedPlugins.plugins = [...new Set(installedPlugins.plugins)]; - writeFileSync(installedPluginsPath, JSON.stringify(installedPlugins)); -}; - -async function run() { - for (const plugin of registryPlugins) { - console.log(`Installing plugin from registry: ${plugin}`) - if (plugin.includes('@')) { - const [name, version] = plugin.split('@'); - await linkInstaller.installPlugin(name, version); - continue; - } - await linkInstaller.installPlugin(plugin); - } - - for (const plugin of localPlugins) { - console.log(`Installing plugin from path: ${plugin}`); - await linkInstaller.installFromPath(plugin); - } -} - -(async () => { - await run(); - await persistInstalledPlugins(); -})(); diff --git a/bin/make_docs.ts b/bin/make_docs.ts new file mode 100644 index 000000000..d4abfc97d --- /dev/null +++ b/bin/make_docs.ts @@ -0,0 +1,63 @@ +import {exec} from 'child_process' +import fs from 'fs' +import path from 'path' + +import pjson from '../src/package.json' + +const VERSION=pjson.version +console.log(`Building docs for version ${VERSION}`) + +const createDirIfNotExists = (dir: fs.PathLike) => { + if (!fs.existsSync(dir)){ + fs.mkdirSync(dir) + } +} + + +function copyFolderSync(from: fs.PathLike, to: fs.PathLike) { + if(fs.existsSync(to)){ + const stat = fs.lstatSync(to) + if (stat.isDirectory()){ + fs.rmSync(to, { recursive: true }) + } + else{ + fs.rmSync(to) + } + } + fs.mkdirSync(to); + fs.readdirSync(from).forEach(element => { + if (fs.lstatSync(path.join(from, element)).isFile()) { + if (typeof from === "string") { + if (typeof to === "string") { + fs.copyFileSync(path.join(from, element), path.join(to, element)) + } + } + } else { + if (typeof from === "string") { + if (typeof to === "string") { + copyFolderSync(path.join(from, element), path.join(to, element)) + } + } + } + }); +} + +exec('asciidoctor -v', (err,stdout)=>{ + if (err){ + console.log('Please install asciidoctor') + console.log('https://asciidoctor.org/docs/install-toolchain/') + process.exit(1) + } +}); + + +createDirIfNotExists('../out') +createDirIfNotExists('../out/doc') +createDirIfNotExists('../out/doc/api') + + + +exec(`asciidoctor -D ../out/doc ../doc/index.adoc ../*/**.adoc -a VERSION=${VERSION}`) +exec(`asciidoctor -D ../out/doc/api ../doc/api/*.adoc -a VERSION=${VERSION}`) + +copyFolderSync('../doc/public/', '../out/doc/') diff --git a/bin/migrateDB.ts b/bin/migrateDB.ts new file mode 100644 index 000000000..dcedf71a1 --- /dev/null +++ b/bin/migrateDB.ts @@ -0,0 +1,83 @@ +// DB migration +import {readFileSync} from 'node:fs' +import {Database, DatabaseType} from "ueberdb2"; +import path from "node:path"; +import settings from 'ep_etherpad-lite/node/utils/Settings'; + + +// file1 = source, file2 = target +// pnpm run --filter bin migrateDB --file1 --file2 +const arg = process.argv.slice(2); + +if (arg.length != 4) { + console.error('Wrong number of arguments!. Call with pnpm run --filter bin migrateDB --file1 source.json target.json') + process.exit(1) +} + +type SettingsConfig = { + dbType: string, + dbSettings: any +} + +/* + { + "dbType": "", + "dbSettings": { + + } + } + */ + +let firstDBSettingsFile: string +let secondDBSettingsFile: string + + +if (arg[0] == "--file1") { + firstDBSettingsFile = arg[1] +} else if (arg[0] === "--file2") { + secondDBSettingsFile = arg[1] +} + +if (arg[2] == "--file1") { + firstDBSettingsFile = arg[3] +} else if (arg[2] === "--file2") { + secondDBSettingsFile = arg[3] +} + + + +const settingsfile = JSON.parse(readFileSync(path.join(settings.root,firstDBSettingsFile!)).toString()) as SettingsConfig +const settingsfile2 = JSON.parse(readFileSync(path.join(settings.root,secondDBSettingsFile!)).toString()) as SettingsConfig + +console.log(settingsfile2) +if ("filename" in settingsfile.dbSettings) { + settingsfile.dbSettings.filename = path.join(settings.root, settingsfile.dbSettings.filename) + console.log(settingsfile.dbType + " location is "+ settingsfile.dbSettings.filename) +} + +if ("filename" in settingsfile2.dbSettings) { + settingsfile2.dbSettings.filename = path.join(settings.root, settingsfile2.dbSettings.filename) + console.log(settingsfile2.dbType + " location is "+ settingsfile2.dbSettings.filename) +} + +const ueberdb1 = new Database(settingsfile.dbType as DatabaseType, settingsfile.dbSettings) +const ueberdb2 = new Database(settingsfile2.dbType as DatabaseType, settingsfile2.dbSettings) + +const handleSync = async ()=>{ + await ueberdb1.init() + await ueberdb2.init() + + const allKeys = await ueberdb1.findKeys('*','') + for (const key of allKeys) { + const foundVal = await ueberdb1.get(key)! + await ueberdb2.set(key, foundVal) + } +} + +handleSync().then(()=>{ + console.log("Done syncing dbs") +}).catch(e=>{ + console.log(`Error syncing db ${e}`) +}) + + diff --git a/bin/migrateDirtyDBtoRealDB.ts b/bin/migrateDirtyDBtoRealDB.ts index 144f6e88c..8bb095d0b 100644 --- a/bin/migrateDirtyDBtoRealDB.ts +++ b/bin/migrateDirtyDBtoRealDB.ts @@ -1,10 +1,9 @@ 'use strict'; import process from 'node:process'; -import ueberDB from "ueberdb2"; +import {Database, DatabaseType} from "ueberdb2"; import log4js from 'log4js'; -import util from 'util'; -const settings = require('ep_etherpad-lite/node/utils/Settings'); +import settings from 'ep_etherpad-lite/node/utils/Settings'; // As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an // unhandled rejection into an uncaught exception, which does cause Node.js to exit. @@ -23,15 +22,15 @@ process.on('unhandledRejection', (err) => { throw err; }); cache: '0', // The cache slows things down when you're mostly writing. writeInterval: 0, // Write directly to the database, don't buffer }; - const db = new ueberDB.Database( // eslint-disable-line new-cap - settings.dbType, + const db = new Database( // eslint-disable-line new-cap + settings.dbType as DatabaseType, settings.dbSettings, dbWrapperSettings, log4js.getLogger('ueberDB')); await db.init(); console.log('Waiting for dirtyDB to parse its file.'); - const dirty = await new ueberDB.Database('dirty',`${__dirname}/../var/dirty.db`); + const dirty = new Database('dirty', `${__dirname}/../var/dirty.db`); await dirty.init(); const keys = await dirty.findKeys('*', '') @@ -57,4 +56,5 @@ process.on('unhandledRejection', (err) => { throw err; }); await db.close(null); await dirty.close(null); console.log('Finished.'); + process.exit(0) })(); diff --git a/bin/package.json b/bin/package.json index dda580f13..a395e0141 100644 --- a/bin/package.json +++ b/bin/package.json @@ -1,25 +1,26 @@ { "name": "bin", - "version": "2.0.3", + "version": "2.6.0", "description": "", "main": "checkAllPads.js", "directories": { "doc": "doc" }, "dependencies": { - "axios": "^1.6.8", + "axios": "^1.13.2", "ep_etherpad-lite": "workspace:../src", "log4js": "^6.9.1", - "semver": "^7.6.0", - "tsx": "^4.7.2", - "ueberdb2": "^4.2.63" + "semver": "^7.7.3", + "tsx": "^4.21.0", + "ueberdb2": "^5.0.23" }, "devDependencies": { - "@types/node": "^20.12.7", - "@types/semver": "^7.5.8", - "typescript": "^5.4.5" + "@types/node": "^25.0.9", + "@types/semver": "^7.7.1", + "typescript": "^5.9.3" }, "scripts": { + "makeDocs": "node --import tsx make_docs.ts", "checkPad": "node --import tsx checkPad.ts", "checkAllPads": "node --import tsx checkAllPads.ts", "createUserSession": "node --import tsx createUserSession.ts", @@ -32,7 +33,9 @@ "rebuildPad": "node --import tsx rebuildPad.ts", "stalePlugins": "node --import tsx ./plugins/stalePlugins.ts", "checkPlugin": "node --import tsx ./plugins/checkPlugin.ts", - "install-plugins": "node --import tsx ./installPlugins.ts" + "plugins": "node --import tsx ./plugins.ts", + "generateChangelog": "node --import tsx generateReleaseNotes.ts", + "migrateDB": "node --import tsx migrateDB.ts" }, "author": "", "license": "ISC" diff --git a/bin/plugins.ts b/bin/plugins.ts new file mode 100644 index 000000000..9acd2af53 --- /dev/null +++ b/bin/plugins.ts @@ -0,0 +1,120 @@ +'use strict'; + +import {linkInstaller, checkForMigration} from "ep_etherpad-lite/static/js/pluginfw/installer"; +import {persistInstalledPlugins} from "./commonPlugins"; +import fs from "node:fs"; +const settings = require('ep_etherpad-lite/node/utils/Settings'); + +if (process.argv.length === 2) { + console.error('Expected at least one argument!'); + process.exit(1); +} + +let args = process.argv.slice(2) + + +const possibleActions = [ + "i", + "install", + "rm", + "remove", + "ls", + "list" +] + +const install = ()=> { + const argsAsString: string = args.join(" "); + const regexRegistryPlugins = /(?<=(?:i|install)\s)(.*?)(?=--github|--path|$)/; + const regexLocalPlugins = /(?<=--path\s)(.*?)(?=--github|$)/; + const regexGithubPlugins = /(?<=--github\s)(.*?)(?=--path|$)/; + const registryPlugins = argsAsString.match(regexRegistryPlugins)?.[0]?.split(" ")?.filter(s => s) || []; + const localPlugins = argsAsString.match(regexLocalPlugins)?.[0]?.split(" ")?.filter(s => s) || []; + const githubPlugins = argsAsString.match(regexGithubPlugins)?.[0]?.split(" ")?.filter(s => s) || []; + + async function run() { + for (const plugin of registryPlugins) { + if (possibleActions.includes(plugin)){ + continue + } + console.log(`Installing plugin from registry: ${plugin}`) + if (plugin.includes('@')) { + const [name, version] = plugin.split('@'); + await linkInstaller.installPlugin(name, version); + continue; + } + await linkInstaller.installPlugin(plugin); + } + + for (const plugin of localPlugins) { + console.log(`Installing plugin from path: ${plugin}`); + await linkInstaller.installFromPath(plugin); + } + + for (const plugin of githubPlugins) { + console.log(`Installing plugin from github: ${plugin}`); + await linkInstaller.installFromGitHub(plugin); + } + } + + (async () => { + await checkForMigration(); + await run(); + await persistInstalledPlugins(); + })(); +} + +const list = ()=>{ + const walk = async () => { + const plugins = fs.readFileSync(settings.root+"/var/installed_plugins.json", "utf-8") + const pluginNames = JSON.parse(plugins).plugins.map((plugin: any) => plugin.name).join(", ") + + console.log("Installed plugins are:", pluginNames) + } + + (async () => { + await walk(); + })(); +} + +const remove = (plugins: string[])=>{ + const walk = async () => { + for (const plugin of plugins) { + console.log(`Uninstalling plugin: ${plugin}`) + await linkInstaller.uninstallPlugin(plugin); + } + await persistInstalledPlugins(); + } + + (async () => { + await checkForMigration(); + await walk(); + })(); +} + +let action = args[0]; + +switch (action) { + case "install": + install(); + break; + case "i": + install(); + break; + case "ls": + list(); + break; + case "list": + list(); + break; + case "rm": + remove(args.slice(1)); + break; + case "remove": + remove(args.slice(1)); + break; + default: + console.error('Expected at least one argument!'); + process.exit(1); +} + + diff --git a/bin/plugins/checkPlugin.ts b/bin/plugins/checkPlugin.ts index cdd78d791..e2ca59d5e 100644 --- a/bin/plugins/checkPlugin.ts +++ b/bin/plugins/checkPlugin.ts @@ -474,6 +474,6 @@ log4js.configure({ logger.info('No changes.'); } } - logger.info('Finished'); + process.exit(0) })(); diff --git a/bin/plugins/lib/backend-tests.yml b/bin/plugins/lib/backend-tests.yml index 7b69a00cd..e38c2e902 100644 --- a/bin/plugins/lib/backend-tests.yml +++ b/bin/plugins/lib/backend-tests.yml @@ -29,7 +29,7 @@ jobs: - uses: pnpm/action-setup@v3 name: Install pnpm with: - version: 8 + version: 10 run_install: false - name: Get pnpm store directory shell: bash @@ -69,7 +69,7 @@ jobs: working-directory: ./etherpad-lite run: | pnpm link --global $PLUGIN_NAME - pnpm run install-plugins --path ../../plugin + pnpm run plugins i --path ../../plugin env: PLUGIN_NAME: ${{ steps.plugin_name.outputs.plugin_name }} - name: Link ep_etherpad-lite diff --git a/bin/plugins/lib/frontend-tests.yml b/bin/plugins/lib/frontend-tests.yml index d1eaf8701..ca9ca965c 100644 --- a/bin/plugins/lib/frontend-tests.yml +++ b/bin/plugins/lib/frontend-tests.yml @@ -18,7 +18,7 @@ jobs: - uses: pnpm/action-setup@v3 name: Install pnpm with: - version: 8 + version: 10 run_install: false - name: Get pnpm store directory shell: bash @@ -78,7 +78,7 @@ jobs: - name: Run the frontend tests shell: bash run: | - pnpm run dev & + pnpm run prod & connected=false can_connect() { curl -sSfo /dev/null http://localhost:9001/ || return 1 diff --git a/bin/plugins/lib/npmpublish.yml b/bin/plugins/lib/npmpublish.yml index 6c2712cc4..efa341c2c 100644 --- a/bin/plugins/lib/npmpublish.yml +++ b/bin/plugins/lib/npmpublish.yml @@ -21,7 +21,7 @@ jobs: - uses: pnpm/action-setup@v3 name: Install pnpm with: - version: 8 + version: 10 run_install: false - name: Get pnpm store directory shell: bash diff --git a/bin/plugins/stalePlugins.ts b/bin/plugins/stalePlugins.ts index ce2b876ed..563bf51d1 100644 --- a/bin/plugins/stalePlugins.ts +++ b/bin/plugins/stalePlugins.ts @@ -3,6 +3,7 @@ // Returns a list of stale plugins and their authors email import axios from 'axios' +import process from "node:process"; const currentTime = new Date(); (async () => { @@ -19,4 +20,5 @@ const currentTime = new Date(); console.log(`${name}, ${res.data[plugin].data.maintainers[0].email}`); } } + process.exit(0) })(); diff --git a/bin/rebuildPad.ts b/bin/rebuildPad.ts index 0d77940c0..16787e2c1 100644 --- a/bin/rebuildPad.ts +++ b/bin/rebuildPad.ts @@ -1,5 +1,3 @@ -'use strict'; - /* This is a repair tool. It rebuilds an old pad at a new pad location up to a known "good" revision. @@ -7,6 +5,8 @@ // As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an // unhandled rejection into an uncaught exception, which does cause Node.js to exit. +import process from "node:process"; + process.on('unhandledRejection', (err) => { throw err; }); if (process.argv.length !== 4 && process.argv.length !== 5) { @@ -82,4 +82,5 @@ const newPadId = process.argv[4] || `${padId}-rebuilt`; await db.shutdown(); console.info('finished'); + process.exit(0) })(); diff --git a/bin/release.ts b/bin/release.ts index 24c5a7d8b..5de3a826d 100644 --- a/bin/release.ts +++ b/bin/release.ts @@ -56,6 +56,8 @@ const readJson = (filename: string) => JSON.parse(fs.readFileSync(filename, {enc const assertWorkDirClean = (opts:{ cwd?: string; } = {}) => { + // Stash any changes in the working directory so that we can check for modifications. + runc('git stash') opts.cwd = runc('git rev-parse --show-cdup', opts) || cwd; const m = runc('git diff-files --name-status', opts); console.log(">"+m.trim()+"<") @@ -172,8 +174,8 @@ try { console.log('Merging develop into master...'); run('git merge --no-ff --no-edit develop'); console.log(`Creating ${newVersion} tag...`); - run(`git tag -s '${newVersion}' -m '${newVersion}'`); - run(`git tag -s 'v${newVersion}' -m 'v${newVersion}'`); + run(`git tag -a '${newVersion}' -m '${newVersion}'`); + run(`git tag -a 'v${newVersion}' -m 'v${newVersion}'`); console.log('Switching back to develop...'); run('git checkout develop'); console.log('Merging master into develop...'); @@ -197,7 +199,7 @@ try { try { console.log('Building documentation...'); - run('node ./make_docs.js'); + run('pnpm run makeDocs'); console.log('Updating ether.github.com master branch...'); run('git pull --ff-only', {cwd: '../ether.github.com/'}); console.log('Committing documentation...'); diff --git a/bin/repairPad.ts b/bin/repairPad.ts index 848b7205f..f59cf347e 100644 --- a/bin/repairPad.ts +++ b/bin/repairPad.ts @@ -57,4 +57,5 @@ let valueCount = 0; } console.info(`Finished: Replaced ${valueCount} values in the database`); + process.exit(0) })(); diff --git a/bin/run.sh b/bin/run.sh index c6c4c92c9..3f6b119bc 100755 --- a/bin/run.sh +++ b/bin/run.sh @@ -45,4 +45,4 @@ fi log "Starting Etherpad..." # cd src -exec pnpm run dev "$@" +exec pnpm run prod "$@" diff --git a/bin/tsconfig.json b/bin/tsconfig.json index e075f973c..afa29e712 100644 --- a/bin/tsconfig.json +++ b/bin/tsconfig.json @@ -39,7 +39,7 @@ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ diff --git a/doc/.vitepress/config.mts b/doc/.vitepress/config.mts index 170f21898..c96fa3bd3 100644 --- a/doc/.vitepress/config.mts +++ b/doc/.vitepress/config.mts @@ -32,6 +32,7 @@ export default defineConfig({ { text: 'Stats', link: '/stats.md' }, {text: 'Skins', link: '/skins.md' }, {text: 'Demo', link: '/demo.md' }, + {text: 'CLI', link: '/cli.md'}, ] }, { diff --git a/doc/api/changeset_library.adoc b/doc/api/changeset_library.adoc index 99ae77375..98f43c0a9 100644 --- a/doc/api/changeset_library.adoc +++ b/doc/api/changeset_library.adoc @@ -1,6 +1,6 @@ == Changeset Library -The https://github.com/ether/etherpad-lite/blob/develop/src/static/js/Changeset.js[changeset +The https://github.com/ether/etherpad-lite/blob/develop/src/static/js/Changeset.ts[changeset library] provides tools to create, read, and apply changesets. @@ -31,7 +31,7 @@ const AttributePool = require('ep_etherpad-lite/static/js/AttributePool'); ---- Changesets do not include any attribute key–value pairs. Instead, they use -numeric identifiers that reference attributes kept in an https://github.com/ether/etherpad-lite/blob/develop/src/static/js/AttributePool.js[attribute pool]. +numeric identifiers that reference attributes kept in an https://github.com/ether/etherpad-lite/blob/develop/src/static/js/AttributePool.ts[attribute pool]. This attribute interning reduces the transmission overhead of attributes that are used many times. diff --git a/doc/api/changeset_library.md b/doc/api/changeset_library.md index 7929aa48b..91d3cbe0a 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-lite/blob/develop/src/static/js/Changeset.js) +library](https://github.com/ether/etherpad-lite/blob/develop/src/static/js/Changeset.ts) provides tools to create, read, and apply changesets. ## Changeset @@ -29,7 +29,7 @@ const AttributePool = require('ep_etherpad-lite/static/js/AttributePool'); Changesets do not include any attribute key–value pairs. Instead, they use numeric identifiers that reference attributes kept in an [attribute -pool](https://github.com/ether/etherpad-lite/blob/develop/src/static/js/AttributePool.js). +pool](https://github.com/ether/etherpad-lite/blob/develop/src/static/js/AttributePool.ts). This attribute interning reduces the transmission overhead of attributes that are used many times. diff --git a/doc/cli.md b/doc/cli.md new file mode 100644 index 000000000..59f2c3ed2 --- /dev/null +++ b/doc/cli.md @@ -0,0 +1,29 @@ +# CLI + +You can find different tools for migrating things, checking your Etherpad health in the bin directory. +One of these is the migrateDB command. It takes two settings.json files and copies data from one source to another one. +In this example we migrate from the old dirty db to the new rustydb engine. So we copy these files to the root of the etherpad-directory. + +````json +{ + "dbType": "dirty", + "dbSettings": { + "filename": "./var/rusty.db" + } +} +```` + + + +````json +{ + "dbType": "rustydb", + "dbSettings": { + "filename": "./var/rusty2.db" + } +} +```` + + +After that we need to move the data from dirty to rustydb. +Therefore, we call `pnpm run --filter bin migrateDB --file1 test1.json --file2 test2.json` with these two files in our root directories. After some time the data should be copied over to the new database. diff --git a/doc/docker.adoc b/doc/docker.adoc index e26323337..ca47555fb 100644 --- a/doc/docker.adoc +++ b/doc/docker.adoc @@ -510,7 +510,7 @@ For the editor container, you can also make it full width by adding `full-width- | `SOCKETIO_MAX_HTTP_BUFFER_SIZE` | The maximum size (in bytes) of a single message accepted via Socket.IO. If a client sends a larger message, its connection gets closed to prevent DoS (memory exhaustion) attacks. -| `10000` +| `50000` | `LOAD_TEST` | Allow Load Testing tools to hit the Etherpad Instance. WARNING: this will disable security on the instance. diff --git a/doc/docker.md b/doc/docker.md index 7ff037a8a..6826d239e 100644 --- a/doc/docker.md +++ b/doc/docker.md @@ -213,7 +213,7 @@ For the editor container, you can also make it full width by adding `full-width- | `FOCUS_LINE_PERCENTAGE_ARROW_UP` | Percentage of viewport height to be additionally scrolled when user presses arrow up in the line of the top of the viewport. Set to 0 to let the scroll to be handled as default by Etherpad | `0` | | `FOCUS_LINE_DURATION` | Time (in milliseconds) used to animate the scroll transition. Set to 0 to disable animation | `0` | | `FOCUS_LINE_CARET_SCROLL` | Flag to control if it should scroll when user places the caret in the last line of the viewport | `false` | -| `SOCKETIO_MAX_HTTP_BUFFER_SIZE` | The maximum size (in bytes) of a single message accepted via Socket.IO. If a client sends a larger message, its connection gets closed to prevent DoS (memory exhaustion) attacks. | `10000` | +| `SOCKETIO_MAX_HTTP_BUFFER_SIZE` | The maximum size (in bytes) of a single message accepted via Socket.IO. If a client sends a larger message, its connection gets closed to prevent DoS (memory exhaustion) attacks. | `50000` | | `LOAD_TEST` | Allow Load Testing tools to hit the Etherpad Instance. WARNING: this will disable security on the instance. | `false` | | `DUMP_ON_UNCLEAN_EXIT` | Enable dumping objects preventing a clean exit of Node.js. WARNING: this has a significant performance impact. | `false` | | `EXPOSE_VERSION` | Expose Etherpad version in the web interface and in the Server http header. Do not enable on production machines. | `false` | diff --git a/doc/package.json b/doc/package.json index 54761149f..20da88ee6 100644 --- a/doc/package.json +++ b/doc/package.json @@ -1,10 +1,16 @@ { "devDependencies": { - "vitepress": "^1.1.3" + "vitepress": "^2.0.0-alpha.15" }, "scripts": { "docs:dev": "vitepress dev", "docs:build": "vitepress build", "docs:preview": "vitepress preview" + }, + "peerDependencies": { + "search-insights": "^2.17.3" + }, + "overrides": { + "vite": "npm:rolldown-vite@7.2.10" } } diff --git a/doc/plugins.md b/doc/plugins.md index acfa069b8..d90d52895 100644 --- a/doc/plugins.md +++ b/doc/plugins.md @@ -7,8 +7,9 @@ execute its own functionality based on these events. Publicly available plugins can be found in the npm registry (see ). Etherpad's naming convention for plugins is to prefix your plugins with `ep_`. So, e.g. it's `ep_flubberworms`. Thus you can install -plugins from npm, using `npm install --no-save --legacy-peer-deps -ep_flubberworm` in Etherpad's root directory. +plugins from npm, using `pnpm run plugins install ep_flubberworms` in Etherpad's root directory. + +Also see [wiki article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins) for more info. You can also browse to `http://yourEtherpadInstan.ce/admin/plugins`, which will list all installed plugins and those available on npm. It even provides diff --git a/doc/skins.md b/doc/skins.md index 90a786f84..954179f78 100644 --- a/doc/skins.md +++ b/doc/skins.md @@ -15,5 +15,5 @@ You can choose a skin changing the parameter `skinName` in `settings.json`. Since Etherpad **1.7.5**, two skins are included: -* `no-skin`: an empty skin, leaving the default Etherpad appearance unchanged, that you can use as a guidance to develop your own. +* `no-skin`: an empty skin, leaving the default Etherpad appearance unchanged, that you can use as guidance to develop your own. * `colibris`: a new, experimental skin, that will become the default in Etherpad 2.0. diff --git a/doc/stats.adoc b/doc/stats.adoc index e1665a853..d1e1a6380 100644 --- a/doc/stats.adoc +++ b/doc/stats.adoc @@ -17,3 +17,15 @@ We currently measure: Under the hood, we are happy to rely on https://github.com/felixge/node-measured[measured] for all our metrics needs. To modify or simply access our stats in your plugin, simply `require('ep_etherpad-lite/stats')` which is a https://yaorg.github.io/node-measured/packages/measured-core/Collection.html[`measured.Collection`]. + + +=== Prometheus scraper + +Besides the non standard `/stats` endpoint, Etherpad also exposes a `/stats/prometheus` endpoint which is compatible with Prometheus scraping. It includes a lot more metrics than the standard `/stats` endpoint. It contains the following metrics: + +- ueberdb stats +- gc +- memory +- event loop lag +- v8 +- and more diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 4efb74da4..b8c01f263 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -9,6 +9,7 @@ services: build: context: . args: + # Attention: installed plugins in the node_modules folder get overwritten during volume mount in dev ETHERPAD_PLUGINS: # change from development to production if needed target: development @@ -57,7 +58,7 @@ services: # ports: # - "5432:5432" volumes: - - postgres_data:/var/lib/postgresql/data/pgdata + - postgres_data:/var/lib/postgresql/data volumes: - postgres_data: \ No newline at end of file + postgres_data: diff --git a/docker-compose.yml b/docker-compose.yml index 24a726164..e009c99f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: app: - user: "0:0" + user: "5001:0" image: etherpad/etherpad:latest tty: true stdin_open: true @@ -42,7 +42,7 @@ services: # ports: # - "5432:5432" volumes: - - postgres_data:/var/lib/postgresql/data/pgdata + - postgres_data:/var/lib/postgresql/data volumes: postgres_data: diff --git a/local_plugins/.gitignore b/local_plugins/.gitignore new file mode 100644 index 000000000..87f7edd0e --- /dev/null +++ b/local_plugins/.gitignore @@ -0,0 +1,3 @@ +# ignore everything +* +!.gitignore diff --git a/make_docs.js b/make_docs.js deleted file mode 100644 index db5daea70..000000000 --- a/make_docs.js +++ /dev/null @@ -1,55 +0,0 @@ -import {exec} from 'child_process' -import fs from 'fs' -import path from 'path' - -import pjson from './src/package.json' assert {type: "json"} - -const VERSION=pjson.version -console.log(`Building docs for version ${VERSION}`) - -const createDirIfNotExists = (dir) => { - if (!fs.existsSync(dir)){ - fs.mkdirSync(dir) - } -} - - -function copyFolderSync(from, to) { - if(fs.existsSync(to)){ - const stat = fs.lstatSync(to) - if (stat.isDirectory()){ - fs.rmSync(to, { recursive: true }) - } - else{ - fs.rmSync(to) - } - } - fs.mkdirSync(to); - fs.readdirSync(from).forEach(element => { - if (fs.lstatSync(path.join(from, element)).isFile()) { - fs.copyFileSync(path.join(from, element), path.join(to, element)) - } else { - copyFolderSync(path.join(from, element), path.join(to, element)) - } - }); -} - -exec('asciidoctor -v', (err,stdout)=>{ - if (err){ - console.log('Please install asciidoctor') - console.log('https://asciidoctor.org/docs/install-toolchain/') - process.exit(1) - } -}); - - -createDirIfNotExists('./out') -createDirIfNotExists('./out/doc') -createDirIfNotExists('./out/doc/api') - - - -exec(`asciidoctor -D out/doc doc/index.adoc */**.adoc -a VERSION=${VERSION}`) -exec(`asciidoctor -D out/doc/api ./doc/api/*.adoc -a VERSION=${VERSION}`) - -copyFolderSync('./doc/public/', './out/doc/') diff --git a/package.json b/package.json index 5c7354b2e..cdd537738 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "scripts": { "lint": "pnpm --filter ep_etherpad-lite run lint", "test": "pnpm --filter ep_etherpad-lite run test", + "test-utils": "pnpm --filter ep_etherpad-lite run test-utils", "test-container": "pnpm --filter ep_etherpad-lite run test-container", "dev": "pnpm --filter ep_etherpad-lite run dev", "prod": "pnpm --filter ep_etherpad-lite run prod", @@ -24,25 +25,30 @@ "test-ui:ui": "pnpm --filter ep_etherpad-lite run test-ui:ui", "test-admin": "pnpm --filter ep_etherpad-lite run test-admin", "test-admin:ui": "pnpm --filter ep_etherpad-lite run test-admin:ui", - "install-plugins": "pnpm --filter bin run install-plugins" + "plugins": "pnpm --filter bin run plugins", + "install-plugins": "pnpm --filter bin run plugins i", + "remove-plugins": "pnpm --filter bin run remove-plugins", + "list-plugins": "pnpm --filter bin run list-plugins", + "build:etherpad": "pnpm --filter admin run build-copy && pnpm --filter ui run build-copy", + "build:ui": "pnpm --filter ui run build-copy && pnpm --filter admin run build-copy", + "makeDocs": "pnpm --filter bin run makeDocs" }, "dependencies": { - "ep_etherpad-lite": "workspace:./src" + "ep_etherpad-lite": "link:src" }, "devDependencies": { - "admin": "workspace:./admin", - "docs": "workspace:./doc", - "ui": "workspace:./ui" + "admin": "link:admin", + "docs": "link:doc", + "ui": "link:ui" }, "engines": { - "node": ">=18.18.2", - "npm": ">=6.14.0", - "pnpm": ">=8.3.0" + "node": ">=20.0.0" }, "repository": { "type": "git", "url": "https://github.com/ether/etherpad-lite.git" }, - "version": "2.0.3", + "engineStrict": true, + "version": "2.6.0", "license": "Apache-2.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96e4a3194..8e17cd5aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,103 +9,106 @@ importers: .: dependencies: ep_etherpad-lite: - specifier: workspace:./src + specifier: link:src version: link:src devDependencies: admin: - specifier: workspace:./admin + specifier: link:admin version: link:admin docs: - specifier: workspace:./doc + specifier: link:doc version: link:doc ui: - specifier: workspace:./ui + specifier: link:ui version: link:ui admin: dependencies: '@radix-ui/react-switch': - specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.2.6 + version: 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) devDependencies: '@radix-ui/react-dialog': - specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-toast': - specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) + specifier: ^1.2.15 + version: 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@types/react': - specifier: ^18.2.79 - version: 18.2.79 + specifier: ^19.2.8 + version: 19.2.8 '@types/react-dom': - specifier: ^18.2.25 - version: 18.2.25 + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.8) '@typescript-eslint/eslint-plugin': - specifier: ^7.7.0 - version: 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5) + specifier: ^8.53.1 + version: 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^7.7.0 - version: 7.7.0(eslint@9.0.0)(typescript@5.4.5) - '@vitejs/plugin-react-swc': - specifier: ^3.5.0 - version: 3.6.0(vite@5.2.9) + specifier: ^8.53.1 + version: 8.53.1(eslint@9.39.2)(typescript@5.9.3) + '@vitejs/plugin-react': + specifier: ^5.1.2 + version: 5.1.2(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0)) + babel-plugin-react-compiler: + specifier: 19.1.0-rc.3 + version: 19.1.0-rc.3 eslint: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.39.2 + version: 9.39.2 eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@9.0.0) + specifier: ^7.0.1 + version: 7.0.1(eslint@9.39.2) eslint-plugin-react-refresh: - specifier: ^0.4.5 - version: 0.4.6(eslint@9.0.0) + specifier: ^0.4.26 + version: 0.4.26(eslint@9.39.2) i18next: - specifier: ^23.11.2 - version: 23.11.2 + specifier: ^25.7.4 + version: 25.7.4(typescript@5.9.3) i18next-browser-languagedetector: - specifier: ^7.2.1 - version: 7.2.1 + specifier: ^8.2.0 + version: 8.2.0 lucide-react: - specifier: ^0.372.0 - version: 0.372.0(react@18.2.0) + specifier: ^0.562.0 + version: 0.562.0(react@19.2.3) react: - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^19.2.3 + version: 19.2.3 react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) react-hook-form: - specifier: ^7.51.3 - version: 7.51.3(react@18.2.0) + specifier: ^7.71.1 + version: 7.71.1(react@19.2.3) react-i18next: - specifier: ^14.1.0 - version: 14.1.0(i18next@23.11.2)(react-dom@18.2.0)(react@18.2.0) + specifier: ^16.5.3 + version: 16.5.3(i18next@25.7.4(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) react-router-dom: - specifier: ^6.22.3 - version: 6.22.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^7.12.0 + version: 7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) socket.io-client: - specifier: ^4.7.5 - version: 4.7.5 + specifier: ^4.8.3 + version: 4.8.3 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 vite: - specifier: ^5.2.9 - version: 5.2.9 + specifier: npm:rolldown-vite@7.2.10 + version: rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0) + vite-plugin-babel: + specifier: ^1.4.1 + version: 1.4.1(@babel/core@7.28.5)(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0)) vite-plugin-static-copy: - specifier: ^1.0.3 - version: 1.0.3(vite@5.2.9) - vite-plugin-svgr: - specifier: ^4.2.0 - version: 4.2.0(typescript@5.4.5)(vite@5.2.9) + specifier: ^3.1.5 + version: 3.1.5(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0)) zustand: - specifier: ^4.5.2 - version: 4.5.2(@types/react@18.2.79)(react@18.2.0) + specifier: ^5.0.10 + version: 5.0.10(@types/react@19.2.8)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)) bin: dependencies: axios: - specifier: ^1.6.8 - version: 1.6.8 + specifier: ^1.13.2 + version: 1.13.2 ep_etherpad-lite: specifier: workspace:../src version: link:../src @@ -113,99 +116,96 @@ importers: specifier: ^6.9.1 version: 6.9.1 semver: - specifier: ^7.6.0 - version: 7.6.0 + specifier: ^7.7.3 + version: 7.7.3 tsx: - specifier: ^4.7.2 - version: 4.7.2 + specifier: ^4.21.0 + version: 4.21.0 ueberdb2: - specifier: ^4.2.63 - version: 4.2.63 + specifier: ^5.0.23 + version: 5.0.23 devDependencies: '@types/node': - specifier: ^20.12.7 - version: 20.12.7 + specifier: ^25.0.9 + version: 25.0.9 '@types/semver': - specifier: ^7.5.8 - version: 7.5.8 + specifier: ^7.7.1 + version: 7.7.1 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 doc: devDependencies: vitepress: - specifier: ^1.1.3 - version: 1.1.3 + specifier: ^2.0.0-alpha.15 + version: 2.0.0-alpha.15(@types/node@25.0.9)(axios@1.13.2)(jwt-decode@4.0.0)(lightningcss@1.30.2)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3) src: dependencies: async: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.2.6 + version: 3.2.6 axios: - specifier: ^1.6.8 - version: 1.6.8 - clean-css: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^1.13.2 + version: 1.13.2 cookie-parser: - specifier: ^1.4.6 - version: 1.4.6 + specifier: ^1.4.7 + version: 1.4.7 + cross-env: + specifier: ^10.1.0 + version: 10.1.0 cross-spawn: - specifier: ^7.0.3 - version: 7.0.3 + specifier: ^7.0.6 + version: 7.0.6 ejs: specifier: ^3.1.10 version: 3.1.10 - etherpad-require-kernel: - specifier: ^1.0.16 - version: 1.0.16 - etherpad-yajsml: - specifier: 0.0.12 - version: 0.0.12 + esbuild: + specifier: ^0.27.2 + version: 0.27.2 express: - specifier: 4.19.2 - version: 4.19.2 + specifier: ^5.2.1 + version: 5.2.1 express-rate-limit: - specifier: ^7.2.0 - version: 7.2.0(express@4.19.2) + specifier: ^8.2.1 + version: 8.2.1(express@5.2.1) express-session: - specifier: npm:@etherpad/express-session@^1.18.2 - version: '@etherpad/express-session@1.18.2' - fast-deep-equal: - specifier: ^3.1.3 - version: 3.1.3 + specifier: ^1.18.2 + version: 1.18.2 find-root: specifier: 1.1.0 version: 1.1.0 formidable: - specifier: ^3.5.1 - version: 3.5.1 + specifier: ^3.5.4 + version: 3.5.4 http-errors: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.0.1 + version: 2.0.1 jose: - specifier: ^5.2.4 - version: 5.2.4 + specifier: ^6.1.3 + version: 6.1.3 js-cookie: specifier: ^3.0.5 version: 3.0.5 jsdom: - specifier: ^24.0.0 - version: 24.0.0 + specifier: ^27.4.0 + version: 27.4.0 jsonminify: specifier: 0.4.2 version: 0.4.2 jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 + specifier: ^9.0.3 + version: 9.0.3 + jwt-decode: + specifier: ^4.0.0 + version: 4.0.0 languages4translatewiki: specifier: 0.1.3 version: 0.1.3 live-plugin-manager: - specifier: ^0.20.0 - version: 0.20.0 + specifier: ^1.1.0 + version: 1.1.0 lodash.clonedeep: specifier: 4.5.0 version: 4.5.0 @@ -213,129 +213,165 @@ importers: specifier: ^6.9.1 version: 6.9.1 lru-cache: - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^11.2.4 + version: 11.2.4 measured-core: specifier: ^2.0.0 version: 2.0.0 mime-types: - specifier: ^2.1.35 - version: 2.1.35 + specifier: ^3.0.2 + version: 3.0.2 oidc-provider: - specifier: ^8.4.5 - version: 8.4.5 + specifier: 9.6.0 + version: 9.6.0 openapi-backend: - specifier: ^5.10.6 - version: 5.10.6 + specifier: ^5.15.0 + version: 5.15.0 + prom-client: + specifier: ^15.1.3 + version: 15.1.3 proxy-addr: specifier: ^2.0.7 version: 2.0.7 rate-limiter-flexible: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^9.0.1 + version: 9.0.1 rehype: - specifier: ^13.0.1 - version: 13.0.1 + specifier: ^13.0.2 + version: 13.0.2 rehype-minify-whitespace: - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^6.0.2 + version: 6.0.2 resolve: - specifier: 1.22.8 - version: 1.22.8 + specifier: 1.22.11 + version: 1.22.11 + rusty-store-kv: + specifier: ^1.3.1 + version: 1.3.1 security: specifier: 1.0.0 version: 1.0.0 semver: - specifier: ^7.6.0 - version: 7.6.0 + specifier: ^7.7.3 + version: 7.7.3 socket.io: - specifier: ^4.7.5 - version: 4.7.5 + specifier: ^4.8.3 + version: 4.8.3 socket.io-client: - specifier: ^4.7.5 - version: 4.7.5 + specifier: ^4.8.3 + version: 4.8.3 superagent: - specifier: ^8.1.2 - version: 8.1.2 - terser: - specifier: ^5.30.3 - version: 5.30.3 - threads: - specifier: ^1.7.0 - version: 1.7.0 + specifier: 10.3.0 + version: 10.3.0 + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@5.2.1) tinycon: specifier: 0.6.8 version: 0.6.8 tsx: - specifier: ^4.7.2 - version: 4.7.2 + specifier: 4.21.0 + version: 4.21.0 ueberdb2: - specifier: ^4.2.63 - version: 4.2.63 + specifier: ^5.0.23 + version: 5.0.23 underscore: - specifier: 1.13.6 - version: 1.13.6 + specifier: 1.13.7 + version: 1.13.7 unorm: specifier: 1.6.0 version: 1.6.0 wtfnode: - specifier: ^0.9.2 - version: 0.9.2 + specifier: ^0.10.1 + version: 0.10.1 devDependencies: '@playwright/test': - specifier: ^1.43.1 - version: 1.43.1 + specifier: ^1.57.0 + version: 1.57.0 '@types/async': - specifier: ^3.2.24 - version: 3.2.24 + specifier: ^3.2.25 + version: 3.2.25 + '@types/cookie-parser': + specifier: ^1.4.10 + version: 1.4.10(@types/express@5.0.6) + '@types/cross-spawn': + specifier: ^6.0.6 + version: 6.0.6 + '@types/ejs': + specifier: ^3.1.5 + version: 3.1.5 '@types/express': - specifier: ^4.17.21 - version: 4.17.21 + specifier: ^5.0.6 + version: 5.0.6 + '@types/express-session': + specifier: ^1.18.2 + version: 1.18.2 '@types/formidable': - specifier: ^3.4.5 - version: 3.4.5 + specifier: ^3.4.6 + version: 3.4.6 '@types/http-errors': - specifier: ^2.0.4 - version: 2.0.4 + specifier: ^2.0.5 + version: 2.0.5 + '@types/jquery': + specifier: ^3.5.33 + version: 3.5.33 + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 '@types/jsdom': - specifier: ^21.1.6 - version: 21.1.6 + specifier: ^27.0.0 + version: 27.0.0 + '@types/jsonminify': + specifier: ^0.4.3 + version: 0.4.3 '@types/jsonwebtoken': - specifier: ^9.0.6 - version: 9.0.6 + specifier: ^9.0.10 + version: 9.0.10 + '@types/mime-types': + specifier: ^3.0.1 + version: 3.0.1 '@types/mocha': - specifier: ^10.0.6 - version: 10.0.6 + specifier: ^10.0.9 + version: 10.0.10 '@types/node': - specifier: ^20.12.7 - version: 20.12.7 + specifier: ^25.0.9 + version: 25.0.9 '@types/oidc-provider': - specifier: ^8.4.4 - version: 8.4.4 + specifier: ^9.5.0 + version: 9.5.0 '@types/semver': - specifier: ^7.5.8 - version: 7.5.8 + specifier: ^7.7.1 + version: 7.7.1 '@types/sinon': - specifier: ^17.0.3 - version: 17.0.3 + specifier: ^21.0.0 + version: 21.0.0 '@types/supertest': specifier: ^6.0.2 - version: 6.0.2 + version: 6.0.3 + '@types/swagger-ui-express': + specifier: ^4.1.8 + version: 4.1.8 '@types/underscore': - specifier: ^1.11.15 - version: 1.11.15 - eslint: - specifier: ^9.0.0 - version: 9.0.0 - eslint-config-etherpad: - specifier: ^4.0.4 - version: 4.0.4(eslint@9.0.0)(typescript@5.4.5) - etherpad-cli-client: + specifier: ^1.13.0 + version: 1.13.0 + '@types/whatwg-mimetype': specifier: ^3.0.2 version: 3.0.2 + chokidar: + specifier: ^5.0.0 + version: 5.0.0 + eslint: + specifier: ^9.39.2 + version: 9.39.2 + eslint-config-etherpad: + specifier: ^4.0.4 + version: 4.0.4(eslint@9.39.2)(typescript@5.9.3) + etherpad-cli-client: + specifier: ^3.0.5 + version: 3.0.5 mocha: - specifier: ^10.4.0 - version: 10.4.0 + specifier: ^11.7.5 + version: 11.7.5 mocha-froth: specifier: ^0.2.10 version: 0.2.10 @@ -346,549 +382,769 @@ importers: specifier: ^0.4.2 version: 0.4.2 set-cookie-parser: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^3.0.1 + version: 3.0.1 sinon: - specifier: ^17.0.1 - version: 17.0.1 + specifier: ^21.0.1 + version: 21.0.1 split-grid: specifier: ^1.0.11 version: 1.0.11 supertest: - specifier: ^6.3.4 - version: 6.3.4 + specifier: ^7.2.2 + version: 7.2.2 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.0.17 + version: 4.0.17(@opentelemetry/api@1.9.0)(@types/node@25.0.9)(jsdom@27.4.0)(lightningcss@1.30.2)(tsx@4.21.0) ui: devDependencies: + ep_etherpad-lite: + specifier: workspace:../src + version: link:../src typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.9.3 + version: 5.9.3 vite: - specifier: ^5.2.9 - version: 5.2.9 + specifier: npm:rolldown-vite@7.2.10 + version: rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} + '@acemir/cssom@0.9.30': + resolution: {integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==} - '@algolia/autocomplete-core@1.9.3': - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3': - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.9.3': - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.9.3': - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/cache-browser-local-storage@4.22.1': - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} - - '@algolia/cache-common@4.22.1': - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} - - '@algolia/cache-in-memory@4.22.1': - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} - - '@algolia/client-account@4.22.1': - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} - - '@algolia/client-analytics@4.22.1': - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} - - '@algolia/client-common@4.22.1': - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} - - '@algolia/client-personalization@4.22.1': - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} - - '@algolia/client-search@4.22.1': - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} - - '@algolia/logger-common@4.22.1': - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} - - '@algolia/logger-console@4.22.1': - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} - - '@algolia/requester-browser-xhr@4.22.1': - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} - - '@algolia/requester-common@4.22.1': - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - - '@algolia/requester-node-http@4.22.1': - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} - - '@algolia/transporter@4.22.1': - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@apidevtools/json-schema-ref-parser@11.1.0': - resolution: {integrity: sha512-g/VW9ZQEFJAOwAyUb8JFf7MLiLy2uEB4rU270rGzDwICxnxMlPy0O11KVePSgS36K1NI29gSlK84n5INGhd4Ag==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.0': - resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.0': - resolution: {integrity: sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.24.0': - resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} - - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.24.0': - resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - - '@docsearch/css@3.6.0': - resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} - - '@docsearch/js@3.6.0': - resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} - - '@docsearch/react@3.6.0': - resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true + '@babel/core': ^7.0.0-0 - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + 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.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.22': + resolution: {integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==} + engines: {node: '>=18'} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@docsearch/css@4.3.2': + resolution: {integrity: sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==} + + '@docsearch/js@4.3.2': + resolution: {integrity: sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@epic-web/invariant@1.0.0': + resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@3.0.2': - resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.0.0': - resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@etherpad/express-session@1.18.2': - resolution: {integrity: sha512-5S+mdCxqSR5AX9jj1G3Qzxv/EX4jyWr9ikHzwtv+uV9fPu7EPFF6oNkhrUCZ19RJ5975KulPyrBB35hUK5x7LA==} - engines: {node: '>= 0.8.0'} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@humanwhocodes/config-array@0.12.3': - resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} - engines: {node: '>=10.10.0'} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/bytes@1.6.0': + resolution: {integrity: sha512-y32mI9627q5LR/L8fLc4YyDRJQOi+jK0D9okzLilAdiU3F9we3zC7Y7CFrR/8vAvUyv7FgBAYcNHtvbmhKCFcw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@exodus/crypto': ^1.0.0-rc.4 + peerDependenciesMeta: + '@exodus/crypto': + optional: true + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@iconify-json/simple-icons@1.2.60': + resolution: {integrity: sha512-KlwLBKCdMCqfySdkAA+jehdUx6VSjnj6lvzQKus7HjkPSQ6QP58d6xiptkIp0jd/Hw3PW2++nRuGvCvSYaF0Mg==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} @@ -897,9 +1153,21 @@ packages: resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} engines: {node: '>= 14.0.0'} - '@koa/router@12.0.1': - resolution: {integrity: sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==} - engines: {node: '>= 12'} + '@koa/router@15.1.1': + resolution: {integrity: sha512-trYxL4VOx8r92f8luqpN83xkN0DMTsp/HBJIxoDZH/a2I1Hxvoe+jjjhyJRQUQIHmsNQjCM+Xj6nCqSvnDnlCw==} + engines: {node: '>= 20'} + peerDependencies: + koa: ^2.0.0 || ^3.0.0 + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@1.1.0': + resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -913,543 +1181,716 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@playwright/test@1.43.1': - resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} - engines: {node: '>=16'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@oxc-project/runtime@0.101.0': + resolution: {integrity: sha512-t3qpfVZIqSiLQ5Kqt/MC4Ge/WCOGrrcagAdzTcDaggupjiGxUx4nJF2v6wUCXWSzWHn5Ns7XLv13fCJEwCOERQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.101.0': + resolution: {integrity: sha512-nuFhqlUzJX+gVIPPfuE6xurd4lST3mdcWOhyK/rZO0B9XWMKm79SuszIQEnSMmmDhq1DC8WWVYGVd+6F93o1gQ==} + + '@paralleldrive/cuid2@2.2.2': + resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.57.0': + resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} + engines: {node: '>=18'} hasBin: true - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-collection@1.0.3': - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-dialog@1.0.5': - resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-dismissable-layer@1.0.5': - resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.0.4': - resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-portal@1.0.4': - resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-presence@1.0.1': - resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-switch@1.0.3': - resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-toast@1.1.5': - resolution: {integrity: sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==} + '@radix-ui/react-toast@1.2.15': + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-use-previous@1.0.1': - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-use-size@1.0.1': - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} peerDependencies: '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.0.3': - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + 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.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true '@types/react-dom': optional: true - '@remix-run/router@1.15.3': - resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} - engines: {node: '>=14.0.0'} - - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.13.0': - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.13.0': - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + '@rolldown/binding-android-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-Ok9V8o7o6YfSdTTYA/uHH30r3YtOxLD6G3wih/U9DO0ucBBFq8WPt/DslU53OgfteLRHITZny9N/qCUxMf9kjQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.13.0': - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-yIsKqMz0CtRnVa6x3Pa+mzTihr4Ty+Z6HfPbZ7RVbk1Uxnco4+CUn7Qbm/5SBol1JD/7nvY8rphAgyAi7Lj6Vg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.13.0': - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + resolution: {integrity: sha512-GTXe+mxsCGUnJOFMhfGWmefP7Q9TpYUseHvhAhr21nCTgdS8jPsvirb0tJwM3lN0/u/cg7bpFNa16fQrjKrCjQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + resolution: {integrity: sha512-9Tmp7bBvKqyDkMcL4e089pH3RsjD3SUungjmqWtyhNOxoQMh0fSmINTyYV8KXtE+JkxYMPWvnEt+/mfpVCkk8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + resolution: {integrity: sha512-a1y5fiB0iovuzdbjUxa7+Zcvgv+mTmlGGC4XydVIsyl48eoxgaYkA3l9079hyTyhECsPq+mbr0gVQsFU11OJAQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.13.0': - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-bpIGX+ov9PhJYV+wHNXl9rzq4F0QvILiURn0y0oepbQx+7stmQsKA0DhPGwmhfvF856wq+gbM8L92SAa/CBcLg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.13.0': - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-bGe5EBB8FVjHBR1mOLOPEFg1Lp3//7geqWkU5NIhxe+yH0W8FVrQ6WRYOap4SUTKdklD/dC4qPLREkMMQ855FA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + resolution: {integrity: sha512-qL+63WKVQs1CMvFedlPt0U9PiEKJOAL/bsHMKUDS6Vp2Q+YAv/QLPu8rcvkfIMvQ0FPU2WL0aX4eWwF6e/GAnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + resolution: {integrity: sha512-VGl9JIGjoJh3H8Mb+7xnVqODajBmrdOOb9lxWXdcmxyI+zjB2sux69br0hZJDTyLJfvBoYm439zPACYbCjGRmw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + resolution: {integrity: sha512-B4iIserJXuSnNzA5xBLFUIjTfhNy7d9sq4FUMQY3GhQWGVhS2RWWzzDnkSU6MUt7/aHUrep0CdQfXUJI9D3W7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + resolution: {integrity: sha512-BUjAEgpABEJXilGq/BPh7jeU3WAJ5o15c1ZEgHaDWSz3LB881LQZnbNJHmUiM4d1JQWMYYyR1Y490IBHi2FPJg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-s27uU7tpCWSjHBnxyVXHt3rMrQdJq5MHNv3BzsewCIroIw3DJFjMH1dzCPPMUFxnh1r52Nf9IJ/eWp6LDoyGcw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + resolution: {integrity: sha512-cjWL/USPJ1g0en2htb4ssMjIycc36RvdQAx1WlXnS6DpULswiUTVXPDesTifSKYSyvx24E0YqQkEm0K/M2Z/AA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.50': + resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.13.0': - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.13.0': - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.13.0': - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.13.0': - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.13.0': - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rushstack/eslint-patch@1.7.2': - resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] - '@shikijs/core@1.3.0': - resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==} + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] - '@shikijs/transformers@1.3.0': - resolution: {integrity: sha512-3mlpg2I9CjhjE96dEWQOGeCWoPcyTov3s4aAsHmgvnTHa8MBknEnCQy8/xivJPSpD+olqOqIEoHnLfbNJK29AA==} + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sinonjs/commons@2.0.0': - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + '@rushstack/eslint-patch@1.11.0': + resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@shikijs/core@3.17.0': + resolution: {integrity: sha512-/HjeOnbc62C+n33QFNFrAhUlIADKwfuoS50Ht0pxujxP4QjZAlFp5Q+OkDo531SCTzivx5T18khwyBdKoPdkuw==} + + '@shikijs/engine-javascript@3.17.0': + resolution: {integrity: sha512-WwF99xdP8KfuDrIbT4wxyypfhoIxMeeOCp1AiuvzzZ6JT5B3vIuoclL8xOuuydA6LBeeNXUF/XV5zlwwex1jlA==} + + '@shikijs/engine-oniguruma@3.17.0': + resolution: {integrity: sha512-flSbHZAiOZDNTrEbULY8DLWavu/TyVu/E7RChpLB4WvKX4iHMfj80C6Hi3TjIWaQtHOW0KC6kzMcuB5TO1hZ8Q==} + + '@shikijs/langs@3.17.0': + resolution: {integrity: sha512-icmur2n5Ojb+HAiQu6NEcIIJ8oWDFGGEpiqSCe43539Sabpx7Y829WR3QuUW2zjTM4l6V8Sazgb3rrHO2orEAw==} + + '@shikijs/themes@3.17.0': + resolution: {integrity: sha512-/xEizMHLBmMHwtx4JuOkRf3zwhWD2bmG5BRr0IPjpcWpaq4C3mYEuTk/USAEglN0qPrTwEHwKVpSu/y2jhferA==} + + '@shikijs/transformers@3.17.0': + resolution: {integrity: sha512-b14s8lPt/3K/PjtGgvdS4oU676Ke/ct9kdi6ksEb2rHzRVBAoWJeRwvDQcHASiiZbrDHlnnC8VnwL2Bw0T/nlw==} + + '@shikijs/types@3.17.0': + resolution: {integrity: sha512-wjLVfutYWVUnxAjsWEob98xgyaGv0dTEnMZDruU5mRjVN7szcGOfgO+997W2yR6odp+1PtSBNeSITRRTfUzK/g==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@11.2.2': - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + '@sinonjs/fake-timers@15.1.0': + resolution: {integrity: sha512-cqfapCxwTGsrR80FEgOoPsTonoefMBY7dnUEbQ+GRcved0jvkJLzvX6F4WtN+HBqbPX/SiFsIRUp+IrCW/2I2w==} - '@sinonjs/samsam@8.0.0': - resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + '@sinonjs/samsam@8.0.3': + resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==} - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@socket.io/component-emitter@3.1.0': - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0': - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-svg-em-dimensions@8.0.0': - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-transform-react-native-svg@8.1.0': - resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-transform-svg-component@8.0.0': - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-preset@8.1.0': - resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/core@8.1.0': - resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} - engines: {node: '>=14'} - - '@svgr/hast-util-to-babel-ast@8.0.0': - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} - - '@svgr/plugin-jsx@8.1.0': - resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - - '@swc/core-darwin-arm64@1.4.7': - resolution: {integrity: sha512-IhfP2Mrrh9WcdlBJQbPNBhfdOhW/SC910SiuzvxaLgJmzq1tw6TVDNUz4Zf85TbK5uzgR0emtPc9hTGxynl57A==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.4.7': - resolution: {integrity: sha512-MO01pnxJDS6st5IiqyTnAOz9kpAPP/O4lzEUH9E80XdXBzwptS5hNTM0egBlqueWDFrPM26RI81JLtyTU7kR8w==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.4.7': - resolution: {integrity: sha512-+cDaXW6PZqGhXIq9C4xE+/QuyUsLkXf8d8uSXep+rZYDl4YHS9Fi7HpZQnqLX6al/iVhwe3VnxHMGw50gxcr/g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.4.7': - resolution: {integrity: sha512-RNnVHRKhEtA3pM34wgb3Vumf5M6/XlWzFdkHEMZIkOKyNSUhZiv8X3tsEK+n1rZQWIDkvlw4YyHtB8vK18WdCA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.4.7': - resolution: {integrity: sha512-p7Xm4Pib02d1SFS9XXMoOcCTDIkFWMspspptPX00VcjAdZYnXWujWGuD2W+KN1gq5syHB1g3TsYs9LP2dGsKqw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.4.7': - resolution: {integrity: sha512-ViI5jy03cFYPETsye1J+oPbHE4v8oIDN34qebzvgHUlNKOXfc1ig0Zha5oQnKp3zj1rmjcSLIMqK++WR021G5A==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.4.7': - resolution: {integrity: sha512-Nf3Axcx/ILl7XE44eidNNPF39rg/KIeqg2545vrOXJG02iu7pEjZuu8wm6w+23BpP4COjZJymlg9LzPT1ZBD5Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.4.7': - resolution: {integrity: sha512-MFkJEaC59AO2HpndmHhCkaj8NJus5etjMtBphOe9em7jmmfdQ7mLenKHbZ/CspHNl8yNPO9Qzpa/at2838x+RQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.4.7': - resolution: {integrity: sha512-nwrfERocUei9sxqd6URrWcEC3KDcTBD+beMerB9idvuzy4rcm5k1O1ClUlZ9pJOZn+vMN1tqZjLze4hJMT9STQ==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.4.7': - resolution: {integrity: sha512-d5T8Z/axAml8FTA+T9RS2mwJDNIbSSz5jcEiWaGuKVDIoSZib2HpMvnMydOGsIrmjfS1Z4ZhdAawivPhAZ3M8Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.4.7': - resolution: {integrity: sha512-I7a9sUxB+z+UCf6KudqrQH/RgLal/S+E+t4uBdbggycLyJe7WvBgPrQlcN5UpEuD9YC2PJ0CN6kgD6ARStg+pg==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': ^0.5.0 - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.5': - resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/accepts@1.3.7': resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} - '@types/async@3.2.24': - resolution: {integrity: sha512-8iHVLHsCCOBKjCF2KwFe0p9Z3rfM9mL+sSP8btyR5vTjJRAqpBYD28/ZLgXPf0pjG1VxOvtCV/BgXkQbpSe8Hw==} + '@types/async@3.2.25': + resolution: {integrity: sha512-O6Th/DI18XjrL9TX8LO9F/g26qAz5vynmQqlXt/qLGrskvzCKXKc5/tATz3G2N6lM8eOf3M8/StB14FncAmocg==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/content-disposition@0.5.8': - resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + '@types/content-disposition@0.5.9': + resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} - '@types/cookie@0.4.1': - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cookie-parser@1.4.10': + resolution: {integrity: sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==} + peerDependencies: + '@types/express': '*' '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - '@types/cookies@0.9.0': - resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} + '@types/cookies@0.9.1': + resolution: {integrity: sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==} - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/express-serve-static-core@4.17.43': - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/ejs@3.1.5': + resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/formidable@3.4.5': - resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + + '@types/express-session@1.18.2': + resolution: {integrity: sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/formidable@3.4.6': + resolution: {integrity: sha512-LI4Hk+KNsM5q7br4oMVoaWeb+gUqJpz1N8+Y2Q6Cz9cVH33ybahRKUWaRmMboVlkwSbOUGgwc/pEkS7yMSzoWg==} '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -1457,17 +1898,20 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-assert@1.5.5': - resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + '@types/http-assert@1.5.6': + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/jquery@3.5.33': + resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} - '@types/jsdom@21.1.6': - resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + + '@types/jsdom@27.0.0': + resolution: {integrity: sha512-NZyFl/PViwKzdEkQg96gtnB8wm+1ljhdDay9ahn4hgb+SfVtPCbm3TlmDUFXTA+MGN3CijicnMhG18SI5H3rFw==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1475,8 +1919,11 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.6': - resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + '@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==} @@ -1484,89 +1931,94 @@ packages: '@types/koa-compose@3.2.8': resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} - '@types/koa@2.15.0': - resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/koa@3.0.0': + resolution: {integrity: sha512-MOcVYdVYmkSutVHZZPh8j3+dAjLyR5Tl59CN0eKgpkE1h/LBSmPAsQQuWs+bKu7WtGNn+hKfJH9Gzml+PulmDg==} - '@types/linkify-it@3.0.5': - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} '@types/lockfile@1.0.4': resolution: {integrity: sha512-Q8oFIHJHr+htLrTXN2FuZfg+WXVHQRwU/hC2GpUu+Q8e3FUM9EDkS2pE3R2AO1ZGu56f479ybdMCNF1DAu8cAQ==} - '@types/lodash.clonedeep@4.5.9': - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/lodash@4.14.202': - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/markdown-it@14.0.1': - resolution: {integrity: sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==} - - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - - '@types/mdurl@1.0.5': - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/mime-types@3.0.1': + resolution: {integrity: sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - '@types/mocha@10.0.6': - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node-fetch@2.6.11': - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node@25.0.9': + resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==} - '@types/node@20.12.7': - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + '@types/oidc-provider@9.5.0': + resolution: {integrity: sha512-eEzCRVTSqIHD9Bo/qRJ4XQWQ5Z/zBcG+Z2cGJluRsSuWx1RJihqRyPxhIEpMXTwPzHYRTQkVp7hwisQOwzzSAg==} - '@types/oidc-provider@8.4.4': - resolution: {integrity: sha512-+SlmKc4qlCJLjpw6Du/8cXw18JsPEYyQwoy+xheLkiuNsCz1mPEYI/lRXLQHvfJD9TH6+2/WDTLZQ2UUJ5G4bw==} - - '@types/prop-types@15.7.11': - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.2.25': - resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 - '@types/react@18.2.79': - resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + '@types/react@19.2.8': + resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - '@types/sinon@17.0.3': - resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/sinonjs__fake-timers@8.1.1': - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/superagent@8.1.3': - resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + '@types/sinon@21.0.0': + resolution: {integrity: sha512-+oHKZ0lTI+WVLxx1IbJDNmReQaIsQJjN2e7UUrJHEeByG7bFeKJYsv1E75JxTQ9QKJDp21bAa/0W2Xo4srsDnw==} - '@types/supertest@6.0.2': - resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + '@types/sinonjs__fake-timers@15.0.1': + resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} + + '@types/sizzle@2.3.9': + resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==} + + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} + + '@types/swagger-ui-express@4.1.8': + resolution: {integrity: sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==} '@types/tar@6.1.13': resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} @@ -1574,20 +2026,23 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/underscore@1.11.15': - resolution: {integrity: sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g==} + '@types/underscore@1.13.0': + resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==} - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/url-join@4.0.3': resolution: {integrity: sha512-3l1qMm3wqO0iyC5gkADzT95UVW7C/XXcdvUcShOideKF0ddgVRErEQQJXBd2kvQm+aSgqhBGHGB38TgMeT57Ww==} - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/eslint-plugin@7.7.0': - resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1597,8 +2052,16 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.7.0': - resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + '@typescript-eslint/eslint-plugin@8.53.1': + resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.53.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1607,12 +2070,35 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.7.0': - resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + '@typescript-eslint/parser@8.53.1': + resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.53.1': + resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.7.0': - resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + '@typescript-eslint/scope-manager@8.53.1': + resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.53.1': + resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1621,12 +2107,23 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.7.0': - resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + '@typescript-eslint/type-utils@8.53.1': + resolution: {integrity: sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.7.0': - resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + '@typescript-eslint/types@8.53.1': + resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1634,89 +2131,212 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.7.0': - resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + '@typescript-eslint/typescript-estree@8.53.1': + resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.7.0': - resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + '@typescript-eslint/utils@8.53.1': + resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/visitor-keys@8.53.1': + resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react-swc@3.6.0': - resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} - peerDependencies: - vite: ^4 || ^5 + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@5.0.4': - resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} - engines: {node: ^18.0.0 || >=20.0.0} + '@unrs/resolver-binding-darwin-arm64@1.3.3': + resolution: {integrity: sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.3.3': + resolution: {integrity: sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.3.3': + resolution: {integrity: sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3': + resolution: {integrity: sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3': + resolution: {integrity: sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.3.3': + resolution: {integrity: sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.3.3': + resolution: {integrity: sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3': + resolution: {integrity: sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.3.3': + resolution: {integrity: sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.3.3': + resolution: {integrity: sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.3.3': + resolution: {integrity: sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.3.3': + resolution: {integrity: sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.3.3': + resolution: {integrity: sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.3.3': + resolution: {integrity: sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.3.3': + resolution: {integrity: sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-react@5.1.2': + resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitejs/plugin-vue@6.0.2': + resolution: {integrity: sha512-iHmwV3QcVGGvSC1BG5bZ4z6iwa1SOpAPWmnjOErd4Ske+lZua5K9TtAVdx0gMBClJ28DViCbSmZitjWZsWO3LA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.4.23': - resolution: {integrity: sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==} + '@vitest/expect@4.0.17': + resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} - '@vue/compiler-dom@3.4.23': - resolution: {integrity: sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==} - - '@vue/compiler-sfc@3.4.23': - resolution: {integrity: sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==} - - '@vue/compiler-ssr@3.4.23': - resolution: {integrity: sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==} - - '@vue/devtools-api@7.0.27': - resolution: {integrity: sha512-BFCFCusSDcw2UcOFD/QeK7OxD1x2C/m+uAN30Q7jLKECSW53hmz0urzJmX834GuWDZX/hIxkyUKnLLfEIP1c/w==} - - '@vue/devtools-kit@7.0.27': - resolution: {integrity: sha512-/A5xM38pPCFX5Yhl/lRFAzjyK6VNsH670nww2WbjFKWqlu3I+lMxWKzQkCW6A1V8bduITgl2kHORfg2gTw6QaA==} + '@vitest/mocker@4.0.17': + resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} peerDependencies: - vue: ^3.0.0 + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - '@vue/devtools-shared@7.0.27': - resolution: {integrity: sha512-4VxtmZ6yjhiSloqZZq2UYU0TBGxOJ8GxWvp5OlAH70zYqi0FIAyWGPkOhvfoZ7DKQyv2UU0mmKzFHjsEkelGyQ==} + '@vitest/pretty-format@4.0.17': + resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} - '@vue/reactivity@3.4.23': - resolution: {integrity: sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==} + '@vitest/runner@4.0.17': + resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} - '@vue/runtime-core@3.4.23': - resolution: {integrity: sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==} + '@vitest/snapshot@4.0.17': + resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} - '@vue/runtime-dom@3.4.23': - resolution: {integrity: sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==} + '@vitest/spy@4.0.17': + resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} - '@vue/server-renderer@3.4.23': - resolution: {integrity: sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==} + '@vitest/utils@4.0.17': + resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} + + '@vue/compiler-core@3.5.25': + resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} + + '@vue/compiler-dom@3.5.25': + resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} + + '@vue/compiler-sfc@3.5.25': + resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} + + '@vue/compiler-ssr@3.5.25': + resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} + + '@vue/devtools-api@8.0.5': + resolution: {integrity: sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/reactivity@3.5.25': + resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} + + '@vue/runtime-core@3.5.25': + resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} + + '@vue/runtime-dom@3.5.25': + resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} + + '@vue/server-renderer@3.5.25': + resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} peerDependencies: - vue: 3.4.23 + vue: 3.5.25 - '@vue/shared@3.4.23': - resolution: {integrity: sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==} + '@vue/shared@3.5.25': + resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} - '@vueuse/core@10.9.0': - resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} - - '@vueuse/integrations@10.9.0': - resolution: {integrity: sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==} + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' + vue: ^3.5.0 + + '@vueuse/integrations@14.1.0': + resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 peerDependenciesMeta: async-validator: optional: true @@ -1743,32 +2363,38 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@10.9.0': - resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} - '@vueuse/shared@10.9.0': - resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} ajv-formats@2.1.1: @@ -1782,28 +2408,25 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1811,54 +2434,55 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.3: - resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} - array.prototype.findlastindex@1.2.4: - resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1867,8 +2491,11 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + babel-plugin-react-compiler@19.1.0-rc.3: + resolution: {integrity: sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1880,6 +2507,10 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + hasBin: true + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -1887,66 +2518,68 @@ packages: bath-es5@3.0.3: resolution: {integrity: sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} binary-search@1.3.6: resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + birpc@2.8.0: + resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + engines: {node: '>=18'} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -1957,15 +2590,15 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001597: - resolution: {integrity: sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==} + caniuse-lite@1.0.30001761: + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1977,35 +2610,30 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -2016,9 +2644,6 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -2029,6 +2654,10 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -2036,28 +2665,31 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-parser@1.4.6: - resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} + cookie-parser@1.4.7: + resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} engines: {node: '>= 0.8.0'} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.4.1: - resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -2066,37 +2698,53 @@ packages: resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} engines: {node: '>= 0.8'} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} + engines: {node: '>=20'} + hasBin: true - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cssstyle@5.3.5: + resolution: {integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag==} + engines: {node: '>=20'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} date-format@4.0.14: resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} @@ -2118,8 +2766,26 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + 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'} peerDependencies: supports-color: '*' @@ -2131,12 +2797,8 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} @@ -2144,10 +2806,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2186,6 +2844,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -2195,12 +2857,12 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -2211,8 +2873,12 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -2225,76 +2891,86 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.703: - resolution: {integrity: sha512-094ZZC4nHXPKl/OwPinSMtLN9+hoFkdfQGKnvXbY+3WEAYtVDpz9UhJIViiY6Zb8agvqxiaJzNG9M+pRZWvSZw==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} - engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.5: + resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - es-abstract@1.22.4: - resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -2313,8 +2989,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.1.2: - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' @@ -2326,15 +3002,21 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + eslint-import-resolver-typescript@3.10.0: + resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2354,13 +3036,13 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-cypress@2.15.1: - resolution: {integrity: sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w==} + eslint-plugin-cypress@2.15.2: + resolution: {integrity: sha512-CtcFEQTDKyftpI22FVGpx8bkpKyYXBlNge6zSo0pl5/qJvBAnzaD76Vu2AsP16d6mTj478Ldn2mhgrWV+Xr0vQ==} peerDependencies: eslint: '>= 3.2.1' - eslint-plugin-es-x@7.5.0: - resolution: {integrity: sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -2371,18 +3053,18 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-plugin-mocha@10.3.0: - resolution: {integrity: sha512-IWzbg2K6B1Q7h37Ih4zMyW+nhmw1JvUlHlbCUUUu6PfOOAUGCB0gxmvv7/U+TQQ6e8yHUv+q7KMdIIum4bx+PA==} + eslint-plugin-mocha@10.5.0: + resolution: {integrity: sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==} engines: {node: '>=14.0.0'} peerDependencies: eslint: '>=7.0.0' @@ -2398,29 +3080,29 @@ packages: peerDependencies: eslint: '>=2.0.0' - eslint-plugin-promise@6.1.1: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.6: - resolution: {integrity: sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==} + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} peerDependencies: - eslint: '>=7' + eslint: '>=8.40' - eslint-plugin-you-dont-need-lodash-underscore@6.13.0: - resolution: {integrity: sha512-6FkFLp/R/QlgfJl5NrxkIXMQ36jMVLczkWDZJvMd7/wr/M3K0DS7mtX7plZ3giTDcbDD7VBfNYUfUVaBCZOXKA==} + eslint-plugin-you-dont-need-lodash-underscore@6.14.0: + resolution: {integrity: sha512-3zkkU/O1agczP7szJGHmisZJS/AknfVl6mb0Zqoc95dvFsdmfK+cbhrn+Ffy0UWB1pgDJwQr7kIO3rPstWs3Dw==} engines: {node: '>=4.0'} - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-utils@3.0.0: @@ -2437,21 +3119,22 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.0.0: - resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: @@ -2459,8 +3142,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -2474,40 +3157,43 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eta@3.4.0: - resolution: {integrity: sha512-tCsc7WXTjrTx4ZjYLplcqrI3o4mYJ+Z6YspeuGL8tbt/hHoMchwBwtKfwM09svEY86iRapY93vUqQttcNuIO5Q==} - engines: {node: '>=6.0.0'} + eta@4.5.0: + resolution: {integrity: sha512-qifAYjuW5AM1eEEIsFnOwB+TGqu6ynU3OKj9WbUTOtUBHFPZqL03XUW34kbp3zm19Ald+U8dEyRXaVsUck+Y1g==} + engines: {node: '>=20'} etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - etherpad-cli-client@3.0.2: - resolution: {integrity: sha512-3uJxz8cx1WSVAPe7haqfwQj4N4wWDrei5BXBjH+e1BLPiEpqWtnMX29Qo9jWhqO9ctyPPHO0nZ1x/ZCNxMVCqA==} + etherpad-cli-client@3.0.5: + resolution: {integrity: sha512-MVApVJUXWWpwjQP4sd9aihCu24LTlEE05AX6Jsh0mAt1hVG/Jh0QGQGs7LG3+SpfIsnVs5B2NfBaZBdKfRJ9iQ==} engines: {node: '>=18.0.0'} hasBin: true - etherpad-require-kernel@1.0.16: - resolution: {integrity: sha512-Zym7acX8tsB0mjZmQgcHnx9W+8djpFGeSA6/LhbKEGALaoaKBxCH/QQwJmsqfbvfYQBEg+NbUfDp9gD8QVjhsg==} - engines: {node: '>=12.13.0'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} - etherpad-yajsml@0.0.12: - resolution: {integrity: sha512-lVCqsZYpFsuIz417h+O83I7eadNXJ3MnQavriFa52/KTwj6xPAzEYr0PvH7KTxcqyAFtW7ItoTNVXe2h7zGxlw==} - engines: {node: '>=12.13.0'} - - express-rate-limit@7.2.0: - resolution: {integrity: sha512-T7nul1t4TNyfZMJ7pKRKkdeVJWa2CqB8NA1P8BwYaoDI5QSBZARv5oMS43J7b7I5P+4asjVXjb7ONuwDKucahg==} + express-rate-limit@8.2.1: + resolution: {integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==} engines: {node: '>= 16'} peerDependencies: - express: 4 || 5 || ^5.0.0-beta.1 + express: '>= 4.11' - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + express-session@1.18.2: + resolution: {integrity: sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==} + engines: {node: '>= 0.8.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2515,8 +3201,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2528,8 +3214,28 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fetch-blob@4.0.0: + resolution: {integrity: sha512-nPmnhRmpNMjYWnp9EBMGs6z5lq9RXed5W1vuZcECrsDVQInM8AMQSooVb3X183Aole60adzjWbH9qlRFWzDDTA==} + engines: {node: '>=16.7'} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -2538,13 +3244,13 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -2561,14 +3267,14 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - focus-trap@7.5.4: - resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + focus-trap@7.6.6: + resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2576,22 +3282,29 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} - formidable@3.5.1: - resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -2601,14 +3314,14 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -2617,9 +3330,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2633,8 +3343,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2648,27 +3358,27 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} glob-parent@5.1.2: @@ -2679,13 +3389,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -2695,20 +3401,17 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2716,12 +3419,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -2730,66 +3430,68 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} hast-util-embedded@3.0.0: resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} - - hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -2801,67 +3503,67 @@ packages: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - i18next-browser-languagedetector@7.2.1: - resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} + i18next-browser-languagedetector@8.2.0: + resolution: {integrity: sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==} - i18next@23.11.2: - resolution: {integrity: sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==} + i18next@25.7.4: + resolution: {integrity: sha512-hRkpEblXXcXSNbw8mBNq9042OEetgyB/ahc/X17uV/khPwzV+uB8RHceHh3qavyrkPJvmXFKXME2Sy1E0KjAfw==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.7.1: + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} engines: {node: '>=0.10.0'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} @@ -2871,71 +3573,81 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-observable@2.1.0: - resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} - engines: {node: '>=8'} - is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -2954,31 +3666,52 @@ packages: is-promise@1.0.1: resolution: {integrity: sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2986,13 +3719,16 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true - jose@5.2.4: - resolution: {integrity: sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==} + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} @@ -3005,34 +3741,30 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - canvas: ^2.11.2 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -3067,18 +3799,19 @@ packages: jsonschema@1.2.4: resolution: {integrity: sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==} - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} kebab-case@1.0.2: resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} @@ -3086,6 +3819,7 @@ packages: keygrip@1.1.0: resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} engines: {node: '>= 0.6'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3093,13 +3827,9 @@ packages: koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa@2.15.2: - resolution: {integrity: sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + koa@3.1.1: + resolution: {integrity: sha512-KDDuvpfqSK0ZKEO2gCPedNjl5wYpfj+HNiuVRlbhd1A88S3M0ySkdf2V/EJ4NWt5dwh5PXCdcenrKK2IQJAxsg==} + engines: {node: '>= 18'} languages4translatewiki@0.1.3: resolution: {integrity: sha512-Z7+IM3FF+VyRbWl2CPWQoRf498zGy/qnolP5wJhMny4W3v0SL9rUCIPDHPao9rrw2yg2KIKnHIzopuWvGdnooQ==} @@ -3108,11 +3838,78 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - live-plugin-manager@0.20.0: - resolution: {integrity: sha512-b8qcfHQNe3SgVKNZv/AUfOIpAUz/7VmNw/wcFyljN4toeSfXmatlHIUTvHhmknw7zMbXNFMGcWtk2Tw8y35Z7Q==} + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + live-plugin-manager@1.1.0: + resolution: {integrity: sha512-2rPHP2H5EDtGzsOYbMaaKA/XgEBKEmiTHNaPIu7xn8Qygv2MAT8D3WobVy3dftwWcCUG2kFukb4UtNWsd8gi6Q==} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -3124,9 +3921,6 @@ packages: lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -3162,57 +3956,52 @@ packages: resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} engines: {node: '>=8.0'} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.372.0: - resolution: {integrity: sha512-0cKdqmilHXWUwWAWnf6CrrjHD8YaqPMtLrmEHXolZusNTr9epULCsiJwIOHk2q1yFxdEwd96D4zShlAj67UJdA==} + lucide-react@0.562.0: + resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} measured-core@2.0.0: resolution: {integrity: sha512-SIzGtX1WGDvR59FqcJaGEAqDueBvLBh6W4T/gQaHr5ufcqvQkUHGcfQhlmq77mkeF5Mo+UpD+8hm69CwUVibGw==} engines: {node: '>= 5.12'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -3222,64 +4011,55 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -3297,8 +4077,12 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -3315,9 +4099,9 @@ packages: mocha-froth@0.2.10: resolution: {integrity: sha512-xyJqAYtm2zjrkG870hjeSVvGgS4Dc9tRokmN6R7XLgBKhdtAJ1ytU6zL045djblfHaPyTkSerQU4wqcjsv7Aew==} - mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} + mocha@11.7.5: + resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true mock-json-schema@1.1.1: @@ -3326,19 +4110,16 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.6: - resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true @@ -3349,27 +4130,25 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-fetch-commonjs@3.3.2: + resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} nodeify@1.0.1: resolution: {integrity: sha512-n7C2NyEze8GCo/z73KdbjRsBiLbv6eBn1FxwYKQ23IqGo7pQY3mhQan61Sv7eEDJCiyUjTVrVkXTzJCo1dW7Aw==} @@ -3378,69 +4157,59 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - - nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.groupby@1.0.2: - resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} - - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - observable-fns@0.6.1: - resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} - oidc-provider@8.4.5: - resolution: {integrity: sha512-2NsPrvIAX1W4ZR41cGbz2Lt2Ci8iXvECh+x+LcKcM115s/h8iB1pwnNlCdIrvAA2iBGM4/TkO75Xg7xb2FCzWA==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - oidc-token-hash@5.0.3: - resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} - engines: {node: ^10.13.0 || >=12.0.0} + oidc-provider@9.6.0: + resolution: {integrity: sha512-CCRUYPOumEy/DT+L86H40WgXjXfDHlsJYZdyd4ZKGFxJh/kAd7DxMX3dwpbX0g+WjB+NWU+kla1b/yZmHNcR0Q==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - openapi-backend@5.10.6: - resolution: {integrity: sha512-vTjBRys/O4JIHdlRHUKZ7pxS+gwIJreAAU9dvYRFrImtPzQ5qxm5a6B8BTVT9m6I8RGGsShJv35MAc3Tu2/y/A==} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + openapi-backend@5.15.0: + resolution: {integrity: sha512-yox0nCv511YWUeBNCdKY6xmUB92yEN+N9rHO4BHA5GOAZaNtY+zzuftAdfEwIbCsCcvZJ9ysENCguqBg+hLlWw==} engines: {node: '>=12.0.0'} openapi-schema-validation@0.4.2: @@ -3455,13 +4224,13 @@ packages: optional-js@2.3.0: resolution: {integrity: sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} @@ -3471,24 +4240,30 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} pac-resolver@7.0.1: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -3505,95 +4280,94 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - playwright-core@1.43.1: - resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} - engines: {node: '>=16'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + playwright-core@1.57.0: + resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} + engines: {node: '>=18'} hasBin: true - playwright@1.43.1: - resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} - engines: {node: '>=16'} + playwright@1.57.0: + resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} + engines: {node: '>=18'} hasBin: true - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.20.1: - resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + promise@1.3.0: resolution: {integrity: sha512-R9WrbTF3EPkVtWjp7B7umQGVndpsi+rsDAfrR4xAALQpFLa/+2OriecLhawxzvii2gd9+DZFwROWDuUUaqS5yA==} - property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + 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==} engines: {node: '>= 0.10'} - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - quick-lru@7.0.0: - resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + quick-lru@7.3.0: + resolution: {integrity: sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==} engines: {node: '>=18'} rambda@7.5.0: @@ -3610,106 +4384,135 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - rate-limiter-flexible@5.0.0: - resolution: {integrity: sha512-ivCyLBwPtR5IRrz+aZnztVwX16ZK3iAjdlW21I/vjHq56at5Zb8eIefDzODg8R7hwPOHpBtb6Pj9Zdmn0nRb8g==} + rate-limiter-flexible@9.0.1: + resolution: {integrity: sha512-sO+QdoGPCxroi4VkO2FIVjfUGuexhRkBc9ROHqu5eVEEz+oPHzQqvCc25ajFfMUBosbNGb6qpNa8xmxH9YNZsg==} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: - react: ^18.2.0 + react: ^19.2.3 - react-hook-form@7.51.3: - resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} - engines: {node: '>=12.22.0'} + react-hook-form@7.71.1: + resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react: ^16.8.0 || ^17 || ^18 || ^19 - react-i18next@14.1.0: - resolution: {integrity: sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==} + react-i18next@16.5.3: + resolution: {integrity: sha512-fo+/NNch37zqxOzlBYrWMx0uy/yInPkRfjSuy4lqKdaecR17nvCHnEUt3QyzA8XjQ2B/0iW/5BhaHR3ZmukpGw==} peerDependencies: - i18next: '>= 23.2.3' + i18next: '>= 25.6.2' react: '>= 16.8.0' react-dom: '*' react-native: '*' + typescript: ^5 peerDependenciesMeta: react-dom: optional: true react-native: optional: true + typescript: + optional: true - react-remove-scroll-bar@2.3.5: - resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - react-router-dom@6.22.3: - resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} - engines: {node: '>=14.0.0'} + react-router-dom@7.12.0: + resolution: {integrity: sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==} + engines: {node: '>=20.0.0'} peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react: '>=18' + react-dom: '>=18' - react-router@6.22.3: - resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} - engines: {node: '>=14.0.0'} + react-router@7.12.0: + resolution: {integrity: sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==} + engines: {node: '>=20.0.0'} peerDependencies: - react: '>=16.8' + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true - react-style-singleton@2.2.1: - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - rehype-minify-whitespace@6.0.0: - resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} - rehype@13.0.1: - resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rehype-minify-whitespace@6.0.2: + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -3719,12 +4522,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3732,41 +4529,157 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + rolldown-vite@7.2.10: + resolution: {integrity: sha512-v2ekZjuVLfumjp1Cr7LSQM1n2oOo3+gMruhOgT0Q4/cQ2J3nkTDLTAWLQQ86UHMbFYyVIN1wGh8BEZbvjkyctg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + esbuild: ^0.25.0 + 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 + 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 + + rolldown@1.0.0-beta.53: + resolution: {integrity: sha512-Qd9c2p0XKZdgT5AYd+KgAMggJ8ZmCs3JnS9PTMWkyUfteKlfmKtxJbWTHkVakxwXs1Ub7jrRYVeFeF7N0sQxyw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.0: - resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + rusty-store-kv-darwin-arm64@1.3.1: + resolution: {integrity: sha512-xJ4kZh22AcNkbl5yIxUFPEZ5xtgOfAn9fH1rcLf0pUHJKTh3FsdrggBqNBlBlJRQ9RWw92MYBSC318mn8mH14Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + rusty-store-kv-darwin-x64@1.3.1: + resolution: {integrity: sha512-glm0uEKaetb6QBtfe5G7tsXA+tnkBCMDaxb3XCe9oCx3Pr7gR/we6OS9lPJHplaQPp10hGxOn7kjAqLVDlcT3w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + rusty-store-kv-freebsd-x64@1.3.1: + resolution: {integrity: sha512-LWUD+JFvrUlo34XfEsTf29EPsktxqqbGlUHAN/6q5DUjg/s5sBFB2W+C1xlwkD+BumyIkN60ZCRVIoXS2UgJjg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + rusty-store-kv-linux-arm-gnueabihf@1.3.1: + resolution: {integrity: sha512-Stpor+kqRZg9ykYLjAJn0YrXfgH96WmTcS1AKeHs6gBhVMJ2RZmn1CyF06g5wVQ7sQGrZWMm8Hp3PGjhM5Z2Ew==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + rusty-store-kv-linux-arm64-gnu@1.3.1: + resolution: {integrity: sha512-ZorAn0AumVbL/6kqswhB/vnLEwlSBMvnhDF6LApHhFTRIygq63dyRrwtM8hgEqL/cjOMotGft6INn429V0RWcw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + rusty-store-kv-linux-arm64-musl@1.3.1: + resolution: {integrity: sha512-QMNbq7G1Zr2Yk82XqGbs7z2X2gs9mO5lxnHXeHLSy++56EUBTW/zj4JSjdYdetnFBkGwlPSQLAs1s0MXefxc0g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + rusty-store-kv-linux-x64-gnu@1.3.1: + resolution: {integrity: sha512-aD6Oj3PlRzLLcIMytTdzkh/mIu0pJjsug2tA8Gfd5lH2SdB6NFVrF/cjrFWgx5LSLcmI+vVpstqjLOIuc3tZ7g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + rusty-store-kv-linux-x64-musl@1.3.1: + resolution: {integrity: sha512-oSkE6X96muX0cbhE754s7shfzEzUTDQi5d3xrNlA/VskWRjDwKmrqiLHLsxO9lamNcDi5wvK8O6byI9qBXigRg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + rusty-store-kv-win32-arm64-msvc@1.3.1: + resolution: {integrity: sha512-HIJ2uJt5LzI/Flx73gnZX/tUfOH2EKS1UKMEzzMF8kqor3iSeGyr0NkLxdl0sZ31dZzRkW63bKxTESmIYjTgiQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + rusty-store-kv-win32-x64-msvc@1.3.1: + resolution: {integrity: sha512-CY1pmACrPg1mgfWPk7/dtB24TGc0RWv34+8Eg2lXbD6V7ePSMOVeVcIH7ra/JIjxbJJV2ljWvhkgUnEnp1FSKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + rusty-store-kv@1.3.1: + resolution: {integrity: sha512-Kk+55VwQ5qLWcSD6R0RrxFOEF70SH7BjYj60MCskJvRkuY7MFlAPEn3hY4WzRodWXj5cCOJ4AsDr+4OvtaW/SQ==} + engines: {node: '>= 10'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safer-buffer@2.1.2: @@ -3776,8 +4689,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} security@1.0.0: resolution: {integrity: sha512-5qfoAgfRWS1sUn+fUJtdbbqM1BD/LoQGa+smPTDjf9OqHyuJqi6ewtbYL0+V1S1RaU6OCOCMWGZocIfz2YK4uw==} @@ -3786,33 +4699,40 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} - set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + set-cookie-parser@3.0.1: + resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -3824,18 +4744,37 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.3.0: - resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} + shiki@3.17.0: + resolution: {integrity: sha512-lUZfWsyW7czITYTdo/Tb6ZM4VfyXlzmKYBQBjTz+pBzPPkP08RgIt00Ls1Z50Cl3SfwJsue6WbJeF3UgqLVI9Q==} - side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - sinon@17.0.1: - resolution: {integrity: sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sinon@21.0.1: + resolution: {integrity: sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw==} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -3845,39 +4784,33 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + socket.io-adapter@2.5.6: + resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} - socket.io-adapter@2.5.4: - resolution: {integrity: sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==} - - socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} engines: {node: '>=10.0.0'} - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} engines: {node: '>=10.0.0'} - socket.io@4.7.5: - resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + socket.io@4.8.3: + resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.3: - resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.1: - resolution: {integrity: sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==} + 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.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3895,14 +4828,23 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} @@ -3911,23 +4853,33 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} - stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3936,17 +4888,17 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} - supertest@6.3.4: - resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} - engines: {node: '>=6.4.0'} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supertest@7.2.2: + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.0'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -3960,46 +4912,56 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - swagger-schema-official@2.0.0-bab6bed: resolution: {integrity: sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==} + swagger-ui-dist@5.20.6: + resolution: {integrity: sha512-q/1dwcCOQb+qsNkb+1VWRdGEEVdBtOTH4vv9rICjPwJXOwq/JSRkBbuEMjMe161Oxsp589+8Ff5nE4HTPLWIAw==} + + swagger-ui-express@5.0.1: + resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} + engines: {node: '>= v0.10.32'} + peerDependencies: + express: '>=4.0.0 || >=5.0.0-beta' + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me - terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} - engines: {node: '>=10'} - hasBin: true + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - threads@1.7.0: - resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} - - tiny-worker@2.3.0: - resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinycon@0.6.8: resolution: {integrity: sha512-bF8Lxm4JUXF6Cw0XlZdugJ44GV575OinZ0Pt8vQPr8ooNqd2yyNkoFdCHzmdpHlgoqfSLfcyk4HDP1EyllT+ug==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -4009,16 +4971,13 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4026,24 +4985,30 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - tsx@4.7.2: - resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -4055,65 +5020,74 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.1: - resolution: {integrity: sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - ueberdb2@4.2.63: - resolution: {integrity: sha512-5zmp6vkBNcfRbhXG623pgHtdhbxNi2B4d8PqLXPa65hC8vdWJrjPQbldpl9Y49LuUF7n50k+nOuseVKAeTkgyA==} + ueberdb2@5.0.23: + resolution: {integrity: sha512-nUz6WqulBI+YHjPd6lOpT1s7pJODS73oNhkTmvxsy38SVmwWQT9obq0e7ySUpn/9rCCcxcB46Hjvl+PpdqcKgQ==} engines: {node: '>=16.20.1'} uid-safe@2.1.5: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} - underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + 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==} + unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -4122,10 +5096,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4138,8 +5108,11 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + unrs-resolver@1.3.3: + resolution: {integrity: sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4150,119 +5123,191 @@ packages: url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - use-callback-ref@1.3.1: - resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - use-sidecar@1.1.2: - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-static-copy@1.0.3: - resolution: {integrity: sha512-hBCCz6T0uNI3oF5oJ/Ju73rhoR+ADrJ2iLAea5+wA7kpQ8clYgY8BD+GL0w0BrqsYCbgBITOByBP/3y9Y+h93A==} + vite-plugin-babel@1.4.1: + resolution: {integrity: sha512-quO+viHGSv1cjbfhbeiMZ7SZpo8P29NiUh9LJfKhpmIDwy0THRiTRUbanBbkNcZcSyHFgp1n7TByd1C2kanqLQ==} + peerDependencies: + '@babel/core': ^7.0.0 + vite: ^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + vite-plugin-static-copy@3.1.5: + resolution: {integrity: sha512-9pbZn9Vb+uUNg/Tr/f2MXmGvfSfLeWjscS4zTA3v+sWqKN+AjJ/ipTFwaqdopJkNkxG5DfgYrZXD80ljbNDxbg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - vite-plugin-svgr@4.2.0: - resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} - peerDependencies: - vite: ^2.6.0 || 3 || 4 || 5 - - vite@5.2.9: - resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.2.6: + resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.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 + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitepress@1.1.3: - resolution: {integrity: sha512-hGrIYN0w9IHWs0NQSnlMjKV/v/HLfD+Ywv5QdvCSkiT32mpNOOwUrZjnqZv/JL/WBPpUc94eghTUvmipxw0xrA==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.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 + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress@2.0.0-alpha.15: + resolution: {integrity: sha512-jhjSYd10Z6RZiKOa7jy0xMVf5NB5oSc/lS3bD/QoUc6V8PrvQR5JhC9104NEt6+oTGY/ftieVWxY9v7YI+1IjA==} 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.0.17: + resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} + 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.0.17 + '@vitest/browser-preview': 4.0.17 + '@vitest/browser-webdriverio': 4.0.17 + '@vitest/ui': 4.0.17 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} - vue-demi@0.14.7: - resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - - vue@3.4.23: - resolution: {integrity: sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==} + vue@3.5.25: + resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4276,33 +5321,36 @@ packages: web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} - which-typed-array@1.1.14: - resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4310,30 +5358,31 @@ packages: engines: {node: '>= 8'} hasBin: true - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4344,8 +5393,9 @@ packages: utf-8-validate: optional: true - wtfnode@0.9.2: - resolution: {integrity: sha512-AzGy/MOGmzufyHDKHwuZeuqaqslGIPuwxDAhdmUUJ91Ak22Ynxry8quXNR/cZZIaSs5T+C+LNS3W9AcMzJXhMw==} + wtfnode@0.10.1: + resolution: {integrity: sha512-4mcHdlvcdSytsbFueN6QYZxmh5K7REawBk//ZOrJrtVOe548Qsq4GNEm/OUfZATqDnsX4g8uBbzmN7NdEZx09Q==} + engines: {node: '>=0.10.0'} hasBin: true xml-name-validator@5.0.0: @@ -4355,8 +5405,8 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} y18n@5.0.8: @@ -4369,33 +5419,39 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - ylru@1.3.2: - resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} - engines: {node: '>= 4.0.0'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zustand@4.5.2: - resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} - engines: {node: '>=12.7.0'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@types/react': '>=16.8' + zod: ^3.25.0 || ^4.0.0 + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + + zustand@5.0.10: + resolution: {integrity: sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' immer: '>=9.0.6' - react: '>=16.8' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' peerDependenciesMeta: '@types/react': optional: true @@ -4403,472 +5459,542 @@ packages: optional: true react: optional: true + use-sync-external-store: + optional: true zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} + '@acemir/cssom@0.9.30': {} - '@algolia/autocomplete-core@1.9.3(algoliasearch@4.22.1)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(algoliasearch@4.22.1) - '@algolia/autocomplete-shared': 1.9.3(algoliasearch@4.22.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.9.3(algoliasearch@4.22.1)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(algoliasearch@4.22.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.9.3(algoliasearch@4.22.1)': - dependencies: - '@algolia/autocomplete-shared': 1.9.3(algoliasearch@4.22.1) - algoliasearch: 4.22.1 - - '@algolia/autocomplete-shared@1.9.3(algoliasearch@4.22.1)': - dependencies: - algoliasearch: 4.22.1 - - '@algolia/cache-browser-local-storage@4.22.1': - dependencies: - '@algolia/cache-common': 4.22.1 - - '@algolia/cache-common@4.22.1': {} - - '@algolia/cache-in-memory@4.22.1': - dependencies: - '@algolia/cache-common': 4.22.1 - - '@algolia/client-account@4.22.1': - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 - - '@algolia/client-analytics@4.22.1': - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - - '@algolia/client-common@4.22.1': - dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - - '@algolia/client-personalization@4.22.1': - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - - '@algolia/client-search@4.22.1': - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - - '@algolia/logger-common@4.22.1': {} - - '@algolia/logger-console@4.22.1': - dependencies: - '@algolia/logger-common': 4.22.1 - - '@algolia/requester-browser-xhr@4.22.1': - dependencies: - '@algolia/requester-common': 4.22.1 - - '@algolia/requester-common@4.22.1': {} - - '@algolia/requester-node-http@4.22.1': - dependencies: - '@algolia/requester-common': 4.22.1 - - '@algolia/transporter@4.22.1': - dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@apidevtools/json-schema-ref-parser@11.1.0': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 - '@types/lodash.clonedeep': 4.5.9 js-yaml: 4.1.0 - lodash.clonedeep: 4.5.0 - '@babel/code-frame@7.23.5': + '@asamuzakjp/css-color@4.1.1': dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.4 - '@babel/compat-data@7.23.5': {} - - '@babel/core@7.24.0': + '@asamuzakjp/dom-selector@6.7.6': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0) - '@babel/helpers': 7.24.0 - '@babel/parser': 7.24.4 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.4 + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': + '@babel/generator@7.28.5': dependencies: - '@babel/types': 7.24.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-globals@7.28.0': {} - '@babel/helper-function-name@7.23.0': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 - - '@babel/helper-hoist-variables@7.22.5': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-module-imports@7.22.15': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - - '@babel/helper-simple-access@7.22.5': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-split-export-declaration@7.22.6': - dependencies: - '@babel/types': 7.24.0 - - '@babel/helper-string-parser@7.23.4': {} - - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/helper-validator-option@7.23.5': {} - - '@babel/helpers@7.24.0': - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.0 - '@babel/types': 7.24.0 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/highlight@7.23.4': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - '@babel/parser@7.24.4': - dependencies: - '@babel/types': 7.24.0 - - '@babel/runtime@7.24.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.24.0': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - - '@babel/traverse@7.24.0': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/types@7.24.0': - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + '@babel/helper-plugin-utils@7.27.1': {} - '@docsearch/css@3.6.0': {} + '@babel/helper-string-parser@7.27.1': {} - '@docsearch/js@3.6.0': + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': dependencies: - '@docsearch/react': 3.6.0 - preact: 10.20.1 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.27.6': {} + + '@babel/runtime@7.28.4': {} + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights + - supports-color - '@docsearch/react@3.6.0': + '@babel/types@7.28.4': dependencies: - '@algolia/autocomplete-core': 1.9.3(algoliasearch@4.22.1) - '@algolia/autocomplete-preset-algolia': 1.9.3(algoliasearch@4.22.1) - '@docsearch/css': 3.6.0 - algoliasearch: 4.22.1 - transitivePeerDependencies: - - '@algolia/client-search' + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - '@esbuild/aix-ppc64@0.19.12': - optional: true - - '@esbuild/aix-ppc64@0.20.2': - optional: true - - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm64@0.20.2': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-arm@0.20.2': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/android-x64@0.20.2': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.20.2': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.20.2': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.20.2': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.20.2': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.20.2': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-arm@0.20.2': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.20.2': - optional: true - - '@esbuild/linux-loong64@0.19.12': - optional: true - - '@esbuild/linux-loong64@0.20.2': - optional: true - - '@esbuild/linux-mips64el@0.19.12': - optional: true - - '@esbuild/linux-mips64el@0.20.2': - optional: true - - '@esbuild/linux-ppc64@0.19.12': - optional: true - - '@esbuild/linux-ppc64@0.20.2': - optional: true - - '@esbuild/linux-riscv64@0.19.12': - optional: true - - '@esbuild/linux-riscv64@0.20.2': - optional: true - - '@esbuild/linux-s390x@0.19.12': - optional: true - - '@esbuild/linux-s390x@0.20.2': - optional: true - - '@esbuild/linux-x64@0.19.12': - optional: true - - '@esbuild/linux-x64@0.20.2': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.20.2': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.20.2': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.20.2': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.20.2': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.20.2': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@esbuild/win32-x64@0.20.2': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@9.0.0)': + '@babel/types@7.28.5': dependencies: - eslint: 9.0.0 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.22': {} + + '@csstools/css-tokenizer@3.0.4': {} + + '@docsearch/css@4.3.2': {} + + '@docsearch/js@4.3.2': + dependencies: + htm: 3.1.1 + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@epic-web/invariant@1.0.0': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.1': + optional: true + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.1': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.1': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.1': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.1': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.1': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.1': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.1': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.1': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.1': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.1': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.1': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.1': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.1': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.1': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.1': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.1': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.1': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.1': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.1': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.1': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.1': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.1': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.1': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.1': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': + dependencies: + eslint: 9.39.2 + eslint-visitor-keys: 3.4.3 - '@eslint/eslintrc@3.0.2': + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 10.0.1 + debug: 4.4.3(supports-color@8.1.1) + espree: 10.4.0 globals: 14.0.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.0.0': {} + '@eslint/js@9.39.2': {} - '@etherpad/express-session@1.18.2': - dependencies: - cookie: 0.4.2 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - on-headers: 1.0.2 - parseurl: 1.3.3 - safe-buffer: 5.2.1 - uid-safe: 2.1.5 - transitivePeerDependencies: - - supports-color + '@eslint/object-schema@2.1.7': {} - '@humanwhocodes/config-array@0.12.3': + '@eslint/plugin-kit@0.4.1': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@exodus/bytes@1.6.0': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} - '@jridgewell/gen-mapping@0.3.5': + '@iconify-json/simple-icons@1.2.60': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@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/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/source-map@0.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jsdevtools/ono@7.1.3': {} @@ -4876,16 +6002,32 @@ snapshots: dependencies: vary: 1.1.2 - '@koa/router@12.0.1': + '@koa/router@15.1.1(koa@3.1.1)': dependencies: - debug: 4.3.4(supports-color@8.1.1) - http-errors: 2.0.0 + debug: 4.4.3(supports-color@8.1.1) + http-errors: 2.0.1 + koa: 3.1.1 koa-compose: 4.1.0 - methods: 1.1.2 - path-to-regexp: 6.2.1 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.0': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4896,851 +6038,1152 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 - '@playwright/test@1.43.1': + '@nolyfill/is-core-module@1.0.39': {} + + '@opentelemetry/api@1.9.0': {} + + '@oxc-project/runtime@0.101.0': {} + + '@oxc-project/types@0.101.0': {} + + '@paralleldrive/cuid2@2.2.2': dependencies: - playwright: 1.43.1 + '@noble/hashes': 1.8.0 - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.24.0 - - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-context@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - aria-hidden: 1.2.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.79)(react@18.2.0) - - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-id@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-slot@1.0.2(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-use-size@1.0.1(@types/react@18.2.79)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0) - '@types/react': 18.2.79 - react: 18.2.0 - - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.24.0 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.79 - '@types/react-dom': 18.2.25 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@remix-run/router@1.15.3': {} - - '@rollup/pluginutils@5.1.0': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - - '@rollup/rollup-android-arm-eabi@4.13.0': + '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm64@4.13.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.13.0': - optional: true - - '@rollup/rollup-darwin-x64@4.13.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.13.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.13.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.13.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.13.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.13.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.13.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.13.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.13.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.13.0': - optional: true - - '@rushstack/eslint-patch@1.7.2': {} - - '@shikijs/core@1.3.0': {} - - '@shikijs/transformers@1.3.0': + '@playwright/test@1.57.0': dependencies: - shiki: 1.3.0 + playwright: 1.57.0 - '@sindresorhus/is@5.6.0': {} + '@radix-ui/primitive@1.1.3': {} - '@sinonjs/commons@2.0.0': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - type-detect: 4.0.8 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-context@1.1.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.8)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.1(@types/react@19.2.8)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-id@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.8)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.8)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.8)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.8 + + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 + '@types/react-dom': 19.2.3(@types/react@19.2.8) + + '@rolldown/binding-android-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.53': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.53': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.53': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.53': + dependencies: + '@napi-rs/wasm-runtime': 1.1.0 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.50': {} + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.55.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.11.0': {} + + '@scarf/scarf@1.4.0': {} + + '@shikijs/core@3.17.0': + dependencies: + '@shikijs/types': 3.17.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.17.0': + dependencies: + '@shikijs/types': 3.17.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.17.0': + dependencies: + '@shikijs/types': 3.17.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.17.0': + dependencies: + '@shikijs/types': 3.17.0 + + '@shikijs/themes@3.17.0': + dependencies: + '@shikijs/types': 3.17.0 + + '@shikijs/transformers@3.17.0': + dependencies: + '@shikijs/core': 3.17.0 + '@shikijs/types': 3.17.0 + + '@shikijs/types@3.17.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@11.2.2': + '@sinonjs/fake-timers@15.1.0': dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/samsam@8.0.0': + '@sinonjs/samsam@8.0.3': dependencies: - '@sinonjs/commons': 2.0.0 - lodash.get: 4.4.2 - type-detect: 4.0.8 + '@sinonjs/commons': 3.0.1 + type-detect: 4.1.0 - '@sinonjs/text-encoding@0.7.2': {} + '@socket.io/component-emitter@3.1.2': {} - '@socket.io/component-emitter@3.1.0': {} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - - '@svgr/babel-preset@8.1.0(@babel/core@7.24.0)': - dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.0) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.0) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.0) - - '@svgr/core@8.1.0(typescript@5.4.5)': - dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.24.0) - camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.4.5) - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@svgr/hast-util-to-babel-ast@8.0.0': - dependencies: - '@babel/types': 7.24.0 - entities: 4.5.0 - - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0)': - dependencies: - '@babel/core': 7.24.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.24.0) - '@svgr/core': 8.1.0(typescript@5.4.5) - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - - '@swc/core-darwin-arm64@1.4.7': - optional: true - - '@swc/core-darwin-x64@1.4.7': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.4.7': - optional: true - - '@swc/core-linux-arm64-gnu@1.4.7': - optional: true - - '@swc/core-linux-arm64-musl@1.4.7': - optional: true - - '@swc/core-linux-x64-gnu@1.4.7': - optional: true - - '@swc/core-linux-x64-musl@1.4.7': - optional: true - - '@swc/core-win32-arm64-msvc@1.4.7': - optional: true - - '@swc/core-win32-ia32-msvc@1.4.7': - optional: true - - '@swc/core-win32-x64-msvc@1.4.7': - optional: true - - '@swc/core@1.4.7': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.5 - optionalDependencies: - '@swc/core-darwin-arm64': 1.4.7 - '@swc/core-darwin-x64': 1.4.7 - '@swc/core-linux-arm-gnueabihf': 1.4.7 - '@swc/core-linux-arm64-gnu': 1.4.7 - '@swc/core-linux-arm64-musl': 1.4.7 - '@swc/core-linux-x64-gnu': 1.4.7 - '@swc/core-linux-x64-musl': 1.4.7 - '@swc/core-win32-arm64-msvc': 1.4.7 - '@swc/core-win32-ia32-msvc': 1.4.7 - '@swc/core-win32-x64-msvc': 1.4.7 - - '@swc/counter@0.1.3': {} - - '@swc/types@0.1.5': {} - - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 + '@standard-schema/spec@1.1.0': {} '@tootallnate/quickjs-emscripten@0.23.0': {} + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/accepts@1.3.7': dependencies: - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/async@3.2.24': {} + '@types/async@3.2.25': {} - '@types/body-parser@1.19.5': + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.12.7 + '@types/node': 25.0.9 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/connect@3.4.38': dependencies: - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/content-disposition@0.5.8': {} + '@types/content-disposition@0.5.9': {} - '@types/cookie@0.4.1': {} + '@types/cookie-parser@1.4.10(@types/express@5.0.6)': + dependencies: + '@types/express': 5.0.6 '@types/cookiejar@2.1.5': {} - '@types/cookies@0.9.0': + '@types/cookies@0.9.1': dependencies: '@types/connect': 3.4.38 - '@types/express': 4.17.21 + '@types/express': 5.0.6 '@types/keygrip': 1.0.6 - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/cors@2.8.17': + '@types/cors@2.8.19': dependencies: - '@types/node': 20.12.7 + '@types/node': 25.0.9 + + '@types/cross-spawn@6.0.6': + dependencies: + '@types/node': 25.0.9 '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 - '@types/estree@1.0.5': {} + '@types/deep-eql@4.0.2': {} - '@types/express-serve-static-core@4.17.43': + '@types/ejs@3.1.5': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 20.12.7 - '@types/qs': 6.9.11 + '@types/node': 25.0.9 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 1.2.1 - '@types/express@4.17.21': + '@types/express-session@1.18.2': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 + '@types/express': 5.0.6 - '@types/formidable@3.4.5': + '@types/express@5.0.6': dependencies: - '@types/node': 20.12.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 2.2.0 + + '@types/formidable@3.4.6': + dependencies: + '@types/node': 25.0.9 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.12.7 + '@types/node': 25.0.9 '@types/hast@3.0.4': dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 - '@types/http-assert@1.5.5': {} + '@types/http-assert@1.5.6': {} - '@types/http-cache-semantics@4.0.4': {} + '@types/http-errors@2.0.5': {} - '@types/http-errors@2.0.4': {} - - '@types/jsdom@21.1.6': + '@types/jquery@3.5.33': dependencies: - '@types/node': 20.12.7 + '@types/sizzle': 2.3.9 + + '@types/js-cookie@3.0.6': {} + + '@types/jsdom@27.0.0': + dependencies: + '@types/node': 25.0.9 '@types/tough-cookie': 4.0.5 - parse5: 7.1.2 + parse5: 7.3.0 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.6': + '@types/jsonminify@0.4.3': {} + + '@types/jsonwebtoken@9.0.10': dependencies: - '@types/node': 20.12.7 + '@types/ms': 2.1.0 + '@types/node': 25.0.9 '@types/keygrip@1.0.6': {} '@types/koa-compose@3.2.8': dependencies: - '@types/koa': 2.15.0 + '@types/koa': 3.0.0 - '@types/koa@2.15.0': + '@types/koa@3.0.0': dependencies: '@types/accepts': 1.3.7 - '@types/content-disposition': 0.5.8 - '@types/cookies': 0.9.0 - '@types/http-assert': 1.5.5 - '@types/http-errors': 2.0.4 + '@types/content-disposition': 0.5.9 + '@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.8 - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/linkify-it@3.0.5': {} + '@types/linkify-it@5.0.0': {} '@types/lockfile@1.0.4': {} - '@types/lodash.clonedeep@4.5.9': + '@types/markdown-it@14.1.2': dependencies: - '@types/lodash': 4.14.202 + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 - '@types/lodash@4.14.202': {} - - '@types/markdown-it@14.0.1': + '@types/mdast@4.0.4': dependencies: - '@types/linkify-it': 3.0.5 - '@types/mdurl': 1.0.5 + '@types/unist': 3.0.3 - '@types/mdast@4.0.3': - dependencies: - '@types/unist': 3.0.2 - - '@types/mdurl@1.0.5': {} + '@types/mdurl@2.0.0': {} '@types/methods@1.1.4': {} + '@types/mime-types@3.0.1': {} + '@types/mime@1.3.5': {} - '@types/mime@3.0.4': {} + '@types/mocha@10.0.10': {} - '@types/mocha@10.0.6': {} + '@types/ms@2.1.0': {} - '@types/ms@0.7.34': {} - - '@types/node-fetch@2.6.11': + '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.12.7 - form-data: 4.0.0 + '@types/node': 25.0.9 + form-data: 4.0.4 - '@types/node@20.12.7': + '@types/node@25.0.9': dependencies: - undici-types: 5.26.5 + undici-types: 7.16.0 - '@types/oidc-provider@8.4.4': + '@types/oidc-provider@9.5.0': dependencies: - '@types/koa': 2.15.0 - '@types/node': 20.12.7 + '@types/keygrip': 1.0.6 + '@types/koa': 3.0.0 + '@types/node': 25.0.9 - '@types/prop-types@15.7.11': {} - - '@types/qs@6.9.11': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.2.25': + '@types/react-dom@19.2.3(@types/react@19.2.8)': dependencies: - '@types/react': 18.2.79 + '@types/react': 19.2.8 - '@types/react@18.2.79': + '@types/react@19.2.8': dependencies: - '@types/prop-types': 15.7.11 - csstype: 3.1.3 + csstype: 3.2.3 - '@types/semver@7.5.8': {} + '@types/semver@7.7.1': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/serve-static@1.15.5': + '@types/send@1.2.1': dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.12.7 + '@types/node': 25.0.9 - '@types/sinon@17.0.3': + '@types/serve-static@1.15.7': dependencies: - '@types/sinonjs__fake-timers': 8.1.1 + '@types/http-errors': 2.0.5 + '@types/node': 25.0.9 + '@types/send': 0.17.4 - '@types/sinonjs__fake-timers@8.1.1': {} + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 25.0.9 - '@types/superagent@8.1.3': + '@types/sinon@21.0.0': + dependencies: + '@types/sinonjs__fake-timers': 15.0.1 + + '@types/sinonjs__fake-timers@15.0.1': {} + + '@types/sizzle@2.3.9': {} + + '@types/superagent@8.1.9': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.12.7 + '@types/node': 25.0.9 + form-data: 4.0.4 - '@types/supertest@6.0.2': + '@types/supertest@6.0.3': dependencies: '@types/methods': 1.1.4 - '@types/superagent': 8.1.3 + '@types/superagent': 8.1.9 + + '@types/swagger-ui-express@4.1.8': + dependencies: + '@types/express': 5.0.6 + '@types/serve-static': 1.15.7 '@types/tar@6.1.13': dependencies: - '@types/node': 20.12.7 + '@types/node': 25.0.9 minipass: 4.2.8 '@types/tough-cookie@4.0.5': {} - '@types/underscore@1.11.15': {} + '@types/underscore@1.13.0': {} - '@types/unist@3.0.2': {} + '@types/unist@3.0.3': {} '@types/url-join@4.0.3': {} - '@types/web-bluetooth@0.0.20': {} + '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5)': + '@types/whatwg-mimetype@3.0.2': {} + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 9.0.0 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.39.2 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 9.0.0 - typescript: 5.4.5 + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.53.1(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.1 + '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.1(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.1 + eslint: 9.39.2 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.7.0': + '@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 - - '@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 9.0.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.7.0': {} - - '@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5)': + '@typescript-eslint/parser@8.53.1(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/visitor-keys': 7.7.0 - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/scope-manager': 8.53.1 + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.1 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/scope-manager@8.53.1': + dependencies: + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.53.1 + + '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@7.18.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.53.1(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.1(eslint@9.39.2)(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/types@8.53.1': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/types': 7.7.0 - '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) - eslint: 9.0.0 - semver: 7.6.0 + '@typescript-eslint/project-service': 8.53.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.53.1 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + eslint: 9.39.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.7.0': + '@typescript-eslint/utils@8.53.1(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.7.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.53.1 + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} - - '@vitejs/plugin-react-swc@3.6.0(vite@5.2.9)': + '@typescript-eslint/visitor-keys@8.53.1': dependencies: - '@swc/core': 1.4.7 - vite: 5.2.9 + '@typescript-eslint/types': 8.53.1 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-darwin-arm64@1.3.3': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.3.3': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.3.3': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.3.3': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.3.3': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.3.3': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.3.3': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.3.3': + optional: true + + '@vitejs/plugin-react@5.1.2(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.53 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0) transitivePeerDependencies: - - '@swc/helpers' + - supports-color - '@vitejs/plugin-vue@5.0.4(vite@5.2.9)(vue@3.4.23)': + '@vitejs/plugin-vue@6.0.2(vite@7.2.6(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0))(vue@3.5.25(typescript@5.9.3))': dependencies: - vite: 5.2.9 - vue: 3.4.23 + '@rolldown/pluginutils': 1.0.0-beta.50 + vite: 7.2.6(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0) + vue: 3.5.25(typescript@5.9.3) - '@vue/compiler-core@3.4.23': + '@vitest/expect@4.0.17': dependencies: - '@babel/parser': 7.24.4 - '@vue/shared': 3.4.23 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.17(vite@7.3.1(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.0.17 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0) + + '@vitest/pretty-format@4.0.17': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.17': + dependencies: + '@vitest/utils': 4.0.17 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.17': {} + + '@vitest/utils@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + tinyrainbow: 3.0.3 + + '@vue/compiler-core@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.25 entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.2.0 + source-map-js: 1.2.1 - '@vue/compiler-dom@3.4.23': + '@vue/compiler-dom@3.5.25': dependencies: - '@vue/compiler-core': 3.4.23 - '@vue/shared': 3.4.23 + '@vue/compiler-core': 3.5.25 + '@vue/shared': 3.5.25 - '@vue/compiler-sfc@3.4.23': + '@vue/compiler-sfc@3.5.25': dependencies: - '@babel/parser': 7.24.4 - '@vue/compiler-core': 3.4.23 - '@vue/compiler-dom': 3.4.23 - '@vue/compiler-ssr': 3.4.23 - '@vue/shared': 3.4.23 + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.25 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 estree-walker: 2.0.2 - magic-string: 0.30.8 - postcss: 8.4.38 - source-map-js: 1.2.0 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 - '@vue/compiler-ssr@3.4.23': + '@vue/compiler-ssr@3.5.25': dependencies: - '@vue/compiler-dom': 3.4.23 - '@vue/shared': 3.4.23 + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 - '@vue/devtools-api@7.0.27(vue@3.4.23)': + '@vue/devtools-api@8.0.5': dependencies: - '@vue/devtools-kit': 7.0.27(vue@3.4.23) - transitivePeerDependencies: - - vue + '@vue/devtools-kit': 8.0.5 - '@vue/devtools-kit@7.0.27(vue@3.4.23)': + '@vue/devtools-kit@8.0.5': dependencies: - '@vue/devtools-shared': 7.0.27 + '@vue/devtools-shared': 8.0.5 + birpc: 2.8.0 hookable: 5.5.3 mitt: 3.0.1 - perfect-debounce: 1.0.0 + perfect-debounce: 2.0.0 speakingurl: 14.0.1 - vue: 3.4.23 + superjson: 2.2.6 - '@vue/devtools-shared@7.0.27': + '@vue/devtools-shared@8.0.5': dependencies: - rfdc: 1.3.1 + rfdc: 1.4.1 - '@vue/reactivity@3.4.23': + '@vue/reactivity@3.5.25': dependencies: - '@vue/shared': 3.4.23 + '@vue/shared': 3.5.25 - '@vue/runtime-core@3.4.23': + '@vue/runtime-core@3.5.25': dependencies: - '@vue/reactivity': 3.4.23 - '@vue/shared': 3.4.23 + '@vue/reactivity': 3.5.25 + '@vue/shared': 3.5.25 - '@vue/runtime-dom@3.4.23': + '@vue/runtime-dom@3.5.25': dependencies: - '@vue/runtime-core': 3.4.23 - '@vue/shared': 3.4.23 - csstype: 3.1.3 + '@vue/reactivity': 3.5.25 + '@vue/runtime-core': 3.5.25 + '@vue/shared': 3.5.25 + csstype: 3.2.3 - '@vue/server-renderer@3.4.23(vue@3.4.23)': + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': dependencies: - '@vue/compiler-ssr': 3.4.23 - '@vue/shared': 3.4.23 - vue: 3.4.23 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.9.3) - '@vue/shared@3.4.23': {} + '@vue/shared@3.5.25': {} - '@vueuse/core@10.9.0(vue@3.4.23)': + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.9.0 - '@vueuse/shared': 10.9.0(vue@3.4.23) - vue-demi: 0.14.7(vue@3.4.23) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) - '@vueuse/integrations@10.9.0(focus-trap@7.5.4)(vue@3.4.23)': + '@vueuse/integrations@14.1.0(axios@1.13.2)(focus-trap@7.6.6)(jwt-decode@4.0.0)(vue@3.5.25(typescript@5.9.3))': dependencies: - '@vueuse/core': 10.9.0(vue@3.4.23) - '@vueuse/shared': 10.9.0(vue@3.4.23) - focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.23) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + axios: 1.13.2 + focus-trap: 7.6.6 + jwt-decode: 4.0.0 - '@vueuse/metadata@10.9.0': {} + '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@10.9.0(vue@3.4.23)': + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: - vue-demi: 0.14.7(vue@3.4.23) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + vue: 3.5.25(typescript@5.9.3) accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.3): + accepts@2.0.0: dependencies: - acorn: 8.11.3 + mime-types: 3.0.2 + negotiator: 1.0.0 - acorn@8.11.3: {} - - agent-base@7.1.0: + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color + acorn: 8.15.0 - agent-base@7.1.1: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color + acorn@8.15.0: {} - ajv-formats@2.1.1(ajv@8.12.0): - dependencies: - ajv: 8.12.0 + agent-base@7.1.3: {} + + agent-base@7.1.4: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 ajv@6.12.6: dependencies: @@ -5749,42 +7192,23 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - - algoliasearch@4.22.1: - dependencies: - '@algolia/cache-browser-local-storage': 4.22.1 - '@algolia/cache-common': 4.22.1 - '@algolia/cache-in-memory': 4.22.1 - '@algolia/client-account': 4.22.1 - '@algolia/client-analytics': 4.22.1 - '@algolia/client-common': 4.22.1 - '@algolia/client-personalization': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/logger-console': 4.22.1 - '@algolia/requester-browser-xhr': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/requester-node-http': 4.22.1 - '@algolia/transporter': 4.22.1 - - ansi-colors@4.1.1: {} ansi-regex@5.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.3: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -5792,193 +7216,187 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.3: + aria-hidden@1.2.6: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.4 + is-array-buffer: 3.0.5 - array-flatten@1.1.1: {} - - array-includes@3.1.7: + array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 array-union@2.1.0: {} - array.prototype.filter@1.0.3: + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - - array.prototype.findlastindex@1.2.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.2 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 asap@2.0.6: {} + assertion-error@2.0.1: {} + ast-types@0.13.4: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - async@3.2.5: {} + async-function@1.0.0: {} + + async@3.2.6: {} asynckit@0.4.0: {} available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 - axios@1.6.8: + axios@1.13.2: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.11 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + babel-plugin-react-compiler@19.1.0-rc.3: + dependencies: + '@babel/types': 7.28.4 + bail@2.0.2: {} balanced-match@1.0.2: {} base64id@2.0.0: {} + baseline-browser-mapping@2.9.11: {} + basic-ftp@5.0.5: {} bath-es5@3.0.3: {} - binary-extensions@2.2.0: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + binary-extensions@2.3.0: {} binary-search@1.3.6: {} - body-parser@1.20.2: + bintrees@1.0.2: {} + + birpc@2.8.0: {} + + body-parser@2.2.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + debug: 4.4.3(supports-color@8.1.1) + http-errors: 2.0.1 + iconv-lite: 0.7.0 on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 + qs: 6.14.0 + raw-body: 3.0.2 + type-is: 2.0.1 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 browser-stdout@1.3.1: {} - browserslist@4.23.0: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001597 - electron-to-chromium: 1.4.703 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001761 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} - builtin-modules@3.3.0: {} - builtins@5.0.1: + builtins@5.1.0: dependencies: - semver: 7.6.0 + semver: 7.7.3 bytes@3.1.2: {} - cache-content-type@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: - mime-types: 2.1.35 - ylru: 1.3.2 - - cacheable-lookup@7.0.0: {} - - cacheable-request@10.2.14: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.1 - responselike: 3.0.0 - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.1 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001597: {} + caniuse-lite@1.0.30001761: {} ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -5989,10 +7407,10 @@ snapshots: character-entities-legacy@3.0.0: {} - chokidar@3.5.3: + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6001,30 +7419,26 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@2.0.0: {} - clean-css@5.3.3: - dependencies: - source-map: 0.6.1 - - cliui@7.0.4: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - co@4.6.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: @@ -6033,8 +7447,6 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@2.20.3: {} - component-emitter@1.3.1: {} concat-map@0.0.1: {} @@ -6043,24 +7455,28 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.0.1: {} + content-type@1.0.5: {} convert-source-map@2.0.0: {} - cookie-parser@1.4.6: + cookie-parser@1.4.7: dependencies: - cookie: 0.4.1 + cookie: 0.7.2 cookie-signature: 1.0.6 cookie-signature@1.0.6: {} - cookie@0.4.1: {} + cookie-signature@1.0.7: {} - cookie@0.4.2: {} + cookie-signature@1.2.2: {} - cookie@0.5.0: {} + cookie@0.7.2: {} - cookie@0.6.0: {} + cookie@1.0.2: {} + + cookie@1.1.1: {} cookiejar@2.1.4: {} @@ -6069,37 +7485,63 @@ snapshots: depd: 2.0.0 keygrip: 1.1.0 + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6(typescript@5.4.5): + cross-env@10.1.0: dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.4.5 + '@epic-web/invariant': 1.0.0 + cross-spawn: 7.0.6 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - cssstyle@4.0.1: + css-tree@3.1.0: dependencies: - rrweb-cssom: 0.6.0 + mdn-data: 2.12.2 + source-map-js: 1.2.1 - csstype@3.1.3: {} + cssstyle@5.3.5: + dependencies: + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.22 + css-tree: 3.1.0 + + csstype@3.2.3: {} data-uri-to-buffer@6.0.2: {} - data-urls@5.0.0: + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 15.1.0 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 date-format@4.0.14: {} @@ -6111,30 +7553,33 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4(supports-color@8.1.1): + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: supports-color: 8.1.1 decamelize@4.0.0: {} - decimal.js@10.4.3: {} - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 + decimal.js@10.6.0: {} deep-equal@1.0.1: {} deep-is@0.1.4: {} - defer-to-connect@2.0.1: {} - define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -6162,6 +7607,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.1.1: {} + detect-node-es@1.1.0: {} devlop@1.1.0: @@ -6173,9 +7620,9 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 - diff@5.0.0: {} + diff@7.0.0: {} - diff@5.2.0: {} + diff@8.0.2: {} dir-glob@3.0.1: dependencies: @@ -6185,10 +7632,13 @@ snapshots: dependencies: esutils: 2.0.3 - dot-case@3.0.4: + dunder-proto@1.0.1: dependencies: - no-case: 3.0.4 - tslib: 2.6.2 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: dependencies: @@ -6198,177 +7648,219 @@ snapshots: ejs@3.1.10: dependencies: - jake: 10.8.7 + jake: 10.9.2 - electron-to-chromium@1.4.703: {} + electron-to-chromium@1.5.267: {} emoji-regex@8.0.0: {} - encodeurl@1.0.2: {} + emoji-regex@9.2.2: {} - engine.io-client@6.5.3: + encodeurl@2.0.0: {} + + engine.io-client@6.6.4: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.2 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@8.1.1) + engine.io-parser: 5.2.3 + ws: 8.18.3 + xmlhttprequest-ssl: 2.1.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - engine.io-parser@5.2.2: {} + engine.io-parser@5.2.3: {} - engine.io@6.5.4: + engine.io@6.6.5: dependencies: - '@types/cookie': 0.4.1 - '@types/cors': 2.8.17 - '@types/node': 20.12.7 + '@types/cors': 2.8.19 + '@types/node': 25.0.9 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) - engine.io-parser: 5.2.2 - ws: 8.11.0 + debug: 4.4.3(supports-color@8.1.1) + engine.io-parser: 5.2.3 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - enhanced-resolve@5.15.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - entities@4.5.0: {} - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 + entities@6.0.1: {} - es-abstract@1.22.4: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.1 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.0 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.1 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.14 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + 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.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 - es-array-method-boxes-properly@1.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-set-tostringtag@2.0.2: + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.1 + hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 - esbuild@0.19.12: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 - esbuild@0.20.2: + esbuild@0.27.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 - escalade@3.1.2: {} + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -6384,218 +7876,226 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.1.2(eslint@9.0.0): + eslint-compat-utils@0.5.1(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 + semver: 7.7.3 - eslint-config-etherpad@4.0.4(eslint@9.0.0)(typescript@5.4.5): + eslint-config-etherpad@4.0.4(eslint@9.39.2)(typescript@5.9.3): dependencies: - '@rushstack/eslint-patch': 1.7.2 - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) - eslint-plugin-cypress: 2.15.1(eslint@9.0.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.0.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) - eslint-plugin-mocha: 10.3.0(eslint@9.0.0) - eslint-plugin-n: 16.6.2(eslint@9.0.0) - eslint-plugin-prefer-arrow: 1.2.3(eslint@9.0.0) - eslint-plugin-promise: 6.1.1(eslint@9.0.0) - eslint-plugin-you-dont-need-lodash-underscore: 6.13.0 + '@rushstack/eslint-patch': 1.11.0 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@9.39.2) + eslint-plugin-cypress: 2.15.2(eslint@9.39.2) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.39.2) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.2) + eslint-plugin-mocha: 10.5.0(eslint@9.39.2) + eslint-plugin-n: 16.6.2(eslint@9.39.2) + eslint-plugin-prefer-arrow: 1.2.3(eslint@9.39.2) + eslint-plugin-promise: 6.6.0(eslint@9.39.2) + eslint-plugin-you-dont-need-lodash-underscore: 6.14.0 transitivePeerDependencies: - eslint - - eslint-import-resolver-node - eslint-import-resolver-webpack + - eslint-plugin-import-x - supports-color - typescript eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0): + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@9.39.2): dependencies: - debug: 4.3.4(supports-color@8.1.1) - enhanced-resolve: 5.15.0 - eslint: 9.0.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2 + get-tsconfig: 4.13.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.3.3 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.2) transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.2): dependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) debug: 3.2.7 - eslint: 9.0.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.7.0)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@9.39.2) transitivePeerDependencies: - supports-color - eslint-plugin-cypress@2.15.1(eslint@9.0.0): + eslint-plugin-cypress@2.15.2(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 globals: 13.24.0 - eslint-plugin-es-x@7.5.0(eslint@9.0.0): + eslint-plugin-es-x@7.8.0(eslint@9.39.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.10.0 - eslint: 9.0.0 - eslint-compat-utils: 0.1.2(eslint@9.0.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.2 + eslint-compat-utils: 0.5.1(eslint@9.39.2) - eslint-plugin-eslint-comments@3.2.0(eslint@9.0.0): + eslint-plugin-eslint-comments@3.2.0(eslint@9.39.2): dependencies: escape-string-regexp: 1.0.5 - eslint: 9.0.0 - ignore: 5.3.1 + eslint: 9.39.2 + ignore: 5.3.2 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.2): dependencies: - '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.5) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.4 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.0.0 + eslint: 9.39.2 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) - hasown: 2.0.1 - is-core-module: 2.13.1 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.39.2) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.2 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 semver: 6.3.1 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@9.39.2)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-mocha@10.3.0(eslint@9.0.0): + eslint-plugin-mocha@10.5.0(eslint@9.39.2): dependencies: - eslint: 9.0.0 - eslint-utils: 3.0.0(eslint@9.0.0) + eslint: 9.39.2 + eslint-utils: 3.0.0(eslint@9.39.2) + globals: 13.24.0 rambda: 7.5.0 - eslint-plugin-n@16.6.2(eslint@9.0.0): + eslint-plugin-n@16.6.2(eslint@9.39.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - builtins: 5.0.1 - eslint: 9.0.0 - eslint-plugin-es-x: 7.5.0(eslint@9.0.0) - get-tsconfig: 4.7.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + builtins: 5.1.0 + eslint: 9.39.2 + eslint-plugin-es-x: 7.8.0(eslint@9.39.2) + get-tsconfig: 4.13.0 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 is-builtin-module: 3.2.1 - is-core-module: 2.13.1 + is-core-module: 2.16.1 minimatch: 3.1.2 - resolve: 1.22.8 - semver: 7.6.0 + resolve: 1.22.11 + semver: 7.7.3 - eslint-plugin-prefer-arrow@1.2.3(eslint@9.0.0): + eslint-plugin-prefer-arrow@1.2.3(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 - eslint-plugin-promise@6.1.1(eslint@9.0.0): + eslint-plugin-promise@6.6.0(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 - eslint-plugin-react-hooks@4.6.0(eslint@9.0.0): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2): dependencies: - eslint: 9.0.0 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.39.2 + hermes-parser: 0.25.1 + zod: 4.1.12 + zod-validation-error: 4.0.2(zod@4.1.12) + transitivePeerDependencies: + - supports-color - eslint-plugin-react-refresh@0.4.6(eslint@9.0.0): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 - eslint-plugin-you-dont-need-lodash-underscore@6.13.0: + eslint-plugin-you-dont-need-lodash-underscore@6.14.0: dependencies: kebab-case: 1.0.2 - eslint-scope@8.0.1: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@9.0.0): + eslint-utils@3.0.0(eslint@9.39.2): dependencies: - eslint: 9.0.0 + eslint: 9.39.2 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.0.0: + eslint@9.39.2: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 3.0.2 - '@eslint/js': 9.0.0 - '@humanwhocodes/config-array': 0.12.3 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.0.1 - esquery: 1.5.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionator: 0.9.4 transitivePeerDependencies: - supports-color - esm@3.2.25: - optional: true - - espree@10.0.1: + espree@10.4.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 4.0.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -6607,64 +8107,75 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + esutils@2.0.3: {} - eta@3.4.0: {} + eta@4.5.0: {} etag@1.8.1: {} - etherpad-cli-client@3.0.2: + etherpad-cli-client@3.0.5: dependencies: - async: 3.2.5 - socket.io-client: 4.7.5 - superagent: 8.1.2 + async: 3.2.6 + socket.io-client: 4.8.3 + superagent: 10.3.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - etherpad-require-kernel@1.0.16: {} + expect-type@1.3.0: {} - etherpad-yajsml@0.0.12: - optionalDependencies: - mime: 1.6.0 - - express-rate-limit@7.2.0(express@4.19.2): + express-rate-limit@8.2.1(express@5.2.1): dependencies: - express: 4.19.2 + express: 5.2.1 + ip-address: 10.0.1 - express@4.19.2: + express-session@1.18.2: dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 + cookie: 0.7.2 + cookie-signature: 1.0.7 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + on-headers: 1.1.0 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + + express@5.2.1: + dependencies: + accepts: 2.0.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 + debug: 4.4.3(supports-color@8.1.1) + depd: 2.0.0 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 on-finished: 2.4.1 + once: 1.4.0 parseurl: 1.3.3 - path-to-regexp: 0.1.7 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.14.0 range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -6673,13 +8184,13 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -6687,9 +8198,24 @@ snapshots: fast-safe-stringify@2.1.1: {} - fastq@1.17.1: + fast-uri@3.0.6: {} + + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fetch-blob@4.0.0: + dependencies: + node-domexception: 1.0.0 file-entry-cache@8.0.0: dependencies: @@ -6699,19 +8225,18 @@ snapshots: dependencies: minimatch: 5.1.6 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@2.1.1: dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 + debug: 4.4.3(supports-color@8.1.1) + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -6724,55 +8249,61 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.2.9 + flatted: 3.3.3 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.2.9: {} + flatted@3.3.3: {} - focus-trap@7.5.4: + focus-trap@7.6.6: dependencies: - tabbable: 6.2.0 + tabbable: 6.3.0 - follow-redirects@1.15.6: {} + follow-redirects@1.15.11: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - form-data-encoder@2.1.4: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - formidable@2.1.2: + form-data@4.0.5: dependencies: - dezalgo: 1.0.4 - hexoid: 1.0.0 - once: 1.4.0 - qs: 6.11.2 + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 - formidable@3.5.1: + formdata-polyfill@4.0.10: dependencies: + fetch-blob: 3.2.0 + + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.2.2 dezalgo: 1.0.4 - hexoid: 1.0.0 once: 1.4.0 forwarded@0.2.0: {} fresh@0.5.2: {} - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 + fresh@2.0.0: {} - fs-extra@11.2.0: + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -6788,8 +8319,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs.realpath@1.0.0: {} - fsevents@2.3.2: optional: true @@ -6798,12 +8327,14 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.22.4 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -6811,34 +8342,41 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.1 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 get-nonce@1.0.1: {} - get-stream@6.0.1: {} - - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - get-tsconfig@4.7.2: + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.3: + get-uri@6.0.4: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) - fs-extra: 11.2.0 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -6850,15 +8388,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@8.1.0: + glob@10.4.5: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - globals@11.12.0: {} + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 globals@13.24.0: dependencies: @@ -6866,60 +8403,45 @@ snapshots: globals@14.0.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - got@13.0.0: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 + gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 - hasown@2.0.1: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -6928,96 +8450,85 @@ snapshots: '@types/hast': 3.0.4 hast-util-is-element: 3.0.0 - hast-util-from-html@2.0.1: + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 devlop: 1.1.0 - hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 - vfile: 6.0.1 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 vfile-message: 4.0.2 - hast-util-from-parse5@8.0.1: + hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.1 - vfile: 6.0.1 - vfile-location: 5.0.2 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 web-namespaces: 2.0.1 hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 - hast-util-raw@9.0.2: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-html@9.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 + stringify-entities: 4.0.4 zwitch: 2.0.4 hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 - hastscript@8.0.0: + hastscript@9.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 + property-information: 7.1.0 space-separated-tokens: 2.0.2 he@1.2.0: {} - hexoid@1.0.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 hookable@5.5.3: {} - html-encoding-sniffer@4.0.0: + htm@3.1.1: {} + + html-encoding-sniffer@6.0.0: dependencies: - whatwg-encoding: 3.1.1 + '@exodus/bytes': 1.6.0 + transitivePeerDependencies: + - '@exodus/crypto' html-parse-stringify@3.0.1: dependencies: @@ -7030,8 +8541,6 @@ snapshots: deep-equal: 1.0.1 http-errors: 1.8.1 - http-cache-semantics@4.1.1: {} - http-errors@1.8.1: dependencies: depd: 1.1.2 @@ -7040,74 +8549,66 @@ snapshots: statuses: 1.5.0 toidentifier: 1.0.1 - http-errors@2.0.0: + http-errors@2.0.1: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - http2-wrapper@2.2.1: + https-proxy-agent@7.0.6: dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@7.0.4: - dependencies: - agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - i18next-browser-languagedetector@7.2.1: + i18next-browser-languagedetector@8.2.0: dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.27.6 - i18next@23.11.2: + i18next@25.7.4(typescript@5.9.3): dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.28.4 + optionalDependencies: + typescript: 5.9.3 - iconv-lite@0.4.24: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.1: dependencies: safer-buffer: 2.1.2 - ignore@5.3.1: {} + ignore@5.3.2: {} - import-fresh@3.3.0: + ignore@7.0.5: {} + + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 imurmurhash@0.1.4: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.1 - side-channel: 1.0.5 + hasown: 2.0.2 + side-channel: 1.1.0 - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 + ip-address@10.0.1: {} ip-address@9.0.5: dependencies: @@ -7116,62 +8617,86 @@ snapshots: ipaddr.js@1.9.1: {} - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - - is-bigint@1.0.4: + is-async-function@2.1.1: dependencies: - has-bigints: 1.0.2 + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 + is-callable@1.2.7: {} - is-core-module@2.13.1: + is-core-module@2.16.1: dependencies: - hasown: 2.0.1 + hasown: 2.0.2 - is-date-object@1.0.5: + is-data-view@1.0.2: dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-negative-zero@2.0.3: {} + is-map@2.0.3: {} - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} - is-observable@2.1.0: {} - is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} @@ -7182,45 +8707,69 @@ snapshots: is-promise@1.0.1: {} - is-regex@1.1.4: + is-promise@4.0.0: {} + + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-shared-array-buffer@1.0.2: + is-symbol@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-string@1.0.7: + is-typed-array@1.1.15: dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.14 + which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} - is-weakref@1.0.2: + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-what@5.5.0: {} isarray@2.0.5: {} isexe@2.0.0: {} - jake@10.8.7: + jackspeak@3.4.3: dependencies: - async: 3.2.5 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - jose@5.2.4: {} + jose@6.1.3: {} js-cookie@3.0.5: {} @@ -7230,44 +8779,44 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsbn@1.1.0: {} - jsdom@24.0.0: + jsdom@27.4.0: dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 + '@acemir/cssom': 0.9.30 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.6.0 + cssstyle: 5.3.5 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 + parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 + webidl-conversions: 8.0.0 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.16.0 + whatwg-url: 15.1.0 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: + - '@exodus/crypto' - bufferutil - supports-color - utf-8-validate - jsesc@2.5.2: {} - - jsesc@3.0.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -7296,9 +8845,9 @@ snapshots: jsonschema@1.2.4: {} - jsonwebtoken@9.0.2: + jsonwebtoken@9.0.3: dependencies: - jws: 3.2.2 + jws: 4.0.1 lodash.includes: 4.3.0 lodash.isboolean: 3.0.3 lodash.isinteger: 4.0.4 @@ -7307,21 +8856,21 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.0 + semver: 7.7.3 - just-extend@6.2.0: {} - - jwa@1.4.1: + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - jws@3.2.2: + jws@4.0.1: dependencies: - jwa: 1.4.1 + jwa: 2.0.1 safe-buffer: 5.2.1 + jwt-decode@4.0.0: {} + kebab-case@1.0.2: {} keygrip@1.1.0: @@ -7334,38 +8883,26 @@ snapshots: koa-compose@4.1.0: {} - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa@2.15.2: + koa@3.1.1: dependencies: accepts: 1.3.8 - cache-content-type: 1.0.1 content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.3.4(supports-color@8.1.1) delegates: 1.0.0 - depd: 2.0.0 destroy: 1.2.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 fresh: 0.5.2 http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.0.10 + http-errors: 2.0.1 koa-compose: 4.1.0 - koa-convert: 2.0.0 + mime-types: 3.0.2 on-finished: 2.4.1 - only: 0.0.2 parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 + statuses: 2.0.2 + type-is: 2.0.1 vary: 1.1.2 - transitivePeerDependencies: - - supports-color languages4translatewiki@0.1.3: {} @@ -7374,27 +8911,75 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lines-and-columns@1.2.4: {} + lightningcss-android-arm64@1.30.2: + optional: true - live-plugin-manager@0.20.0: + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.1 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + live-plugin-manager@1.1.0: dependencies: '@types/debug': 4.1.12 '@types/fs-extra': 9.0.13 '@types/lockfile': 1.0.4 - '@types/node-fetch': 2.6.11 - '@types/semver': 7.5.8 + '@types/node-fetch': 2.6.12 + '@types/semver': 7.7.1 '@types/tar': 6.1.13 '@types/url-join': 4.0.3 - debug: 4.3.4(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: 2.7.0 - proxy-agent: 6.4.0 - semver: 7.6.0 + node-fetch-commonjs: 3.3.2 + proxy-agent: 6.5.0 + semver: 7.7.3 tar: 6.2.1 url-join: 4.0.1 transitivePeerDependencies: - - encoding - supports-color locate-path@6.0.0: @@ -7407,8 +8992,6 @@ snapshots: lodash.clonedeep@4.5.0: {} - lodash.get@4.4.2: {} - lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -7435,121 +9018,109 @@ snapshots: log4js@6.9.1: dependencies: date-format: 4.0.14 - debug: 4.3.4(supports-color@8.1.1) - flatted: 3.2.9 - rfdc: 1.3.1 + debug: 4.4.0 + flatted: 3.3.3 + rfdc: 1.4.1 streamroller: 3.1.5 transitivePeerDependencies: - supports-color - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 + lru-cache@10.4.3: {} - lower-case@2.0.2: - dependencies: - tslib: 2.6.2 - - lowercase-keys@3.0.0: {} - - lru-cache@10.2.0: {} + lru-cache@11.2.4: {} lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru-cache@7.18.3: {} - lucide-react@0.372.0(react@18.2.0): + lucide-react@0.562.0(react@19.2.3): dependencies: - react: 18.2.0 + react: 19.2.3 - magic-string@0.30.8: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 mark.js@8.11.1: {} - mdast-util-to-hast@13.1.0: + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - vfile: 6.0.1 + vfile: 6.0.3 + + mdn-data@2.12.2: {} measured-core@2.0.0: dependencies: binary-search: 1.3.6 optional-js: 2.3.0 - media-typer@0.3.0: {} + media-typer@1.1.0: {} - merge-descriptors@1.0.1: {} + merge-descriptors@2.0.0: {} merge2@1.4.1: {} methods@1.1.2: {} - micromark-util-character@2.1.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.2: {} - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 mime@2.6.0: {} - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} - minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 - - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -7561,7 +9132,9 @@ snapshots: minipass@5.0.0: {} - minisearch@6.3.0: {} + minipass@7.1.2: {} + + minisearch@7.2.0: {} minizlib@2.1.2: dependencies: @@ -7574,27 +9147,28 @@ snapshots: mocha-froth@0.2.10: {} - mocha@10.4.0: + mocha@11.7.5: dependencies: - ansi-colors: 4.1.1 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 8.1.0 + glob: 10.4.5 he: 1.2.0 + is-path-inside: 3.0.3 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 9.0.5 ms: 2.1.3 - serialize-javascript: 6.0.0 + picocolors: 1.1.1 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 + workerpool: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 yargs-unparser: 2.0.0 mock-json-schema@1.1.1: @@ -7603,38 +9177,28 @@ snapshots: ms@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} - nanoid@3.3.7: {} + nanoid@3.3.11: {} - nanoid@5.0.6: {} + nanoid@5.1.6: {} natural-compare@1.4.0: {} negotiator@0.6.3: {} + negotiator@1.0.0: {} + netmask@2.0.2: {} - nise@5.1.9: - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/text-encoding': 0.7.2 - just-extend: 6.2.0 - path-to-regexp: 6.2.1 + node-domexception@1.0.0: {} - no-case@3.0.4: + node-fetch-commonjs@3.3.2: dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-releases@2.0.14: {} + node-releases@2.0.27: {} nodeify@1.0.1: dependencies: @@ -7643,91 +9207,88 @@ snapshots: normalize-path@3.0.0: {} - normalize-url@8.0.1: {} - - nwsapi@2.2.7: {} - object-assign@4.1.1: {} - object-hash@3.0.0: {} - - object-inspect@1.13.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - object.fromentries@2.0.7: + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 - object.groupby@1.0.2: + object.groupby@1.0.3: dependencies: - array.prototype.filter: 1.0.3 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.22.4 - es-errors: 1.3.0 + es-abstract: 1.23.9 - object.values@1.1.7: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.1.1 - observable-fns@0.6.1: {} + obug@2.1.1: {} - oidc-provider@8.4.5: + oidc-provider@9.6.0: dependencies: '@koa/cors': 5.0.0 - '@koa/router': 12.0.1 - debug: 4.3.4(supports-color@8.1.1) - eta: 3.4.0 - got: 13.0.0 - jose: 5.2.4 - jsesc: 3.0.2 - koa: 2.15.2 - nanoid: 5.0.6 - object-hash: 3.0.0 - oidc-token-hash: 5.0.3 - quick-lru: 7.0.0 - raw-body: 2.5.2 + '@koa/router': 15.1.1(koa@3.1.1) + debug: 4.4.3(supports-color@8.1.1) + eta: 4.5.0 + jose: 6.1.3 + jsesc: 3.1.0 + koa: 3.1.1 + nanoid: 5.1.6 + quick-lru: 7.3.0 + raw-body: 3.0.2 transitivePeerDependencies: - supports-color - oidc-token-hash@5.0.3: {} - on-finished@2.4.1: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} + on-headers@1.1.0: {} once@1.4.0: dependencies: wrappy: 1.0.2 - only@0.0.2: {} + oniguruma-parser@0.12.1: {} - openapi-backend@5.10.6: + oniguruma-to-es@4.3.4: dependencies: - '@apidevtools/json-schema-ref-parser': 11.1.0 - ajv: 8.12.0 + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + openapi-backend@5.15.0: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.9.3 + ajv: 8.17.1 bath-es5: 3.0.3 - cookie: 0.5.0 + cookie: 1.0.2 dereference-json-schema: 0.2.1 lodash: 4.17.21 mock-json-schema: 1.1.1 openapi-schema-validator: 12.1.3 openapi-types: 12.1.3 - qs: 6.11.2 + qs: 6.14.0 openapi-schema-validation@0.4.2: dependencies: @@ -7737,8 +9298,8 @@ snapshots: openapi-schema-validator@12.1.3: dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) lodash.merge: 4.6.2 openapi-types: 12.1.3 @@ -7746,16 +9307,20 @@ snapshots: optional-js@2.3.0: {} - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 - p-cancelable@3.0.0: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 p-limit@3.1.0: dependencies: @@ -7765,16 +9330,18 @@ snapshots: dependencies: p-limit: 3.1.0 - pac-proxy-agent@7.0.1: + p-map@7.0.4: {} + + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.3 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + get-uri: 6.0.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 + https-proxy-agent: 7.0.6 pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.3 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -7783,20 +9350,19 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-json@5.2.0: + parse5@7.3.0: dependencies: - '@babel/code-frame': 7.23.5 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + entities: 6.0.1 - parse5@7.1.2: + parse5@8.0.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 parseurl@1.3.3: {} @@ -7806,83 +9372,87 @@ snapshots: path-parse@1.0.7: {} - path-to-regexp@0.1.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 - path-to-regexp@6.2.1: {} + path-to-regexp@8.3.0: {} path-type@4.0.0: {} - perfect-debounce@1.0.0: {} + pathe@2.0.3: {} - picocolors@1.0.0: {} + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} picomatch@2.3.1: {} - playwright-core@1.43.1: {} + picomatch@4.0.3: {} - playwright@1.43.1: + playwright-core@1.57.0: {} + + playwright@1.57.0: dependencies: - playwright-core: 1.43.1 + playwright-core: 1.57.0 optionalDependencies: fsevents: 2.3.2 - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss@8.4.38: + postcss@8.5.6: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - - preact@10.20.1: {} + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} + prom-client@15.1.3: + dependencies: + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + promise@1.3.0: dependencies: is-promise: 1.0.1 - property-information@6.4.1: {} + property-information@7.1.0: {} proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.4.0: + proxy-agent@6.5.0: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) + 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.4 + https-proxy-agent: 7.0.6 lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 + pac-proxy-agent: 7.2.0 proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.3 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color proxy-from-env@1.1.0: {} - psl@1.9.0: {} - punycode@2.3.1: {} - qs@6.11.0: + qs@6.14.0: dependencies: - side-channel: 1.0.5 + side-channel: 1.1.0 - qs@6.11.2: + qs@6.14.1: dependencies: - side-channel: 1.0.5 - - querystringify@2.2.0: {} + side-channel: 1.1.0 queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - - quick-lru@7.0.0: {} + quick-lru@7.3.0: {} rambda@7.5.0: {} @@ -7894,179 +9464,330 @@ snapshots: range-parser@1.2.1: {} - rate-limiter-flexible@5.0.0: {} + rate-limiter-flexible@9.0.1: {} - raw-body@2.5.2: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + http-errors: 2.0.1 + iconv-lite: 0.7.1 unpipe: 1.0.0 - react-dom@18.2.0(react@18.2.0): + react-dom@19.2.3(react@19.2.3): dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 19.2.3 + scheduler: 0.27.0 - react-hook-form@7.51.3(react@18.2.0): + react-hook-form@7.71.1(react@19.2.3): dependencies: - react: 18.2.0 + react: 19.2.3 - react-i18next@14.1.0(i18next@23.11.2)(react-dom@18.2.0)(react@18.2.0): + react-i18next@16.5.3(i18next@25.7.4(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3): dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.28.6 html-parse-stringify: 3.0.1 - i18next: 23.11.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + i18next: 25.7.4(typescript@5.9.3) + react: 19.2.3 + use-sync-external-store: 1.6.0(react@19.2.3) + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + typescript: 5.9.3 - react-remove-scroll-bar@2.3.5(@types/react@18.2.79)(react@18.2.0): - dependencies: - '@types/react': 18.2.79 - react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.2.0) - tslib: 2.6.2 + react-refresh@0.18.0: {} - react-remove-scroll@2.5.5(@types/react@18.2.79)(react@18.2.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.8)(react@19.2.3): dependencies: - '@types/react': 18.2.79 - react: 18.2.0 - react-remove-scroll-bar: 2.3.5(@types/react@18.2.79)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.79)(react@18.2.0) - tslib: 2.6.2 - use-callback-ref: 1.3.1(@types/react@18.2.79)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.79)(react@18.2.0) + react: 19.2.3 + react-style-singleton: 2.2.3(@types/react@19.2.8)(react@19.2.3) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): + react-remove-scroll@2.7.1(@types/react@19.2.8)(react@19.2.3): dependencies: - '@remix-run/router': 1.15.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.3(react@18.2.0) + react: 19.2.3 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.8)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.8)(react@19.2.3) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.8)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.2.8)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.8 - react-router@6.22.3(react@18.2.0): + react-router-dom@7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@remix-run/router': 1.15.3 - react: 18.2.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-router: 7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react-style-singleton@2.2.1(@types/react@18.2.79)(react@18.2.0): + react-router@7.12.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + cookie: 1.1.1 + react: 19.2.3 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + + react-style-singleton@2.2.3(@types/react@19.2.8)(react@19.2.3): dependencies: - '@types/react': 18.2.79 get-nonce: 1.0.1 - invariant: 2.2.4 - react: 18.2.0 - tslib: 2.6.2 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - react@18.2.0: - dependencies: - loose-envify: 1.4.0 + react@19.2.3: {} readdirp@3.6.0: dependencies: picomatch: 2.3.1 - regenerator-runtime@0.14.1: {} + readdirp@4.1.2: {} - regexp.prototype.flags@1.5.2: + readdirp@5.0.0: {} + + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 - rehype-minify-whitespace@6.0.0: + rehype-minify-whitespace@6.0.2: dependencies: '@types/hast': 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 + hast-util-minify-whitespace: 1.0.1 - rehype-parse@9.0.0: + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 - hast-util-from-html: 2.0.1 - unified: 11.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 - rehype-stringify@10.0.0: + rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 - hast-util-to-html: 9.0.0 - unified: 11.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 - rehype@13.0.1: + rehype@13.0.2: dependencies: '@types/hast': 3.0.4 - rehype-parse: 9.0.0 - rehype-stringify: 10.0.0 - unified: 11.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 require-directory@2.1.1: {} require-from-string@2.0.2: {} - requires-port@1.0.0: {} - - resolve-alpn@1.2.1: {} - resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.11: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@3.0.0: + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0): dependencies: - lowercase-keys: 3.0.0 - - reusify@1.0.4: {} - - rfdc@1.3.1: {} - - rollup@4.13.0: - dependencies: - '@types/estree': 1.0.5 + '@oxc-project/runtime': 0.101.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.30.2 + picomatch: 4.0.3 + postcss: 8.5.6 + rolldown: 1.0.0-beta.53 + tinyglobby: 0.2.15 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@types/node': 25.0.9 + esbuild: 0.25.12 + fsevents: 2.3.3 + tsx: 4.21.0 + + rolldown@1.0.0-beta.53: + dependencies: + '@oxc-project/types': 0.101.0 + '@rolldown/pluginutils': 1.0.0-beta.53 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.53 + '@rolldown/binding-darwin-x64': 1.0.0-beta.53 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.53 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.53 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.53 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.53 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.53 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.53 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.53 + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.0: + rusty-store-kv-darwin-arm64@1.3.1: + optional: true + + rusty-store-kv-darwin-x64@1.3.1: + optional: true + + rusty-store-kv-freebsd-x64@1.3.1: + optional: true + + rusty-store-kv-linux-arm-gnueabihf@1.3.1: + optional: true + + rusty-store-kv-linux-arm64-gnu@1.3.1: + optional: true + + rusty-store-kv-linux-arm64-musl@1.3.1: + optional: true + + rusty-store-kv-linux-x64-gnu@1.3.1: + optional: true + + rusty-store-kv-linux-x64-musl@1.3.1: + optional: true + + rusty-store-kv-win32-arm64-msvc@1.3.1: + optional: true + + rusty-store-kv-win32-x64-msvc@1.3.1: + optional: true + + rusty-store-kv@1.3.1: + optionalDependencies: + rusty-store-kv-darwin-arm64: 1.3.1 + rusty-store-kv-darwin-x64: 1.3.1 + rusty-store-kv-freebsd-x64: 1.3.1 + rusty-store-kv-linux-arm-gnueabihf: 1.3.1 + rusty-store-kv-linux-arm64-gnu: 1.3.1 + rusty-store-kv-linux-arm64-musl: 1.3.1 + rusty-store-kv-linux-x64-gnu: 1.3.1 + rusty-store-kv-linux-x64-musl: 1.3.1 + rusty-store-kv-win32-arm64-msvc: 1.3.1 + rusty-store-kv-win32-x64-msvc: 1.3.1 + + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 safer-buffer@2.1.2: {} @@ -8074,58 +9795,54 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.0: - dependencies: - loose-envify: 1.4.0 + scheduler@0.27.0: {} security@1.0.0: {} semver@6.3.1: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.7.3: {} - send@0.18.0: + send@1.2.0: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 + debug: 4.4.3(supports-color@8.1.1) + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@2.2.0: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 1.2.0 transitivePeerDependencies: - supports-color - set-cookie-parser@2.6.0: {} + set-cookie-parser@2.7.2: {} - set-function-length@1.2.1: + set-cookie-parser@3.0.1: {} + + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -8135,6 +9852,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} shebang-command@2.0.0: @@ -8143,99 +9866,121 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.3.0: + shiki@3.17.0: dependencies: - '@shikijs/core': 1.3.0 + '@shikijs/core': 3.17.0 + '@shikijs/engine-javascript': 3.17.0 + '@shikijs/engine-oniguruma': 3.17.0 + '@shikijs/langs': 3.17.0 + '@shikijs/themes': 3.17.0 + '@shikijs/types': 3.17.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - side-channel@1.0.5: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} signal-exit@3.0.7: {} - sinon@17.0.1: + signal-exit@4.1.0: {} + + sinon@21.0.1: dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/samsam': 8.0.0 - diff: 5.2.0 - nise: 5.1.9 + '@sinonjs/fake-timers': 15.1.0 + '@sinonjs/samsam': 8.0.3 + diff: 8.0.2 supports-color: 7.2.0 slash@3.0.0: {} smart-buffer@4.2.0: {} - snake-case@3.0.4: + socket.io-adapter@2.5.6: dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - - socket.io-adapter@2.5.4: - dependencies: - debug: 4.3.4(supports-color@8.1.1) - ws: 8.11.0 + debug: 4.4.3(supports-color@8.1.1) + ws: 8.18.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-client@4.7.5: + socket.io-client@4.8.3: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - engine.io-client: 6.5.3 - socket.io-parser: 4.2.4 + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@8.1.1) + engine.io-client: 6.6.4 + socket.io-parser: 4.2.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socket.io-parser@4.2.4: + socket.io-parser@4.2.5: dependencies: - '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - socket.io@4.7.5: + socket.io@4.8.3: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) - engine.io: 6.5.4 - socket.io-adapter: 2.5.4 - socket.io-parser: 4.2.4 + debug: 4.4.3(supports-color@8.1.1) + engine.io: 6.6.5 + socket.io-adapter: 2.5.6 + socket.io-parser: 4.2.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socks-proxy-agent@8.0.3: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@8.1.1) - socks: 2.8.1 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@8.1.1) + socks: 2.8.5 transitivePeerDependencies: - supports-color - socks@2.8.1: + socks@2.8.5: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} + source-map@0.6.1: + optional: true space-separated-tokens@2.0.2: {} @@ -8245,14 +9990,20 @@ snapshots: sprintf-js@1.1.3: {} + stable-hash@0.0.5: {} + + stackback@0.0.2: {} + statuses@1.5.0: {} - statuses@2.0.1: {} + statuses@2.0.2: {} + + std-env@3.10.0: {} streamroller@3.1.5: dependencies: date-format: 4.0.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -8263,25 +10014,36 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.trim@1.2.8: + string-width@5.1.2: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.22.4 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 - string.prototype.trimend@1.0.7: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimstart@1.0.7: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-object-atoms: 1.1.1 - stringify-entities@4.0.3: + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 @@ -8290,36 +10052,40 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} - superagent@8.1.2: + superagent@10.3.0: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 + form-data: 4.0.5 + formidable: 3.5.4 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.2 - semver: 7.6.0 + qs: 6.14.1 transitivePeerDependencies: - supports-color - supertest@6.3.4: + superjson@2.2.6: dependencies: + copy-anything: 4.0.5 + + supertest@7.2.2: + dependencies: + cookie-signature: 1.2.2 methods: 1.1.2 - superagent: 8.1.2 + superagent: 10.3.0 transitivePeerDependencies: - supports-color - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8330,15 +10096,20 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svg-parser@2.0.4: {} - swagger-schema-official@2.0.0-bab6bed: {} + swagger-ui-dist@5.20.6: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-express@5.0.1(express@5.2.1): + dependencies: + express: 5.2.1 + swagger-ui-dist: 5.20.6 + symbol-tree@3.2.4: {} - tabbable@6.2.0: {} - - tapable@2.2.1: {} + tabbable@6.3.0: {} tar@6.2.1: dependencies: @@ -8349,34 +10120,28 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser@5.30.3: + tdigest@0.1.2: dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 + bintrees: 1.0.2 - text-table@0.2.0: {} - - threads@1.7.0: - dependencies: - callsites: 3.1.0 - debug: 4.3.4(supports-color@8.1.1) - is-observable: 2.1.0 - observable-fns: 0.6.1 - optionalDependencies: - tiny-worker: 2.3.0 - transitivePeerDependencies: - - supports-color - - tiny-worker@2.3.0: - dependencies: - esm: 3.2.25 - optional: true + tinybench@2.9.0: {} tinycon@0.6.8: {} - to-fast-properties@2.0.0: {} + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 to-regex-range@5.0.1: dependencies: @@ -8384,16 +10149,11 @@ snapshots: toidentifier@1.0.1: {} - tough-cookie@4.1.3: + tough-cookie@6.0.0: dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.0.19 - tr46@0.0.3: {} - - tr46@5.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -8401,9 +10161,13 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.4.5): + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: - typescript: 5.4.5 + typescript: 5.9.3 + + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 tsconfig-paths@3.15.0: dependencies: @@ -8412,14 +10176,14 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.6.2: {} + tslib@2.8.1: {} tsscmp@1.0.6: {} - tsx@4.7.2: + tsx@4.21.0: dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.2 + esbuild: 0.27.1 + get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -8429,108 +10193,136 @@ snapshots: type-detect@4.0.8: {} + type-detect@4.1.0: {} + type-fest@0.20.2: {} - type-is@1.6.18: + type-is@2.0.1: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.0: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.1: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.4: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 - typescript@5.4.5: {} + typescript@5.9.3: {} - ueberdb2@4.2.63: {} + ueberdb2@5.0.23: {} uid-safe@2.1.5: dependencies: random-bytes: 1.0.0 - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - underscore@1.13.6: {} + underscore@1.13.7: {} - undici-types@5.26.5: {} + undici-types@7.16.0: {} - unified@11.0.4: + unified@11.0.5: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 bail: 2.0.2 devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 6.0.1 + vfile: 6.0.3 unist-util-is@6.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 unist-util-position@5.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position@4.0.0: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 unist-util-visit@5.0.0: dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 universalify@0.1.2: {} - universalify@0.2.0: {} - universalify@2.0.1: {} unorm@1.6.0: {} unpipe@1.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + unrs-resolver@1.3.3: + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.3.3 + '@unrs/resolver-binding-darwin-x64': 1.3.3 + '@unrs/resolver-binding-freebsd-x64': 1.3.3 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.3.3 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.3.3 + '@unrs/resolver-binding-linux-arm64-gnu': 1.3.3 + '@unrs/resolver-binding-linux-arm64-musl': 1.3.3 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.3.3 + '@unrs/resolver-binding-linux-s390x-gnu': 1.3.3 + '@unrs/resolver-binding-linux-x64-gnu': 1.3.3 + '@unrs/resolver-binding-linux-x64-musl': 1.3.3 + '@unrs/resolver-binding-wasm32-wasi': 1.3.3 + '@unrs/resolver-binding-win32-arm64-msvc': 1.3.3 + '@unrs/resolver-binding-win32-ia32-msvc': 1.3.3 + '@unrs/resolver-binding-win32-x64-msvc': 1.3.3 + + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -8538,132 +10330,180 @@ snapshots: url-join@4.0.1: {} - url-parse@1.5.10: + use-callback-ref@1.3.3(@types/react@19.2.8)(react@19.2.3): dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - use-callback-ref@1.3.1(@types/react@18.2.79)(react@18.2.0): + use-sidecar@1.1.3(@types/react@19.2.8)(react@19.2.3): dependencies: - '@types/react': 18.2.79 - react: 18.2.0 - tslib: 2.6.2 - - use-sidecar@1.1.2(@types/react@18.2.79)(react@18.2.0): - dependencies: - '@types/react': 18.2.79 detect-node-es: 1.1.0 - react: 18.2.0 - tslib: 2.6.2 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.8 - use-sync-external-store@1.2.0(react@18.2.0): + use-sync-external-store@1.6.0(react@19.2.3): dependencies: - react: 18.2.0 - - utils-merge@1.0.1: {} + react: 19.2.3 vary@1.1.2: {} - vfile-location@5.0.2: + vfile-location@5.0.3: dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 + '@types/unist': 3.0.3 + vfile: 6.0.3 vfile-message@4.0.2: dependencies: - '@types/unist': 3.0.2 + '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vfile@6.0.1: + vfile@6.0.3: dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 + '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-static-copy@1.0.3(vite@5.2.9): + vite-plugin-babel@1.4.1(@babel/core@7.28.5)(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0)): dependencies: - chokidar: 3.5.3 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - picocolors: 1.0.0 - vite: 5.2.9 + '@babel/core': 7.28.5 + vite: rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0) - vite-plugin-svgr@4.2.0(typescript@5.4.5)(vite@5.2.9): + vite-plugin-static-copy@3.1.5(rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0)): dependencies: - '@rollup/pluginutils': 5.1.0 - '@svgr/core': 8.1.0(typescript@5.4.5) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) - vite: 5.2.9 - transitivePeerDependencies: - - rollup - - supports-color - - typescript + chokidar: 3.6.0 + p-map: 7.0.4 + picocolors: 1.1.1 + tinyglobby: 0.2.15 + vite: rolldown-vite@7.2.10(@types/node@25.0.9)(esbuild@0.25.12)(tsx@4.21.0) - vite@5.2.9: + vite@7.2.6(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.13.0 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 25.0.9 fsevents: 2.3.3 + lightningcss: 1.30.2 + tsx: 4.21.0 - vitepress@1.1.3: + vite@7.3.1(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0): dependencies: - '@docsearch/css': 3.6.0 - '@docsearch/js': 3.6.0 - '@shikijs/core': 1.3.0 - '@shikijs/transformers': 1.3.0 - '@types/markdown-it': 14.0.1 - '@vitejs/plugin-vue': 5.0.4(vite@5.2.9)(vue@3.4.23) - '@vue/devtools-api': 7.0.27(vue@3.4.23) - '@vueuse/core': 10.9.0(vue@3.4.23) - '@vueuse/integrations': 10.9.0(focus-trap@7.5.4)(vue@3.4.23) - focus-trap: 7.5.4 + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.9 + fsevents: 2.3.3 + lightningcss: 1.30.2 + tsx: 4.21.0 + + vitepress@2.0.0-alpha.15(@types/node@25.0.9)(axios@1.13.2)(jwt-decode@4.0.0)(lightningcss@1.30.2)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3): + dependencies: + '@docsearch/css': 4.3.2 + '@docsearch/js': 4.3.2 + '@iconify-json/simple-icons': 1.2.60 + '@shikijs/core': 3.17.0 + '@shikijs/transformers': 3.17.0 + '@shikijs/types': 3.17.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.2(vite@7.2.6(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-api': 8.0.5 + '@vue/shared': 3.5.25 + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/integrations': 14.1.0(axios@1.13.2)(focus-trap@7.6.6)(jwt-decode@4.0.0)(vue@3.5.25(typescript@5.9.3)) + focus-trap: 7.6.6 mark.js: 8.11.1 - minisearch: 6.3.0 - shiki: 1.3.0 - vite: 5.2.9 - vue: 3.4.23 + minisearch: 7.2.0 + shiki: 3.17.0 + vite: 7.2.6(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0) + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + postcss: 8.5.6 transitivePeerDependencies: - - '@algolia/client-search' - '@types/node' - - '@types/react' - - '@vue/composition-api' - async-validator - axios - change-case - drauu - fuse.js - idb-keyval + - jiti - jwt-decode - less - lightningcss - nprogress - qrcode - - react - - react-dom - sass - - search-insights + - sass-embedded - sortablejs - stylus - sugarss - terser + - tsx - typescript - universal-cookie + - yaml + + vitest@4.0.17(@opentelemetry/api@1.9.0)(@types/node@25.0.9)(jsdom@27.4.0)(lightningcss@1.30.2)(tsx@4.21.0): + dependencies: + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(vite@7.3.1(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@25.0.9)(lightningcss@1.30.2)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@types/node': 25.0.9 + jsdom: 27.4.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml void-elements@3.1.0: {} - vue-demi@0.14.7(vue@3.4.23): + vue@3.5.25(typescript@5.9.3): dependencies: - vue: 3.4.23 - - vue@3.4.23: - dependencies: - '@vue/compiler-dom': 3.4.23 - '@vue/compiler-sfc': 3.4.23 - '@vue/runtime-dom': 3.4.23 - '@vue/server-renderer': 3.4.23(vue@3.4.23) - '@vue/shared': 3.4.23 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 w3c-xmlserializer@5.0.0: dependencies: @@ -8671,47 +10511,70 @@ snapshots: web-namespaces@2.0.1: {} - webidl-conversions@3.0.1: {} + web-streams-polyfill@3.3.3: {} - webidl-conversions@7.0.0: {} - - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 + webidl-conversions@8.0.0: {} whatwg-mimetype@4.0.0: {} - whatwg-url@14.0.0: + whatwg-url@15.1.0: dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 + tr46: 6.0.0 + webidl-conversions: 8.0.0 - whatwg-url@5.0.0: + which-boxed-primitive@1.1.1: dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-boxed-primitive@1.0.2: + which-builtin-type@1.2.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 - which-typed-array@1.1.14: + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 - workerpool@6.2.1: {} + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + workerpool@9.3.4: {} wrap-ansi@7.0.0: dependencies: @@ -8719,19 +10582,23 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + wrappy@1.0.2: {} - ws@8.11.0: {} + ws@8.18.3: {} - ws@8.16.0: {} - - wtfnode@0.9.2: {} + wtfnode@0.10.1: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} - xmlhttprequest-ssl@2.0.0: {} + xmlhttprequest-ssl@2.1.2: {} y18n@5.0.8: {} @@ -8739,7 +10606,7 @@ snapshots: yallist@4.0.0: {} - yargs-parser@20.2.4: {} + yargs-parser@21.1.1: {} yargs-unparser@2.0.0: dependencies: @@ -8748,24 +10615,28 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@16.2.0: + yargs@17.7.2: dependencies: - cliui: 7.0.4 - escalade: 3.1.2 + cliui: 8.0.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 - - ylru@1.3.2: {} + yargs-parser: 21.1.1 yocto-queue@0.1.0: {} - zustand@4.5.2(@types/react@18.2.79)(react@18.2.0): + zod-validation-error@4.0.2(zod@4.1.12): dependencies: - '@types/react': 18.2.79 - react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) + zod: 4.1.12 + + zod@4.1.12: {} + + zustand@5.0.10(@types/react@19.2.8)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)): + optionalDependencies: + '@types/react': 19.2.8 + react: 19.2.3 + use-sync-external-store: 1.6.0(react@19.2.3) zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9ebd5c672..3ce092a3c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,3 +4,7 @@ packages: - bin - doc - ui +onlyBuiltDependencies: + - '@scarf/scarf' + - '@swc/core' + - esbuild diff --git a/settings.json.docker b/settings.json.docker index 621c7b9b1..1dabcdc0c 100644 --- a/settings.json.docker +++ b/settings.json.docker @@ -96,7 +96,7 @@ * 3) if you want to use newlines in the default value of a string parameter, * use "\n" as usual. * - * "defaultPadText" : "${DEFAULT_PAD_TEXT}Line 1\nLine 2" + * "defaultPadText" : "${DEFAULT_PAD_TEXT:Line 1\nLine 2}" */ { /* @@ -104,6 +104,11 @@ */ "title": "${TITLE:Etherpad}", + /* + * Whether to show recent pads on the homepage or not. + */ + "showRecentPads": "${SHOW_RECENT_PADS:true}", + /* * Pathname of the favicon you want to use. If null, the skin's favicon is * used if one is provided by the skin, otherwise the default Etherpad favicon @@ -171,6 +176,35 @@ */ "showSettingsInAdminPage": "${SHOW_SETTINGS_IN_ADMIN_PAGE:true}", + /* + * Enable/disable the metrics endpoint. + * + * This is used by the monitoring plugins to collect metrics about Etherpad. + * If you do not use any monitoring plugins, you can disable this. + */ + "enableMetrics": "${ENABLE_METRICS:true}", + + /* + * Settings for cleanup of pads + */ + "cleanup": { + "enabled": false, + "keepRevisions": 5 + }, + + /* + The authentication method used by the server. + The default value is sso + If you want to use the old authentication system, change this to apikey + */ + "authenticationMethod": "${AUTHENTICATION_METHOD:sso}", + + /** + * Allow setting dark mode for the enduser. This is so if the user has preferred dark mode in their browser, Etherpad will respect that. + * Of course this overrides all the skin variants and the skinName set by the administrator. + **/ + "enableDarkMode": "${ENABLE_DARK_MODE:true}", + /* * Node native SSL support * @@ -187,6 +221,15 @@ }, */ + + /* + * Enables the use of a different server. We have a different one that syncs changes from the original server. + * It is hosted on GitHub and should not be blocked by many firewalls. + * https://etherpad.org/ep_infos + */ + + "updateServer": "https://etherpad.org/ep_infos", + /* * The type of the database. * @@ -537,7 +580,7 @@ * value to work properly, but increasing the value increases susceptibility * to denial of service attacks (malicious clients can exhaust memory). */ - "maxHttpBufferSize": "${SOCKETIO_MAX_HTTP_BUFFER_SIZE:10000}" + "maxHttpBufferSize": "${SOCKETIO_MAX_HTTP_BUFFER_SIZE:50000}" }, /* @@ -618,7 +661,7 @@ ], "right": [ ["importexport", "timeslider", "savedrevision"], - ["settings", "embed"], + ["settings", "embed", "home"], ["showusers"] ], "timeslider": [ diff --git a/settings.json.template b/settings.json.template index 039fa2966..d8e42fe60 100644 --- a/settings.json.template +++ b/settings.json.template @@ -87,7 +87,7 @@ * 3) if you want to use newlines in the default value of a string parameter, * use "\n" as usual. * - * "defaultPadText" : "${DEFAULT_PAD_TEXT}Line 1\nLine 2" + * "defaultPadText" : "${DEFAULT_PAD_TEXT:Line 1\nLine 2}" */ { /* @@ -95,6 +95,11 @@ */ "title": "Etherpad", + /* + * Whether to show recent pads on the homepage or not. + */ + "showRecentPads": true, + /* * Pathname of the favicon you want to use. If null, the skin's favicon is * used if one is provided by the skin, otherwise the default Etherpad favicon @@ -162,6 +167,22 @@ */ "showSettingsInAdminPage": true, + /* + * Enable/disable the metrics endpoint. + * + * This is used by the monitoring plugins to collect metrics about Etherpad. + * If you do not use any monitoring plugins, you can disable this. + */ + "enableMetrics": "${ENABLE_METRICS:true}", + + /* + * Settings for cleanup of pads + */ + "cleanup": { + "enabled": false, + "keepRevisions": 5 + }, + /* * Node native SSL support * @@ -271,6 +292,14 @@ "pageDown": true }, + /* + * Enables the use of a different server. We have a different one that syncs changes from the original server. + * It is hosted on GitHub and should not be blocked by many firewalls. + * https://etherpad.org/ep_infos + */ + + "updateServer": "https://etherpad.org/ep_infos", + /* * Should we suppress errors from being visible in the default Pad Text? */ @@ -537,7 +566,7 @@ * value to work properly, but increasing the value increases susceptibility * to denial of service attacks (malicious clients can exhaust memory). */ - "maxHttpBufferSize": 10000 + "maxHttpBufferSize": 50000 }, /* @@ -586,6 +615,19 @@ */ "importMaxFileSize": 52428800, // 50 * 1024 * 1024 + /* + The authentication method used by the server. + The default value is sso + If you want to use the old authentication system, change this to apikey + */ + "authenticationMethod": "${AUTHENTICATION_METHOD:sso}", + + /** + * Allow setting dark mode for the enduser. This is so if the user has preferred dark mode in their browser, Etherpad will respect that. + * Of course this overrides all the skin variants and the skinName set by the administrator. + **/ + "enableDarkMode": "${ENABLE_DARK_MODE:true}", + /* * From Etherpad 1.8.5 onwards, when Etherpad is in production mode commits from individual users are rate limited * @@ -618,7 +660,7 @@ ], "right": [ ["importexport", "timeslider", "savedrevision"], - ["settings", "embed"], + ["settings", "embed", "home"], ["showusers"] ], "timeslider": [ @@ -641,6 +683,13 @@ */ "loglevel": "INFO", + /* + * The log layout type to use. + * + * Valid values: basic, colored + */ + "logLayoutType": "colored", + /* Override any strings found in locale directories */ "customLocaleStrings": {}, diff --git a/src/ep.json b/src/ep.json index a96890fb4..14016364d 100644 --- a/src/ep.json +++ b/src/ep.json @@ -42,7 +42,8 @@ "name": "specialpages", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/specialpages", - "expressPreSession": "ep_etherpad-lite/node/hooks/express/specialpages" + "expressPreSession": "ep_etherpad-lite/node/hooks/express/specialpages", + "socketio": "ep_etherpad-lite/node/hooks/express/specialpages" } }, { @@ -57,6 +58,18 @@ "expressCreateServer": "ep_etherpad-lite/node/hooks/express/padurlsanitize" } }, + { + "name": "transferToken", + "hooks": { + "expressCreateServer": "ep_etherpad-lite/node/hooks/express/tokenTransfer" + } + }, + { + "name": "pwa", + "hooks": { + "expressCreateServer": "ep_etherpad-lite/node/hooks/express/pwa" + } + }, { "name": "apicalls", "hooks": { @@ -75,6 +88,12 @@ "expressCreateServer": "ep_etherpad-lite/node/hooks/express/errorhandling" } }, + { + "name": "restApi", + "hooks": { + "expressCreateServer": "ep_etherpad-lite/node/handler/RestAPI" + } + }, { "name": "socketio", "hooks": { @@ -83,12 +102,6 @@ "socketio": "ep_etherpad-lite/node/handler/PadMessageHandler" } }, - { - "name": "tests", - "hooks": { - "expressPreSession": "ep_etherpad-lite/node/hooks/express/tests" - } - }, { "name": "admin", "hooks": { @@ -112,12 +125,6 @@ "hooks": { "expressPreSession": "ep_etherpad-lite/node/hooks/express/openapi" } - }, - { - "name": "ep_message_all", - "client_hooks": { - "handleClientMessage_shoutMessage": "ep_etherpad-lite/static/js/messageHandler" - } } ] } diff --git a/src/locales/ar.json b/src/locales/ar.json index 7255581ec..1ffd7f015 100644 --- a/src/locales/ar.json +++ b/src/locales/ar.json @@ -16,10 +16,18 @@ ] }, "admin.page-title": "لوحة تحكم المسؤول - Etherpad", + "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.description": "الوصف", "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": "مدير البرنامج المساعد - Etherpad", "admin_plugins.version": "الإصدار", @@ -31,16 +39,37 @@ "admin_plugins_info.plugins": "الإضافات المثبتة", "admin_plugins_info.page-title": "معلومات البرنامج المساعد - Etherpad", "admin_plugins_info.version": "إصدار Etherpad", + "admin_plugins_info.version_latest": "أحدث إصدار متاح", "admin_plugins_info.version_number": "رقم الإصدار", "admin_settings": "إعدادات", + "admin_settings.current": "التكوين الحالي", "admin_settings.current_example-devel": "مثال على قالب إعدادات التطوير", "admin_settings.current_example-prod": "مثال على قالب إعدادات الإنتاج", "admin_settings.current_restart.value": "أعد تشغيل Etherpad", "admin_settings.current_save.value": "حفظ الإعدادات", "admin_settings.page-title": "الإعدادات - Etherpad", "index.newPad": "باد جديد", - "index.createOpenPad": "أو صنع/فتح باد بوضع اسمه:", + "index.settings": "إعدادات", + "index.transferSessionTitle": "جلسة النقل", + "index.receiveSessionTitle": "تلقي الجلسة", + "index.receiveSessionDescription": "هنا يمكنك استقبال جلسة Etherpad من متصفح أو جهاز آخر. مع ذلك، يُرجى العلم أن هذا سيؤدي إلى حذف جلستك الحالية، إن وُجدت.", + "index.transferSession": "1. جلسة النقل", + "index.transferSessionNow": "نقل الجلسة الآن", + "index.copyLink": "2. نسخ الرابط", + "index.copyLinkDescription": "انقر على الزر أدناه لنسخ الرابط إلى الحافظة الخاصة بك.", + "index.copyLinkButton": "نسخ الرابط إلى الحافظة", + "index.transferToSystem": "3. نسخ الجلسة إلى النظام الجديد", + "index.transferToSystemDescription": "افتح الرابط المنسوخ في المتصفح أو الجهاز المستهدف لنقل جلستك.", + "index.transferSessionDescription": "انقل جلستك الحالية إلى المتصفح أو الجهاز بالنقر على الزر أدناه. سيؤدي هذا إلى نسخ رابط لصفحة ستنقل جلستك عند فتحها في المتصفح أو الجهاز المستهدف.", + "index.createOpenPad": "افتح الوسادة حسب الاسم", "index.openPad": "افتح باد موجودة بالاسم:", + "index.recentPads": "الوسادات الأخيرة", + "index.recentPadsEmpty": "لم يتم العثور على أي وسادات حديثة.", + "index.generateNewPad": "إنشاء اسم لوحة عشوائي", + "index.labelPad": "اسم الوسادة (اختياري)", + "index.placeholderPadEnter": "الرجاء إدخال اسم الوسادة...", + "index.createAndShareDocuments": "إنشاء المستندات ومشاركتها في الوقت الفعلي", + "index.createAndShareDocumentsDescription": "يتيح لك Etherpad تحرير المستندات بشكل تعاوني في الوقت الفعلي، تمامًا مثل محرر متعدد اللاعبين مباشر يعمل في متصفحك.", "pad.toolbar.bold.title": "سميك (Ctrl+B)", "pad.toolbar.italic.title": "مائل (Ctrl+I)", "pad.toolbar.underline.title": "تسطير (Ctrl+U)", @@ -57,6 +86,7 @@ "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": "إلغاء", @@ -73,6 +103,8 @@ "pad.settings.fontType": "نوع الخط:", "pad.settings.fontType.normal": "عادي", "pad.settings.language": "اللغة:", + "pad.settings.deletePad": "حذف الوسادة", + "pad.delete.confirm": "هل تريد حقا حذف هذه الوسادة؟", "pad.settings.about": "حول", "pad.settings.poweredBy": "مدعوم من", "pad.importExport.import_export": "استيراد/تصدير", @@ -110,6 +142,8 @@ "pad.modals.deleted": "محذوف.", "pad.modals.deleted.explanation": "تمت إزالة هذا الباد.", "pad.modals.rateLimited": "معدل محدود.", + "pad.modals.rateLimited.explanation": "لقد أرسلت الكثير من الرسائل إلى هذه اللوحة مما أدى إلى قطع الاتصال بك.", + "pad.modals.rejected.explanation": "رفض الخادم الرسالة التي أرسلها متصفحك.", "pad.modals.rejected.cause": "ربما تم تحديث الخادم أثناء عرض اللوحة ، أو ربما كان هناك خطأ في Etherpad. حاول إعادة تحميل الصفحة.", "pad.modals.disconnected": "لم تعد متصلا.", "pad.modals.disconnected.explanation": "تم فقدان الاتصال بالخادم", diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json index b785fb9cc..5fce5a93b 100644 --- a/src/locales/be-tarask.json +++ b/src/locales/be-tarask.json @@ -35,10 +35,20 @@ "admin_plugins_info.version_number": "Нумар вэрсіі", "admin_settings": "Налады", "admin_settings.current": "Цяперашняя канфігурацыя", + "admin_settings.current_example-devel": "Прыклад шаблёну наладаў распрацоўкі", + "admin_settings.current_example-prod": "Прыклад шаблёну наладаў вытворчасьці", + "admin_settings.current_restart.value": "Перазапуск Etherpad", + "admin_settings.current_save.value": "Захаваць налады", "admin_settings.page-title": "Налады — Etherpad", "index.newPad": "Стварыць", - "index.createOpenPad": "ці тварыць/адкрыць дакумэнт з назвай:", + "index.createOpenPad": "Адкрыць дакумэнт паводле назвы", "index.openPad": "адкрыць існы Нататнік з назваю:", + "index.recentPads": "Нядаўнія дакумэнты", + "index.recentPadsEmpty": "Нядаўнія дакумэнты ня знойдзеныя.", + "index.generateNewPad": "Стварыць выпадковую назву дакумэнта", + "index.labelPad": "Назва дакумэнта (неабавязкова)", + "index.placeholderPadEnter": "Калі ласка, увядзіце назву дакумэнта…", + "index.createAndShareDocuments": "Стварайце і дзяліцеся дакумэнтамі ў рэальным часе", "pad.toolbar.bold.title": "Тоўсты (Ctrl-B)", "pad.toolbar.italic.title": "Курсіў (Ctrl-I)", "pad.toolbar.underline.title": "Падкрэсьліваньне (Ctrl-U)", @@ -55,6 +65,7 @@ "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": "Скасаваць", @@ -71,7 +82,10 @@ "pad.settings.fontType": "Тып шрыфту:", "pad.settings.fontType.normal": "Звычайны", "pad.settings.language": "Мова:", + "pad.settings.deletePad": "Выдаліць нататнік", + "pad.delete.confirm": "Вы ўпэўненыя, што хочаце выдаліць гэты нататнік?", "pad.settings.about": "Пра", + "pad.settings.poweredBy": "Працуе на", "pad.importExport.import_export": "Імпарт/Экспарт", "pad.importExport.import": "Загрузіжайце любыя тэкставыя файлы або дакумэнты", "pad.importExport.importSuccessful": "Пасьпяхова!", @@ -106,6 +120,9 @@ "pad.modals.corruptPad.cause": "Гэта можа быць выклікана няправільнай канфігурацыяй сэрвэру або іншымі нечаканымі дзеяньнямі. Калі ласка, скантактуйцеся з адміністратарам службы.", "pad.modals.deleted": "Выдалены.", "pad.modals.deleted.explanation": "Гэты дакумэнт быў выдалены.", + "pad.modals.rateLimited": "Хуткасьць абмежаваная.", + "pad.modals.rateLimited.explanation": "Вы адаслалі так шмат паведамленьняў, што гэты дакумэнт вас адключыў.", + "pad.modals.rejected.explanation": "Сэрвэр адхіліў паведамленьне, адасланае вашым броўзэрам.", "pad.modals.disconnected": "Вы былі адключаныя.", "pad.modals.disconnected.explanation": "Злучэньне з сэрвэрам было страчанае", "pad.modals.disconnected.cause": "Магчыма, сэрвэр недаступны. Калі ласка, паведаміце адміністратару службы, калі праблема будзе паўтарацца.", diff --git a/src/locales/bn.json b/src/locales/bn.json index ac422714b..472eb27b0 100644 --- a/src/locales/bn.json +++ b/src/locales/bn.json @@ -8,6 +8,7 @@ "Bellayet", "Greatder", "Nasir8891", + "RiazACU", "Sankarshan", "Sibabrata Banerjee", "আজিজ", diff --git a/src/locales/ce.json b/src/locales/ce.json new file mode 100644 index 000000000..a368c7cff --- /dev/null +++ b/src/locales/ce.json @@ -0,0 +1,49 @@ +{ + "@metadata": { + "authors": [ + "Умар" + ] + }, + "admin.page-title": "Администраторан панель — Etherpad", + "admin_plugins": "Плагинийн менеджер", + "admin_plugins.available": "ТӀекхочуш йолу плагинаш", + "admin_plugins.available_not-found": "Плагинаш ца карийна.", + "admin_plugins.available_fetching": "Схьаоьцуш...", + "admin_plugins.available_install.value": "ДӀахӀоттайе", + "admin_plugins.installed_uninstall.value": "ДӀайаккха", + "admin_plugins.last-update": "ТӀаьххьара карлайаккхар", + "admin_plugins.name": "ЦӀе", + "admin_plugins.page-title": "Плагинийн менеджер — Etherpad", + "admin_plugins.version": "Верси", + "admin_plugins_info.version_number": "Версин лоьмар", + "admin_settings": "Нисдаран гӀирс", + "admin_settings.current": "Карара конфигураци", + "pad.colorpicker.save": "Ӏалашйан", + "pad.colorpicker.cancel": "Йухайаккхар", + "pad.loading": "Чуйолуш…", + "pad.permissionDenied": "Хьан бакъонаш йац тӀекхача", + "pad.settings.padSettings": "Документан нисдаран гӀирс", + "pad.settings.myView": "Сан васт", + "pad.settings.stickychat": "Гуттара а гайта чат", + "pad.settings.language": "Мотт:", + "pad.settings.about": "Проектах лаьцна", + "pad.importExport.importSuccessful": "Кхиамца!", + "pad.modals.cancel": "Йухайаккхар", + "pad.share.link": "Хьажорг", + "pad.chat": "Чат", + "timeslider.toolbar.authors": "Авторш:", + "timeslider.toolbar.exportlink.title": "Экспорт", + "timeslider.month.january": "январь", + "timeslider.month.february": "февраль", + "timeslider.month.march": "март", + "timeslider.month.april": "апрель", + "timeslider.month.may": "май", + "timeslider.month.june": "июнь", + "timeslider.month.july": "июль", + "timeslider.month.august": "август", + "timeslider.month.september": "сентябрь", + "timeslider.month.october": "октябрь", + "timeslider.month.november": "ноябрь", + "timeslider.month.december": "декабрь", + "pad.impexp.importing": "Импорт йар..." +} diff --git a/src/locales/cs.json b/src/locales/cs.json index a47b1a3be..aec3a5a1c 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -11,7 +11,8 @@ "Mormegil", "Peldrjan", "Quinn", - "Spotter" + "Spotter", + "The astrea" ] }, "admin.page-title": "Ovládací panel Správce - Etherpad", @@ -48,8 +49,27 @@ "admin_settings.current_save.value": "Uložit nastavení", "admin_settings.page-title": "Nastavení - Etherpad", "index.newPad": "Založ nový Pad", - "index.createOpenPad": "nebo vytvoř/otevři Pad s názvem:", + "index.settings": "Nastavení", + "index.transferSessionTitle": "relace Přenosu", + "index.receiveSessionTitle": "Přijmout relaci", + "index.receiveSessionDescription": "Zde můžete přijímat relaci Etherpad z jiného prohlížeče nebo zařízení. Upozorňujeme však, že tím se smaže vaše aktuální relace, pokud nějaká existuje.", + "index.transferSession": "1. Přenos relace", + "index.transferSessionNow": "Přenést relaci nyní", + "index.copyLink": "2. Zkopírovat odkaz", + "index.copyLinkDescription": "Kliknutím na tlačítko níže zkopírujete odkaz do schránky.", + "index.copyLinkButton": "Kopírovat odkaz do schránky", + "index.transferToSystem": "3. Zkopírujte relaci do nového systému", + "index.transferToSystemDescription": "Otevřete zkopírovaný odkaz v cílovém prohlížeči nebo zařízení a přeneste svou relaci.", + "index.transferSessionDescription": "Přeneste svou aktuální relaci do prohlížeče nebo zařízení kliknutím na tlačítko níže. Tím se zkopíruje odkaz na stránku, která přenese vaši relaci po otevření v cílovém prohlížeči nebo zařízení.", + "index.createOpenPad": "Otevřít pad podle jména", "index.openPad": "otevřít existující Pad se jménem:", + "index.recentPads": "Poslední Pady", + "index.recentPadsEmpty": "Nebyly nalezeny žádné nedávné pady.", + "index.generateNewPad": "Generovat náhodný název padu", + "index.labelPad": "Název Padu (volitelné)", + "index.placeholderPadEnter": "Zadejte prosím název padu...", + "index.createAndShareDocuments": "Vytvářejte a sdílejte dokumenty v reálném čase", + "index.createAndShareDocumentsDescription": "Etherpad umožňuje kolaborativní úpravu dokumentů v reálném čase, podobně jako živý multiplayerový editor, který běží ve vašem prohlížeči.", "pad.toolbar.bold.title": "Tučný text (Ctrl-B)", "pad.toolbar.italic.title": "Kurzíva (Ctrl-I)", "pad.toolbar.underline.title": "Podtržené písmo (Ctrl-U)", @@ -66,6 +86,7 @@ "pad.toolbar.savedRevision.title": "Uložit revizi", "pad.toolbar.settings.title": "Nastavení", "pad.toolbar.embed.title": "Sdílet a umístit tento Pad", + "pad.toolbar.home.title": "Zpět domů", "pad.toolbar.showusers.title": "Zobrazit uživatele u tohoto Padu", "pad.colorpicker.save": "Uložit", "pad.colorpicker.cancel": "Zrušit", @@ -82,6 +103,8 @@ "pad.settings.fontType": "Typ písma:", "pad.settings.fontType.normal": "Normální", "pad.settings.language": "Jazyk:", + "pad.settings.deletePad": "Smazat pad", + "pad.delete.confirm": "Opravdu chcete tento pad smazat?", "pad.settings.about": "O projektu", "pad.settings.poweredBy": "Běží na", "pad.importExport.import_export": "Import/Export", diff --git a/src/locales/de.json b/src/locales/de.json index 92e203ef2..5fde3af2e 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -2,15 +2,18 @@ "@metadata": { "authors": [ "Bjarncraft", + "Brettchenweber", "Dom", "Justman10000", "Killarnee", "Metalhead64", "Mklehr", + "Mukeber", "Nipsky", "Predatorix", "SamTV", "Sebastian Wallroth", + "Ssgl", "Thargon", "Tim.krieger", "Wikinaut", @@ -51,8 +54,27 @@ "admin_settings.current_save.value": "Einstellungen speichern", "admin_settings.page-title": "Einstellungen - Etherpad", "index.newPad": "Neues Pad", - "index.createOpenPad": "oder ein Pad mit folgendem Namen erstellen/öffnen:", + "index.settings": "Einstellungen", + "index.transferSessionTitle": "Sitzung übertragen", + "index.receiveSessionTitle": "Sitzung empfangen", + "index.receiveSessionDescription": "Hier kannst du eine Etherpad-Sitzung aus einem anderen Browser oder Gerät empfangen. Bedenke allerdings, dass dadurch deine aktuelle Sitzung, falls vorhanden, gelöscht wird.", + "index.transferSession": "1. Sitzung übertragen", + "index.transferSessionNow": "Jetzt übertragen", + "index.copyLink": "2. Link kopieren", + "index.copyLinkDescription": "Klicke auf den untenstehenden Button, um den Übertragungscode in deine Zwischenablage zu kopieren.", + "index.copyLinkButton": "Übertragungscode kopieren", + "index.transferToSystem": "3. Sitzung einfügen", + "index.transferToSystemDescription": "Öffne den kopierten Link in dem neuen Browser oder Gerät, um deine aktuelle Etherpad-Sitzung zu übertragen.", + "index.transferSessionDescription": "Übertrage deine aktuelle Etherpad-Sitzung zu einem anderen Browser oder Gerät, indem du den untenstehenden Button klickst. Dabei wird ein Link in deine Zwischenablage kopiert, den du im neuen Browser oder Gerät öffnen kannst, um deine Sitzung zu übertragen.", + "index.createOpenPad": "Pad öffnen", "index.openPad": "Öffne ein vorhandenes Pad mit folgendem Namen:", + "index.recentPads": "Zuletzt bearbeitete Pads", + "index.recentPadsEmpty": "Keine kürzlich bearbeiteten Pads gefunden.", + "index.generateNewPad": "Neues Pad generieren", + "index.labelPad": "Padname (optional)", + "index.placeholderPadEnter": "Gib den Namen des Pads ein...", + "index.createAndShareDocuments": "Erstelle und teile Dokumente in Echtzeit", + "index.createAndShareDocumentsDescription": "Etherpad ermöglicht die gemeinsame Bearbeitung von Dokumenten in Echtzeit, ähnlich wie ein Live-Multiplayer-Editor, der in Ihrem Browser läuft.", "pad.toolbar.bold.title": "Fett (Strg-B)", "pad.toolbar.italic.title": "Kursiv (Strg-I)", "pad.toolbar.underline.title": "Unterstrichen (Strg-U)", @@ -69,6 +91,7 @@ "pad.toolbar.savedRevision.title": "Version speichern", "pad.toolbar.settings.title": "Einstellungen", "pad.toolbar.embed.title": "Dieses Pad teilen oder einbetten", + "pad.toolbar.home.title": "Zurück zur Startseite", "pad.toolbar.showusers.title": "Benutzer dieses Pads anzeigen", "pad.colorpicker.save": "Speichern", "pad.colorpicker.cancel": "Abbrechen", @@ -85,6 +108,8 @@ "pad.settings.fontType": "Schriftart:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Sprache:", + "pad.settings.deletePad": "Pad löschen", + "pad.delete.confirm": "Möchtest du dieses Pad wirklich löschen?", "pad.settings.about": "Über", "pad.settings.poweredBy": "Betrieben von", "pad.importExport.import_export": "Import/Export", diff --git a/src/locales/diq.json b/src/locales/diq.json index ef7275712..96ef1cbfe 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -3,6 +3,7 @@ "authors": [ "1917 Ekim Devrimi", "Erdemaslancan", + "GolyatGeri", "Gorizon", "Gırd", "Kumkumuk", @@ -78,6 +79,8 @@ "pad.settings.fontType": "Babeta nuşti:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Zıwan:", + "pad.settings.deletePad": "Defteri bıesterê", + "pad.delete.confirm": "Şıma raşti wazenê ke nê defteri bıesterên?", "pad.settings.about": "Heqa", "pad.settings.poweredBy": "Pheştidayoğ", "pad.importExport.import_export": "Zerredayış/Teberdayış", diff --git a/src/locales/dsb.json b/src/locales/dsb.json index cedac2f88..805d3f19d 100644 --- a/src/locales/dsb.json +++ b/src/locales/dsb.json @@ -38,8 +38,27 @@ "admin_settings.current_save.value": "Nastajenja składowaś", "admin_settings.page-title": "Nastajenja – Etherpad", "index.newPad": "Nowy zapisnik", - "index.createOpenPad": "abo napóraj/wócyń zapisnik z mjenim:", + "index.settings": "Nastajenja", + "index.transferSessionTitle": "Pósejźenje pśenosowaś", + "index.receiveSessionTitle": "Pósejźenje dostaś", + "index.receiveSessionDescription": "How móžoš póseźenje Etherpad z drugego wobglědowaka abo rěda dostaś. Pšosym źiwaj na to, až to wašo aktualne pósejźenje wulašujo, jolic take eksistěrujo.", + "index.transferSession": "1. Pósejźenje pśenosowaś", + "index.transferSessionNow": "Pósejźenje něnto pśenosowaś", + "index.copyLink": "2. Wótkaz kopěrowaś", + "index.copyLinkDescription": "Klikni na slědujucy tłocašk, aby wótkaz do mjazywótkłada kopěrował.", + "index.copyLinkButton": "Wótkaz do mjazywótkłada kopěrowaś", + "index.transferToSystem": "3. Pósejźenje do nowego systema kopěrowaś", + "index.transferToSystemDescription": "Wócyń kopěrowany wótkaz w celowem wobglědowaku abo rěźe, aby swóje pósejźenje pśenosował.", + "index.transferSessionDescription": "Klikni na slědujucy tłocašk, aby swójo aktualne pósejźenje do wobglědowaka abo rěda pśenosował. To buźo wótkaz do boka kopěrowaś, kótaryž buźo wašo pósejźenje pśenosowaś, gaž se w celowem wobglědowaku abo rěźe woócynja.", + "index.createOpenPad": "Zapisnik pó mjenju wócyniś", "index.openPad": "wócyńśo eksistěrujucy Pad z mjenim:", + "index.recentPads": "Nejnowše zapisniki", + "index.recentPadsEmpty": "Žedne nejnowše zapisniki namakane.", + "index.generateNewPad": "Pśipadne mě zapisnika generěrowaś", + "index.labelPad": "Mě zapisnika (pó žycenju)", + "index.placeholderPadEnter": "Pšosym zapódaj mě zapisnika…", + "index.createAndShareDocuments": "Napóraj a źěl dokumenty w napšawdnem casu", + "index.createAndShareDocumentsDescription": "Etherpad wam zmóžnja, dokumenty zgromadnje w napšawdnem casu wobźěłaś, kaž editor live multi-player, kótaryž we wašom wobglědowaku běžy.", "pad.toolbar.bold.title": "Tucny (Strg-B)", "pad.toolbar.italic.title": "Kursiwny (Strg-I)", "pad.toolbar.underline.title": "Pódšmarnuś (Strg-U)", @@ -56,6 +75,7 @@ "pad.toolbar.savedRevision.title": "Wersiju składowaś", "pad.toolbar.settings.title": "Nastajenja", "pad.toolbar.embed.title": "Toś ten zapisnik źěliś a zasajźiś", + "pad.toolbar.home.title": "Slědk k startowemu bokoju", "pad.toolbar.showusers.title": "Wužywarje na toś tom zapisniku pokazaś", "pad.colorpicker.save": "Składowaś", "pad.colorpicker.cancel": "Pśetergnuś", @@ -72,6 +92,8 @@ "pad.settings.fontType": "Pismowa družyna:", "pad.settings.fontType.normal": "Normalny", "pad.settings.language": "Rěc:", + "pad.settings.deletePad": "Zapisnik lašowaś", + "pad.delete.confirm": "Cośo napšawdu toś ten zapisnik lašowaś?", "pad.settings.about": "Wó", "pad.settings.poweredBy": "Pódpěrany wót", "pad.importExport.import_export": "Import/Eksport", diff --git a/src/locales/el.json b/src/locales/el.json index 502063c11..cbe811a9f 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -4,6 +4,7 @@ "Evropi", "Geraki", "Glavkos", + "Jimkats", "Monopatis", "Norhorn", "Papspyr", @@ -14,10 +15,12 @@ "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.description": "Περιγραφή", "admin_plugins.installed": "Εγκατεστημένα πρόσθετα", + "admin_plugins.installed_fetching": "Ανάκτηση εγκατεστημένων προσθηκών…", "admin_plugins.installed_nothing": "Δεν έχετε εγκαταστήσει πρόσθετα ακόμη.", "admin_plugins.installed_uninstall.value": "Απεγκατάσταση", "admin_plugins.last-update": "Τελευταία ενημέρωση", @@ -41,6 +44,16 @@ "admin_settings.current_save.value": "Αποθήκευση Ρυθμίσεων", "admin_settings.page-title": "Ρυθμίσεις - Etherpad", "index.newPad": "Νέος Κοινόχρηστος Πίνακας", + "index.settings": "Ρυθμίσεις", + "index.transferSessionTitle": "Μεταφορά συνεδρίας", + "index.receiveSessionTitle": "Λήψη συνεδρίας", + "index.transferSession": "1. Μεταφορά συνεδρίας", + "index.transferSessionNow": "Μεταφορά συνεδρίας τώρα", + "index.copyLink": "2. Αντιγραφή συνδέσμου", + "index.copyLinkDescription": "Πατήστε στο παρακάτω κουμπί για να αντιγράψετε τον σύνδεσμο στο πρόχειρό σας.", + "index.copyLinkButton": "Αντιγραφή συνδέσμου στο πρόχειρο", + "index.transferToSystem": "3. Αντιγραφή συνεδρίας στο νέο σύστημα", + "index.transferToSystemDescription": "Ανοίξτε τον αντιγραμμένο σύνδεσμο στο πρόγραμμα περιήγησης ή στη συσκευή προορισμού για να μεταφέρετε την συνεδρία σας.", "index.createOpenPad": "ή δημιουργία/άνοιγμα ενός κοινόχρηστου πίνακα με όνομα:", "index.openPad": "άνοιγμα υπάρχοντος κοινόχρηστού πίνακα με όνομα:", "pad.toolbar.bold.title": "Έντονα (Ctrl-B)", @@ -59,6 +72,7 @@ "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": "Ακύρωση", @@ -75,6 +89,8 @@ "pad.settings.fontType": "Τύπος γραμματοσειράς:", "pad.settings.fontType.normal": "Κανονική", "pad.settings.language": "Γλώσσα:", + "pad.settings.deletePad": "Διαγραφή Pad", + "pad.delete.confirm": "Θέλετε πραγματικά να διαγράψετε αυτό το pad;", "pad.settings.about": "Σχετικά", "pad.settings.poweredBy": "Υποστηρίζεται από", "pad.importExport.import_export": "Εισαγωγή/Εξαγωγή", @@ -89,7 +105,7 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.abiword.innerHTML": "Μπορείτε να εισάγετε απλό κείμενο ή HTML. Για προηγμένες δυνατότητες εισαγωγής παρακαλούμε εγκαταστήστε το AbiWord ή το LibreOffice.", "pad.modals.connected": "Συνδεμένοι.", - "pad.modals.reconnecting": "Επανασύνδεση στο pad σας...", + "pad.modals.reconnecting": "Επανασύνδεση στο pad σας…", "pad.modals.forcereconnect": "Επιβολή επανασύνδεσης", "pad.modals.reconnecttimer": "Προσπάθεια επανασύνδεσης σε", "pad.modals.cancel": "Ακύρωση", @@ -111,7 +127,9 @@ "pad.modals.corruptPad.cause": "Αυτό μπορεί να οφείλεται σε ένα λάθος στη ρύθμιση του διακομιστή ή κάποια άλλη απρόβλεπτη συμπεριφορά. Παρακαλώ επικοινωνήστε με τον διαχειριστή της υπηρεσίας.", "pad.modals.deleted": "Διεγράφη.", "pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.", + "pad.modals.rateLimited.explanation": "Στείλατε πάρα πολλά μηνύματα σε αυτό το pad, επομένως σας αποσύνδεσε.", "pad.modals.rejected.explanation": "Ο διακομιστής απέρριψε ένα μήνυμα που στάλθηκε από το πρόγραμμα περιήγησής σας.", + "pad.modals.rejected.cause": "Ο διακομιστής μπορεί να έχει ενημερωθεί ενώ προβάλλατε το pad ή ίσως υπάρχει σφάλμα στο Etherpad. Δοκιμάστε να φορτώσετε ξανά τη σελίδα.", "pad.modals.disconnected": "Είστε αποσυνδεδεμένοι.", "pad.modals.disconnected.explanation": "Χάθηκε η σύνδεση με τον διακομιστή", "pad.modals.disconnected.cause": "Ο διακομιστής μπορεί να μην είναι διαθέσιμος. Παρακαλούμε ειδοποιήστε τον διαχειριστή της υπηρεσίας εάν εξακολουθεί να συμβαίνει αυτό.", @@ -124,6 +142,7 @@ "pad.chat.loadmessages": "Φόρτωση περισσότερων μηνυμάτων", "pad.chat.stick.title": "Κρατήστε τη συνομιλία στην οθόνη", "pad.chat.writeMessage.placeholder": "Γράψτε το μήνυμα σας εδώ", + "timeslider.followContents": "Ακολουθήστε τις ενημερώσεις περιεχομένου του pad", "timeslider.pageTitle": "{{appTitle}} Χρονοδιάγραμμα", "timeslider.toolbar.returnbutton": "Επιστροφή στο pad", "timeslider.toolbar.authors": "Συντάκτες:", diff --git a/src/locales/en.json b/src/locales/en.json index 5737fab00..51e07f302 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -34,8 +34,28 @@ "admin_settings.page-title": "Settings - Etherpad", "index.newPad": "New Pad", - "index.createOpenPad": "or create/open a Pad with the name:", + "index.settings": "Settings", + "index.transferSessionTitle": "Transfer session", + "index.receiveSessionTitle": "Receive session", + "index.receiveSessionDescription": "Here you can receive an Etherpad session from another browser or device. Please note, however, that this will delete your current session, if any.", + "index.transferSession": "1. Transfer session", + "index.transferSessionNow": "Transfer session now", + "index.copyLink": "2. Copy link", + "index.copyLinkDescription": "Click on the button below to copy the link to your clipboard.", + "index.copyLinkButton": "Copy link to clipboard", + "index.transferToSystem": "3. Copy session to new system", + "index.transferToSystemDescription": "Open the copied link in the target browser or device to transfer your session.", + "index.transferSessionDescription": "Transfer your current session to browser or device by clicking the button below. This will copy a link to a page that will transfer your session when opened in the target browser or device.", + "index.createOpenPad": "Open pad by name", "index.openPad": "open an existing Pad with the name:", + "index.recentPads": "Recent Pads", + "index.recentPadsEmpty": "No recent pads found.", + "index.generateNewPad": "Generate random pad name", + "index.labelPad": "Pad name (optional)", + "index.placeholderPadEnter": "Please enter a pad name...", + "index.createAndShareDocuments": "Create and share documents in real time", + "index.createAndShareDocumentsDescription": "Etherpad allows you to edit documents collaboratively in real-time, much like a live multi-player editor that runs in your browser.", + "pad.toolbar.bold.title": "Bold (Ctrl+B)", "pad.toolbar.italic.title": "Italic (Ctrl+I)", @@ -53,6 +73,7 @@ "pad.toolbar.savedRevision.title": "Save Revision", "pad.toolbar.settings.title": "Settings", "pad.toolbar.embed.title": "Share and Embed this pad", + "pad.toolbar.home.title": "Back to home", "pad.toolbar.showusers.title": "Show the users on this pad", "pad.colorpicker.save": "Save", @@ -72,6 +93,8 @@ "pad.settings.fontType": "Font type:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Language:", + "pad.settings.deletePad": "Delete Pad", + "pad.delete.confirm": "Do you really want to delete this pad?", "pad.settings.about": "About", "pad.settings.poweredBy": "Powered by", diff --git a/src/locales/es.json b/src/locales/es.json index bd71603af..85153d0cb 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -14,6 +14,7 @@ "Macofe", "MartaEgea", "Mklehr", + "Ovruni", "Rubenwap", "Tiberius1701", "VegaDark", @@ -50,11 +51,13 @@ "admin_settings": "Configuración", "admin_settings.current": "Configuración actual", "admin_settings.current_example-devel": "Plantilla de ejemplo de configuración de desarrollo", + "admin_settings.current_example-prod": "Ejemplo de plantilla de configuración de producción", "admin_settings.current_restart.value": "Reiniciar Etherpad", "admin_settings.current_save.value": "Guardar configuración", "admin_settings.page-title": "Configuración. Etherpad", "index.newPad": "Nuevo pad", "index.createOpenPad": "o crea/abre un pad con el nombre:", + "index.openPad": "abrir un pad existente con el nombre:", "pad.toolbar.bold.title": "Negrita (Ctrl-B)", "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", "pad.toolbar.underline.title": "Subrayado (Ctrl-U)", @@ -87,6 +90,8 @@ "pad.settings.fontType": "Tipografía:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Idioma:", + "pad.settings.deletePad": "Eliminar pad", + "pad.delete.confirm": "¿De verdad quieres borrar este pad?", "pad.settings.about": "Acerca de", "pad.settings.poweredBy": "Funciona con", "pad.importExport.import_export": "Importar/Exportar", @@ -123,6 +128,10 @@ "pad.modals.corruptPad.cause": "Esto puede deberse a una mala configuración del servidor o algún otro comportamiento inesperado. Contacta con el administrador del servicio.", "pad.modals.deleted": "Borrado.", "pad.modals.deleted.explanation": "Este pad ha sido borrado.", + "pad.modals.rateLimited": "Límite de solicitudes.", + "pad.modals.rateLimited.explanation": "Enviaste demasiados mensajes a este pad por lo que te desconectó.", + "pad.modals.rejected.explanation": "El servidor rechazó un mensaje que envió tu navegador.", + "pad.modals.rejected.cause": "Es posible que el servidor se haya actualizado mientras veías el panel, o que haya un error en Etherpad. Intenta recargar la página.", "pad.modals.disconnected": "Te has desconectado.", "pad.modals.disconnected.explanation": "Se perdió la conexión con el servidor", "pad.modals.disconnected.cause": "El servidor podría no estar disponible. Contacta con el administrador del servicio si esto continúa sucediendo.", @@ -135,6 +144,7 @@ "pad.chat.loadmessages": "Cargar más mensajes", "pad.chat.stick.title": "Ampliar", "pad.chat.writeMessage.placeholder": "Enviar un mensaje", + "timeslider.followContents": "Sigue las actualizaciones de contenido del pad", "timeslider.pageTitle": "{{appTitle}} Línea de tiempo", "timeslider.toolbar.returnbutton": "Volver al pad", "timeslider.toolbar.authors": "Autores:", @@ -173,5 +183,6 @@ "pad.impexp.uploadFailed": "El envío falló. Inténtalo de nuevo.", "pad.impexp.importfailed": "Fallo al importar", "pad.impexp.copypaste": "Intenta copiar y pegar", - "pad.impexp.exportdisabled": "La exportación al formato {{type}} está desactivada. Contacta con tu administrador del sistema." + "pad.impexp.exportdisabled": "La exportación al formato {{type}} está desactivada. Contacta con tu administrador del sistema.", + "pad.impexp.maxFileSize": "El archivo es demasiado grande. Contacte al administrador del sitio para aumentar el tamaño de archivo permitido para la importación." } diff --git a/src/locales/eu.json b/src/locales/eu.json index ca1d20f5e..b85f9381c 100644 --- a/src/locales/eu.json +++ b/src/locales/eu.json @@ -1,7 +1,9 @@ { "@metadata": { "authors": [ + "Alexgabi", "An13sa", + "Atzerritik", "HairyFotr", "Izendegi", "Mikel Ibaiba", @@ -44,8 +46,14 @@ "admin_settings.current_save.value": "Gorde Ezarpenak", "admin_settings.page-title": "Ezarpenak - Etherpad", "index.newPad": "Pad berria", - "index.createOpenPad": "edo sortu/ireki Pad bat honako izenarekin:", + "index.createOpenPad": "Ireki Pad bat honako izenarekin:", "index.openPad": "ireki existitzen den eta hurrengo izena duen Pad-a:", + "index.recentPadsEmpty": "Ez da aurkitu duela gutxiko pad-ik", + "index.generateNewPad": "Sortu pad izen aleatorioa", + "index.labelPad": "Pad izena (aukerakoa)", + "index.placeholderPadEnter": "Mesedez sartu pad izen bat...", + "index.createAndShareDocuments": "Sortu eta partekatu dokumentuak denbora errealean", + "index.createAndShareDocumentsDescription": "Etherpadek aukera ematen dizu dokumentuak elkarlanean editatzeko zure nabigatzailean exekutatzen den idazle anitzeko editore bat bezala.", "pad.toolbar.bold.title": "Lodia (Ctrl+B)", "pad.toolbar.italic.title": "Etzana (Ctrl+I)", "pad.toolbar.underline.title": "Azpimarratua (Ctrl+U)", @@ -62,6 +70,7 @@ "pad.toolbar.savedRevision.title": "Gorde berrikuspena", "pad.toolbar.settings.title": "Ezarpenak", "pad.toolbar.embed.title": "Partekatu eta Txertatu pad hau", + "pad.toolbar.home.title": "Atzera hasierara", "pad.toolbar.showusers.title": "Erakutsi pad honetako erabiltzaileak", "pad.colorpicker.save": "Gorde", "pad.colorpicker.cancel": "Utzi", @@ -78,6 +87,8 @@ "pad.settings.fontType": "Letra-mota:", "pad.settings.fontType.normal": "Arrunta", "pad.settings.language": "Hizkuntza:", + "pad.settings.deletePad": "Ezabatu pad-a", + "pad.delete.confirm": "Benetan pad hau ezabatu nahi duzu?", "pad.settings.about": "Honi buruz", "pad.settings.poweredBy": "Honek garatua:", "pad.importExport.import_export": "Inportatu/Esportatu", diff --git a/src/locales/fa.json b/src/locales/fa.json index dfb320e40..4f03adc3b 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -4,6 +4,8 @@ "BMRG14", "Beginneruser", "Dalba", + "Darafsh", + "Ebrahim", "Ebraminio", "FarsiNevis", "Jeeputer", @@ -65,6 +67,7 @@ "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": "لغو", @@ -81,8 +84,10 @@ "pad.settings.fontType": "نوع قلم:", "pad.settings.fontType.normal": "ساده", "pad.settings.language": "زبان:", + "pad.settings.deletePad": "حذف پد", + "pad.delete.confirm": "آیا واقعاً می‌خواهید این پد را حذف کنید؟", "pad.settings.about": "درباره", - "pad.settings.poweredBy": "قدرست‌گرفته از", + "pad.settings.poweredBy": "قدرت‌گرفته از", "pad.importExport.import_export": "درون‌ریزی/برون‌بری", "pad.importExport.import": "بارگذاری پروندهٔ متنی یا سند", "pad.importExport.importSuccessful": "موفقیت آمیز بود!", @@ -118,6 +123,9 @@ "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": "ممکن است سرور در دسترس نباشد. اگر این مشکل باز هم رخ داد مدیر حدمت را آگاه کنید.", @@ -130,6 +138,7 @@ "pad.chat.loadmessages": "بارگیری پیام‌های بیشتر", "pad.chat.stick.title": "چسباندن چت به صفحه", "pad.chat.writeMessage.placeholder": "پیام خود را این‌جا بنویسید", + "timeslider.followContents": "پیگیری به‌روزرسانی‌های محتوای پد", "timeslider.pageTitle": "لغزندهٔ زمان {{appTitle}}", "timeslider.toolbar.returnbutton": "بازگشت به دفترچه یادداشت", "timeslider.toolbar.authors": "نویسندگان:", @@ -168,5 +177,6 @@ "pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید", "pad.impexp.importfailed": "درون‌ریزی انجام نشد", "pad.impexp.copypaste": "کپی پیست کنید", - "pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سامانه خودتان تماس بگیرید." + "pad.impexp.exportdisabled": "برون‌ریزی با قالب {{type}} از کار افتاده است. برای جزئیات بیشتر با مدیر سامانه خودتان تماس بگیرید.", + "pad.impexp.maxFileSize": "پرونده خیلی بزرگ است. با مدیر سایت تماس بگیرید تا اندازهٔ مجاز برای وارد کردن پرونده را افزایش دهد." } diff --git a/src/locales/fi.json b/src/locales/fi.json index 8859f39a8..80a48ada5 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -50,11 +50,13 @@ "admin_settings": "Asetukset", "admin_settings.current": "Nykyinen kokoonpano", "admin_settings.current_example-devel": "Esimerkki kehitysasetusten mallista", + "admin_settings.current_example-prod": "Esimerkkipohja tuotantoasetuksille", "admin_settings.current_restart.value": "Käynnistä Etherpad uudelleen", "admin_settings.current_save.value": "Tallenna asetukset", "admin_settings.page-title": "asetukset - Etherpad", "index.newPad": "Uusi muistio", - "index.createOpenPad": "tai luo tai avaa muistio nimellä:", + "index.createOpenPad": "Avaa muistio nimellä", + "index.openPad": "avaa olemassa oleva muistio nimellä:", "pad.toolbar.bold.title": "Lihavointi (Ctrl-B)", "pad.toolbar.italic.title": "Kursivointi (Ctrl-I)", "pad.toolbar.underline.title": "Alleviivaus (Ctrl-U)", @@ -71,6 +73,7 @@ "pad.toolbar.savedRevision.title": "Tallenna muutos", "pad.toolbar.settings.title": "Asetukset", "pad.toolbar.embed.title": "Jaa ja upota muistio", + "pad.toolbar.home.title": "Takaisin kotiin", "pad.toolbar.showusers.title": "Näytä muistion käyttäjät", "pad.colorpicker.save": "Tallenna", "pad.colorpicker.cancel": "Peru", @@ -87,6 +90,8 @@ "pad.settings.fontType": "Fonttityyppi:", "pad.settings.fontType.normal": "normaali", "pad.settings.language": "Kieli:", + "pad.settings.deletePad": "Poista muistio", + "pad.delete.confirm": "Haluatko todella poistaa tämän muistion?", "pad.settings.about": "Tietoja", "pad.settings.poweredBy": "Palvelun mahdollistaa", "pad.importExport.import_export": "Tuonti/vienti", @@ -135,6 +140,7 @@ "pad.chat.loadmessages": "Lataa lisää viestejä", "pad.chat.stick.title": "Liimaa chatti ruutuun", "pad.chat.writeMessage.placeholder": "Kirjoita viestisi tähän", + "timeslider.followContents": "Seuraa muistion sisällön päivityksiä", "timeslider.pageTitle": "{{appTitle}} -aikajana", "timeslider.toolbar.returnbutton": "Palaa muistioon", "timeslider.toolbar.authors": "Tekijät:", @@ -173,5 +179,6 @@ "pad.impexp.uploadFailed": "Lähetys epäonnistui. Yritä uudelleen.", "pad.impexp.importfailed": "Tuonti epäonnistui", "pad.impexp.copypaste": "Kopioi ja liitä", - "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole käytössä. Ota yhteys ylläpitäjään saadaksesi lisätietoja." + "pad.impexp.exportdisabled": "Vienti muotoon \"{{type}}\" ei ole käytössä. Ota yhteys ylläpitäjään saadaksesi lisätietoja.", + "pad.impexp.maxFileSize": "Tiedosto on liian suuri. Ota yhteyttä sivustosi ylläpitäjään ja pyydä heitä korottomaan suurinta sallittua tiedostokokoa." } diff --git a/src/locales/fr.json b/src/locales/fr.json index 8f3192107..1915edaee 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -5,6 +5,7 @@ "C13m3n7", "Cquoi", "Crochet.david", + "Derugon", "Envlh", "Framafan", "Fylip22", @@ -14,13 +15,16 @@ "Jean-Frédéric", "Leviathan", "Macofe", + "Mahabarata", "Maxim21", "McDutchie", + "Meaz", "Metroitendo", "Od1n", "Peter17", "Quenenni", "Rastus Vernon", + "Spf", "Stephane Cottin", "Thibaut120094", "Tux-tn", @@ -63,8 +67,27 @@ "admin_settings.current_save.value": "Enregistrer les paramètres", "admin_settings.page-title": "Paramètres — Etherpad", "index.newPad": "Nouveau bloc-notes", - "index.createOpenPad": "ou créer/ouvrir un bloc-notes intitulé :", + "index.settings": "Paramètres", + "index.transferSessionTitle": "Session de transfert", + "index.receiveSessionTitle": "Résumé de la séance", + "index.receiveSessionDescription": "Vous pouvez ici recevoir une session Etherpad depuis un autre navigateur ou appareil. Veuillez noter toutefois que cela supprimera votre session actuelle, le cas échéant.", + "index.transferSession": "1. Séance de transfert", + "index.transferSessionNow": "Séance de transfert maintenant", + "index.copyLink": "Copier le lien", + "index.copyLinkDescription": "Cliquez sur le bouton ci-dessous pour copier le lien dans votre presse-papiers.", + "index.copyLinkButton": "Copier le lien dans le presse-papiers", + "index.transferToSystem": "3. Copier la séance sur le nouveau système", + "index.transferToSystemDescription": "Ouvrir le lien copié dans le navigateur ou l'appareil cible pour transférer votre séance.", + "index.transferSessionDescription": "Transférez votre session actuelle vers le navigateur ou l'appareil en cliquant sur le bouton ci-dessous. Cela copiera un lien vers une page qui transférera votre session lors de l'ouverture dans le navigateur ou l'appareil cible.", + "index.createOpenPad": "Ouvrir le bloc-notes par son nom", "index.openPad": "ouvrir un bloc-note existant avec le nom :", + "index.recentPads": "Bloc-notes récents", + "index.recentPadsEmpty": "Aucun bloc-notes récents trouvés.", + "index.generateNewPad": "Générer un nom de bloc-notes aléatoire", + "index.labelPad": "Nom du bloc-notes (facultatif)", + "index.placeholderPadEnter": "Veuillez saisir un nom de bloc-notes...", + "index.createAndShareDocuments": "Créez et partagez des documents en temps réel", + "index.createAndShareDocumentsDescription": "Etherpad vous permet d'éditer des documents de manière collaborative en temps réel, un peu comme un éditeur multijoueur en direct qui s'exécute dans votre navigateur.", "pad.toolbar.bold.title": "Gras (Ctrl + B)", "pad.toolbar.italic.title": "Italique (Ctrl + I)", "pad.toolbar.underline.title": "Souligné (Ctrl + U)", @@ -81,6 +104,7 @@ "pad.toolbar.savedRevision.title": "Enregistrer la révision", "pad.toolbar.settings.title": "Paramètres", "pad.toolbar.embed.title": "Partager et intégrer ce bloc-notes", + "pad.toolbar.home.title": "Retour à l’accueil", "pad.toolbar.showusers.title": "Afficher les utilisateurs du bloc-notes", "pad.colorpicker.save": "Enregistrer", "pad.colorpicker.cancel": "Annuler", @@ -97,10 +121,12 @@ "pad.settings.fontType": "Type de police :", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Langue :", + "pad.settings.deletePad": "Supprimer le bloc-notes", + "pad.delete.confirm": "Voulez-vous vraiment supprimer ce bloc-notes ?", "pad.settings.about": "À propos", "pad.settings.poweredBy": "Propulsé par", "pad.importExport.import_export": "Importer/Exporter", - "pad.importExport.import": "Charger un texte ou un document", + "pad.importExport.import": "Téléverser un texte ou un document", "pad.importExport.importSuccessful": "Réussi !", "pad.importExport.export": "Exporter le bloc-notes actuel en :", "pad.importExport.exportetherpad": "Etherpad", @@ -119,7 +145,7 @@ "pad.modals.userdup.explanation": "Ce bloc-notes semble être ouvert dans plusieurs fenêtres sur cet ordinateur.", "pad.modals.userdup.advice": "Se reconnecter en utilisant plutôt cette fenêtre.", "pad.modals.unauth": "Non autorisé", - "pad.modals.unauth.explanation": "Vos autorisations ont été changées lors de l’affichage de cette page. Essayez de vous reconnecter.", + "pad.modals.unauth.explanation": "Vos autorisations ont changées lors de l’affichage de cette page. Essayez de vous reconnecter.", "pad.modals.looping.explanation": "Nous éprouvons des problèmes de communication au serveur de synchronisation.", "pad.modals.looping.cause": "Il est possible que vous soyez connecté avec un pare-feu ou un mandataire incompatible.", "pad.modals.initsocketfail": "Le serveur est introuvable.", @@ -133,12 +159,12 @@ "pad.modals.corruptPad.cause": "Cela peut être dû à une mauvaise configuration du serveur ou à un autre comportement inattendu. Veuillez contacter l’administrateur du service.", "pad.modals.deleted": "Supprimé.", "pad.modals.deleted.explanation": "Ce bloc-notes a été supprimé.", - "pad.modals.rateLimited": "Flot limité.", + "pad.modals.rateLimited": "Débit limité.", "pad.modals.rateLimited.explanation": "Vous avez envoyé trop de messages à ce bloc-notes, il vous a donc déconnecté.", "pad.modals.rejected.explanation": "Le serveur a rejeté un message qui a été envoyé par votre navigateur.", "pad.modals.rejected.cause": "Le serveur peut avoir été mis à jour pendant que vous regardiez le bloc-notes, ou il y a peut-être une anomalie dans Etherpad. Essayez de recharger la page.", "pad.modals.disconnected": "Vous avez été déconnecté.", - "pad.modals.disconnected.explanation": "La connexion au serveur a échoué.", + "pad.modals.disconnected.explanation": "La connexion au serveur a échoué", "pad.modals.disconnected.cause": "Il se peut que le serveur soit indisponible. Si le problème persiste, veuillez en informer l’administrateur du service.", "pad.share": "Partager ce bloc-notes", "pad.share.readonly": "Lecture seule", @@ -157,7 +183,7 @@ "timeslider.toolbar.exportlink.title": "Exporter", "timeslider.exportCurrent": "Exporter la version actuelle sous :", "timeslider.version": "Version {{version}}", - "timeslider.saved": "Enregistré le {{day}} {{month}} {{year}}", + "timeslider.saved": "Enregistrée le {{day}} {{month}} {{year}}", "timeslider.playPause": "Lecture / Pause des contenus du bloc-notes", "timeslider.backRevision": "Reculer d’une révision dans ce bloc-notes", "timeslider.forwardRevision": "Avancer d’une révision dans ce bloc-notes", @@ -179,13 +205,13 @@ "pad.savedrevs.timeslider": "Vous pouvez voir les révisions enregistrées en ouvrant l’historique", "pad.userlist.entername": "Saisissez votre nom", "pad.userlist.unnamed": "anonyme", - "pad.editbar.clearcolors": "Effacer le surlignage par auteur dans tout le document ? Cette action ne peut être annulée.", + "pad.editbar.clearcolors": "Effacer le surlignage par auteur dans tout le document ? Cette action n'est pas réversible.", "pad.impexp.importbutton": "Importer maintenant", "pad.impexp.importing": "Importation en cours...", "pad.impexp.confirmimport": "Importer un fichier écrasera le contenu actuel du bloc-notes. Êtes-vous sûr de vouloir le faire ?", - "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire manuellement un copier/coller du texte brut", - "pad.impexp.padHasData": "Nous n’avons pas pu importer ce fichier parce que ce bloc-notes a déjà été modifié ; veuillez l’importer vers un nouveau bloc-notes.", - "pad.impexp.uploadFailed": "Le téléversement a échoué, veuillez réessayer.", + "pad.impexp.convertFailed": "Nous ne pouvons pas importer ce fichier. Veuillez utiliser un autre format de document ou faire manuellement", + "pad.impexp.padHasData": "Nous n’avons pas pu importer ce fichier parce que ce bloc-notes a déjà été modifié ; veuillez l’importer vers un nouveau bloc-notes", + "pad.impexp.uploadFailed": "Le téléversement a échoué, veuillez réessayer", "pad.impexp.importfailed": "Échec de l’import", "pad.impexp.copypaste": "Veuillez copier-coller", "pad.impexp.exportdisabled": "L’exportation au format {{type}} est désactivée. Veuillez contacter votre administrateur système pour plus de détails.", diff --git a/src/locales/gl.json b/src/locales/gl.json index 352737d39..465496a03 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -40,11 +40,30 @@ "admin_settings.current_save.value": "Gardar axustes", "admin_settings.page-title": "Axustes - Etherpad", "index.newPad": "Novo documento", - "index.createOpenPad": "ou crea/abre un documento co nome:", - "index.openPad": "abrir un Pad existente co nome:", - "pad.toolbar.bold.title": "Resaltado (Ctrl-B)", - "pad.toolbar.italic.title": "Cursiva (Ctrl-I)", - "pad.toolbar.underline.title": "Subliñar (Ctrl-U)", + "index.settings": "Axustes", + "index.transferSessionTitle": "Transferir a sesión", + "index.receiveSessionTitle": "Recibir a sesión", + "index.receiveSessionDescription": "Aquí podes recibir unha sesión de Etherpad desde outro navegador ou dispositivo. Ten en conta, non obstante, que isto eliminará a túa sesión actual, se a houbese.", + "index.transferSession": "1. Transfire a sesión", + "index.transferSessionNow": "Transfire a sesión agora", + "index.copyLink": "2. Copia a ligazón", + "index.copyLinkDescription": "Fai clic no botón de embaixo para copiar a ligazón no portapapeis.", + "index.copyLinkButton": "Copiar a ligazón no portapapeis", + "index.transferToSystem": "3. Copia a sesión no novo sistema", + "index.transferToSystemDescription": "Abre a ligazón copiada no navegador ou dispositivo de destino para transferir a túa sesión.", + "index.transferSessionDescription": "Transfire a túa sesión actual ao navegador ou dispositivo facendo clic no botón de embaixo. Isto copiará unha ligazón cara a unha páxina que transferirá a túa sesión cando se abra no navegador ou dispositivo de destino.", + "index.createOpenPad": "Abrir un documento por nome", + "index.openPad": "abrir un documento existente co nome:", + "index.recentPads": "Documentos recentes", + "index.recentPadsEmpty": "Non se atoparon documentos recentes.", + "index.generateNewPad": "Xerar un nome de documento ao chou", + "index.labelPad": "Nome do documento (opcional)", + "index.placeholderPadEnter": "Escribe un nome para o documento...", + "index.createAndShareDocuments": "Crea e comparte documentos en tempo real", + "index.createAndShareDocumentsDescription": "Etherpad permite editar documentos de forma colaborativa en tempo real, de xeito semellante a un editor multixogador en directo que se executa no navegador.", + "pad.toolbar.bold.title": "Grosa (Ctrl+B)", + "pad.toolbar.italic.title": "Cursiva (Ctrl+I)", + "pad.toolbar.underline.title": "Subliñar (Ctrl+U)", "pad.toolbar.strikethrough.title": "Riscar (Ctrl+5)", "pad.toolbar.ol.title": "Lista ordenada (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Lista sen ordenar (Ctrl+Shift+L)", @@ -58,6 +77,7 @@ "pad.toolbar.savedRevision.title": "Gardar a revisión", "pad.toolbar.settings.title": "Axustes", "pad.toolbar.embed.title": "Compartir e incorporar este documento", + "pad.toolbar.home.title": "Volver ao inicio", "pad.toolbar.showusers.title": "Mostrar as usuarias deste documento", "pad.colorpicker.save": "Gardar", "pad.colorpicker.cancel": "Cancelar", @@ -74,6 +94,8 @@ "pad.settings.fontType": "Tipo de letra:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Lingua:", + "pad.settings.deletePad": "Borrar o documento", + "pad.delete.confirm": "Queres borrar este documento?", "pad.settings.about": "Acerca de", "pad.settings.poweredBy": "Grazas a", "pad.importExport.import_export": "Importar/Exportar", @@ -88,7 +110,7 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.abiword.innerHTML": "Só podes importar texto simple ou formatos HTML. Para obter máis información sobre as características de importación avanzadas instala AbiWord.", "pad.modals.connected": "Conectado.", - "pad.modals.reconnecting": "Reconectando co seu documento...", + "pad.modals.reconnecting": "Reconectando co teu documento...", "pad.modals.forcereconnect": "Forzar a reconexión", "pad.modals.reconnecttimer": "Intentarase reconectar en", "pad.modals.cancel": "Cancelar", @@ -118,7 +140,7 @@ "pad.modals.disconnected.explanation": "Perdeuse a conexión co servidor", "pad.modals.disconnected.cause": "O servidor non está dispoñible. Póñase en contacto co administrador do servizo se o problema continúa.", "pad.share": "Compartir este documento", - "pad.share.readonly": "Só lectura", + "pad.share.readonly": "Lectura só", "pad.share.link": "Ligazón", "pad.share.emebdcode": "Incorporar o URL", "pad.chat": "Chat", diff --git a/src/locales/got.json b/src/locales/got.json new file mode 100644 index 000000000..8e658ca16 --- /dev/null +++ b/src/locales/got.json @@ -0,0 +1,67 @@ +{ + "@metadata": { + "authors": [ + "Gothicspeaker" + ] + }, + "admin_plugins.name": "𐌽𐌰𐌼𐍉", + "admin_plugins.version": "𐌿𐍃𐌼𐌴𐍂𐌹", + "admin_plugins_info.version_latest": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐍅𐌹𐍃𐌰𐌽𐌳𐍉 𐌿𐍃𐌼𐌴𐍂𐌹", + "admin_plugins_info.version_number": "𐍂𐌰𐌸𐌾𐍉 𐌿𐍃𐌼𐌴𐍂𐌾𐌹𐍃", + "index.newPad": "𐍀𐌰𐌳 𐌽𐌹𐍅𐌹", + "index.createOpenPad": "𐍀𐌰𐌳 𐌱𐌹 𐌽𐌰𐌼𐌹𐌽 𐌿𐍃𐌻𐌿𐌺𐌰𐌽", + "index.openPad": "𐍅𐌹𐍃𐌰𐌽𐌳𐍉 𐍀𐌰𐌳 𐌿𐍃𐌻𐌿𐌺𐌰𐌽 𐌼𐌹𐌸 𐌽𐌰𐌼𐌹𐌽:", + "index.recentPads": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰 𐍀𐌰𐌳𐌰", + "index.recentPadsEmpty": "𐌽𐌹 𐌱𐌹𐌲𐌰𐍄 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰 𐍀𐌰𐌳𐌰.", + "index.labelPad": "𐌽𐌰𐌼𐍉 𐍀𐌰𐌳𐌹𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲)", + "index.placeholderPadEnter": "𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺 𐌼𐌴𐌻𐌴𐌹 𐌽𐌰𐌼𐍉 𐍀𐌰𐌳𐌹𐍃...", + "pad.toolbar.bold.title": "𐌱𐌰𐌻𐌸 (𐌺𐍄𐍂𐌻+𐌱)", + "pad.toolbar.italic.title": "𐌹𐍄𐌰𐌻𐌹𐍃𐌺 (𐌺𐍄𐍂𐌻+𐌹)", + "pad.toolbar.underline.title": "𐌿𐍆𐍃𐍄𐍂𐌹𐌺𐍃 (𐌺𐍄𐍂𐌻+𐌿)", + "pad.toolbar.strikethrough.title": "𐍃𐍄𐍂𐌹𐌺𐌰𐌸𐌰𐌹𐍂𐌷 (𐌺𐍄𐍂𐌻+5)", + "pad.toolbar.undo.title": "𐌱𐌻𐌰𐌿𐌸𐌾𐌰𐌽 (𐌺𐍄𐍂𐌻+𐌶)", + "pad.toolbar.redo.title": "𐌰𐍆𐍄𐍂𐌰𐌲𐌰𐍄𐌰𐌿𐌾𐌰𐌽 (𐌺𐍄𐍂𐌻+𐍅)", + "pad.toolbar.timeslider.title": "𐌸𐌴𐌹𐌷𐍃𐌰𐍃𐌻𐌴𐌹𐌳𐌰𐌽𐌳𐍃", + "pad.toolbar.savedRevision.title": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌽", + "pad.toolbar.home.title": "𐌲𐌰𐍅𐌰𐌽𐌳𐌾𐌰𐌽 𐌸𐌿𐌺 𐌳𐌿 𐌲𐌰𐍂𐌳𐌰", + "pad.colorpicker.save": "𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌽", + "pad.colorpicker.cancel": "𐌱𐌹𐍅𐌰𐌽𐌳𐌾𐌰𐌽", + "pad.settings.myView": "𐍃𐌹𐌿𐌽𐍃 𐌼𐌴𐌹𐌽𐌰", + "pad.settings.stickychat": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌰𐌽𐌰 𐍃𐌺𐌰𐌹𐍂𐌼𐌰 𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉", + "pad.settings.chatandusers": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌾𐌰𐌷 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐍃 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽", + "pad.settings.language": "𐍂𐌰𐌶𐌳𐌰:", + "pad.settings.deletePad": "𐍀𐌰𐌳𐌰 𐌿𐍃𐌵𐌹𐍃𐍄𐌾𐌰𐌽", + "pad.delete.confirm": "𐌱𐌹 𐍃𐌿𐌽𐌾𐌰𐌹 𐍅𐌹𐌻𐌴𐌹𐌶𐌿 𐌸𐌰𐌼𐌼𐌰 𐍀𐌰𐌳𐌰 𐌿𐍃𐌵𐌹𐍃𐍄𐌾𐌰𐌽?", + "pad.settings.about": "𐌱𐌹", + "pad.importExport.exporthtml": "𐌷𐍄𐌼𐌻", + "pad.importExport.exportpdf": "𐍀𐌳𐍆", + "pad.importExport.exportopen": "𐍉𐌳𐍆 (𐍉𐍀𐌰𐌹𐌽 𐌳𐍉𐌺𐌿𐌼𐌰𐌹𐌽𐍄 𐍆𐌰𐌿𐍂𐌼𐌰𐍄)", + "pad.modals.cancel": "𐌱𐌹𐍅𐌰𐌽𐌳𐌾𐌰𐌽", + "pad.modals.userdup": "𐌿𐍃𐌻𐌿𐌺𐌰𐌽 𐌹𐌽 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌼𐌼𐌰", + "pad.modals.deleted": "𐌿𐍃𐌵𐌹𐍃𐍄𐌹𐌸.", + "pad.modals.deleted.explanation": "𐌸𐌰𐍄𐌰 𐍀𐌰𐌳 𐌿𐍃𐌽𐌿𐌼𐌰𐌽 𐌹𐍃𐍄.", + "pad.share": "𐌸𐌰𐍄𐌰 𐍀𐌰𐌳 𐌳𐌰𐌹𐌻𐌾𐌰𐌽", + "pad.share.readonly": "𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌰𐌽𐌰𐌺𐌿𐌽𐌽𐌰𐌽", + "pad.share.link": "𐌲𐌰𐍅𐌹𐍃𐍃", + "pad.chat": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹", + "pad.chat.title": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌸𐌰𐌼𐌼𐌰 𐍀𐌰𐌳𐌰 𐌿𐍃𐌻𐌿𐌺𐌰𐌽.", + "pad.chat.stick.title": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐍃𐍄𐌹𐌺𐌰𐌽 𐌳𐌿 𐍃𐌺𐌰𐌹𐍂𐌼𐌰", + "timeslider.toolbar.returnbutton": "𐌲𐌰𐍅𐌰𐌽𐌳𐌾𐌰𐌽 𐌸𐌿𐌺 𐌳𐌿 𐍀𐌰𐌳𐌰", + "timeslider.toolbar.authors": "𐌱𐍉𐌺𐌰𐍂𐌾𐍉𐍃:", + "timeslider.toolbar.authorsList": "𐌽𐌹 𐌱𐍉𐌺𐌰𐍂𐌾𐍉𐍃", + "timeslider.version": "𐌿𐍃𐌼𐌴𐍂𐌹 {{version}}", + "timeslider.month.january": "𐌾𐌰𐌽𐌿𐌰𐍂𐌴𐌹𐍃", + "timeslider.month.february": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃", + "timeslider.month.march": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃", + "timeslider.month.april": "𐌰𐍀𐍂𐌴𐌹𐌻𐌹𐍃", + "timeslider.month.may": "𐌼𐌰𐌾𐌿𐍃", + "timeslider.month.june": "𐌾𐌿𐌽𐌹𐌿𐍃", + "timeslider.month.july": "𐌾𐌿𐌻𐌹𐌿𐍃", + "timeslider.month.august": "𐌰𐌲𐌿𐍃𐍄𐌿𐍃", + "timeslider.month.september": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂", + "timeslider.month.october": "𐌰𐌿𐌺𐍄𐍉𐌱𐌰𐌹𐍂", + "timeslider.month.november": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂", + "timeslider.month.december": "𐌾𐌹𐌿𐌻𐌴𐌹𐍃", + "pad.userlist.entername": "𐌼𐌴𐌻𐌴𐌹 𐌽𐌰𐌼𐍉 𐌸𐌴𐌹𐌽", + "pad.userlist.unnamed": "𐌿𐌽𐌽𐌰𐌼𐌽𐌹𐌸" +} diff --git a/src/locales/he.json b/src/locales/he.json index 458ad0ace..0515308f0 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -42,12 +42,31 @@ "admin_settings.current_save.value": "שמירת הגדרות", "admin_settings.page-title": "הגדרות - Etherpad", "index.newPad": "פנקס חדש", - "index.createOpenPad": "ליצור או לפתוח פנקס בשם:", + "index.settings": "הגדרות", + "index.transferSessionTitle": "העברת הפעלה", + "index.receiveSessionTitle": "קבלת הפעלה", + "index.receiveSessionDescription": "כאן אפשר לקבל הפעלת Etherpad מדפדפן או מכשיר אחרים. נא לשים לב, שזה עלול למחוק את ההפעלה הנוכחית שלך, אם יש כזאת.", + "index.transferSession": "1. העברת הפעלה", + "index.transferSessionNow": "העברת הפעלה כעת", + "index.copyLink": "2. להעתיק קישור", + "index.copyLinkDescription": "לחיצה על הכפתור להלן תעתיק את הקישור ללוח הגזירים שלך.", + "index.copyLinkButton": "העתקת קישור ללוח", + "index.transferToSystem": "3. העתקת הפעלה למערכת חדשה", + "index.transferToSystemDescription": "יש לפתוח את הקישור שהועתק בדפדפן או מכשיר היעד כדי להעביר את ההפעלה שלך.", + "index.transferSessionDescription": "אפשר להעביר את ההתחברות הנוכחית שלך לדפדפן או למכשיר בלחיצה על הכפתור שלהלן. הפעולה הזאת תעתיק את הקישור לדף שיעביר את ההפעלה שלך כשייפתח בדפדפן או מכשיר היעד.", + "index.createOpenPad": "פתיחת פנקס לפי שם", "index.openPad": "פתיחת פנקס קיים עם השם:", - "pad.toolbar.bold.title": "בולט (Ctrl-B)", - "pad.toolbar.italic.title": "נטוי (Ctrl-I)", - "pad.toolbar.underline.title": "קו תחתי (Ctrl-U)", - "pad.toolbar.strikethrough.title": "קו מוחק (Ctrl+5)", + "index.recentPads": "פנקסים אחרונים", + "index.recentPadsEmpty": "לא נמצאו פנקסים אחרונים.", + "index.generateNewPad": "יצירת שם אקראי לפנקס", + "index.labelPad": "שם הפנקס (רשות)", + "index.placeholderPadEnter": "נא למלא שם לפנקס...", + "index.createAndShareDocuments": "יצירה ושיתוף של מסמכים בזמן אמת", + "index.createAndShareDocumentsDescription": "Etherpad מאפשר לך לערוך מסמכים באופן שיתופי בזמן אמת, כמו עורך רב־שחקנים בזמן אחר שרץ בדפדפן שלך.", + "pad.toolbar.bold.title": "מודגש (Ctrl+B)", + "pad.toolbar.italic.title": "נטוי (Ctrl+I)", + "pad.toolbar.underline.title": "קו תחתי (Ctrl+U)", + "pad.toolbar.strikethrough.title": "קו חוצה (Ctrl+5)", "pad.toolbar.ol.title": "רשימה ממוספרת (Ctrl+Shift+N)", "pad.toolbar.ul.title": "רשימת תבליטים (Ctrl+Shift+L)", "pad.toolbar.indent.title": "הזחה (טאב)", @@ -60,6 +79,7 @@ "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": "ביטול", @@ -69,13 +89,15 @@ "pad.settings.padSettings": "הגדרות פנקס", "pad.settings.myView": "התצוגה שלי", "pad.settings.stickychat": "השיחה תמיד על המסך", - "pad.settings.chatandusers": "הצגת צ'אט ומשתמשים", + "pad.settings.chatandusers": "הצגת צ׳אט ומשתמשים", "pad.settings.colorcheck": "צביעה לפי מחבר", "pad.settings.linenocheck": "מספרי שורות", "pad.settings.rtlcheck": "לקרוא את התוכן מימין לשמאל?", "pad.settings.fontType": "סוג גופן:", "pad.settings.fontType.normal": "רגיל", "pad.settings.language": "שפה:", + "pad.settings.deletePad": "מחיקת פנקס", + "pad.delete.confirm": "למחוק את הפנקס הזה?", "pad.settings.about": "על אודות", "pad.settings.poweredBy": "מופעל על גבי", "pad.importExport.import_export": "יבוא/יצוא", diff --git a/src/locales/hsb.json b/src/locales/hsb.json index 62f70740f..7a75c9508 100644 --- a/src/locales/hsb.json +++ b/src/locales/hsb.json @@ -38,8 +38,27 @@ "admin_settings.current_save.value": "Nastajenja składować", "admin_settings.page-title": "Nastajenja – Etherpad", "index.newPad": "Nowy zapisnik", - "index.createOpenPad": "abo wutwor/wočiń zapisnik z mjenom:", + "index.settings": "Nastajenja", + "index.transferSessionTitle": "Posedźenje přenošować", + "index.receiveSessionTitle": "Posedźenje přijeć", + "index.receiveSessionDescription": "Tu móžeš posedźenje Etherpad z druheho wobhladowaka abo grata přijeć. Prošu dźiwaj na to, zo to waše aktualne posedźenje zhaša, jeli tajke eksistuje.", + "index.transferSession": "1. Posedźenje přenošować", + "index.transferSessionNow": "Posedźenje nětko přenošować", + "index.copyLink": "2. Wotkaz kopěrować", + "index.copyLinkDescription": "Klikń na slědowace tłóčatko, zo by wotkaz do mjezyskłada kopěrował.", + "index.copyLinkButton": "Wotkaz do mjezyskłada kopěrować", + "index.transferToSystem": "3. Posedźenje do noweho systema kopěrować", + "index.transferToSystemDescription": "Wočiń kopěrowany wotkaz w cilowym wobhladowaku abo graće, zo by swoje posedźenje přenošował.", + "index.transferSessionDescription": "Klikń na slědowace tłóčatko, zo by swoje aktualne posedźenje do wobhladowaka abo grata přenošował. To budźe wotkaz do strony kopěrować, kotraž budźe waše posedźenje přenošować, hdyž so w cilowym wobhladowaku abo graće wočinja.", + "index.createOpenPad": "Zapisnik po mjenje wočinić", "index.openPad": "wočińće eksistowacy Pad z mjenom:", + "index.recentPads": "Najnowše zapisniki", + "index.recentPadsEmpty": "Žane najnowše zapisniki namakane.", + "index.generateNewPad": "Připadne mjeno zapisnika generować", + "index.labelPad": "Mjeno zapisnika (po přeću)", + "index.placeholderPadEnter": "Prošu zapodaj mjeno zapisnika…", + "index.createAndShareDocuments": "Wutwor a dźěl dokumenty we woprawdźitym času", + "index.createAndShareDocumentsDescription": "Etherpad wam zmóžnja, dokumenty zhromadnje we woprawdźitym času wobdźěłać, kaž editor live multi-player, kotryž we wašim wobhladowaku běži.", "pad.toolbar.bold.title": "Tučny (Strg-B)", "pad.toolbar.italic.title": "Kursiwny (Strg-I)", "pad.toolbar.underline.title": "Podšmórnyć (Strg-U)", @@ -56,6 +75,7 @@ "pad.toolbar.savedRevision.title": "Wersiju składować", "pad.toolbar.settings.title": "Nastajenja", "pad.toolbar.embed.title": "Tutón zapisnik dźělić a zasadźić", + "pad.toolbar.home.title": "Wróćo k startowej stronje", "pad.toolbar.showusers.title": "Wužiwarjow na tutym zapisniku pokazać", "pad.colorpicker.save": "Składować", "pad.colorpicker.cancel": "Přetorhnyć", @@ -72,6 +92,8 @@ "pad.settings.fontType": "Pismowa družina:", "pad.settings.fontType.normal": "Normalny", "pad.settings.language": "Rěč:", + "pad.settings.deletePad": "Zapisnik zhašeć", + "pad.delete.confirm": "Chceće woprawdźe tutón zapisnik zhašeć?", "pad.settings.about": "Wo", "pad.settings.poweredBy": "Spěchowany wot", "pad.importExport.import_export": "Import/Eksport", diff --git a/src/locales/hu.json b/src/locales/hu.json index 46f111903..377672b17 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -10,7 +10,8 @@ "Notramo", "Ovari", "R-Joe", - "Tgr" + "Tgr", + "Urbalazs" ] }, "admin.page-title": "Admin irányítópult - Etherpad", @@ -67,7 +68,7 @@ "pad.toolbar.embed.title": "Jegyzetfüzet beágyazása és megosztása", "pad.toolbar.showusers.title": "Jegyzetfüzet felhasználóinak megmutatása", "pad.colorpicker.save": "Mentés", - "pad.colorpicker.cancel": "Mégsem", + "pad.colorpicker.cancel": "Mégse", "pad.loading": "Betöltés…", "pad.noCookie": "Nem található a süti. Engedélyezd a böngésződben a sütik használatát! A munkamenet és a beállítások nem kerülnek mentésre a látogatások között. Ennek oka lehet az, hogy az Etherpad egyes böngészőkben szerepel az iFrame-ben. Ellenőrizze, hogy az Etherpad ugyanabban az altartomány / tartományban van-e, mint a szülő iFrame", "pad.permissionDenied": "Nincs engedélyed ezen jegyzetfüzet eléréséhez", diff --git a/src/locales/ia.json b/src/locales/ia.json index 6d0c4f283..9023a76a6 100644 --- a/src/locales/ia.json +++ b/src/locales/ia.json @@ -37,32 +37,40 @@ "admin_settings.current_restart.value": "Reinitiar Etherpad", "admin_settings.current_save.value": "Salveguardar parametros", "admin_settings.page-title": "Parametros – Etherpad", - "index.newPad": "Nove pad", - "index.createOpenPad": "o crear/aperir un pad con le nomine:", - "index.openPad": "aperir un Pad existente con le nomine:", - "pad.toolbar.bold.title": "Grasse (Ctrl-B)", - "pad.toolbar.italic.title": "Italic (Ctrl-I)", - "pad.toolbar.underline.title": "Sublinear (Ctrl-U)", + "index.newPad": "Nove nota", + "index.createOpenPad": "Aperir le nota con le nomine", + "index.openPad": "aperir un nota existente con le nomine:", + "index.recentPads": "Notas recente", + "index.recentPadsEmpty": "Necun nota recente trovate.", + "index.generateNewPad": "Generar un nomine de nota aleatori", + "index.labelPad": "Nomine del nota (optional)", + "index.placeholderPadEnter": "Per favor insere un nomine de nota…", + "index.createAndShareDocuments": "Crear e condivider documentos in tempore real", + "index.createAndShareDocumentsDescription": "Etherpad permitte modificar documentos de maniera collaborative e in tempore real. Es un editor multi-usator in directo que se executa in tu navigator.", + "pad.toolbar.bold.title": "Grasse (Ctrl+B)", + "pad.toolbar.italic.title": "Italic (Ctrl+I)", + "pad.toolbar.underline.title": "Sublineate (Ctrl+U)", "pad.toolbar.strikethrough.title": "Barrate (Ctrl+5)", "pad.toolbar.ol.title": "Lista ordinate (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Lista non ordinate (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Indentar (TAB)", "pad.toolbar.unindent.title": "Disindentar (Shift+TAB)", - "pad.toolbar.undo.title": "Disfacer (Ctrl-Z)", - "pad.toolbar.redo.title": "Refacer (Ctrl-Y)", + "pad.toolbar.undo.title": "Disfacer (Ctrl+Z)", + "pad.toolbar.redo.title": "Refacer (Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "Rader colores de autor (Ctrl+Shift+C)", - "pad.toolbar.import_export.title": "Importar/exportar in differente formatos de file", + "pad.toolbar.import_export.title": "Importar/exportar inter differente formatos de file", "pad.toolbar.timeslider.title": "Glissa-tempore", - "pad.toolbar.savedRevision.title": "Version salveguardate", - "pad.toolbar.settings.title": "Configuration", - "pad.toolbar.embed.title": "Condivider e incorporar iste pad", - "pad.toolbar.showusers.title": "Monstrar le usatores de iste pad", + "pad.toolbar.savedRevision.title": "Salveguardar version", + "pad.toolbar.settings.title": "Parametros", + "pad.toolbar.embed.title": "Condivider e incorporar iste nota", + "pad.toolbar.home.title": "Retro al initio", + "pad.toolbar.showusers.title": "Monstrar le usatores de iste nota", "pad.colorpicker.save": "Salveguardar", "pad.colorpicker.cancel": "Cancellar", "pad.loading": "Cargamento…", - "pad.noCookie": "Le cookie non pote esser trovate. Per favor permitte le cookies in tu navigator! Tu session e parametros non essera salveguardate inter visitas. Isto pote esser debite al facto que Etherpad ha essite includite in un iFrame in alcun navigatores. Assecura te que Etherpad es sure le mesme subdominio/dominio que su iFrame parente.", - "pad.permissionDenied": "Tu non ha le permission de acceder a iste pad", - "pad.settings.padSettings": "Configuration del pad", + "pad.noCookie": "Le cookie non pote esser trovate. Per favor permitte le cookies in tu navigator! Tu session e parametros non essera salveguardate inter visitas. In alcun navigatores, isto pote esser debite al facto que Etherpad ha essite includite in un iFrame. Assecura te que Etherpad es sur le mesme subdominio/dominio que su iFrame genitor.", + "pad.permissionDenied": "Tu non ha le permission de acceder a iste nota", + "pad.settings.padSettings": "Parametros del nota", "pad.settings.myView": "Mi vista", "pad.settings.stickychat": "Chat sempre visibile", "pad.settings.chatandusers": "Monstrar chat e usatores", @@ -72,26 +80,28 @@ "pad.settings.fontType": "Typo de litteras:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Lingua:", + "pad.settings.deletePad": "Deler nota", + "pad.delete.confirm": "Es tu secur de voler deler iste nota?", "pad.settings.about": "A proposito", "pad.settings.poweredBy": "Actionate per", "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Incargar qualcunque file de texto o documento", "pad.importExport.importSuccessful": "Succedite!", - "pad.importExport.export": "Exportar le pad actual como:", + "pad.importExport.export": "Exportar le nota actual como:", "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto simple", "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.abiword.innerHTML": "Tu pote solmente importar files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, installa AbiWord o LibreOffice.", + "pad.importExport.abiword.innerHTML": "Es possibile importar solmente le files in formato de texto simple o HTML. Pro functionalitate de importation plus extense, installa AbiWord o LibreOffice.", "pad.modals.connected": "Connectite.", - "pad.modals.reconnecting": "Reconnexion a tu pad…", + "pad.modals.reconnecting": "Reconnexion a tu nota…", "pad.modals.forcereconnect": "Fortiar reconnexion", "pad.modals.reconnecttimer": "Tentativa de reconnexion in", "pad.modals.cancel": "Cancellar", "pad.modals.userdup": "Aperte in un altere fenestra", - "pad.modals.userdup.explanation": "Iste pad pare esser aperte in plus de un fenestra de navigator in iste computator.", + "pad.modals.userdup.explanation": "Iste nota pare esser aperte in plus de un fenestra de navigator in iste computator.", "pad.modals.userdup.advice": "Reconnecte pro usar iste fenestra.", "pad.modals.unauth": "Non autorisate", "pad.modals.unauth.explanation": "Tu permissiones ha cambiate durante que tu legeva iste pagina. Tenta reconnecter.", @@ -104,38 +114,38 @@ "pad.modals.slowcommit.cause": "Isto pote esser causate per problemas con le connexion al rete.", "pad.modals.badChangeset.explanation": "Un modification que tu ha facite ha essite classificate como incorrecte per le servitor de synchronisation.", "pad.modals.badChangeset.cause": "Isto pote esser causate per un configuration incorrecte del servitor o per alcun altere comportamento impreviste. Per favor contacta le administrator del servicio si tu pensa que se tracta de un error. Tenta reconnecter te pro continuar a modificar.", - "pad.modals.corruptPad.explanation": "Le pad al qual tu tenta acceder es corrumpite.", + "pad.modals.corruptPad.explanation": "Le nota al qual tu tenta acceder es corrumpite.", "pad.modals.corruptPad.cause": "Isto pote esser debite a un configuration incorrecte del servitor o a alcun altere comportamento impreviste. Per favor contacta le administrator del servicio.", "pad.modals.deleted": "Delite.", - "pad.modals.deleted.explanation": "Iste pad ha essite removite.", + "pad.modals.deleted.explanation": "Iste nota ha essite removite.", "pad.modals.rateLimited": "Frequentia limitate.", - "pad.modals.rateLimited.explanation": "Tu ha inviate troppo de messages a iste pad, dunque illo te ha disconnectite.", + "pad.modals.rateLimited.explanation": "Tu ha inviate troppo de messages a iste nota, dunque illo te ha disconnectite.", "pad.modals.rejected.explanation": "Le servitor ha rejectate un message que tu navigator ha inviate.", - "pad.modals.rejected.cause": "Es possibile que le servitor ha essite actualisate durante que tu legeva le pad, o que il ha un falta in Etherpad. Tenta recargar le pagina.", + "pad.modals.rejected.cause": "Es possibile que le servitor ha essite actualisate durante que tu legeva le nota, o que il ha un falta in Etherpad. Tenta recargar le pagina.", "pad.modals.disconnected": "Tu ha essite disconnectite.", "pad.modals.disconnected.explanation": "Le connexion al servitor ha essite perdite.", "pad.modals.disconnected.cause": "Le servitor pote esser indisponibile. Per favor notifica le administrator del servicio si isto continua a producer se.", - "pad.share": "Diffunder iste pad", + "pad.share": "Condivider iste nota", "pad.share.readonly": "Lectura solmente", "pad.share.link": "Ligamine", "pad.share.emebdcode": "Codice de incorporation", "pad.chat": "Chat", - "pad.chat.title": "Aperir le chat pro iste pad.", + "pad.chat.title": "Aperir le conversation pro iste nota.", "pad.chat.loadmessages": "Cargar plus messages", "pad.chat.stick.title": "Ancorar le chat sur le schermo", "pad.chat.writeMessage.placeholder": "Scribe tu message hic", - "timeslider.followContents": "Sequer le actualisationes de contento del pad", + "timeslider.followContents": "Sequer le nove contento del nota", "timeslider.pageTitle": "Glissa-tempore pro {{appTitle}}", - "timeslider.toolbar.returnbutton": "Retornar al pad", + "timeslider.toolbar.returnbutton": "Retornar al nota", "timeslider.toolbar.authors": "Autores:", "timeslider.toolbar.authorsList": "Nulle autor", "timeslider.toolbar.exportlink.title": "Exportar", "timeslider.exportCurrent": "Exportar le version actual como:", "timeslider.version": "Version {{version}}", "timeslider.saved": "Salveguardate le {{day}} de {{month}} {{year}}", - "timeslider.playPause": "Reproducer/pausar le contento del pad", - "timeslider.backRevision": "Recular un version in iste pad", - "timeslider.forwardRevision": "Avantiar un version in iste pad", + "timeslider.playPause": "Reproducer/pausar le contento del nota", + "timeslider.backRevision": "Recular un version in iste nota", + "timeslider.forwardRevision": "Avantiar un version in iste nota", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januario", "timeslider.month.february": "februario", @@ -157,9 +167,9 @@ "pad.editbar.clearcolors": "Rader le colores de autor in tote le documento? Isto non pote esser disfacite", "pad.impexp.importbutton": "Importar ora", "pad.impexp.importing": "Importation in curso…", - "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del pad. Es tu secur de voler continuar?", - "pad.impexp.convertFailed": "Nos non ha potite importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", - "pad.impexp.padHasData": "Nos non ha potite importar iste file perque iste Pad ha jam habite cambiamentos. Per favor importa lo a un nove pad.", + "pad.impexp.confirmimport": "Le importation de un file superscribera le texto actual del nota. Es tu secur de voler continuar?", + "pad.impexp.convertFailed": "Non esseva possibile importar iste file. Per favor usa un altere formato de documento o copia e colla le texto manualmente.", + "pad.impexp.padHasData": "Non es possibile importar iste file perque iste nota ha ja essite modificate. Per favor importa lo in un nove nota.", "pad.impexp.uploadFailed": "Le incargamento ha fallite. Per favor reproba.", "pad.impexp.importfailed": "Importation fallite", "pad.impexp.copypaste": "Per favor copia e colla", diff --git a/src/locales/id.json b/src/locales/id.json index 49b8f34fa..0011a9557 100644 --- a/src/locales/id.json +++ b/src/locales/id.json @@ -1,22 +1,51 @@ { "@metadata": { "authors": [ + "Akmaie Ajam", + "Atriwidada", "Bennylin", "IvanLanin", "Marwan Mohamad", + "Penyuwangi", "Veracious" ] }, "admin.page-title": "Dasbor Pengurus - Etherpad", - "admin_plugins": "Manajer plugin", + "admin_plugins": "Pengelola plugin", "admin_plugins.available": "Plugin yang tersedia", + "admin_plugins.available_not-found": "Tidak ada plugin yang ditemukan.", + "admin_plugins.available_fetching": "Mengambil…", "admin_plugins.available_install.value": "Instal", + "admin_plugins.available_search.placeholder": "Cari plugin yang akan dipasang", + "admin_plugins.description": "Deskripsi", + "admin_plugins.installed": "Plugin terpasang", + "admin_plugins.installed_fetching": "Mengambil plugin yang terpasang…", + "admin_plugins.installed_nothing": "Anda belum memasang plugin apa pun.", + "admin_plugins.installed_uninstall.value": "Uninstal", + "admin_plugins.last-update": "Pembaruan terakhir", + "admin_plugins.name": "Nama", + "admin_plugins.page-title": "Pengelola plugin - Etherpad", "admin_plugins.version": "Versi", + "admin_plugins_info": "Informasi penelusuran masalah", + "admin_plugins_info.hooks": "Kait terpasang", + "admin_plugins_info.hooks_client": "Kait sisi klien", + "admin_plugins_info.hooks_server": "Kait sisi peladen", + "admin_plugins_info.parts": "Bagian terpasang", + "admin_plugins_info.plugins": "Plugin terpasang", + "admin_plugins_info.page-title": "Informasi plugin - Etherpad", + "admin_plugins_info.version": "Versi Etherpad", + "admin_plugins_info.version_latest": "Versi terakhir yang tersedia", + "admin_plugins_info.version_number": "Nomor versi", "admin_settings": "Pengaturan", + "admin_settings.current": "Konfigurasi kini", + "admin_settings.current_example-devel": "Contoh templat pengaturan pengembangan", + "admin_settings.current_example-prod": "Contoh templat pengaturan produksi", + "admin_settings.current_restart.value": "Jalankan ulang Etherpad", "admin_settings.current_save.value": "Simpan pengaturan", "admin_settings.page-title": "Pengaturan - Etherpad", "index.newPad": "Pad baru", "index.createOpenPad": "atau buat/buka Pad dengan nama:", + "index.openPad": "buka Pad yang ada dengan nama:", "pad.toolbar.bold.title": "Tebal (Ctrl-B)", "pad.toolbar.italic.title": "Miring (Ctrl-I)", "pad.toolbar.underline.title": "Garis bawah (Ctrl-U)", @@ -37,7 +66,7 @@ "pad.colorpicker.save": "Simpan", "pad.colorpicker.cancel": "Batalkan", "pad.loading": "Memuat...", - "pad.noCookie": "Kuki tidak dapat ditemukan. Izinkan kuki di peramban Anda!", + "pad.noCookie": "Kuki tidak dapat ditemukan. Izinkan kuki di peramban Anda! Sesi dan pengaturan Anda tidak akan disimpan antar kunjungan. Ini mungkin karena Etherpad disertakan dalam suatu iFrame dalam beberapa Peramban. Harap pastikan Etherpad ada pada sub domain/domain dengan iFrame induk", "pad.permissionDenied": "Anda tidak memiliki izin untuk mengakses pad ini", "pad.settings.padSettings": "Pengaturan Pad", "pad.settings.myView": "Tampilan Saya", @@ -48,7 +77,10 @@ "pad.settings.rtlcheck": "Membaca dari kanan ke kiri?", "pad.settings.fontType": "Jenis fonta:", "pad.settings.language": "Bahasa:", + "pad.settings.deletePad": "Hapus Pad", + "pad.delete.confirm": "Apakah Anda benar-benar ingin menghapus pad ini?", "pad.settings.about": "Tentang", + "pad.settings.poweredBy": "Ditenagai oleh", "pad.importExport.import_export": "Impor/Ekspor", "pad.importExport.import": "Unggah setiap berkas teks atau dokumen", "pad.importExport.importSuccessful": "Berhasil!", @@ -59,9 +91,9 @@ "pad.importExport.exportword": "Microsoft Word", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", - "pad.importExport.abiword.innerHTML": "Anda hanya dapat mengimpor dari format teks biasa atau HTML. Untuk fitur impor yang lebih canggih, pasanglah AbiWord.", + "pad.importExport.abiword.innerHTML": "Anda hanya dapat mengimpor dari format teks polos atau HTML. Untuk fitur impor yang lebih canggih, pasanglah AbiWord atau LibreOffice.", "pad.modals.connected": "Tersambung.", - "pad.modals.reconnecting": "Menyambungkan kembali ke pad Anda...", + "pad.modals.reconnecting": "Menyambungkan kembali ke pad Anda…", "pad.modals.forcereconnect": "Sambung kembali secara paksa", "pad.modals.reconnecttimer": "Mencoba menghubungkan ulang", "pad.modals.cancel": "Batalkan", @@ -75,17 +107,21 @@ "pad.modals.initsocketfail": "Peladen tidak dapat dihubungi.", "pad.modals.initsocketfail.explanation": "Peladen sinkronisasi tidak dapat dihubungi.", "pad.modals.initsocketfail.cause": "Ini mungkin disebabkan oleh masalah dengan peramban atau sambungan internet Anda.", - "pad.modals.slowcommit.explanation": "Peladen tidak merespons.", + "pad.modals.slowcommit.explanation": "Peladen tidak menanggapi.", "pad.modals.slowcommit.cause": "Ini mungkin disebabkan oleh masalah dengan sambungan jaringan Anda.", - "pad.modals.badChangeset.explanation": "Suntingan yang Anda lakukan dianggap ilegal oleh server sinkronisasi.", - "pad.modals.badChangeset.cause": "Hal ini mungkin disebabkan oleh konfigurasi peladen salah atau sesuatu perilaku yang tidak diperkirakan. Silahkan hubungi administrator Anda jika Anda merasakan ini adalah satu kesalahan. Coba sambungkan kembali untuk terus menyunting.", + "pad.modals.badChangeset.explanation": "Suntingan yang telah Anda buat digolongkan ilegal oleh peladen sinkronisasi.", + "pad.modals.badChangeset.cause": "Ini mungkin disebabkan oleh konfigurasi peladen salah atau perilaku tak terduga lainnya. Harap hubungi pengurus layanan Anda jika Anda merasakan ini adalah satu kesalahan. Coba sambungkan kembali untuk terus menyunting.", "pad.modals.corruptPad.explanation": "Pad yang Anda coba akses telah korup.", - "pad.modals.corruptPad.cause": "Hal ini mungkin disebabkan oleh konfigurasi peladen salah atau sesuatu perilaku yang tidak diperkirakan. Silahkan hubungi administrator Anda jika Anda merasakan ini adalah satu kesalahan.", + "pad.modals.corruptPad.cause": "Ini mungkin disebabkan oleh konfigurasi peladen salah atau perilaku tak terduga lainnya. Harap hubungi pengurus layanan.", "pad.modals.deleted": "Dihapus", "pad.modals.deleted.explanation": "Pad ini telah dibuang.", + "pad.modals.rateLimited": "Laju Dibatasi.", + "pad.modals.rateLimited.explanation": "Anda mengirim terlalu banyak pesan ke pad ini sehingga itu memutus Anda.", + "pad.modals.rejected.explanation": "Peladen menolak suatu pesan yang dikirim oleh peramban Anda.", + "pad.modals.rejected.cause": "Peladen mungkin telah diperbarui ketika Anda sedang melihat pad, atau mungkin ada kekutu dalam Etherpad. Coba muat ulang halaman.", "pad.modals.disconnected": "Sambungan Anda telah diputuskan.", "pad.modals.disconnected.explanation": "Sambungan ke peladen terputus", - "pad.modals.disconnected.cause": "Peladen ini mungkin tidak tersedia. Silakan beritahu administrator jika masalah ini berkelanjutan.", + "pad.modals.disconnected.cause": "Peladen ini mungkin tak tersedia. Silakan beritahukan pengurus jika masalah ini berlanjut.", "pad.share": "Bagikan pad ini", "pad.share.readonly": "Baca saja", "pad.share.link": "Pranala", @@ -95,6 +131,7 @@ "pad.chat.loadmessages": "Muatkan lebih banyak pesan", "pad.chat.stick.title": "Tempelkan chat ke layar", "pad.chat.writeMessage.placeholder": "Tuliskan pesan Anda di sini", + "timeslider.followContents": "Ikuti pembaruan isi pad", "timeslider.pageTitle": "{{appTitle}} Timeslider", "timeslider.toolbar.returnbutton": "Kembali ke pad", "timeslider.toolbar.authors": "Pembuat:", @@ -124,7 +161,7 @@ "pad.savedrevs.timeslider": "Anda bisa melihat revisi yang tersimpan dengan mengunjungi timeslider", "pad.userlist.entername": "Masukkan nama Anda", "pad.userlist.unnamed": "tanpa nama", - "pad.editbar.clearcolors": "Padamkan warna penulis pada seluruh dokumen?", + "pad.editbar.clearcolors": "Bersihkan warna penulis pada seluruh dokumen? Ini tidak dapat dibatalkan", "pad.impexp.importbutton": "Impor Sekarang", "pad.impexp.importing": "Mengimpor...", "pad.impexp.confirmimport": "Mengimpor berkas akan menimpa teks saat ini di pad ini. Apakah Anda benar-benar ingin melakukannya?", @@ -133,5 +170,6 @@ "pad.impexp.uploadFailed": "Penunggahan gagal, silakan mencoba lagi", "pad.impexp.importfailed": "Impor gagal", "pad.impexp.copypaste": "Silahkan salin tempel", - "pad.impexp.exportdisabled": "Mengekspor dalam format {{type}} dilarang. Silakan hubungi administrator untuk detilnya." + "pad.impexp.exportdisabled": "Mengekspor dalam format {{type}} dimatikan. Silakan hubungi pengurus sistem Anda untuk rincian.", + "pad.impexp.maxFileSize": "Berkas terlalu besar. Hubungi pengurus situs Anda untuk menaikkan ukuran berkas yang diizinkan untuk impor" } diff --git a/src/locales/it.json b/src/locales/it.json index 0774f6ad5..aa49a59c0 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -2,6 +2,8 @@ "@metadata": { "authors": [ "Ajeje Brazorf", + "Albano", + "Ayub Abdulla", "Beta16", "Gianfranco", "Jack", @@ -16,16 +18,57 @@ "admin_plugins": "Gestione plugin", "admin_plugins.available": "Plugin disponibili", "admin_plugins.available_not-found": "Nessun plugin trovato.", + "admin_plugins.available_fetching": "Recupero in corso…", "admin_plugins.available_install.value": "Installa", + "admin_plugins.available_search.placeholder": "Cerca i plugin da installare", + "admin_plugins.description": "Descrizione", + "admin_plugins.installed": "Plugin installati", + "admin_plugins.installed_fetching": "Recupero dei plugin installati…", + "admin_plugins.installed_nothing": "Non hai ancora installato alcun plugin.", "admin_plugins.installed_uninstall.value": "Disinstalla", "admin_plugins.last-update": "Ultimo aggiornamento", "admin_plugins.name": "Nome", + "admin_plugins.page-title": "Gestore dei plugin - Etherpad", "admin_plugins.version": "Versione", + "admin_plugins_info": "Informazioni sulla risoluzione dei problemi", + "admin_plugins_info.hooks": "Hook installati", + "admin_plugins_info.hooks_client": "Hook lato client", + "admin_plugins_info.hooks_server": "Hook lato server", + "admin_plugins_info.parts": "Parti installate", + "admin_plugins_info.plugins": "Plugin installati", + "admin_plugins_info.page-title": "Informazioni sul plugin - Etherpad", + "admin_plugins_info.version": "Versione di Etherpad", + "admin_plugins_info.version_latest": "Ultima versione disponibile", + "admin_plugins_info.version_number": "Numero di versione", "admin_settings": "Impostazioni", + "admin_settings.current": "Configurazione attuale", + "admin_settings.current_example-devel": "Esempio di modello di impostazioni di sviluppo", + "admin_settings.current_example-prod": "Esempio di modello di impostazioni di produzione", + "admin_settings.current_restart.value": "Riavvia Etherpad", "admin_settings.current_save.value": "Salva impostazioni", + "admin_settings.page-title": "Impostazioni - Etherpad", "index.newPad": "Nuovo pad", - "index.createOpenPad": "o crea/apre un pad con il nome:", + "index.settings": "Impostazioni", + "index.transferSessionTitle": "Sessione di trasferimento", + "index.receiveSessionTitle": "Ricevi sessione", + "index.receiveSessionDescription": "Qui puoi ricevere una sessione Etherpad da un altro browser o dispositivo. Tieni presente, tuttavia, che questa operazione eliminerà la sessione corrente, se presente.", + "index.transferSession": "1. Sessione di trasferimento", + "index.transferSessionNow": "Trasferisci sessione ora", + "index.copyLink": "2. Copia il collegamento", + "index.copyLinkDescription": "Clicca sul pulsante qui sotto per copiare il link negli appunti.", + "index.copyLinkButton": "Copia link negli appunti", + "index.transferToSystem": "3. Copia la sessione sul nuovo sistema", + "index.transferToSystemDescription": "Apri il collegamento copiato nel browser o nel dispositivo di destinazione per trasferire la sessione", + "index.transferSessionDescription": "Trasferisci la tua sessione corrente al browser o al dispositivo cliccando sul pulsante qui sotto. Verrà copiato un link a una pagina che trasferirà la tua sessione quando verrà aperta nel browser o dispositivo di destinazione.", + "index.createOpenPad": "Apri pad per nome", "index.openPad": "apri un Pad esistente col nome:", + "index.recentPads": "Pad recenti", + "index.recentPadsEmpty": "Nessun Pad recente trovato.", + "index.generateNewPad": "Genera un nome casuale per il pad", + "index.labelPad": "Nome pad (facoltativo)", + "index.placeholderPadEnter": "Inserisci un nome per il pad...", + "index.createAndShareDocuments": "Crea e condividi documenti in tempo reale", + "index.createAndShareDocumentsDescription": "Etherpad consente di modificare documenti in modo collaborativo e in tempo reale, proprio come un editor multi-player in tempo reale eseguito nel browser.", "pad.toolbar.bold.title": "Grassetto (Ctrl+B)", "pad.toolbar.italic.title": "Corsivo (Ctrl+I)", "pad.toolbar.underline.title": "Sottolineato (Ctrl+U)", @@ -42,6 +85,7 @@ "pad.toolbar.savedRevision.title": "Versione salvata", "pad.toolbar.settings.title": "Impostazioni", "pad.toolbar.embed.title": "Condividi ed incorpora questo Pad", + "pad.toolbar.home.title": "Torna alla pagina principale", "pad.toolbar.showusers.title": "Visualizza gli utenti su questo Pad", "pad.colorpicker.save": "Salva", "pad.colorpicker.cancel": "Annulla", @@ -58,6 +102,8 @@ "pad.settings.fontType": "Tipo di carattere:", "pad.settings.fontType.normal": "Normale", "pad.settings.language": "Lingua:", + "pad.settings.deletePad": "Elimina Pad", + "pad.delete.confirm": "Vuoi veramente cancellare questo pad?", "pad.settings.about": "Informazioni", "pad.settings.poweredBy": "Realizzato con", "pad.importExport.import_export": "Importazione/esportazione", @@ -94,6 +140,10 @@ "pad.modals.corruptPad.cause": "Ciò potrebbe essere causato da una errata configurazione del server o qualche altro comportamento imprevisto. Si prega di contattare l'amministratore del servizio.", "pad.modals.deleted": "Cancellato.", "pad.modals.deleted.explanation": "Questo Pad è stato rimosso.", + "pad.modals.rateLimited": "Limite di richieste.", + "pad.modals.rateLimited.explanation": "Hai inviato troppi messaggi a questo pad e la connessione è stata interrotta.", + "pad.modals.rejected.explanation": "Il server ha rifiutato un messaggio inviato dal tuo browser.", + "pad.modals.rejected.cause": "Il server potrebbe essere stato aggiornato mentre stavi visualizzando il pad, oppure potrebbe esserci un bug in Etherpad. Prova a ricaricare la pagina.", "pad.modals.disconnected": "Sei stato disconnesso.", "pad.modals.disconnected.explanation": "La connessione al server è stata persa", "pad.modals.disconnected.cause": "Il server potrebbe essere non disponibile. Informa l'amministrazione del servizio se il problema persiste.", @@ -106,6 +156,7 @@ "pad.chat.loadmessages": "Carica altri messaggi", "pad.chat.stick.title": "Ancora chat nello schermo", "pad.chat.writeMessage.placeholder": "Scrivi il tuo messaggio qui", + "timeslider.followContents": "Segui gli aggiornamenti sui contenuti del pad", "timeslider.pageTitle": "Cronologia {{appTitle}}", "timeslider.toolbar.returnbutton": "Ritorna al Pad", "timeslider.toolbar.authors": "Autori:", diff --git a/src/locales/kab.json b/src/locales/kab.json index 77f7fa1ad..38f7ba99e 100644 --- a/src/locales/kab.json +++ b/src/locales/kab.json @@ -1,9 +1,16 @@ { "@metadata": { "authors": [ - "Belkacem77" + "Belkacem77", + "ButterflyOfFire" ] }, + "admin_plugins.name": "Isem", + "admin_plugins.version": "Lqem", + "admin_settings": "Iɣewwaren", + "admin_settings.current": "Tawila tamirant", + "admin_settings.current_save.value": "Sekles iɣewwaren", + "admin_settings.page-title": "Iɣewwaren - Etherpad", "index.newPad": "Apad amaynut", "index.createOpenPad": "neɣ rnu/ldi apad s yisem:", "pad.toolbar.bold.title": "Zur (Ctrl+B)", @@ -24,7 +31,7 @@ "pad.toolbar.embed.title": "Bḍu sakin seddu apad-agi", "pad.toolbar.showusers.title": "Sken iseqdacen ɣef upad-agi", "pad.colorpicker.save": "Sekles", - "pad.colorpicker.cancel": "Sefsex", + "pad.colorpicker.cancel": "Semmet", "pad.loading": "Asali...", "pad.noCookie": "Anagi n tuqqna ulac-it. Sireg inagan n tuqqna deg iminig-ik!", "pad.permissionDenied": "Ur ɣur-k ara tasiregt akken ad tkecmeḍ ar upad-agi", @@ -37,6 +44,7 @@ "pad.settings.rtlcheck": "Ɣeṛ agbur seg uyeffus s azelmaḍ?", "pad.settings.fontType": "Anaw n tsefsit:", "pad.settings.language": "Tutlayt:", + "pad.settings.about": "Ɣef", "pad.importExport.import_export": "Kter/Sifeḍ", "pad.importExport.import": "Sali aḍris neɣ isemli", "pad.importExport.importSuccessful": "Yedda!", @@ -52,7 +60,7 @@ "pad.modals.reconnecting": "Tulsa n tuqqna ar upad-ik.", "pad.modals.forcereconnect": "Ḥettem tulsa n tuqqna", "pad.modals.reconnecttimer": "Ɛreḍ tikelt-nniḍen tuqqna", - "pad.modals.cancel": "Sefsex", + "pad.modals.cancel": "Semmet", "pad.modals.userdup": "Yeldi deg usfaylu-nniḍen", "pad.modals.userdup.explanation": "Apad-agi yettban yeldi deg isfuyla-nniḍen deg uselkim-agi.", "pad.modals.userdup.advice": "Ales tuqqna akken ad tesqedceḍ asfaylu-agi.", diff --git a/src/locales/ko.json b/src/locales/ko.json index d8bcc3e97..174fa2eb0 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -8,6 +8,8 @@ "Kurousagi", "Revi", "SeoJeongHo", + "Suleiman the Magnificent Television", + "YeBoy371", "Ykhwong", "그냥기여자", "아라" @@ -19,13 +21,13 @@ "admin_plugins.available_not-found": "플러그인이 없습니다.", "admin_plugins.available_fetching": "검색 중...", "admin_plugins.available_install.value": "설치", - "admin_plugins.available_search.placeholder": "설치할 플러그인을 검색합니다", + "admin_plugins.available_search.placeholder": "설치할 플러그인을 검색", "admin_plugins.description": "설명", "admin_plugins.installed": "설치된 플러그인", "admin_plugins.installed_fetching": "설치된 플러그인을 검색하는 중...", "admin_plugins.installed_nothing": "아직 플러인을 설치하지 않으셨습니다.", - "admin_plugins.installed_uninstall.value": "설치 제거", - "admin_plugins.last-update": "최근 업데이트", + "admin_plugins.installed_uninstall.value": "제거", + "admin_plugins.last-update": "마지막 업데이트", "admin_plugins.name": "이름", "admin_plugins.page-title": "플러그인 관리자 - 이더패드", "admin_plugins.version": "버전", @@ -41,8 +43,8 @@ "admin_plugins_info.version_number": "버전 번호", "admin_settings": "설정", "admin_settings.current": "현재 구성", - "admin_settings.current_example-devel": "예시 개발용 설정 템플릿", - "admin_settings.current_example-prod": "예시 운영용 설정 템플릿", + "admin_settings.current_example-devel": "예시 개발용 설정 틀", + "admin_settings.current_example-prod": "예시 운영용 설정 틀", "admin_settings.current_restart.value": "이더패드 다시 시작", "admin_settings.current_save.value": "설정 저장", "admin_settings.page-title": "설정 - 이더패드", @@ -65,11 +67,12 @@ "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": "쿠키를 찾지 못했습니다. 브라우저에서 쿠키를 허용해 주십시오! 세션과 설정은 방문 간 저장되지 않습니다. 일부 브라우저의 iFrame에 이더패드가 포함된 것이 그 이유일 수 있습니다. 이더패드가 부모 iFrame과 동일한 서브도메인/도메인에 위치하는지 확인해 주십시오", + "pad.noCookie": "쿠키를 찾지 못했습니다. 브라우저에서 쿠키를 허용해 주십시오! 세션과 설정은 방문 간 저장되지 않습니다. 일부 브라우저의 iFrame에 이더패드가 포함된 것이 그 이유일 수 있습니다. 이더패드가 상위 iFrame과 동일한 서브도메인/도메인에 위치하는지 확인해 주십시오", "pad.permissionDenied": "이 패드에 접근할 권한이 없습니다", "pad.settings.padSettings": "패드 설정", "pad.settings.myView": "내 보기", @@ -81,7 +84,9 @@ "pad.settings.fontType": "글꼴 종류:", "pad.settings.fontType.normal": "보통", "pad.settings.language": "언어:", - "pad.settings.about": "소개", + "pad.settings.deletePad": "패드 삭제", + "pad.delete.confirm": "정말로 이 패드를 삭제하겠습니까?", + "pad.settings.about": "정보", "pad.settings.poweredBy": "제공:", "pad.importExport.import_export": "가져오기/내보내기", "pad.importExport.import": "텍스트 파일이나 문서 올리기", @@ -90,11 +95,11 @@ "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "일반 텍스트", - "pad.importExport.exportword": "마이크로소프트 워드", + "pad.importExport.exportword": "Microsoft 워드", "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format, 개방형 문서 형식)", "pad.importExport.abiword.innerHTML": "일반 텍스트나 HTML 형식으로만 가져올 수 있습니다. 고급 가져오기 기능에 대해서는 AbiWord를 설치하세요.", - "pad.modals.connected": "연결했습니다.", + "pad.modals.connected": "연결함.", "pad.modals.reconnecting": "내 패드에 다시 연결하는 중...", "pad.modals.forcereconnect": "강제로 다시 연결", "pad.modals.reconnecttimer": "다시 접속 시도 중", @@ -103,7 +108,7 @@ "pad.modals.userdup.explanation": "이 패드는 이 컴퓨터에 하나 이상의 브라우저 창에서 열린 것 같습니다.", "pad.modals.userdup.advice": "대신 이 창을 사용해 다시 연결합니다.", "pad.modals.unauth": "권한이 없음", - "pad.modals.unauth.explanation": "이 페이지를 보는 동안 권한이 바뀌었습니다. 연결을 다시 시도하세요.", + "pad.modals.unauth.explanation": "이 문서를 보는 동안 권한이 바뀌었습니다. 연결을 다시 시도하세요.", "pad.modals.looping.explanation": "동기화 서버와 통신 문제가 있습니다.", "pad.modals.looping.cause": "아마 호환되지 않는 방화벽이나 프록시를 통해 연결되어 있습니다.", "pad.modals.initsocketfail": "서버에 연결할 수 없습니다.", diff --git a/src/locales/krc.json b/src/locales/krc.json index 85323b6f9..fdf400a80 100644 --- a/src/locales/krc.json +++ b/src/locales/krc.json @@ -36,7 +36,7 @@ "admin_settings.current_example-devel": "Юлгю хазырлау джарашдырыуланы шаблону", "admin_settings.current_example-prod": "Юлгю чыгъарыу джарашдырыуланы шаблону", "admin_settings.current_restart.value": "Etherpad-ны джангыдан башлат", - "admin_settings.current_save.value": "Джарашдырыуланы Сакъла", + "admin_settings.current_save.value": "Джарашдырыуланы Сакъландыр", "admin_settings.page-title": "Джарашдырыула — Etherpad", "index.newPad": "Джангы Блокнот", "index.createOpenPad": "неда бу ат бла Блокнот болдур/ач:", diff --git a/src/locales/lb.json b/src/locales/lb.json index 8bb3beb77..46bd3285a 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -19,6 +19,9 @@ "admin_settings.current_save.value": "Astellunge späicheren", "admin_settings.page-title": "Astellungen - Etherpad", "index.newPad": "Neie Pad", + "index.settings": "Astellungen", + "index.copyLink": "2. Link 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)", "pad.toolbar.italic.title": "Schréi (Ctrl+I)", @@ -32,6 +35,7 @@ "pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)", "pad.toolbar.savedRevision.title": "Versioun späicheren", "pad.toolbar.settings.title": "Astellungen", + "pad.toolbar.home.title": "Zeréck op d'Haaptsäit", "pad.toolbar.showusers.title": "Aktuell Benotzer vun dësem Pad uweisen", "pad.colorpicker.save": "Späicheren", "pad.colorpicker.cancel": "Ofbriechen", @@ -82,7 +86,7 @@ "timeslider.toolbar.exportlink.title": "Exportéieren", "timeslider.exportCurrent": "Exportéiert déi aktuell Versioun als:", "timeslider.version": "Versioun {{version}}", - "timeslider.saved": "Gespäichert de(n) {{day}} {{month}} {{year}}", + "timeslider.saved": "Gespäichert de(n) {{day}}. {{month}} {{year}}", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Januar", "timeslider.month.february": "Februar", diff --git a/src/locales/lt.json b/src/locales/lt.json index 40ea28270..885a90408 100644 --- a/src/locales/lt.json +++ b/src/locales/lt.json @@ -63,7 +63,7 @@ "pad.colorpicker.save": "Išsaugoti", "pad.colorpicker.cancel": "Atšaukti", "pad.loading": "Įkraunama...", - "pad.noCookie": "Slapuko nepavyko rasti. Prašome leisti slapukus interneto naršyklėje!", + "pad.noCookie": "Slapuko rasti nepavyko. Prašome leisti slapukus savo naršyklėje! Jūsų sesija ir nustatymai nebus išsaugoti tarp apsilankymų. Taip gali būti dėl to, kad kai kuriose naršyklėse Etherpad yra įtrauktas į iFrame. Įsitikinkite, kad Etherpad yra tame pačiame padomenyje / domene kaip ir pirminis iFrame.", "pad.permissionDenied": "Jūs neturite leidimo patekti į šį bloknotą", "pad.settings.padSettings": "Bloknoto nustatymai", "pad.settings.myView": "Mano Vaizdas", @@ -75,6 +75,8 @@ "pad.settings.fontType": "Šrifto tipas:", "pad.settings.fontType.normal": "Normalus", "pad.settings.language": "Kalba:", + "pad.settings.deletePad": "Ištrinti bloką", + "pad.delete.confirm": "Ar tikrai norite ištrinti šį bloką?", "pad.settings.about": "Apie", "pad.settings.poweredBy": "Palaiko", "pad.importExport.import_export": "Importuoti/Eksportuoti", diff --git a/src/locales/lv.json b/src/locales/lv.json index 29d07b19b..84e1fd7e8 100644 --- a/src/locales/lv.json +++ b/src/locales/lv.json @@ -40,6 +40,7 @@ "pad.settings.fontType": "Fonta tips:", "pad.settings.fontType.normal": "Normāls", "pad.settings.language": "Valoda:", + "pad.settings.about": "Par", "pad.importExport.import_export": "Importet/Eksportet", "pad.importExport.import": "Augšupielādēt jebkuru teksta failu vai dokumentu", "pad.importExport.importSuccessful": "Veiksmīgi!", diff --git a/src/locales/mk.json b/src/locales/mk.json index 68ba2f1cd..af56f6999 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -40,8 +40,27 @@ "admin_settings.current_save.value": "Зачувај нагодувања", "admin_settings.page-title": "Нагодувања — Etherpad", "index.newPad": "Нова тетратка", - "index.createOpenPad": "или направете/отворете тетратка со името:", + "index.settings": "Нагодувања", + "index.transferSessionTitle": "Префрли седница", + "index.receiveSessionTitle": "Прими седница", + "index.receiveSessionDescription": "Тука можете да примите седница на Etherpad од друг прелистувач или уред. Но имајте на ум дека ова ќе ја избрише вашата тековна седница, ако ја има.", + "index.transferSession": "1. Префрли седница", + "index.transferSessionNow": "Префрли седница сега", + "index.copyLink": "2. Копирај врска", + "index.copyLinkDescription": "Стиснете на копчето подолу за да ја прекопирајте врската во вашиот меѓусклад", + "index.copyLinkButton": "Копирај врска во меѓускладот", + "index.transferToSystem": "3. Копирај седница во нов систем", + "index.transferToSystemDescription": "Отворете ја ископираната врска во целниот прелистувач или уред за да ја префрлите вашата седница.", + "index.transferSessionDescription": "Префрлете ја вашата тековна седница на прелистувач или уред стискајќи на копчето подолу. Ова ќе ја прекопира врската во страница која ќе ви ја префрли седницата кога ќе се отвори во целниот прелистувач или уред.", + "index.createOpenPad": "Отвори тетратка по име", "index.openPad": "отвори постоечка тетратка наречена:", + "index.recentPads": "Скорешни тетратки", + "index.recentPadsEmpty": "Не најдов скорешни тетратки.", + "index.generateNewPad": "Создај случајно име на тетратка", + "index.labelPad": "Име на тетратка (незадолжително)", + "index.placeholderPadEnter": "Внесете име на тетратката...", + "index.createAndShareDocuments": "Создавајте и споделувајте документи во живо", + "index.createAndShareDocumentsDescription": "Etherpad ви овозможува соработно уредување на документи во живо, слично како уредувачот за повеќе играчи во живо што работи во вашиот пречистувач.", "pad.toolbar.bold.title": "Задебелено (Ctrl-B)", "pad.toolbar.italic.title": "Косо (Ctrl-I)", "pad.toolbar.underline.title": "Подвлечено (Ctrl-U)", @@ -58,6 +77,7 @@ "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": "Откажи", @@ -74,6 +94,8 @@ "pad.settings.fontType": "Тип на фонт:", "pad.settings.fontType.normal": "Нормален", "pad.settings.language": "Јазик:", + "pad.settings.deletePad": "Избриши тетратка", + "pad.delete.confirm": "Дали навистина сакате да ја избришете тетраткава?", "pad.settings.about": "За додатоков", "pad.settings.poweredBy": "Овозможено од", "pad.importExport.import_export": "Увоз/Извоз", diff --git a/src/locales/mnw.json b/src/locales/mnw.json index db7dfa56e..09b987756 100644 --- a/src/locales/mnw.json +++ b/src/locales/mnw.json @@ -45,7 +45,7 @@ "timeslider.month.april": "ဨပြဳ", "timeslider.month.may": "မေ", "timeslider.month.june": "ဂျောန်", - "timeslider.month.july": "ဂျူလာင်", + "timeslider.month.july": "ဂျူလာၚ်", "timeslider.month.august": "အဝ်ဂေတ်", "timeslider.month.september": "\nသေပ်တေမ်ပါ", "timeslider.month.october": "\nအံက်တဝ်ပါ", diff --git a/src/locales/ms.json b/src/locales/ms.json index a5d8d1deb..767d283e3 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -41,6 +41,7 @@ "pad.settings.fontType": "Jenis fon:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Bahasa:", + "pad.settings.poweredBy": "Dikuasakan oleh", "pad.importExport.import_export": "Import/Eksport", "pad.importExport.import": "Muat naik sebarang fail teks atau dokumen", "pad.importExport.importSuccessful": "Berjaya!", @@ -111,7 +112,7 @@ "pad.savedrevs.marked": "Semakan ini telah ditandai sebagai semakan tersimpan", "pad.savedrevs.timeslider": "Anda boleh melihat semakan yang tersimpan dengan melawat gelangsar masa", "pad.userlist.entername": "Taipkan nama anda", - "pad.userlist.unnamed": "tanpa nama", + "pad.userlist.unnamed": "tidak bernama", "pad.editbar.clearcolors": "Padamkan warna pengarang pada seluruh dokumen?", "pad.impexp.importbutton": "Import Sekarang", "pad.impexp.importing": "Sedang mengimport...", diff --git a/src/locales/ne.json b/src/locales/ne.json index 93b31c0eb..9ba6b3f6e 100644 --- a/src/locales/ne.json +++ b/src/locales/ne.json @@ -4,13 +4,18 @@ "Bada Kaji", "Nirajan pant", "Nirjal stha", + "पर्वत सुबेदी", "बडा काजी", "राम प्रसाद जोशी", "सरोज कुमार ढकाल", "हिमाल सुबेदी" ] }, + "admin_plugins.description": "विवरण", + "admin_plugins.name": "नाम", + "admin_plugins.version": "संस्करण", "index.newPad": "नयाँ प्याड", + "index.settings": "अभिरुचिहरू", "index.createOpenPad": "नाम सहितको नयाँ प्याड सिर्जना गर्ने / खोल्ने :", "pad.toolbar.bold.title": "मोटो (Ctrl-B)", "pad.toolbar.italic.title": "ढल्के (Ctrl-I)", @@ -22,13 +27,13 @@ "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)", + "pad.toolbar.clearAuthorship.title": "लेखकत्व रङहरू खाली गर्नुहोस् (Ctrl + Shift + C)", "pad.toolbar.timeslider.title": "टाइमस्लाइडर", "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने", "pad.toolbar.settings.title": "अभिरुचिहरू", "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", - "pad.colorpicker.save": "सङ्ग्रह गर्ने", + "pad.colorpicker.save": "सङ्ग्रह गर्नुहोस्", "pad.colorpicker.cancel": "रद्द गर्नुहोस्", "pad.loading": "खुल्दै छ…", "pad.permissionDenied": "तपाईंलाई यो प्याड खोल्न अनुमति छैन", @@ -36,7 +41,7 @@ "pad.settings.myView": "मेरो दृष्य", "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", "pad.settings.chatandusers": "वार्ता तथा प्रयोगकर्ताहरू देखाउने", - "pad.settings.colorcheck": "लेखकीय रङ्ग", + "pad.settings.colorcheck": "लेखकका रङहरू", "pad.settings.linenocheck": "हरफ संख्या", "pad.settings.rtlcheck": "के सामग्री दाहिने देखि देब्रे पढ्ने हो ?", "pad.settings.fontType": "लिपि प्रकार:", @@ -57,6 +62,7 @@ "pad.modals.connected": "जोडीएको।", "pad.modals.reconnecting": "तपाईंको प्याडमा पुन: जडान गर्दै", "pad.modals.forcereconnect": "जडानको लागि जोडगर्ने", + "pad.modals.cancel": "रद्द गर्नुहोस्", "pad.modals.userdup": "अर्को सन्झ्यालमा खोल्ने", "pad.modals.unauth": "अनुमती नदिइएको", "pad.modals.initsocketfail": "सर्भरमा पहुँच पुर्‍याउन सकिएन ।", diff --git a/src/locales/nl.json b/src/locales/nl.json index 5fb4347a8..31ab822b5 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "ABPMAB", "Dutchy45", "Klaas van Buiten", "KlaasZ4usV", @@ -17,65 +18,85 @@ "woeterman94" ] }, - "admin.page-title": "Admin Dashboard - Etherpad", - "admin_plugins": "Plugin Beheer", - "admin_plugins.available": "Beschikbare plugins", - "admin_plugins.available_not-found": "Geen plugins gevonden.", + "admin.page-title": "Beheerdashboard – Etherpad", + "admin_plugins": "Beheer plug-ins", + "admin_plugins.available": "Beschikbare plug-ins", + "admin_plugins.available_not-found": "Geen plug-ins gevonden.", "admin_plugins.available_fetching": "Ophalen…", "admin_plugins.available_install.value": "Installeren", - "admin_plugins.available_search.placeholder": "Zoek achter plugins om te installeren", + "admin_plugins.available_search.placeholder": "Zoeken naar plug-ins om te installeren", "admin_plugins.description": "Beschrijving", - "admin_plugins.installed": "Geïnstalleerd plugins", - "admin_plugins.installed_fetching": "Geïnstalleerd plugins worden opgehaald…", - "admin_plugins.installed_nothing": "Je hebt nog geen plugins geïnstalleerd.", + "admin_plugins.installed": "Geïnstalleerde plug-ins", + "admin_plugins.installed_fetching": "Geïnstalleerd plug-ins worden opgehaald…", + "admin_plugins.installed_nothing": "U hebt nog geen plug-ins geïnstalleerd.", "admin_plugins.installed_uninstall.value": "Verwijderen", - "admin_plugins.last-update": "Laatste update", + "admin_plugins.last-update": "Laatst bijgewerkt", "admin_plugins.name": "Naam", - "admin_plugins.page-title": "Plugin beheer - Etherpad", + "admin_plugins.page-title": "Beheer plug-ins – Etherpad", "admin_plugins.version": "Versie", "admin_plugins_info": "Probleemoplossingsinformatie", "admin_plugins_info.hooks": "Geïnstalleerde hooks", "admin_plugins_info.hooks_client": "Client-side hooks", "admin_plugins_info.hooks_server": "Server-side hooks", "admin_plugins_info.parts": "Geïnstalleerde onderdelen", - "admin_plugins_info.plugins": "Geïnstalleerde plugins", - "admin_plugins_info.page-title": "Plugin info - Etherpad", - "admin_plugins_info.version": "Etherpad versie", + "admin_plugins_info.plugins": "Geïnstalleerde plug-ins", + "admin_plugins_info.page-title": "Plug-in-informatie – Etherpad", + "admin_plugins_info.version": "Versie van Etherpad", "admin_plugins_info.version_latest": "Meest recente versie", - "admin_plugins_info.version_number": "Versie nummer", + "admin_plugins_info.version_number": "Versienummer", "admin_settings": "Instellingen", "admin_settings.current": "Huidige configuratie", "admin_settings.current_example-devel": "Voorbeeldsjabloon voor ontwikkelingsinstellingen", - "admin_settings.current_example-prod": "Productie instellingen template", + "admin_settings.current_example-prod": "Voorbeeldsjabloon voor productie-instellingen", "admin_settings.current_restart.value": "Herstart Etherpad", "admin_settings.current_save.value": "Bewaar instellingen", "admin_settings.page-title": "Instellingen - Etherpad", - "index.newPad": "Nieuw pad", - "index.createOpenPad": "of maak/open een pad met de naam:", - "index.openPad": "open een bestaande Pad met de naam:", - "pad.toolbar.bold.title": "Vet (Ctrl-B)", - "pad.toolbar.italic.title": "Cursief (Ctrl-I)", - "pad.toolbar.underline.title": "Onderstrepen (Ctrl-U)", + "index.newPad": "Nieuwe notitie", + "index.settings": "Instellingen", + "index.transferSessionTitle": "Sessie overzetten", + "index.receiveSessionTitle": "Sessie ontvangen", + "index.receiveSessionDescription": "Hier kunt u een Etherpad-sessie ontvangen vanaf een andere browser of een ander apparaat. Houd er echter rekening mee dat hiermee uw huidige sessie, indien aanwezig, wordt verwijderd.", + "index.transferSession": "1. Sessie overzetten", + "index.transferSessionNow": "Sessie nu overzetten", + "index.copyLink": "2. Koppeling kopiëren", + "index.copyLinkDescription": "Klik op de onderstaande knop om de koppeling naar uw klembord te kopiëren.", + "index.copyLinkButton": "Koppeling naar klembord kopiëren", + "index.transferToSystem": "3. Kopieer de sessie naar het nieuwe systeem", + "index.transferToSystemDescription": "Open de gekopieerde koppeling in de doelbrowser of het doelapparaat om uw sessie over te zetten.", + "index.transferSessionDescription": "Zet uw huidige sessie over naar uw browser of apparaat door op de onderstaande knop te klikken. Hiermee wordt een koppeling naar een pagina gekopieerd die uw sessie overzet wanneer deze in de gewenste browser of op het gewenste apparaat wordt geopend.", + "index.createOpenPad": "Open een notitie met de naam", + "index.openPad": "open een bestaande notitie met de naam:", + "index.recentPads": "Recente notities", + "index.recentPadsEmpty": "Geen recente notities gevonden.", + "index.generateNewPad": "Genereer willekeurige notitienaam", + "index.labelPad": "Notitienaam (optioneel)", + "index.placeholderPadEnter": "Voer de naam van een notitie in…", + "index.createAndShareDocuments": "Maak en deel documenten in realtime", + "index.createAndShareDocumentsDescription": "Met Etherpad kunt u in samenwerking met anderen tegelijkertijd hetzelfde document bewerken. Het is zoals een live multiplayer-editor die in uw browser draait.", + "pad.toolbar.bold.title": "Vet (Ctrl+B)", + "pad.toolbar.italic.title": "Cursief (Ctrl+I)", + "pad.toolbar.underline.title": "Onderstrepen (Ctrl+U)", "pad.toolbar.strikethrough.title": "Doorhalen (Ctrl+5)", "pad.toolbar.ol.title": "Geordende lijst (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Ongeordende lijst (Ctrl+Shift+L)", - "pad.toolbar.indent.title": "Inspringen (Tab)", - "pad.toolbar.unindent.title": "Uitspringen (Shift+Tab)", - "pad.toolbar.undo.title": "Ongedaan maken (Ctrl-Z)", - "pad.toolbar.redo.title": "Opnieuw uitvoeren (Ctrl-Y)", + "pad.toolbar.indent.title": "Inspringen (TAB)", + "pad.toolbar.unindent.title": "Uitspringen (Shift+TAB)", + "pad.toolbar.undo.title": "Ongedaan maken (Ctrl+Z)", + "pad.toolbar.redo.title": "Opnieuw uitvoeren (Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "Kleuren auteurs wissen (Ctrl+Shift+C)", "pad.toolbar.import_export.title": "Naar/van andere opmaak exporteren/importeren", "pad.toolbar.timeslider.title": "Tijdlijn", "pad.toolbar.savedRevision.title": "Versie opslaan", "pad.toolbar.settings.title": "Instellingen", - "pad.toolbar.embed.title": "Pad delen en insluiten", - "pad.toolbar.showusers.title": "Gebruikers van dit pad weergeven", + "pad.toolbar.embed.title": "Deze notitie delen en insluiten", + "pad.toolbar.home.title": "Terug naar de startpagina", + "pad.toolbar.showusers.title": "Gebruikers van deze notitie weergeven", "pad.colorpicker.save": "Opslaan", "pad.colorpicker.cancel": "Annuleren", "pad.loading": "Bezig met laden…", "pad.noCookie": "Er kon geen cookie gevonden worden. Zorg ervoor dat uw browser cookies accepteert. Uw sessie en instellingen worden tussen bezoeken niet opgeslagen. Dit kan te wijten zijn aan het feit dat Etherpad in sommige browsers wordt opgenomen in een iFrame. Zorg ervoor dat Etherpad zich op hetzelfde subdomein/domein bevindt als het bovenliggende iFrame.", - "pad.permissionDenied": "U hebt geen rechten om deze pad te bekijken", - "pad.settings.padSettings": "Padinstellingen", + "pad.permissionDenied": "U hebt geen toestemming om deze notitie te openen", + "pad.settings.padSettings": "Notitie-instellingen", "pad.settings.myView": "Mijn overzicht", "pad.settings.stickychat": "Chat altijd zichtbaar", "pad.settings.chatandusers": "Chat en gebruikers weergeven", @@ -85,70 +106,72 @@ "pad.settings.fontType": "Lettertype:", "pad.settings.fontType.normal": "Normaal", "pad.settings.language": "Taal:", + "pad.settings.deletePad": "Notitie verwijderen", + "pad.delete.confirm": "Wilt u deze notitie echt verwijderen?", "pad.settings.about": "Over", - "pad.settings.poweredBy": "Aangedreven door", + "pad.settings.poweredBy": "Mogelijk gemaakt door", "pad.importExport.import_export": "Importeren/exporteren", "pad.importExport.import": "Tekstbestand of document uploaden", - "pad.importExport.importSuccessful": "Afgerond", - "pad.importExport.export": "Huidige pad exporteren als", + "pad.importExport.importSuccessful": "Gelukt!", + "pad.importExport.export": "Huidige notitie exporteren als:", "pad.importExport.exportetherpad": "Etherpad", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Tekst zonder opmaak", "pad.importExport.exportword": "Microsoft Word", - "pad.importExport.exportpdf": "Pdf", + "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.abiword.innerHTML": "U kunt alleen importeren vanuit tekst zonder opmaak of met HTML-opmaak. Installeer AbiWord of LibreOffice om meer geavanceerde importmogelijkheden te krijgen.", "pad.modals.connected": "Verbonden.", - "pad.modals.reconnecting": "Opnieuw verbinding maken met uw pad…", + "pad.modals.reconnecting": "De verbinding met uw notitie wordt hersteld…", "pad.modals.forcereconnect": "Opnieuw verbinden", - "pad.modals.reconnecttimer": "Proberen te verbinden over", + "pad.modals.reconnecttimer": "Nieuwe verbindingspoging over", "pad.modals.cancel": "Annuleren", "pad.modals.userdup": "In een ander venster geopend", - "pad.modals.userdup.explanation": "Dit pad is meer dan één keer geopend in een browservenster op deze computer.", + "pad.modals.userdup.explanation": "Deze notitie is blijkbaar in meer dan één browservenster op deze computer geopend.", "pad.modals.userdup.advice": "Maak opnieuw verbinding als u dit venster wilt gebruiken.", "pad.modals.unauth": "Niet toegestaan", "pad.modals.unauth.explanation": "Uw rechten zijn gewijzigd terwijl u de pagina aan het bekijken was. Probeer opnieuw te verbinden.", "pad.modals.looping.explanation": "Er is een probleem opgetreden tijdens de communicatie met de synchronisatieserver.", - "pad.modals.looping.cause": "Mogelijk gebruikt de server een niet compatibele firewall of proxy server.", + "pad.modals.looping.cause": "Mogelijk hebt u verbinding gemaakt via een niet-compatibele firewall of proxy.", "pad.modals.initsocketfail": "De server is niet bereikbaar.", - "pad.modals.initsocketfail.explanation": "Het was niet mogelijk te verbinden met de synchronisatieserver.", - "pad.modals.initsocketfail.cause": "Mogelijk komt dit door uw browser of internetverbinding.", + "pad.modals.initsocketfail.explanation": "Er kon geen verbinding worden gemaakt met de synchronisatieserver.", + "pad.modals.initsocketfail.cause": "Dit komt waarschijnlijk door een probleem met uw browser of uw internetverbinding.", "pad.modals.slowcommit.explanation": "De server reageert niet.", "pad.modals.slowcommit.cause": "Dit komt mogelijk door netwerkproblemen.", "pad.modals.badChangeset.explanation": "Een door u gemaakte bewerking is door de synchronisatieserver als incorrect aangemerkt.", - "pad.modals.badChangeset.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder als u denkt dat er een onverwachte uitkomst is. Probeer opnieuw te verbinden om door te gaan met bewerken.", - "pad.modals.corruptPad.explanation": "Het pad dat u wilt openen is beschadigd.", + "pad.modals.badChangeset.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder als u denkt dat dit een fout is. Probeer opnieuw te verbinden om door te gaan met bewerken.", + "pad.modals.corruptPad.explanation": "De notitie die u wilt openen is beschadigd.", "pad.modals.corruptPad.cause": "Dit kan komen door een onjuiste serverinstelling of door ander onverwacht gedrag. Neem contact op met de servicebeheerder.", "pad.modals.deleted": "Verwijderd.", - "pad.modals.deleted.explanation": "Dit pad is verwijderd.", + "pad.modals.deleted.explanation": "Deze notitie is verwijderd.", "pad.modals.rateLimited": "Snelheid begrensd.", - "pad.modals.rateLimited.explanation": "Je hebt te veel berichten naar deze pad gestuurd. Daarom is je verbinding verbroken.", - "pad.modals.rejected.explanation": "De server heeft een bericht afgewezen dat door je browser is verzonden.", - "pad.modals.rejected.cause": "Mogelijks is de server bijgewerkt terwijl je de pad aan het bekijken was. Of misschien is er een bug in Etherpad. Probeer de pagina opnieuw te laden.", + "pad.modals.rateLimited.explanation": "U hebt te veel berichten naar deze notitie gestuurd. Daarom is uw verbinding verbroken.", + "pad.modals.rejected.explanation": "De server heeft een bericht verworpen dat door uw browser is verzonden.", + "pad.modals.rejected.cause": "Mogelijk is de server bijgewerkt terwijl u de notitie aan het bekijken was. Of misschien is er een bug in Etherpad. Probeer de pagina opnieuw te laden.", "pad.modals.disconnected": "Uw verbinding is verbroken.", "pad.modals.disconnected.explanation": "De verbinding met de server is verbroken", - "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel de servicebeheerder op de hoogte.", - "pad.share": "Pad delen", - "pad.share.readonly": "Alleen-lezen", + "pad.modals.disconnected.cause": "De server is mogelijk niet beschikbaar. Stel de servicebeheerder op de hoogte als dit probleem aanhoudt.", + "pad.share": "Deze notitie delen", + "pad.share.readonly": "Alleen lezen", "pad.share.link": "Koppeling", - "pad.share.emebdcode": "URL insluiten", + "pad.share.emebdcode": "URL voor insluiten", "pad.chat": "Chatten", - "pad.chat.title": "Chat voor dit pad opnenen", + "pad.chat.title": "De chat voor deze notitie openen.", "pad.chat.loadmessages": "Meer berichten laden", "pad.chat.stick.title": "Chat op scherm vastzetten", - "pad.chat.writeMessage.placeholder": "Schrijf je bericht hier", - "timeslider.followContents": "Volg de inhoudelijke updates van de pad", + "pad.chat.writeMessage.placeholder": "Schrijf uw bericht hier", + "timeslider.followContents": "Volg het bijwerken van de inhoud van deze notitie", "timeslider.pageTitle": "Tijdlijn voor {{appTitle}}", - "timeslider.toolbar.returnbutton": "Terug naar pad", + "timeslider.toolbar.returnbutton": "Terug naar notitie", "timeslider.toolbar.authors": "Auteurs:", "timeslider.toolbar.authorsList": "Geen auteurs", "timeslider.toolbar.exportlink.title": "Exporteren", "timeslider.exportCurrent": "Huidige versie exporteren als:", "timeslider.version": "Versie {{version}}", "timeslider.saved": "Opgeslagen op {{day}} {{month}} {{year}}", - "timeslider.playPause": "Padinhoud afspelen of pauzeren", - "timeslider.backRevision": "Een versie teruggaan voor deze pad", - "timeslider.forwardRevision": "Een versie vooruit gaan voor deze pad", + "timeslider.playPause": "Notitie-inhoud afspelen of pauzeren", + "timeslider.backRevision": "Een versie teruggaan in deze notitie", + "timeslider.forwardRevision": "Een versie vooruit gaan in deze notitie", "timeslider.dateformat": "{{year}}-{{month}}-{{day}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "januari", "timeslider.month.february": "februari", @@ -164,18 +187,18 @@ "timeslider.month.december": "december", "timeslider.unnamedauthors": "{{num}} onbekende {[plural(num) one: auteur, other: auteurs ]}", "pad.savedrevs.marked": "Deze versie is nu gemarkeerd als opgeslagen versie", - "pad.savedrevs.timeslider": "U kunt opgeslagen versies bekijken via de tijdschuiver.", + "pad.savedrevs.timeslider": "U kunt opgeslagen versies bekijken via de tijdlijn", "pad.userlist.entername": "Geef uw naam op", "pad.userlist.unnamed": "zonder naam", - "pad.editbar.clearcolors": "Auteurskleuren voor het hele document wissen? Dit kan je niet ongedaan maken", + "pad.editbar.clearcolors": "Auteurskleuren voor het hele document wissen? Dit kan niet ongedaan worden gemaakt.", "pad.impexp.importbutton": "Nu importeren", "pad.impexp.importing": "Bezig met importeren…", - "pad.impexp.confirmimport": "Door een bestand te importeren overschrijft u de huidige tekst van de pad. Wilt u echt doorgaan?", + "pad.impexp.confirmimport": "Door een bestand te importeren overschrijft u de huidige tekst van de notitie. Wilt u echt doorgaan?", "pad.impexp.convertFailed": "Het was niet mogelijk dit bestand te importeren. Gebruik een andere documentopmaak of kopieer en plak de inhoud handmatig", - "pad.impexp.padHasData": "Het was niet mogelijk dit bestand te importeren omdat er al wijzigingen aan de etherpad zijn gemaakt. Importeer naar een nieuwe etherpad.", + "pad.impexp.padHasData": "Het was niet mogelijk dit bestand te importeren omdat er al wijzigingen aan de notitie zijn aangebracht. Importeer in een nieuwe notitie.", "pad.impexp.uploadFailed": "Het uploaden is mislukt. Probeer het opnieuw", "pad.impexp.importfailed": "Importeren is mislukt", "pad.impexp.copypaste": "Gebruik kopiëren en plakken", - "pad.impexp.exportdisabled": "Exporteren als {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details.", - "pad.impexp.maxFileSize": "Het bestand is te groot. Neem contact op met je sitebeheerder om de toegestane bestandsgrootte voor importeren te vergroten." + "pad.impexp.exportdisabled": "Het exporteren in de indeling {{type}} is uitgeschakeld. Neem contact op met de systeembeheerder voor details.", + "pad.impexp.maxFileSize": "Het bestand is te groot. Neem contact op met uw sitebeheerder om de toegestane bestandsgrootte voor importeren te vergroten." } diff --git a/src/locales/pa.json b/src/locales/pa.json index 071498f98..423ffd367 100644 --- a/src/locales/pa.json +++ b/src/locales/pa.json @@ -3,11 +3,22 @@ "authors": [ "Aalam", "Babanwalia", + "Cabal", "Tow", "ਗੁਰਪ੍ਰੀਤ ਹੁੰਦਲ", "ਪ੍ਰਚਾਰਕ" ] }, + "admin_plugins.available_fetching": "ਲਿਆਉਣਾ ਪਿਆਂ...", + "admin_plugins.available_install.value": "ਜੜੋ", + "admin_plugins.description": "ਵੇਰਵਾ", + "admin_plugins.last-update": "ਆਖਰੀ ਵਾਰ ਨਵਿਆਈਆ ਗਿਆ", + "admin_plugins.name": "ਨਾਂ", + "admin_plugins_info": "ਸਮੱਸਿਆ ਨਿਵਾਰਣ ਜਾਣਕਾਰੀ", + "admin_settings": "ਤਰਜੀਹਾਂ", + "admin_settings.current": "ਮੌਜੂਦਾ ਬਣਤਰ", + "admin_settings.current_save.value": "ਤਰਜੀਹਾਂ ਸੰਭਾਲੋ", + "admin_settings.page-title": "ਤਰਜੀਹਾਂ - ਈਥਰਪੈਡ", "index.newPad": "ਨਵਾਂ ਪੈਡ", "index.createOpenPad": "ਜਾਂ ਨਾਂ ਨਾਲ ਨਵਾਂ ਪੈਡ ਬਣਾਓ/ਖੋਲ੍ਹੋ:", "pad.toolbar.bold.title": "ਗੂੜ੍ਹਾ (Ctrl-B)", @@ -24,12 +35,12 @@ "pad.toolbar.import_export.title": "ਵੱਖ-ਵੱਖ ਫਾਇਲ ਫਾਰਮੈਟ ਤੋਂ/ਵਿੱਚ ਇੰਪੋਰਟ/ਐਕਸਪੋਰਟ ਕਰੋ", "pad.toolbar.timeslider.title": "ਸਮਾਂ-ਲਕੀਰ", "pad.toolbar.savedRevision.title": "ਦੁਹਰਾਅ ਸਾਂਭੋ", - "pad.toolbar.settings.title": "ਸੈਟਿੰਗ", + "pad.toolbar.settings.title": "ਪਸੰਦਾਂ", "pad.toolbar.embed.title": "ਇਹ ਪੈਡ ਸਾਂਝਾ ਤੇ ਇੰਬੈੱਡ ਕਰੋ", - "pad.toolbar.showusers.title": "ਇਹ ਪੈਡ ਉੱਤੇ ਯੂਜ਼ਰ ਵੇਖਾਓ", + "pad.toolbar.showusers.title": "ਇਸ ਫੱਟੀ ਉੱਤੇ ਵਰਤੋਂਕਾਰ ਵਿਖਾਓ", "pad.colorpicker.save": "ਸੰਭਾਲੋ", "pad.colorpicker.cancel": "ਰੱਦ ਕਰੋ", - "pad.loading": "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", + "pad.loading": "ਲੱਦ ਰਿਹਾ ਏ...", "pad.noCookie": "ਕੂਕੀਜ਼ ਨਹੀਂ ਲੱਭੀਅਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਬ੍ਰਾੳੂਜ਼ਰ ਵਿੱਚ ਕੂਕੀਜ਼ ਲਾਗੂ ਕਰੋ।", "pad.permissionDenied": "ਇਹ ਪੈਡ ਵਰਤਨ ਲਈ ਤੁਹਾਨੂੰ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ", "pad.settings.padSettings": "ਪੈਡ ਸੈਟਿੰਗ", @@ -37,12 +48,13 @@ "pad.settings.stickychat": "ਹਮੇਸ਼ਾ ਸਕਰੀਨ ਉੱਤੇ ਗੱਲ ਕਰੋ", "pad.settings.chatandusers": "ਗੱਲ-ਬਾਤ ਅਤੇ ਵਰਤੋਂਕਾਰ ਦਿਖਾਵੋ", "pad.settings.colorcheck": "ਲੇਖਕੀ ਰੰਗ", - "pad.settings.linenocheck": "ਲਾਈਨ ਨੰਬਰ", + "pad.settings.linenocheck": "ਲਕੀਰ ਨੰਬਰ", "pad.settings.rtlcheck": "ਸਮੱਗਰੀ ਸੱਜੇ ਤੋਂ ਖੱਬੇ ਪੜ੍ਹਨੀ ਹੈ?", - "pad.settings.fontType": "ਫੋਂਟ ਕਿਸਮ:", - "pad.settings.fontType.normal": "ਸਧਾਰਨ", + "pad.settings.fontType": "ਅੱਖਰ ਦੀ ਕਿਸਮ:", + "pad.settings.fontType.normal": "ਆਮ", "pad.settings.language": "ਭਾਸ਼ਾ:", - "pad.importExport.import_export": "ਇੰਪੋਰਟ/ਐਕਸਪੋਰਟ", + "pad.settings.about": "ਬਾਬਤ", + "pad.importExport.import_export": "ਦਰਾਮਦ/ਬਰਾਮਦ", "pad.importExport.import": "ਕੋਈ ਵੀ ਟੈਕਸਟ ਫਾਇਲ ਜਾਂ ਦਸਤਾਵੇਜ਼ ਅੱਪਲੋਡ ਕਰੋ", "pad.importExport.importSuccessful": "ਸਫ਼ਲ!", "pad.importExport.export": "ਮੌਜੂਦਾ ਪੈਡ ਨੂੰ ਐਕਸਪੋਰਟ ਕਰੋ:", @@ -53,9 +65,11 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (ਓਪਨ ਡੌਕੂਮੈਂਟ ਫਾਰਮੈਟ)", "pad.importExport.abiword.innerHTML": "ਤੁਸੀਂ ਸਿਰਫ਼ ਸਾਦੀਆਂ ਲਿਖਤੀ ਜਾਂ ਐੱਚ.ਟੀ.ਐੱਮ.ਐੱਲ. ਰੂਪ-ਰੇਖਾਵਾਂ ਤੋਂ ਦਰਾਮਦ ਕਰ ਸਕਦੇ ਹੋ। ਹੋਰ ਉੱਨਤ ਦਰਾਮਦੀ ਗੁਣਾਂ ਵਾਸਤੇ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਐਬੀਵਰਡ ਥਾਪੋ।", - "pad.modals.connected": "ਕੁਨੈਕਟ ਹੈ।", + "pad.modals.connected": "ਜੁੜਿਆ ਹੋਇਆ।", "pad.modals.reconnecting": "..ਤੁਹਾਡੇ ਪੈਡ ਨਾਲ ਮੁੜ-ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", - "pad.modals.forcereconnect": "ਧੱਕੇ ਨਾਲ ਮੁੜ-ਕੁਨੈਕਟ ਕਰੋ", + "pad.modals.forcereconnect": "ਧੱਕੇ ਨਾਲ ਮੁੜ-ਜੁੜੋ", + "pad.modals.reconnecttimer": "ਮੁਡ਼ ਜੋੜਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਏ", + "pad.modals.cancel": "ਰੱਦ ਕਰੋ", "pad.modals.userdup": "ਹੋਰ ਵਿੰਡੋ ਵਿੱਚ ਖੁੱਲ੍ਹਿਆ ਹੈ", "pad.modals.userdup.explanation": "ਇਹ ਪੈਡ ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ ਇੱਕ ਤੋਂ ਵੱਧ ਫਰੋਲੂ ਬਾਰੀ ਵਿੱਚ ਖੁੱਲ੍ਹਿਆ ਜਾਪਦਾ ਹੈ।", "pad.modals.userdup.advice": "ਸਗੋਂ ਇਹ ਬਾਰੀ ਵਰਤਣ ਵਾਸਤੇ ਮੁੜ ਜੁੜੋ।", @@ -78,19 +92,20 @@ "pad.modals.disconnected.explanation": "ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਸ਼ਨ ਖਤਮ ਹੋਇਆ ਹੈ", "pad.modals.disconnected.cause": "ਸਰਵਰ ਨਾਮੌਜੂਦ ਹੋ ਸਕਦਾ ਹੈ। ਜੇਕਰ ਇਹ ਹੁੰਦਾ ਰਹੇ ਤਾਂ ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਸੇਵਾ ਪ੍ਰਬੰਧਕ ਨੂੰ ਖ਼ਬਰ ਕਰੋ।", "pad.share": "ਇਹ ਪੈਡ ਸਾਂਝਾ ਕਰੋ", - "pad.share.readonly": "ਕੇਵਲ ਪੜ੍ਹਨ ਲਈ", - "pad.share.link": "ਲਿੰਕ", + "pad.share.readonly": "ਸਿਰਫ਼ ਪੜ੍ਹਨ ਲਈ", + "pad.share.link": "ਕੜੀ", "pad.share.emebdcode": "ਇੰਬੈੱਡ URL", "pad.chat": "ਗੱਲਬਾਤ", "pad.chat.title": "ਇਹ ਪੈਡ ਲਈ ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ।", - "pad.chat.loadmessages": "ਹੋਰ ਸੁਨੇਹੇ ਲੋਡ ਕਰੋ", + "pad.chat.loadmessages": "ਹੋਰ ਸੁਨੇਹੇ ਲੱਦੋ", + "pad.chat.writeMessage.placeholder": "ਆਪਣਾ ਸੁਨੇਹਾ ਇੱਥੇ ਲਿਖੋ", "timeslider.pageTitle": "{{appTitle}} ਸਮਾਂ-ਲਕੀਰ", "timeslider.toolbar.returnbutton": "ਪੈਡ ਉੱਤੇ ਵਾਪਸ", "timeslider.toolbar.authors": "ਲੇਖਕ:", "timeslider.toolbar.authorsList": "ਕੋਈ ਲੇਖਕ ਨਹੀਂ", - "timeslider.toolbar.exportlink.title": "ਐਕਸਪੋਰਟ", + "timeslider.toolbar.exportlink.title": "ਬਰਾਮਦ", "timeslider.exportCurrent": "ਮੌਜੂਦਾ ਵਰਜਨ ਇੰਝ ਐਕਸਪੋਰਟ ਕਰੋ:", - "timeslider.version": "ਵਰਜ਼ਨ {{version}}", + "timeslider.version": "ਰੂਪ {{version}}", "timeslider.saved": "{{day}} {{month}} {{year}} ਨੂੰ ਸੰਭਾਲਿਆ", "timeslider.playPause": "ਪੈਡ ਸਮੱਗਰੀ ਚਲਾਓ / ਵਿਰਾਮ ਕਰੋ", "timeslider.backRevision": "ਇਸ ਪੈਡ ਵਿੱਚ ਪਿਛਲੇ ਰੀਵਿਜ਼ਨ ਤੇ ਜਾਓ", @@ -109,18 +124,18 @@ "timeslider.month.november": "ਨਵੰਬਰ", "timeslider.month.december": "ਦਸੰਬਰ", "timeslider.unnamedauthors": "{{num}} ਬੇਨਾਮ {[plural(num) one: ਲੇਖਕ, other: ਲੇਖਕ ]}", - "pad.savedrevs.marked": "ਇਹ ਰੀਵਿਜ਼ਨ ਨੂੰ ਹੁਣ ਸੰਭਾਲੇ ਹੋਏ ਰੀਵਿਜ਼ਨ ਵਜੋਂ ਮੰਨਿਆ ਗਿਆ ਹੈ", + "pad.savedrevs.marked": "ਇਹ ਦੁਹਰਾਅ ਨੂੰ ਹੁਣ ਸੰਭਾਲੇ ਹੋਏ ਦੁਹਰਾਅ ਵਜੋਂ ਮੰਨਿਆ ਗਿਆ ਹੈ", "pad.savedrevs.timeslider": "ਤੁਸੀੰ ਸਾੰਭੀਆੰ ਹੋਈਆੰ ਵਰਜਨਾੰ ਸਮਾੰਸਲਾਈਡਰ ਤੇ ਜਾ ਕੇ ਵੇਖ ਸਕਦੇ ਹੋ", "pad.userlist.entername": "ਆਪਣਾ ਨਾਂ ਦਿਉ", "pad.userlist.unnamed": "ਬੇਨਾਮ", "pad.editbar.clearcolors": "ਪੂਰੇ ਦਸਾਤਵੇਜ਼ ਉੱਤੇ ਪਰਮਾਣਕਿਤਾ ਰੰਗ ਸਾਫ਼ ਕਰਨੇ ਹਨ?", - "pad.impexp.importbutton": "ਹੁਣੇ ਇੰਪੋਰਟ ਕਰੋ", - "pad.impexp.importing": "...ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ", + "pad.impexp.importbutton": "ਹੁਣੇ ਦਰਾਮਦ ਕਰੋ", + "pad.impexp.importing": "ਦਰਾਮਦ ਜਾਰੀ ਏ...", "pad.impexp.confirmimport": "ਕੋਈ ਫ਼ਾਈਲ ਦਰਾਮਦ ਕਾਰਨ ਨਾਲ਼ ਪੈਡ ਦੀ ਮੌਜੂਦਾ ਲਿਖਤ ਉੱਤੇ ਲਿਖਿਆ ਜਾਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਸੱਚੀਂ ਇਹ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?", "pad.impexp.convertFailed": "ਅਸੀਂ ਇਸ ਫ਼ਾਈਲ ਦੀ ਦਰਾਮਦ ਨਹੀਂ ਕਰ ਸਕੇ। ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਕੋਈ ਵੱਖਰੀ ਦਸਤਾਵੇਜ਼ੀ ਰੂਪ-ਰੇਖਾ ਵਰਤੋ ਜਾਂ ਹੱਥੀਂ ਨਕਲ-ਚੇਪੀ ਕਰੋ।", - "pad.impexp.padHasData": "ਅਸੀ ਇਸ ਫਾਈਲ ਨੂੰ ਆਯਾਤ ਨਹੀੰ ਕਰ ਸਕੇ ਕਿਉੰਕਿ ਇਸ ਪੈਡ ਉੱਤੇ ਪਹਿਲਾੰ ਹੀ ਤਬਦੀਲੀਆੰ ਕੀਤੀਆੰ ਜਾ ਚੁਕੀਆੰ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਨਵੇੰ ਪੈਡ ਵਿਚ ਆਯਾਤ ਕਰੋ", + "pad.impexp.padHasData": "ਅਸੀ ਇਸ ਫਾਈਲ ਨੂੰ ਦਰਾਮਦ ਨਹੀੰ ਕਰ ਸਕੇ ਕਿਉੰਕਿ ਇਸ ਕਾਗਜ਼ ਉੱਤੇ ਪਹਿਲਾਂ ਹੀ ਤਬਦੀਲੀਆਂ ਕੀਤੀਆਂ ਜਾ ਚੁਕੀਆਂ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਨਵੇਂ ਕਾਗਜ਼ ਵਿਚ ਦਰਾਮਦ ਕਰੋ", "pad.impexp.uploadFailed": "ਅੱਪਲੋਡ ਲਈ ਫੇਲ੍ਹ ਹੈ, ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ।", - "pad.impexp.importfailed": "ਇੰਪੋਰਟ ਫੇਲ੍ਹ ਹੈ", + "pad.impexp.importfailed": "ਦਰਾਮਦ ਨਾਕਾਮ", "pad.impexp.copypaste": "ਕਾਪੀ ਕਰੋ ਚੇਪੋ ਜੀ", "pad.impexp.exportdisabled": "{{type}} ਫਾਰਮੈਟ ਵਜੋਂ ਬਰਾਮਦ ਕਰਨਾ ਬੰਦ ਹੈ। ਵੇਰਵੇ ਵਾਸਤੇ ਆਪਣੇ ਸਿਸਟਮ ਦੇ ਪਰਬੰਧਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" } diff --git a/src/locales/pl.json b/src/locales/pl.json index 6f01cd6d2..ec82f9014 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -11,6 +11,7 @@ "Rezonansowy", "Teeed", "Ty221", + "Usagi.02808", "WTM", "WaldiSt", "Woytecr" @@ -20,19 +21,42 @@ "admin_plugins": "Menedżer wtyczek", "admin_plugins.available": "Dostępne wtyczki", "admin_plugins.available_not-found": "Nie znaleziono żadnych wtyczek.", + "admin_plugins.available_fetching": "Pobieranie...", "admin_plugins.available_install.value": "Instaluj", + "admin_plugins.available_search.placeholder": "Wyszukaj wtyczki do zainstalowania", "admin_plugins.description": "Opis", "admin_plugins.installed": "Zainstalowane wtyczki", + "admin_plugins.installed_fetching": "Pobieranie zainstalowanych wtyczek…", + "admin_plugins.installed_nothing": "Nie zainstalowałeś jeszcze żadnych wtyczek.", "admin_plugins.installed_uninstall.value": "Odinstaluj", "admin_plugins.last-update": "Ostatnia aktualizacja", "admin_plugins.name": "Nazwa", "admin_plugins.page-title": "Menedżer wtyczek - Etherpad", "admin_plugins.version": "Wersja", + "admin_plugins_info": "Informacje dotyczące rozwiązywania problemów", + "admin_plugins_info.parts": "Zainstalowane części", + "admin_plugins_info.plugins": "Zainstalowane wtyczki", + "admin_plugins_info.page-title": "Informacje o wtyczkach - Etherpad", "admin_plugins_info.version": "Wersja Etherpada", + "admin_plugins_info.version_latest": "Najnowsza dostępna wersja", + "admin_plugins_info.version_number": "Numer wersji", "admin_settings": "Ustawienia", + "admin_settings.current": "Obecna konfiguracja", + "admin_settings.current_example-devel": "Przykładowy szablon ustawień deweloperskich", + "admin_settings.current_example-prod": "Przykładowy szablon ustawień produkcyjnych", + "admin_settings.current_restart.value": "Zrestartuj Etherpad", + "admin_settings.current_save.value": "Zapisz ustawienia", + "admin_settings.page-title": "Ustawienia - Etherpad", "index.newPad": "Nowy dokument", - "index.createOpenPad": "lub stwórz/otwórz dokument o nazwie:", + "index.createOpenPad": "Otwórz dokument znając nazwę", "index.openPad": "otwórz istniejący dokument o nazwie:", + "index.recentPads": "Ostatnie dokumenty", + "index.recentPadsEmpty": "Nie znaleziono ostatnio używanych dokumentów.", + "index.generateNewPad": "Wygeneruj losową nazwę dokumentu", + "index.labelPad": "Nazwa dokumentu (opcjonalna)", + "index.placeholderPadEnter": "Proszę wpisać nazwę dokumentu...", + "index.createAndShareDocuments": "Twórz i udostępniaj dokumenty w czasie rzeczywistym", + "index.createAndShareDocumentsDescription": "Etherpad umożliwia wspólną edycję dokumentów w czasie rzeczywistym, podobnie jak edytor wieloosobowy działający w przeglądarce.", "pad.toolbar.bold.title": "Pogrubienie (Ctrl-B)", "pad.toolbar.italic.title": "Kursywa (Ctrl-I)", "pad.toolbar.underline.title": "Podkreślenie (Ctrl-U)", @@ -49,6 +73,7 @@ "pad.toolbar.savedRevision.title": "Zapisz wersję", "pad.toolbar.settings.title": "Ustawienia", "pad.toolbar.embed.title": "Podziel się i osadź ten dokument", + "pad.toolbar.home.title": "Wróć do strony głównej", "pad.toolbar.showusers.title": "Pokaż użytkowników", "pad.colorpicker.save": "Zapisz", "pad.colorpicker.cancel": "Anuluj", @@ -65,6 +90,8 @@ "pad.settings.fontType": "Rodzaj czcionki:", "pad.settings.fontType.normal": "Normalna", "pad.settings.language": "Język:", + "pad.settings.deletePad": "Usuń dokument", + "pad.delete.confirm": "Czy na pewno chcesz usunąć ten dokument?", "pad.settings.about": "O aplikacji", "pad.settings.poweredBy": "Dostarczane przez $1", "pad.importExport.import_export": "Import/eksport", @@ -101,6 +128,8 @@ "pad.modals.corruptPad.cause": "Może być to spowodowane złą konfiguracją serwera lub innym nieoczekiwanym zachowaniem. Skontaktuj się z administratorem serwisu.", "pad.modals.deleted": "Usunięto.", "pad.modals.deleted.explanation": "Ten dokument został usunięty.", + "pad.modals.rateLimited.explanation": "Wysłano za dużo wiadomości w tym dokumencie, dlatego nastąpiło rozłączenie.", + "pad.modals.rejected.cause": "Serwer mógł zostać zaktualizowany podczas przeglądania panelu lub wystąpił błąd w Etherpadzie. Spróbuj odświeżyć stronę.", "pad.modals.disconnected": "Zostałeś rozłączony.", "pad.modals.disconnected.explanation": "Utracono połączenie z serwerem", "pad.modals.disconnected.cause": "Serwer może być niedostępny. Poinformuj administratora serwisu jeżeli problem będzie się powtarzał.", @@ -111,8 +140,9 @@ "pad.chat": "Czat", "pad.chat.title": "Otwórz czat dla tego dokumentu.", "pad.chat.loadmessages": "Załaduj więcej wiadomości", - "pad.chat.stick.title": "Przyklej czat do ekranu", + "pad.chat.stick.title": "Przypnij czat do ekranu", "pad.chat.writeMessage.placeholder": "Napisz swoją wiadomość tutaj", + "timeslider.followContents": "Śledź aktualizacje zawartości dokumentu", "timeslider.pageTitle": "Oś czasu {{appTitle}}", "timeslider.toolbar.returnbutton": "Powróć do dokumentu", "timeslider.toolbar.authors": "Autorzy:", diff --git a/src/locales/pms.json b/src/locales/pms.json index 2d25ea928..c41c023c1 100644 --- a/src/locales/pms.json +++ b/src/locales/pms.json @@ -38,8 +38,27 @@ "admin_settings.current_save.value": "Argistré ij paràmeter", "admin_settings.page-title": "Paràmeter - Etherpad", "index.newPad": "Feuj neuv", - "index.createOpenPad": "o creé/duverté un feuj antitolà:", + "index.settings": "Paràmeter", + "index.transferSessionTitle": "Tramudé la session", + "index.receiveSessionTitle": "Arsèive na session", + "index.receiveSessionDescription": "Ambelessì a peul arsèive na session Etherpad da n'àutr navigador o angign. Për piasì, ch'a armarca che, an tute le manere, sòn a dëscancelërà soa session corent, s'a-i na j'é.", + "index.transferSession": "1. Tramudé la session", + "index.transferSessionNow": "Tramudé la session adess", + "index.copyLink": "2. Copié la liura", + "index.copyLinkDescription": "Ch'a sgnaca an sël boton sì-sota për copié la liura su soa taulëtta.", + "index.copyLinkButton": "Copié la liura an sla taulëtta", + "index.transferToSystem": "3. Copié la session ant ël neuv sistema", + "index.transferToSystemDescription": "Duverté la liura copià ant ël navigador o angign ëd destinassion për tramudé soa session.", + "index.transferSessionDescription": "Tramudé soa session corenta a 'n navigador o n'angign an ësgnacand ël boton sota. Sòn a copiërà na liura a na pàgina che a tramudërà soa session cand a sarà duvertà ant ël navigador o l'angign ëd destinassion.", + "index.createOpenPad": "Duverté ël blochèt con sò nòm", "index.openPad": "duverté un Pad esistent con ël nòm:", + "index.recentPads": "Blochèt recent", + "index.recentPadsEmpty": "Gnun blochèt recent trovà.", + "index.generateNewPad": "Generé un nòm ëd blochèt a l'ancàpit", + "index.labelPad": "Nòm dël blochèt (facoltativ)", + "index.placeholderPadEnter": "Për piasì, ch'a anserissa un nòm ëd blochèt...", + "index.createAndShareDocuments": "Creé e partagé dij document an temp real", + "index.createAndShareDocumentsDescription": "Etherpad a-j përmet ëd modifiché dij document an manera colaborativa an temp real, un pò coma n'editor multi-giugador che a marcia an sò navigador.", "pad.toolbar.bold.title": "Grassèt (Ctrl+B)", "pad.toolbar.italic.title": "Corsiv (Ctrl+I)", "pad.toolbar.underline.title": "Sotlignà (Ctrl+U)", @@ -56,6 +75,7 @@ "pad.toolbar.savedRevision.title": "Argistré la revision", "pad.toolbar.settings.title": "Paràmeter", "pad.toolbar.embed.title": "Partagé e antëgré ës feuj", + "pad.toolbar.home.title": "Artorn a l'intrada", "pad.toolbar.showusers.title": "Smon-e j'utent ansima a 's feuj", "pad.colorpicker.save": "Argistré", "pad.colorpicker.cancel": "Anulé", @@ -71,6 +91,8 @@ "pad.settings.rtlcheck": "Ël contnù, dev-lo esse lesù da drita a snistra?", "pad.settings.fontType": "Sòrt ëd caràter:", "pad.settings.language": "Lenga:", + "pad.settings.deletePad": "Eliminé ël blochet", + "pad.delete.confirm": "Veul-lo për da bon eliminé cost blochet?", "pad.settings.about": "A propòsit", "pad.settings.poweredBy": "Potensià da", "pad.importExport.import_export": "Amporté/Esporté", diff --git a/src/locales/ps.json b/src/locales/ps.json index 7413c41e2..c2b20981d 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -1,11 +1,30 @@ { "@metadata": { "authors": [ - "Ahmed-Najib-Biabani-Ibrahimkhel" + "Ahmed-Najib-Biabani-Ibrahimkhel", + "شاه زمان پټان" ] }, + "admin_plugins.last-update": "وروستۍ هم‌مهالېدنه", + "admin_plugins.name": "نوم", + "admin_plugins.version": "بل‌بڼه", + "admin_plugins_info": "ستونزو اواري مالومات", + "admin_plugins_info.hooks": "ځای‌پرځای‌شوي چنگکونه", + "admin_plugins_info.version_latest": "وروستۍ د لاسرسي وړ بل‌بڼه", + "admin_plugins_info.version_number": "بل‌بڼې شمېره", + "admin_settings": "اوڼنې", + "admin_settings.current": "اوسنی ترتيب", + "admin_settings.current_example-devel": "د پراختيااوڼنې کينډۍ بېلگه", + "admin_settings.current_example-prod": "د توليد اوڼنې کينډۍ بېلگه", + "admin_settings.current_save.value": "اوڼنې خوندي‌کول", "index.newPad": "نوې ليکچه", - "index.createOpenPad": "يا په همدې نوم يوه نوې ليکچه جوړول/پرانيستل:", + "index.createOpenPad": "ليکچه د نوم له مخې پرانېستل", + "index.recentPads": "وروستۍ ليکچې", + "index.recentPadsEmpty": "هېڅ وروستۍ ليکچې ونه موندل شوې.", + "index.generateNewPad": "ناڅاپي ليکچې نوم پنځول", + "index.labelPad": "ليکچې نوم (اختياري)", + "index.placeholderPadEnter": "مهرباني وکړئ ليکچې نوم وليکئ...", + "index.createAndShareDocuments": "په رښتينې وخت کې لاسوندونه جوړ او شريک کړئ", "pad.toolbar.bold.title": "زغرد (Ctrl-B)", "pad.toolbar.italic.title": "رېوند (Ctrl-I)", "pad.toolbar.underline.title": "لرکرښن (Ctrl+U)", @@ -16,11 +35,12 @@ "pad.toolbar.redo.title": "بياکړل (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "د ليکوالۍ رنگونه سپينول (Ctrl+Shift+C)", "pad.toolbar.savedRevision.title": "مخکتنه خوندي کول", - "pad.toolbar.settings.title": "امستنې", + "pad.toolbar.settings.title": "اوڼنې", + "pad.toolbar.home.title": "بېرته کور ته", "pad.colorpicker.save": "خوندي کول", "pad.colorpicker.cancel": "ناگارل", "pad.loading": "رابرسېرېږي...", - "pad.settings.padSettings": "د ليکچې امستنې", + "pad.settings.padSettings": "د ليکچې اوڼنې", "pad.settings.myView": "زما کتنه", "pad.settings.stickychat": "تل په پردې بانډار کول", "pad.settings.chatandusers": "کارنان او بانډار ښکاره کول", @@ -29,6 +49,9 @@ "pad.settings.fontType": "ليکبڼې ډول:", "pad.settings.fontType.normal": "نورمال", "pad.settings.language": "ژبه:", + "pad.settings.about": "په‌اړه", + "pad.settings.poweredBy": "چلوونکی", + "pad.importExport.import_export": "رالېږدول/بهرلېږل", "pad.importExport.importSuccessful": "بريالی شو!", "pad.importExport.exportetherpad": "اېترپډ", "pad.importExport.exporthtml": "اچ ټي ام اېل", @@ -37,6 +60,9 @@ "pad.importExport.exportpdf": "پي ډي اېف", "pad.importExport.exportopen": "ODF (اوپن ډاکومنټ فارمټ)", "pad.modals.connected": "اړيکمن شو.", + "pad.modals.forcereconnect": "په زوره بيانښلونه", + "pad.modals.reconnecttimer": "د بيانښلولو هڅه‌کول", + "pad.modals.cancel": "ناگارل", "pad.modals.slowcommit.explanation": "پالنگر ځواب نه وايي.", "pad.modals.slowcommit.cause": "دا کېدای شي د جال د اړيکتيايي ستونزو په سبب وي.", "pad.modals.deleted": "ړنگ شو.", @@ -69,5 +95,6 @@ "pad.userlist.unnamed": "بې نومه", "pad.impexp.importbutton": "اوس واردول", "pad.impexp.importing": "په واردولو کې دی...", + "pad.impexp.uploadFailed": "راپورته‌کول نابرياله شول، مهرباني وکړئ بيا هڅه وکړئ.", "pad.impexp.copypaste": "لطفاً لمېسل لېښل ترسره کړئ" } diff --git a/src/locales/pt-br.json b/src/locales/pt-br.json index 98c660319..4ffe81cbd 100644 --- a/src/locales/pt-br.json +++ b/src/locales/pt-br.json @@ -23,22 +23,22 @@ ] }, "admin.page-title": "Painel administrativo - Etherpad", - "admin_plugins": "Gerente de complementos", + "admin_plugins": "Gerenciador de complementos", "admin_plugins.available": "Plugins disponíveis", - "admin_plugins.available_not-found": "Nenhuma complementos encontrado.", + "admin_plugins.available_not-found": "Nenhum plugin encontrado.", "admin_plugins.available_fetching": "Buscando…", "admin_plugins.available_install.value": "Instalar", - "admin_plugins.available_search.placeholder": "Procure por plug-ins para instalar", + "admin_plugins.available_search.placeholder": "Procure plugins para instalar", "admin_plugins.description": "Descrição", - "admin_plugins.installed": "Complementos instalados", - "admin_plugins.installed_fetching": "Buscando plug-ins instalados…", - "admin_plugins.installed_nothing": "Você ainda não instalou nenhum plug-in.", + "admin_plugins.installed": "Plugins instalados", + "admin_plugins.installed_fetching": "Buscando plugins instalados…", + "admin_plugins.installed_nothing": "Você ainda não instalou nenhum plugin.", "admin_plugins.installed_uninstall.value": "Desinstalar", "admin_plugins.last-update": "Última atualização", "admin_plugins.name": "Nome", - "admin_plugins.page-title": "Gerenciador de plug-ins - Etherpad", + "admin_plugins.page-title": "Gerenciador de plugins - Etherpad", "admin_plugins.version": "Versão", - "admin_plugins_info": "Informações sobre solução", + "admin_plugins_info": "Resolução de problemas", "admin_plugins_info.hooks": "Ganchos instalados", "admin_plugins_info.hooks_client": "Ganchos do lado do cliente", "admin_plugins_info.hooks_server": "Ganchos do lado do servidor", @@ -90,6 +90,8 @@ "pad.settings.fontType": "Tipo de fonte:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Idioma:", + "pad.settings.deletePad": "Apagar Pad", + "pad.delete.confirm": "Tem certeza de que quer deletar este pad?", "pad.settings.about": "Sobre", "pad.settings.poweredBy": "Fornecido por", "pad.importExport.import_export": "Importar/Exportar", @@ -127,7 +129,7 @@ "pad.modals.deleted": "Excluído.", "pad.modals.deleted.explanation": "Esta nota foi removida.", "pad.modals.rateLimited": "Limitado.", - "pad.modals.rateLimited.explanation": "Você enviou muitas mensagens para este pad por isso será desconectado.", + "pad.modals.rateLimited.explanation": "Você enviou muitas mensagens para esta nota por isso será desconectado.", "pad.modals.rejected.explanation": "O servidor rejeitou uma mensagem que foi enviada pelo seu navegador.", "pad.modals.rejected.cause": "O server pode ter sido atualizado enquanto visualizava esta nota, ou talvez seja apenas um bug do Etherpad. Tenta recarregar a página.", "pad.modals.disconnected": "Você foi desconectado.", @@ -142,7 +144,7 @@ "pad.chat.loadmessages": "Carregar mais mensagens", "pad.chat.stick.title": "Cole o bate-papo na tela", "pad.chat.writeMessage.placeholder": "Escreva sua mensagem aqui", - "timeslider.followContents": "Siga as atualizações de conteúdo do pad", + "timeslider.followContents": "Siga as atualizações de conteúdo da nota", "timeslider.pageTitle": "Linha do tempo de {{appTitle}}", "timeslider.toolbar.returnbutton": "Retornar para a nota", "timeslider.toolbar.authors": "Autores:", @@ -151,9 +153,9 @@ "timeslider.exportCurrent": "Exportar a versão atual em formato:", "timeslider.version": "Versão {{version}}", "timeslider.saved": "Salvo em {{day}} de {{month}} de {{year}}", - "timeslider.playPause": "Reproduzir / Pausar conteúdo no Pad", - "timeslider.backRevision": "Voltar a uma revisão anterior neste Pad", - "timeslider.forwardRevision": "Ir a uma revisão posterior neste Pad", + "timeslider.playPause": "Reproduzir / Pausar conteúdos da Nota", + "timeslider.backRevision": "Voltar a uma revisão anterior nesta Nota", + "timeslider.forwardRevision": "Ir a uma revisão posterior nesta Nota", "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janeiro", "timeslider.month.february": "Fevereiro", diff --git a/src/locales/ro.json b/src/locales/ro.json index e46c4b7f7..fba98804d 100644 --- a/src/locales/ro.json +++ b/src/locales/ro.json @@ -6,12 +6,13 @@ "ImGelu", "MSClaudiu", "Minisarm", + "SZ475", "Strainu", "Wintereu" ] }, "index.newPad": "Pad nou", - "index.createOpenPad": "sau creează/deschide un Pad cu numele:", + "index.createOpenPad": "Deschideți pad-ul după nume", "index.openPad": "deschide un Pad existent cu numele:", "pad.toolbar.bold.title": "Aldin (Ctrl + B)", "pad.toolbar.italic.title": "Cursiv (Ctrl + I)", @@ -20,7 +21,7 @@ "pad.toolbar.ol.title": "Listă ordonată (Ctrl+Shift+N)", "pad.toolbar.ul.title": "Listă neordonată (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Cursiv (TAB)", - "pad.toolbar.unindent.title": "Fără cursiv (Shift+TAB)", + "pad.toolbar.unindent.title": "Outdent (Shift+TAB)", "pad.toolbar.undo.title": "Anulează (Ctrl+Z)", "pad.toolbar.redo.title": "Refă (Ctrl+Y)", "pad.toolbar.clearAuthorship.title": "Curăță culorile autorilor (Ctrl+Shift+C)", @@ -57,7 +58,7 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.abiword.innerHTML": "Puteți importa doar din format simplu sau HTML. Pentru funcții de import mai avansate, vă rugăm instalați AbiWord sau LibreOffice.", "pad.modals.connected": "Conectat.", - "pad.modals.reconnecting": "Se reconectează la pad-ul dumneavoastră..", + "pad.modals.reconnecting": "Se reconectează la pad…", "pad.modals.forcereconnect": "Forțează reconectarea", "pad.modals.reconnecttimer": "Încercați să vă reconectați în", "pad.modals.cancel": "Anulează", diff --git a/src/locales/ru.json b/src/locales/ru.json index f8e7fb340..7e11d382e 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -7,6 +7,7 @@ "Eleferen", "Facenapalm", "Kareyac", + "Lvova", "MSClaudiu", "Megakott", "Movses", @@ -53,8 +54,27 @@ "admin_settings.current_save.value": "Сохранить настройки", "admin_settings.page-title": "Настройки — Etherpad", "index.newPad": "Создать", - "index.createOpenPad": "или создать/открыть документ с именем:", + "index.settings": "Настройки", + "index.transferSessionTitle": "Передача сеанса", + "index.receiveSessionTitle": "Приём сеанса", + "index.receiveSessionDescription": "Здесь вы можете принять сеанс Etherpad из другого браузера или устройства. Обратите внимание, что это удалит ваш текущий сеанс, если он есть.", + "index.transferSession": "1. Перенос сеанса", + "index.transferSessionNow": "Перенести сеанс сейчас", + "index.copyLink": "2. Скопировать ссылку", + "index.copyLinkDescription": "Нажмите на кнопку ниже, чтобы скопировать ссылку в буфер обмена.", + "index.copyLinkButton": "Скопировать в буфер обмена", + "index.transferToSystem": "3. Копировать сеанс в новую систему", + "index.transferToSystemDescription": "Откройте скопированную ссылку в нужном браузере или устройстве, чтобы перенести сеанс.", + "index.transferSessionDescription": "Перенесите текущий сеанс в браузер или на устройство, нажав кнопку ниже. Будет скопирована ссылка на страницу, которая перенесёт ваш сеанс при открытии в целевом браузере или на целевом устройстве.", + "index.createOpenPad": "Открыть документ по имени", "index.openPad": "откройте существующий документ с именем:", + "index.recentPads": "Последние документы", + "index.recentPadsEmpty": "Свежих документов не найдено.", + "index.generateNewPad": "Создать случайное имя документа", + "index.labelPad": "Название документа (необязательно)", + "index.placeholderPadEnter": "Введите название документа…", + "index.createAndShareDocuments": "Создать и поделиться документами в режиме реального времени", + "index.createAndShareDocumentsDescription": "Etherpad позволяет вам совместно редактировать документы в режиме реального времени, подобно многопользовательскому редактору, работающему в вашем браузере.", "pad.toolbar.bold.title": "Полужирный (Ctrl-B)", "pad.toolbar.italic.title": "Курсив (Ctrl-I)", "pad.toolbar.underline.title": "подчёркивание (Ctrl-U)", @@ -71,6 +91,7 @@ "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": "Отмена", @@ -87,6 +108,8 @@ "pad.settings.fontType": "Тип шрифта:", "pad.settings.fontType.normal": "Обычный", "pad.settings.language": "Язык:", + "pad.settings.deletePad": "Удалить документ", + "pad.delete.confirm": "Вы действительно хотите удалить этот документ?", "pad.settings.about": "О проекте", "pad.settings.poweredBy": "Проект основан на", "pad.importExport.import_export": "Импорт/экспорт", diff --git a/src/locales/sh.json b/src/locales/sh-latn.json similarity index 99% rename from src/locales/sh.json rename to src/locales/sh-latn.json index f5c045c55..e09c64dd4 100644 --- a/src/locales/sh.json +++ b/src/locales/sh-latn.json @@ -1,8 +1,7 @@ { "@metadata": { "authors": [ - "Conquistador", - "Vlad5250" + "Winston Sung" ] }, "admin_plugins.available_not-found": "Nijedan plugin nije pronađen.", diff --git a/src/locales/shn.json b/src/locales/shn.json index d03f9e6c7..f36df000f 100644 --- a/src/locales/shn.json +++ b/src/locales/shn.json @@ -26,7 +26,7 @@ "pad.toolbar.embed.title": "ၽႄပၼ်ၽႅတ်ႉဢၼ်ၼႆႉသေ ၽိူမ်ႉပၼ်", "pad.toolbar.showusers.title": "ၼႄပၼ်ၵေႃႉၸႂ်ႉ တီႈၼိူဝ်ၽႅတ်ႉၼႆႉ", "pad.colorpicker.save": "ၵဵပ်းသိမ်း", - "pad.colorpicker.cancel": "ဢမ်ႇႁဵတ်း", + "pad.colorpicker.cancel": "ယႃႉၶိုၼ်း", "pad.loading": "တိုၵ်ႉလူတ်ႇ", "pad.noCookie": "ၶုၵ်းၶီး ဢမ်ႇႁၼ်လႆႈ။ ၶႅၼ်းတေႃႈ ၶႂၢင်းပၼ် ၶုၵ်းၶီး တီႈၼႂ်း ပရၢဝ်ႇသႃႇၸဝ်ႈၵဝ်ႇ", "pad.permissionDenied": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးၶေႃႈၶႂၢင်ႉ တႃႇၶဝ်ႈၼႂ်းၽႅတ်ႉၼႆႉ", @@ -54,7 +54,7 @@ "pad.modals.reconnecting": "ၶိုၼ်းၵွင်ႉသၢၼ်ၸူး ၽႅတ်ႉၸဝ်ႈၵဝ်ႇယူႇ", "pad.modals.forcereconnect": "တဵၵ်းၸႂ်ႉ ၶိုၼ်းၵွင်ႉသၢၼ်", "pad.modals.reconnecttimer": "ၶတ်းၸႂ်တူၺ်း တႃႇၶိုၼ်းၵွင်ႉသိုပ်ႇၸူး", - "pad.modals.cancel": "ဢမ်ႇႁဵတ်း", + "pad.modals.cancel": "ယႃႉၶိုၼ်း", "pad.modals.userdup": "ပိုတ်ႇတမ်ႈတီႈ ၼႃႈတူမႂ်ႇ", "pad.modals.userdup.explanation": "တမ်ႈတီႈၼႂ်းၶွမ်းတၢင်ႇဢၼ်ၼၼ်ႉ ၽႅတ်ႉဢၼ်ၼႆႉ လႅပ်ႉပိုတ်ႇဝႆႉ တမ်ႈတီႈ ပရၢဝ်ႇသႃႇတၢင်ႇတီႈယူႇ", "pad.modals.userdup.advice": "ၶိုၼ်းၵွင်ႉသၢၼ်တၢင် တမ်ႈတီႈ ဝိၼ်းတူဝ်းၼႆႉ", @@ -71,14 +71,14 @@ "pad.modals.badChangeset.cause": "ၼႆႉမၼ်းၸၢင်ႈပဵၼ်ယွၼ်ႉပိူဝ်ႈ လွင်ႈၵုမ်းၵၢၼ်သႃႇပိူဝ်ႇ ၽိတ်းပိူင်ႈဝႆႉ ဢမ်ႇၼၼ် ပဵၼ်ယွၼ်ႉလွင်ႈဢၼ်ဢမ်ႇမုင်ႈမွင်းဝႆႉ။ သင်ၸိူဝ်ႉဝႃႈ ၸဝ်ႈၵဝ်ႇယိၼ်းဝႃႈပဵၼ်လွင်ႈၽိတ်းပိူင်ႈၼႆ ၶႅၼ်းတေႃႈၵပ်းသိုပ်ႇၸူးတင်း ၽူႈၵုမ်းၵၢၼ် ၵၢၼ်ၸွႆႈသၢင်ႈလႄႈ။ ၶိုၼ်းၶတ်းၸႂ်ၵွင်ႉသိုပ်ႇသေ တွၼ်ႈတႃႇ သိုပ်ႇႁဵတ်းလွင်ႈမႄးထတ်း။", "pad.modals.corruptPad.explanation": "ၽႅတ်ႉဢၼ်ၸဝ်ႈၵဝ်ႇပေႃႉၼၼ်ႉ ၶဝ်ႈၽိတ်းဝႆႉ", "pad.modals.corruptPad.cause": "ဢၼ်ၼႆႉ သႃႇဝႃႇဢၼ်ၸၼ်ထိင်းမၼ်း ၽိတ်းဝႆႉ ဢမ်ႇၼၼ် ဢမ်ႇမုင်ႈမွင်းသေ ၽိတ်းပိူင်ႈဝႆႉယဝ်ႉ။ ၶႅၼ်းတေႃႈ ၵပ်းသိုပ်ႇတမ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်.", - "pad.modals.deleted": "ယႃႉ", + "pad.modals.deleted": "မွတ်ႇပႅတ်ႈယဝ်ႉ။", "pad.modals.deleted.explanation": "ၽႅတ်ႉဢၼ်ၼႆႉ ၶၢႆႉပႅတ်ႈယဝ်ႉ", "pad.modals.disconnected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇၵွင်ႉသၢၼ်ဝႆႉ", "pad.modals.disconnected.explanation": "လွင်ႈၵွင်ႉသၢၼ် ၵႂႃႇၸူးသႃႇဝႃႇၼၼ်ႉ ႁၢႆဝႆႉ", "pad.modals.disconnected.cause": "သႃႇဝႃႇတေဢမ်ႇၸၢင်ႈယိပ်းတိုဝ်း။ တႃႇႁႂ်ႈသိုပ်ႇပဵၼ်ၵၢၼ်ၵႂႃႇၼၼ်ႉ ၶႅၼ်းတေႃႈ ပွင်ႇၶၢဝ်ႇ တမ်ႈတီႈ ၽူႈၵုမ်းၵၢၼ်", "pad.share": "ၽႄၽႅတ်ႉၼႆႉ", "pad.share.readonly": "လူလၢႆလၢႆ", - "pad.share.link": "ၵွင်ႉ", + "pad.share.link": "လိင်ႉၶ်", "pad.share.emebdcode": "သႂ်ႇ URL", "pad.chat": "ၶျၢတ်ႉ", "pad.chat.title": "ပိုတ်ႇၶျၢတ်ႉ တႃႇၽႅတ်ႉၼႆႉ", diff --git a/src/locales/sl.json b/src/locales/sl.json index 3f0f17e8b..a599a1688 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -77,6 +77,8 @@ "pad.settings.fontType": "Vrsta pisave:", "pad.settings.fontType.normal": "Normalno", "pad.settings.language": "Jezik:", + "pad.settings.deletePad": "Izbriši ploščico", + "pad.delete.confirm": "Res želite izbrisati to ploščico?", "pad.settings.about": "Kolofon", "pad.settings.poweredBy": "Omogoča", "pad.importExport.import_export": "Uvoz/Izvoz", diff --git a/src/locales/sq.json b/src/locales/sq.json index b6c2fa285..4f8c18fe4 100644 --- a/src/locales/sq.json +++ b/src/locales/sq.json @@ -4,7 +4,8 @@ "Besnik b", "Eraldkerciku", "Kosovastar", - "Liridon" + "Liridon", + "Xhulianoo" ] }, "admin.page-title": "Pult Përgjegjësi - Etherpad", diff --git a/src/locales/sr-ec.json b/src/locales/sr-ec.json index 156715af0..2ae09c5ed 100644 --- a/src/locales/sr-ec.json +++ b/src/locales/sr-ec.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Aca", "Acamicamacaraca", "Aktron", "BadDog", diff --git a/src/locales/sv.json b/src/locales/sv.json index f855e1841..939eeac3d 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -42,8 +42,27 @@ "admin_settings.current_save.value": "Spara inställningar", "admin_settings.page-title": "Inställningar - Etherpad", "index.newPad": "Nytt block", - "index.createOpenPad": "eller skapa/öppna ett block med namnet:", + "index.settings": "Inställningar", + "index.transferSessionTitle": "Överför session", + "index.receiveSessionTitle": "Ta emot session", + "index.receiveSessionDescription": "Här kan du ta emot en Etherpad-session från en annan webbläsare eller enhet. Observera att detta kommer att radera din aktuella session, om en sådan finns.", + "index.transferSession": "1. Överför session", + "index.transferSessionNow": "Överför session nu", + "index.copyLink": "2. Kopiera länk", + "index.copyLinkDescription": "Klicka på knappen nedan för att kopiera länken till urklipp.", + "index.copyLinkButton": "Kopiera länk till urklipp", + "index.transferToSystem": "3. Kopiera sessionen till det nya systemet", + "index.transferToSystemDescription": "Öppna den kopierade länken i målwebbläsaren eller -enheten för att överföra din session.", + "index.transferSessionDescription": "Överför din nuvarande session till webbläsaren eller enheten genom att klicka på knappen nedan. Detta kopierar en länk till en sida som överför din session när den öppnas i målwebbläsaren eller -enheten.", + "index.createOpenPad": "Öppna block med namn", "index.openPad": "öppna ett befintligt block med namnet:", + "index.recentPads": "Senaste block", + "index.recentPadsEmpty": "Inga senaste block hittades.", + "index.generateNewPad": "Generera slumpat blocknamn", + "index.labelPad": "Blocknamn (valfritt)", + "index.placeholderPadEnter": "Ange ett blocknamn...", + "index.createAndShareDocuments": "Skapa och dela dokument i realtid", + "index.createAndShareDocumentsDescription": "Med Etherpad kan ni redigera dokument tillsammans i realtid, ungefär som en live-redigerare för flera spelare som körs i din webbläsare.", "pad.toolbar.bold.title": "Fet (Ctrl+B)", "pad.toolbar.italic.title": "Kursiv (Ctrl+I)", "pad.toolbar.underline.title": "Understruken (Ctrl+U)", @@ -60,6 +79,7 @@ "pad.toolbar.savedRevision.title": "Spara version", "pad.toolbar.settings.title": "Inställningar", "pad.toolbar.embed.title": "Dela och bädda in detta block", + "pad.toolbar.home.title": "Tillbaka till hemsidan", "pad.toolbar.showusers.title": "Visa användarna på detta block", "pad.colorpicker.save": "Spara", "pad.colorpicker.cancel": "Avbryt", @@ -76,6 +96,8 @@ "pad.settings.fontType": "Typsnitt:", "pad.settings.fontType.normal": "Normal", "pad.settings.language": "Språk:", + "pad.settings.deletePad": "Radera block", + "pad.delete.confirm": "Vill du verkligen radera detta block?", "pad.settings.about": "Om", "pad.settings.poweredBy": "Drivs av", "pad.importExport.import_export": "Importera/Exportera", diff --git a/src/locales/sw.json b/src/locales/sw.json index 33d24add2..c45ed08e9 100644 --- a/src/locales/sw.json +++ b/src/locales/sw.json @@ -3,7 +3,8 @@ "authors": [ "Andibecker", "Edwingudfriend", - "Muddyb" + "Muddyb", + "Samuel Kiongo" ] }, "admin.page-title": "Dashibodi ya Usimamizi - Etherpad", @@ -42,6 +43,7 @@ "index.newPad": "Pad Mpya", "index.createOpenPad": "au tunga/fungua Pad yenye jina:", "index.openPad": "fungua Pad iliyopo na jina:", + "index.placeholderPadEnter": "Tafadhali weka jina la mtumiaji.", "pad.toolbar.bold.title": "Koozesha (Ctrl+B)", "pad.toolbar.italic.title": "Mlalo (Ctrl+I)", "pad.toolbar.underline.title": "Pigia mstari (Ctrl+U)", diff --git a/src/locales/th.json b/src/locales/th.json index 7de1e4fdc..8b44b2f20 100644 --- a/src/locales/th.json +++ b/src/locales/th.json @@ -3,6 +3,7 @@ "authors": [ "Aefgh39622", "Andibecker", + "Ekminarin", "Patsagorn Y.", "Trisorn Triboon" ] @@ -121,7 +122,7 @@ "pad.share.readonly": "อ่านเท่านั้น", "pad.share.link": "ลิงก์", "pad.share.emebdcode": "URL แบบฝังตัว", - "pad.chat": "แชท", + "pad.chat": "แชต", "pad.chat.title": "เปิดการแชทสำหรับแผ่นจดบันทึกนี้", "pad.chat.loadmessages": "โหลดข้อความเพิ่มเติม", "pad.chat.stick.title": "ปักการสนทนาไว้บนหน้าจอ", diff --git a/src/locales/tr.json b/src/locales/tr.json index f3d7ae33f..486385099 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -7,6 +7,7 @@ "Grkn gll", "Hedda", "Joseph", + "Leo", "McAang", "Meelo", "MuratTheTurkish", @@ -48,7 +49,7 @@ "admin_settings.current_save.value": "Ayarları Kaydet", "admin_settings.page-title": "Ayarlar - Etherpad", "index.newPad": "Yeni Bloknot", - "index.createOpenPad": "veya şu adla bir Bloknot oluşturun/açın:", + "index.createOpenPad": "İsme göre açık bloknot", "index.openPad": "şu adla varolan bir Bloknot'u açın:", "pad.toolbar.bold.title": "Kalın (Ctrl+B)", "pad.toolbar.italic.title": "Eğik (Ctrl+I)", @@ -82,6 +83,8 @@ "pad.settings.fontType": "Yazı tipi:", "pad.settings.fontType.normal": "Olağan", "pad.settings.language": "Dil:", + "pad.settings.deletePad": "Silme Defteri", + "pad.delete.confirm": "Bu defteri gerçekten silmek istiyor musunuz?", "pad.settings.about": "Hakkında", "pad.settings.poweredBy": "Destekleyen:", "pad.importExport.import_export": "İçe/Dışa aktar", diff --git a/src/locales/uk.json b/src/locales/uk.json index 314e3219d..4879f62cc 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -50,7 +50,7 @@ "admin_settings.current_save.value": "Зберегти налаштування", "admin_settings.page-title": "Налаштування — Etherpad", "index.newPad": "Створити", - "index.createOpenPad": "або створити/відкрити документ з назвою:", + "index.createOpenPad": "Відкрити документ з іменем", "index.openPad": "відкрити наявний документ з назвою:", "pad.toolbar.bold.title": "Напівжирний (Ctrl-B)", "pad.toolbar.italic.title": "Курсив (Ctrl-I)", @@ -84,6 +84,8 @@ "pad.settings.fontType": "Тип шрифту:", "pad.settings.fontType.normal": "Звичайний", "pad.settings.language": "Мова:", + "pad.settings.deletePad": "Вилучити документ", + "pad.delete.confirm": "Ви дійсно хочете вилучити цей документ?", "pad.settings.about": "Про програму", "pad.settings.poweredBy": "Працює на", "pad.importExport.import_export": "Імпорт/Експорт", diff --git a/src/locales/vec.json b/src/locales/vec.json index 97892523e..3128dbb11 100644 --- a/src/locales/vec.json +++ b/src/locales/vec.json @@ -1,13 +1,14 @@ { "@metadata": { "authors": [ + "Candalua", "Fierodelveneto" ] }, "index.newPad": "Novo Pad", "index.createOpenPad": "O creare o verxare on Pad co'l nome:", "pad.toolbar.bold.title": "Groseto (Ctrl-B)", - "pad.toolbar.italic.title": "Corivo (Ctrl-I)", + "pad.toolbar.italic.title": "Corsivo (Ctrl-I)", "pad.toolbar.underline.title": "Sotolineà (Ctrl-U)", "pad.toolbar.strikethrough.title": "Barà (Ctrl+5)", "pad.toolbar.ol.title": "Ełenco numarà (Ctrl+Shift+N)", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index ae454be4b..ac4549262 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -10,11 +10,13 @@ "Hzy980512", "JuneAugust", "Lakejason0", + "LittlePaw365", "Liuxinyu970226", "Qiyue2001", "Shangkuanlc", "Shizhao", "Stang", + "TFX202X", "VulpesVulpes825", "Yfdyh000", "乌拉跨氪", @@ -57,8 +59,27 @@ "admin_settings.current_save.value": "保存设置", "admin_settings.page-title": "设置 - Etherpad", "index.newPad": "新记事本", - "index.createOpenPad": "或创建/打开一个名为以下的记事本:", + "index.settings": "设置", + "index.transferSessionTitle": "转移会话", + "index.receiveSessionTitle": "接收会话", + "index.receiveSessionDescription": "您可以在此处从其他浏览器或设备接收Etherpad会话。但请注意,这会删除您目前的会话(如有)。", + "index.transferSession": "1. 转移会话", + "index.transferSessionNow": "现在进行转移会话", + "index.copyLink": "2. 复制链接", + "index.copyLinkDescription": "点击下方按钮,将链接复制到剪贴板。", + "index.copyLinkButton": "复制链接到剪贴板", + "index.transferToSystem": "3. 将会话复制到新系统", + "index.transferToSystemDescription": "在目标浏览器或设备上打开复制的链接,即可转移您的会话。", + "index.transferSessionDescription": "点击下方按钮,即可将目前的会话转移到浏览器或设备。这将复制一个指向某页面的链接,当该页面在目标浏览器或设备上打开时,将会转移您的会话。", + "index.createOpenPad": "按名称打开记事本", "index.openPad": "打开一个现有的记事本,名称为:", + "index.recentPads": "最近的记事本", + "index.recentPadsEmpty": "未找到最近的记事本。", + "index.generateNewPad": "生成随机记事本名称", + "index.labelPad": "记事本名称(可选)", + "index.placeholderPadEnter": "输入记事本名称…", + "index.createAndShareDocuments": "实时创建和共享文档", + "index.createAndShareDocumentsDescription": "Etherpad允许您实时协作编辑文档,就像在浏览器中运行的实时多人编辑器一样。", "pad.toolbar.bold.title": "粗体(Ctrl-B)", "pad.toolbar.italic.title": "斜体(Ctrl-I)", "pad.toolbar.underline.title": "下划线(Ctrl-U)", @@ -75,6 +96,7 @@ "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": "取消", @@ -91,6 +113,8 @@ "pad.settings.fontType": "字体类型:", "pad.settings.fontType.normal": "正常", "pad.settings.language": "语言:", + "pad.settings.deletePad": "删除记事本", + "pad.delete.confirm": "您确定要删除此记事本吗?", "pad.settings.about": "关于", "pad.settings.poweredBy": "技术支持来自", "pad.importExport.import_export": "导入/导出", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 434145efa..febf764c8 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -48,8 +48,27 @@ "admin_settings.current_save.value": "儲存設定", "admin_settings.page-title": "設定 - Etherpad", "index.newPad": "新記事本", - "index.createOpenPad": "或建立/開啟以下名稱的記事本:", + "index.settings": "設定", + "index.transferSessionTitle": "轉移連線階段", + "index.receiveSessionTitle": "接收連線階段", + "index.receiveSessionDescription": "您可以在此處從其他瀏覽器或裝置接收 Etherpad 的連線階段。但請留意,這會刪除您目前的連線階段(如有)。", + "index.transferSession": "1. 轉移連線階段", + "index.transferSessionNow": "現在進行轉移連線階段", + "index.copyLink": "2. 複製連結", + "index.copyLinkDescription": "點擊下方按鈕,將連結複製到您的剪貼簿。", + "index.copyLinkButton": "複製連結到剪貼簿", + "index.transferToSystem": "3. 將連線階段複製到新系統", + "index.transferToSystemDescription": "在目標瀏覽器或裝置上開啟複製的連結,即可轉移您的連線階段。", + "index.transferSessionDescription": "點擊下方按鈕,即可將您目前的連線階段轉移到瀏覽器或裝置。這將複製一個指向到一個頁面的連結,當該頁面在目標瀏覽器或設備上打開時,會轉移您的連線階段。", + "index.createOpenPad": "依照名稱開啟記事本", "index.openPad": "開啟一個現有的記事本,名稱為:", + "index.recentPads": "近期記事本", + "index.recentPadsEmpty": "找不到近期的記事本。", + "index.generateNewPad": "產生隨機記事本名稱", + "index.labelPad": "記事本名稱(可選)", + "index.placeholderPadEnter": "請輸入記事本名稱…", + "index.createAndShareDocuments": "即時建立和共享文件", + "index.createAndShareDocumentsDescription": "Etherpad 允許您即時協作編輯文件,就像在瀏覽器中運作的即時多人編輯器一樣。", "pad.toolbar.bold.title": "粗體(Ctrl+B)", "pad.toolbar.italic.title": "斜體(Ctrl+I)", "pad.toolbar.underline.title": "底線(Ctrl+U)", @@ -66,11 +85,12 @@ "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": "無法找到 Cookie。請在您的瀏覽器中允許cookie!您的 session 和設定未在訪問期間保存下來。這可能是由於 Etherpad 包含在某些瀏覽器的 iFrame 中。請確保 Etherpad 與父層級 iFrame 位於同一子網域/網域中", + "pad.noCookie": "無法找到 Cookie。請在您的瀏覽器中允許 cookie!您的連線階段和設定未在訪問期間保存下來。這可能是由於 Etherpad 包含在某些瀏覽器的 iFrame 中。請確保 Etherpad 與父層級 iFrame 位於同一子網域/網域中", "pad.permissionDenied": "你沒有存取這個記事本的權限", "pad.settings.padSettings": "記事本設定", "pad.settings.myView": "我的視窗", @@ -82,6 +102,8 @@ "pad.settings.fontType": "字型類型:", "pad.settings.fontType.normal": "正常", "pad.settings.language": "語言:", + "pad.settings.deletePad": "刪除記事本", + "pad.delete.confirm": "您確定要刪除此記事本?", "pad.settings.about": "關於", "pad.settings.poweredBy": "技術支援來自", "pad.importExport.import_export": "導入/匯出", diff --git a/src/node/db/API.ts b/src/node/db/API.ts index 9ce84fc51..9ca5ca03c 100644 --- a/src/node/db/API.ts +++ b/src/node/db/API.ts @@ -19,12 +19,14 @@ * limitations under the License. */ -const Changeset = require('../../static/js/Changeset'); -const ChatMessage = require('../../static/js/ChatMessage'); +import {deserializeOps} from '../../static/js/Changeset'; +import ChatMessage from '../../static/js/ChatMessage'; +import {Builder} from "../../static/js/Builder"; +import {Attribute} from "../../static/js/types/Attribute"; const CustomError = require('../utils/customError'); const padManager = require('./PadManager'); const padMessageHandler = require('../handler/PadMessageHandler'); -const readOnlyManager = require('./ReadOnlyManager'); +import readOnlyManager from './ReadOnlyManager'; const groupManager = require('./GroupManager'); const authorManager = require('./AuthorManager'); const sessionManager = require('./SessionManager'); @@ -563,11 +565,11 @@ exports.restoreRevision = async (padID: string, rev: number, authorId = '') => { const oldText = pad.text(); atext.text += '\n'; - const eachAttribRun = (attribs: string[], func:Function) => { + const eachAttribRun = (attribs: string, func:Function) => { let textIndex = 0; const newTextStart = 0; const newTextEnd = atext.text.length; - for (const op of Changeset.deserializeOps(attribs)) { + for (const op of deserializeOps(attribs)) { const nextIndex = textIndex + op.chars; if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) { func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); @@ -577,10 +579,10 @@ exports.restoreRevision = async (padID: string, rev: number, authorId = '') => { }; // create a new changeset with a helper builder object - const builder = Changeset.builder(oldText.length); + const builder = new Builder(oldText.length); // assemble each line into the builder - eachAttribRun(atext.attribs, (start: number, end: number, attribs:string[]) => { + eachAttribRun(atext.attribs, (start: number, end: number, attribs:Attribute[]) => { builder.insert(atext.text.substring(start, end), attribs); }); diff --git a/src/node/db/AuthorManager.ts b/src/node/db/AuthorManager.ts index 2f4e7d751..4bcfa2c0d 100644 --- a/src/node/db/AuthorManager.ts +++ b/src/node/db/AuthorManager.ts @@ -21,8 +21,8 @@ const db = require('./DB'); const CustomError = require('../utils/customError'); -const hooks = require('../../static/js/pluginfw/hooks.js'); -const {randomString, padutils: {warnDeprecated}} = require('../../static/js/pad_utils'); +const hooks = require('../../static/js/pluginfw/hooks'); +import padutils, {randomString} from "../../static/js/pad_utils"; exports.getColorPalette = () => [ '#ffc7c7', @@ -169,7 +169,7 @@ exports.getAuthorId = async (token: string, user: object) => { * @param {String} token The token */ exports.getAuthor4Token = async (token: string) => { - warnDeprecated( + padutils.warnDeprecated( 'AuthorManager.getAuthor4Token() is deprecated; use AuthorManager.getAuthorId() instead'); return await getAuthor4Token(token); }; diff --git a/src/node/db/DB.ts b/src/node/db/DB.ts index 542da6735..4b4899fac 100644 --- a/src/node/db/DB.ts +++ b/src/node/db/DB.ts @@ -21,8 +21,8 @@ * limitations under the License. */ -import ueberDB from 'ueberdb2'; -const settings = require('../utils/Settings'); +import {Database, DatabaseType} from 'ueberdb2'; +import settings from '../utils/Settings'; import log4js from 'log4js'; const stats = require('../stats') @@ -37,7 +37,7 @@ exports.db = null; * Initializes the database with the settings provided by the settings module */ exports.init = async () => { - exports.db = new ueberDB.Database(settings.dbType, settings.dbSettings, null, logger); + exports.db = new Database(settings.dbType as DatabaseType, settings.dbSettings, null, logger); await exports.db.init(); if (exports.db.metrics != null) { for (const [metric, value] of Object.entries(exports.db.metrics)) { diff --git a/src/node/db/GroupManager.ts b/src/node/db/GroupManager.ts index 0524c4eda..b8cb6db02 100644 --- a/src/node/db/GroupManager.ts +++ b/src/node/db/GroupManager.ts @@ -20,7 +20,7 @@ */ const CustomError = require('../utils/customError'); -const randomString = require('../../static/js/pad_utils').randomString; +import {randomString} from "../../static/js/pad_utils"; const db = require('./DB'); const padManager = require('./PadManager'); const sessionManager = require('./SessionManager'); diff --git a/src/node/db/Pad.ts b/src/node/db/Pad.ts index fa4af994d..003ec0831 100644 --- a/src/node/db/Pad.ts +++ b/src/node/db/Pad.ts @@ -7,24 +7,25 @@ import {MapArrayType} from "../types/MapType"; * The pad object, defined with joose */ -const AttributeMap = require('../../static/js/AttributeMap'); -const Changeset = require('../../static/js/Changeset'); -const ChatMessage = require('../../static/js/ChatMessage'); -const AttributePool = require('../../static/js/AttributePool'); +import AttributeMap from '../../static/js/AttributeMap'; +import {applyToAText, checkRep, copyAText, deserializeOps, makeAText, makeSplice, opsFromAText, pack, unpack} from '../../static/js/Changeset'; +import ChatMessage from '../../static/js/ChatMessage'; +import AttributePool from '../../static/js/AttributePool'; const Stream = require('../utils/Stream'); const assert = require('assert').strict; const db = require('./DB'); -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; const authorManager = require('./AuthorManager'); const padManager = require('./PadManager'); const padMessageHandler = require('../handler/PadMessageHandler'); const groupManager = require('./GroupManager'); const CustomError = require('../utils/customError'); -const readOnlyManager = require('./ReadOnlyManager'); -const randomString = require('../utils/randomstring'); +import readOnlyManager from './ReadOnlyManager'; +import randomString from '../utils/randomstring'; const hooks = require('../../static/js/pluginfw/hooks'); -const {padutils: {warnDeprecated}} = require('../../static/js/pad_utils'); -const promises = require('../utils/promises'); +import pad_utils from "../../static/js/pad_utils"; +import {SmartOpAssembler} from "../../static/js/SmartOpAssembler"; +import {timesLimit} from "async"; /** * Copied from the Etherpad source code. It converts Windows line breaks to Unix @@ -40,7 +41,7 @@ exports.cleanText = (txt:string): string => txt.replace(/\r\n/g, '\n') class Pad { private db: Database; private atext: AText; - private pool: APool; + private pool: AttributePool; private head: number; private chatHead: number; private publicStatus: boolean; @@ -56,7 +57,7 @@ class Pad { */ constructor(id:string, database = db) { this.db = database; - this.atext = Changeset.makeAText('\n'); + this.atext = makeAText('\n'); this.pool = new AttributePool(); this.head = -1; this.chatHead = -1; @@ -93,13 +94,13 @@ class Pad { * @param {String} authorId The id of the author * @return {Promise} */ - async appendRevision(aChangeset:AChangeSet, authorId = '') { - const newAText = Changeset.applyToAText(aChangeset, this.atext, this.pool); + async appendRevision(aChangeset:string, authorId = '') { + const newAText = applyToAText(aChangeset, this.atext, this.pool); if (newAText.text === this.atext.text && newAText.attribs === this.atext.attribs && this.head !== -1) { return this.head; } - Changeset.copyAText(newAText, this.atext); + copyAText(newAText, this.atext); const newRev = ++this.head; @@ -126,11 +127,11 @@ class Pad { pad: this, authorId, get author() { - warnDeprecated(`${hook} hook author context is deprecated; use authorId instead`); + pad_utils.warnDeprecated(`${hook} hook author context is deprecated; use authorId instead`); return this.authorId; }, set author(authorId) { - warnDeprecated(`${hook} hook author context is deprecated; use authorId instead`); + pad_utils.warnDeprecated(`${hook} hook author context is deprecated; use authorId instead`); this.authorId = authorId; }, ...this.head === 0 ? {} : { @@ -215,7 +216,7 @@ class Pad { ]); const apool = this.apool(); let atext = keyAText; - for (const cs of changesets) atext = Changeset.applyToAText(cs, atext, apool); + for (const cs of changesets) atext = applyToAText(cs, atext, apool); return atext; } @@ -293,7 +294,7 @@ class Pad { (!ins && start > 0 && orig[start - 1] === '\n'); if (!willEndWithNewline) ins += '\n'; if (ndel === 0 && ins.length === 0) return; - const changeset = Changeset.makeSplice(orig, start, ndel, ins); + const changeset = makeSplice(orig, start, ndel, ins); await this.appendRevision(changeset, authorId); } @@ -330,7 +331,7 @@ class Pad { * @param {?number} [time] - Message timestamp (milliseconds since epoch). Deprecated; use * `msgOrText.time` instead. */ - async appendChatMessage(msgOrText: string|typeof ChatMessage, authorId = null, time = null) { + async appendChatMessage(msgOrText: string| ChatMessage, authorId = null, time = null) { const msg = msgOrText instanceof ChatMessage ? msgOrText : new ChatMessage(msgOrText, authorId, time); this.chatHead++; @@ -393,7 +394,7 @@ class Pad { if (context.type !== 'text') throw new Error(`unsupported content type: ${context.type}`); text = exports.cleanText(context.content); } - const firstChangeset = Changeset.makeSplice('\n', 0, 0, text); + const firstChangeset = makeSplice('\n', 0, 0, text); await this.appendRevision(firstChangeset, authorId); } await hooks.aCallAll('padLoad', {pad: this}); @@ -437,11 +438,11 @@ class Pad { // let the plugins know the pad was copied await hooks.aCallAll('padCopy', { get originalPad() { - warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); + pad_utils.warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); return this.srcPad; }, get destinationID() { - warnDeprecated( + pad_utils.warnDeprecated( 'padCopy destinationID context property is deprecated; use dstPad.id instead'); return this.dstPad.id; }, @@ -520,8 +521,8 @@ class Pad { const oldAText = this.atext; // based on Changeset.makeSplice - const assem = Changeset.smartOpAssembler(); - for (const op of Changeset.opsFromAText(oldAText)) assem.append(op); + const assem = new SmartOpAssembler(); + for (const op of opsFromAText(oldAText)) assem.append(op); assem.endDocument(); // although we have instantiated the dstPad with '\n', an additional '\n' is @@ -533,16 +534,16 @@ class Pad { // create a changeset that removes the previous text and add the newText with // all atributes present on the source pad - const changeset = Changeset.pack(oldLength, newLength, assem.toString(), newText); + const changeset = pack(oldLength, newLength, assem.toString(), newText); dstPad.appendRevision(changeset, authorId); await hooks.aCallAll('padCopy', { get originalPad() { - warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); + pad_utils.warnDeprecated('padCopy originalPad context property is deprecated; use srcPad instead'); return this.srcPad; }, get destinationID() { - warnDeprecated( + pad_utils.warnDeprecated( 'padCopy destinationID context property is deprecated; use dstPad.id instead'); return this.dstPad.id; }, @@ -585,12 +586,14 @@ class Pad { p.push(db.remove(`pad2readonly:${padID}`)); // delete all chat messages - p.push(promises.timesLimit(this.chatHead + 1, 500, async (i: string) => { + // @ts-ignore + p.push(timesLimit(this.chatHead + 1, 500, async (i: string) => { await this.db.remove(`pad:${this.id}:chat:${i}`, null); })); // delete all revisions - p.push(promises.timesLimit(this.head + 1, 500, async (i: string) => { + // @ts-ignore + p.push(timesLimit(this.head + 1, 500, async (i: string) => { await this.db.remove(`pad:${this.id}:revs:${i}`, null); })); @@ -603,7 +606,7 @@ class Pad { p.push(padManager.removePad(padID)); p.push(hooks.aCallAll('padRemove', { get padID() { - warnDeprecated('padRemove padID context property is deprecated; use pad.id instead'); + pad_utils.warnDeprecated('padRemove padID context property is deprecated; use pad.id instead'); return this.pad.id; }, pad: this, @@ -706,7 +709,7 @@ class Pad { } }) .batch(100).buffer(99); - let atext = Changeset.makeAText('\n'); + let atext = makeAText('\n'); for await (const [r, changeset, authorId, timestamp, isKeyRev, keyAText] of revs) { try { assert(authorId != null); @@ -717,10 +720,10 @@ class Pad { assert(timestamp > 0); assert(changeset != null); assert.equal(typeof changeset, 'string'); - Changeset.checkRep(changeset); - const unpacked = Changeset.unpack(changeset); + checkRep(changeset); + const unpacked = unpack(changeset); let text = atext.text; - for (const op of Changeset.deserializeOps(unpacked.ops)) { + for (const op of deserializeOps(unpacked.ops)) { if (['=', '-'].includes(op.opcode)) { assert(text.length >= op.chars); const consumed = text.slice(0, op.chars); @@ -731,7 +734,7 @@ class Pad { } assert.equal(op.attribs, AttributeMap.fromString(op.attribs, pool).toString()); } - atext = Changeset.applyToAText(changeset, atext, pool); + atext = applyToAText(changeset, atext, pool); if (isKeyRev) assert.deepEqual(keyAText, atext); } catch (err:any) { err.message = `(pad ${this.id} revision ${r}) ${err.message}`; diff --git a/src/node/db/PadManager.ts b/src/node/db/PadManager.ts index 54dbbf089..292261531 100644 --- a/src/node/db/PadManager.ts +++ b/src/node/db/PadManager.ts @@ -25,7 +25,7 @@ import {PadType} from "../types/PadType"; const CustomError = require('../utils/customError'); const Pad = require('../db/Pad'); const db = require('./DB'); -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; /** * A cache of all loaded Pads. diff --git a/src/node/db/ReadOnlyManager.ts b/src/node/db/ReadOnlyManager.ts index 23639d665..b341dfbe4 100644 --- a/src/node/db/ReadOnlyManager.ts +++ b/src/node/db/ReadOnlyManager.ts @@ -21,7 +21,7 @@ const db = require('./DB'); -const randomString = require('../utils/randomstring'); +import randomString from '../utils/randomstring'; /** @@ -29,14 +29,14 @@ const randomString = require('../utils/randomstring'); * @param {String} id the pad's id * @return {Boolean} true if the id is readonly */ -exports.isReadOnlyId = (id:string) => id.startsWith('r.'); +const isReadOnlyId = (id:string) => id.startsWith('r.'); /** * returns a read only id for a pad * @param {String} padId the id of the pad * @return {String} the read only id */ -exports.getReadOnlyId = async (padId:string) => { +const getReadOnlyId = async (padId:string) => { // check if there is a pad2readonly entry let readOnlyId = await db.get(`pad2readonly:${padId}`); @@ -57,19 +57,29 @@ exports.getReadOnlyId = async (padId:string) => { * @param {String} readOnlyId read only id * @return {String} the padId */ -exports.getPadId = async (readOnlyId:string) => await db.get(`readonly2pad:${readOnlyId}`); +const getPadId = async (readOnlyId:string) => await db.get(`readonly2pad:${readOnlyId}`); /** * returns the padId and readonlyPadId in an object for any id * @param {String} id read only id or real pad id * @return {Object} an object with the padId and readonlyPadId */ -exports.getIds = async (id:string) => { - const readonly = exports.isReadOnlyId(id); +const getIds = async (id:string) => { + const readonly = isReadOnlyId(id); // Might be null, if this is an unknown read-only id - const readOnlyPadId = readonly ? id : await exports.getReadOnlyId(id); - const padId = readonly ? await exports.getPadId(id) : id; + const readOnlyPadId = readonly ? id : await getReadOnlyId(id); + const padId = readonly ? await getPadId(id) : id; return {readOnlyPadId, padId, readonly}; }; + +export default { + isReadOnlyId, + getReadOnlyId, + getPadId, + getIds, + // Export for testing purposes + __getReadOnlyId: getReadOnlyId, // eslint-disable-line no-underscore-dangle + __getPadId: getPadId, // eslint-disable-line no-underscore-dangle +} diff --git a/src/node/db/SecurityManager.ts b/src/node/db/SecurityManager.ts index 326bf3659..219d3f2be 100644 --- a/src/node/db/SecurityManager.ts +++ b/src/node/db/SecurityManager.ts @@ -22,15 +22,15 @@ import {UserSettingsObject} from "../types/UserSettingsObject"; const authorManager = require('./AuthorManager'); -const hooks = require('../../static/js/pluginfw/hooks.js'); +const hooks = require('../../static/js/pluginfw/hooks'); const padManager = require('./PadManager'); -const readOnlyManager = require('./ReadOnlyManager'); +import readOnlyManager from './ReadOnlyManager'; const sessionManager = require('./SessionManager'); -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; const webaccess = require('../hooks/express/webaccess'); const log4js = require('log4js'); const authLogger = log4js.getLogger('auth'); -const {padutils} = require('../../static/js/pad_utils'); +import padutils from '../../static/js/pad_utils' const DENY = Object.freeze({accessStatus: 'deny'}); diff --git a/src/node/db/SessionManager.ts b/src/node/db/SessionManager.ts index c0e43a659..b8b1b2562 100644 --- a/src/node/db/SessionManager.ts +++ b/src/node/db/SessionManager.ts @@ -21,8 +21,8 @@ */ const CustomError = require('../utils/customError'); -const promises = require('../utils/promises'); -const randomString = require('../utils/randomstring'); +import {firstSatisfies} from '../utils/promises'; +import randomString from '../utils/randomstring'; const db = require('./DB'); const groupManager = require('./GroupManager'); const authorManager = require('./AuthorManager'); @@ -79,7 +79,7 @@ exports.findAuthorID = async (groupID:string, sessionCookie: string) => { groupID: string; validUntil: number; }|null) => (si != null && si.groupID === groupID && now < si.validUntil); - const sessionInfo = await promises.firstSatisfies(sessionInfoPromises, isMatch); + const sessionInfo = await firstSatisfies(sessionInfoPromises, isMatch) as any; if (sessionInfo == null) return undefined; return sessionInfo.authorID; }; diff --git a/src/node/db/SessionStore.ts b/src/node/db/SessionStore.ts index 5dca5e201..15eb5a971 100644 --- a/src/node/db/SessionStore.ts +++ b/src/node/db/SessionStore.ts @@ -1,13 +1,15 @@ -'use strict'; +// @ts-nocheck + const DB = require('./DB'); -const Store = require('express-session').Store; +import expressSession from 'express-session' + const log4js = require('log4js'); const util = require('util'); const logger = log4js.getLogger('SessionStore'); -class SessionStore extends Store { +class SessionStore extends expressSession.Store { /** * @param {?number} [refresh] - How often (in milliseconds) `touch()` will update a session's * database record with the cookie's latest expiration time. If the difference between the @@ -19,7 +21,7 @@ class SessionStore extends Store { * Etherpad is restarted. Use `null` to prevent `touch()` from ever updating the record. * Ignored if the cookie does not expire. */ - constructor(refresh = null) { + constructor(refresh: number | null = null) { super(); this._refresh = refresh; // Maps session ID to an object with the following properties: diff --git a/src/node/eejs/index.ts b/src/node/eejs/index.ts index b7f2cf998..85de034b0 100644 --- a/src/node/eejs/index.ts +++ b/src/node/eejs/index.ts @@ -20,12 +20,13 @@ * require("./index").require("./path/to/template.ejs") */ -const ejs = require('ejs'); -const fs = require('fs'); -const hooks = require('../../static/js/pluginfw/hooks.js'); -const path = require('path'); -const resolve = require('resolve'); -const settings = require('../utils/Settings'); +import ejs from 'ejs'; +import fs from 'fs'; +const hooks = require('../../static/js/pluginfw/hooks'); +import path from 'node:path'; +// @ts-ignore +import resolve from 'resolve'; +import settings from '../utils/Settings'; import {pluginInstallPath} from '../../static/js/pluginfw/installer' const templateCache = new Map(); diff --git a/src/node/handler/APIHandler.ts b/src/node/handler/APIHandler.ts index 17346b791..32ce9d118 100644 --- a/src/node/handler/APIHandler.ts +++ b/src/node/handler/APIHandler.ts @@ -20,14 +20,15 @@ */ import {MapArrayType} from "../types/MapType"; - +import { jwtDecode } from "jwt-decode"; const api = require('../db/API'); const padManager = require('../db/PadManager'); +import settings from '../utils/Settings'; import createHTTPError from 'http-errors'; -import {Http2ServerRequest, Http2ServerResponse} from "node:http2"; +import {Http2ServerRequest} from "node:http2"; import {publicKeyExported} from "../security/OAuth2Provider"; import {jwtVerify} from "jose"; - +import {APIFields, apikey} from './APIKeyHandler' // a list of all functions const version:MapArrayType = {}; @@ -141,6 +142,7 @@ version['1.3.0'] = { setText: ['padID', 'text', 'authorId'], }; + // set the latest available API version here exports.latestApiVersion = '1.3.0'; @@ -148,11 +150,6 @@ exports.latestApiVersion = '1.3.0'; exports.version = version; -type APIFields = { - api_key: string; - padID: string; - padName: string; -} /** * Handles an HTTP API call @@ -160,9 +157,9 @@ type APIFields = { * @param {String} functionName the name of the called function * @param fields the params of the called function * @param req express request object - * @param res express response object */ -exports.handle = async function (apiVersion: string, functionName: string, fields: APIFields, req: Http2ServerRequest, res: Http2ServerResponse) { +exports.handle = async function (apiVersion: string, functionName: string, fields: APIFields, + req: Http2ServerRequest) { // say goodbye if this is an unknown API version if (!(apiVersion in version)) { throw new createHTTPError.NotFound('no such api version'); @@ -173,20 +170,35 @@ exports.handle = async function (apiVersion: string, functionName: string, field throw new createHTTPError.NotFound('no such function'); } - if(!req.headers.authorization) { - throw new createHTTPError.Unauthorized('no or wrong API Key'); + + + if (apikey !== null && apikey.trim().length > 0) { + fields.apikey = fields.apikey || fields.api_key || fields.authorization; + // API key is configured, check if it is valid + if (fields.apikey !== apikey!.trim()) { + throw new createHTTPError.Unauthorized('no or wrong API Key'); + } + } else { + if(!req.headers.authorization) { + throw new createHTTPError.Unauthorized('no or wrong API Key'); + } + try { + const clientIds: string[] = settings.sso.clients?.map((client: {client_id: string}) => client.client_id) ?? []; + const jwtToCheck = req.headers.authorization.replace("Bearer ", "") + const payload = jwtDecode(jwtToCheck) + // client_credentials + if (clientIds.includes(payload.sub)) { + await jwtVerify(jwtToCheck, publicKeyExported!, {algorithms: ['RS256']}) + } else { + // authorization_code + await jwtVerify(jwtToCheck, publicKeyExported!, {algorithms: ['RS256'], + requiredClaims: ["admin"]}) + } + } catch (e) { + throw new createHTTPError.Unauthorized('no or wrong OAuth token'); + } } - try { - await jwtVerify(req.headers.authorization!.replace("Bearer ", ""), publicKeyExported!, {algorithms: ['RS256'], - requiredClaims: ["admin"]}) - - } catch (e) { - throw new createHTTPError.Unauthorized('no or wrong API Key'); - } - - - // sanitize any padIDs before continuing if (fields.padID) { fields.padID = await padManager.sanitizePadId(fields.padID); diff --git a/src/node/handler/APIKeyHandler.ts b/src/node/handler/APIKeyHandler.ts new file mode 100644 index 000000000..bdeee2290 --- /dev/null +++ b/src/node/handler/APIKeyHandler.ts @@ -0,0 +1,35 @@ +import * as absolutePaths from '../utils/AbsolutePaths'; +import fs from 'fs'; +import log4js from 'log4js'; +import randomString from '../utils/randomstring'; +import {argv} from '../utils/Cli' +import settings from '../utils/Settings'; + +const apiHandlerLogger = log4js.getLogger('APIHandler'); + + + +export type APIFields = { + apikey: string; + api_key: string; + padID: string; + padName: string; + authorization: string; +} + +// ensure we have an apikey +export let apikey:string|null = null; +const apikeyFilename = absolutePaths.makeAbsolute(argv.apikey || './APIKEY.txt'); + + +if(settings.authenticationMethod === 'apikey') { + try { + apikey = fs.readFileSync(apikeyFilename, 'utf8'); + apiHandlerLogger.info(`Api key file read from: "${apikeyFilename}"`); + } catch (e) { + apiHandlerLogger.info( + `Api key file "${apikeyFilename}" not found. Creating with random contents.`); + apikey = randomString(32); + fs.writeFileSync(apikeyFilename, apikey!, 'utf8'); + } +} diff --git a/src/node/handler/ExportHandler.ts b/src/node/handler/ExportHandler.ts index 0bf57e2d1..e1294171a 100644 --- a/src/node/handler/ExportHandler.ts +++ b/src/node/handler/ExportHandler.ts @@ -24,7 +24,7 @@ const exporthtml = require('../utils/ExportHtml'); const exporttxt = require('../utils/ExportTxt'); const exportEtherpad = require('../utils/ExportEtherpad'); import fs from 'fs'; -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; import os from 'os'; const hooks = require('../../static/js/pluginfw/hooks'); import util from 'util'; diff --git a/src/node/handler/ImportHandler.ts b/src/node/handler/ImportHandler.ts index 330a2d6f9..e569c12fa 100644 --- a/src/node/handler/ImportHandler.ts +++ b/src/node/handler/ImportHandler.ts @@ -25,13 +25,13 @@ const padManager = require('../db/PadManager'); const padMessageHandler = require('./PadMessageHandler'); import {promises as fs} from 'fs'; import path from 'path'; -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; const {Formidable} = require('formidable'); import os from 'os'; const importHtml = require('../utils/ImportHtml'); const importEtherpad = require('../utils/ImportEtherpad'); import log4js from 'log4js'; -const hooks = require('../../static/js/pluginfw/hooks.js'); +const hooks = require('../../static/js/pluginfw/hooks'); const logger = log4js.getLogger('ImportHandler'); diff --git a/src/node/handler/PadMessageHandler.ts b/src/node/handler/PadMessageHandler.ts index 2ed40391c..0b411ed67 100644 --- a/src/node/handler/PadMessageHandler.ts +++ b/src/node/handler/PadMessageHandler.ts @@ -21,28 +21,34 @@ import {MapArrayType} from "../types/MapType"; -const AttributeMap = require('../../static/js/AttributeMap'); +import AttributeMap from '../../static/js/AttributeMap'; const padManager = require('../db/PadManager'); -const Changeset = require('../../static/js/Changeset'); -const ChatMessage = require('../../static/js/ChatMessage'); -const AttributePool = require('../../static/js/AttributePool'); +import {checkRep, cloneAText, compose, deserializeOps, follow, identity, inverse, makeAText, makeSplice, moveOpsToNewPool, mutateAttributionLines, mutateTextLines, oldLen, prepareForWire, splitAttributionLines, splitTextLines, unpack} from '../../static/js/Changeset'; +import ChatMessage from '../../static/js/ChatMessage'; +import AttributePool from '../../static/js/AttributePool'; const AttributeManager = require('../../static/js/AttributeManager'); const authorManager = require('../db/AuthorManager'); -const {padutils} = require('../../static/js/pad_utils'); -const readOnlyManager = require('../db/ReadOnlyManager'); -const settings = require('../utils/Settings'); +import padutils from '../../static/js/pad_utils'; +import readOnlyManager from '../db/ReadOnlyManager'; +import settings, { + exportAvailable, + abiwordAvailable, + sofficeAvailable +} from '../utils/Settings'; const securityManager = require('../db/SecurityManager'); -const plugins = require('../../static/js/pluginfw/plugin_defs.js'); +const plugins = require('../../static/js/pluginfw/plugin_defs'); import log4js from 'log4js'; const messageLogger = log4js.getLogger('message'); const accessLogger = log4js.getLogger('access'); -const hooks = require('../../static/js/pluginfw/hooks.js'); +const hooks = require('../../static/js/pluginfw/hooks'); const stats = require('../stats') const assert = require('assert').strict; import {RateLimiterMemory} from 'rate-limiter-flexible'; import {ChangesetRequest, PadUserInfo, SocketClientRequest} from "../types/SocketClientRequest"; import {APool, AText, PadAuthor, PadType} from "../types/PadType"; import {ChangeSet} from "../types/ChangeSet"; +import {ChatMessageMessage, ClientReadyMessage, ClientSaveRevisionMessage, ClientSuggestUserName, ClientUserChangesMessage, ClientVarMessage, CustomMessage, PadDeleteMessage, UserNewInfoMessage} from "../../static/js/types/SocketIOMessage"; +import {Builder} from "../../static/js/Builder"; const webaccess = require('../hooks/express/webaccess'); const { checkValidRev } = require('../utils/checkValidRev'); @@ -88,14 +94,25 @@ exports.socketio = () => { const sessioninfos:MapArrayType = {}; exports.sessioninfos = sessioninfos; -stats.gauge('totalUsers', () => socketio ? socketio.engine.clientsCount : 0); -stats.gauge('activePads', () => { +function getTotalActiveUsers() { + return socketio ? socketio.engine.clientsCount : 0; +} + +exports.getTotalActiveUsers = getTotalActiveUsers; + +function getActivePadCountFromSessionInfos() { const padIds = new Set(); for (const {padId} of Object.values(sessioninfos)) { if (!padId) continue; padIds.add(padId); } return padIds.size; +} +exports.getActivePadCountFromSessionInfos = getActivePadCountFromSessionInfos; + +stats.gauge('totalUsers', () => getTotalActiveUsers()); +stats.gauge('activePads', () => { + return getActivePadCountFromSessionInfos(); }); /** @@ -209,12 +226,51 @@ exports.handleDisconnect = async (socket:any) => { }); }; + +const handlePadDelete = async (socket: any, padDeleteMessage: PadDeleteMessage) => { + const session = sessioninfos[socket.id]; + if (!session || !session.author || !session.padId) throw new Error('session not ready'); + if (await padManager.doesPadExist(padDeleteMessage.data.padId)) { + const retrievedPad = await padManager.getPad(padDeleteMessage.data.padId) + // Only the one doing the first revision can delete the pad, otherwise people could troll a lot + const firstContributor = await retrievedPad.getRevisionAuthor(0) + if (session.author === firstContributor) { + retrievedPad.remove() + } else { + + type ShoutMessage = { + message: string, + sticky: boolean, + } + + const messageToShout: ShoutMessage = { + message: 'You are not the creator of this pad, so you cannot delete it', + sticky: false + } + const messageToSend = { + type: "COLLABROOM", + data: { + type: "shoutMessage", + payload: { + message: messageToShout, + timestamp: Date.now() + } + } + } + socket.emit('shout', + messageToSend + ) + } + } +} + + /** * Handles a message from a user * @param socket the socket.io Socket object for the client * @param message the message from the client */ -exports.handleMessage = async (socket:any, message:typeof ChatMessage) => { +exports.handleMessage = async (socket:any, message: ClientVarMessage) => { const env = process.env.NODE_ENV || 'development'; if (env === 'production') { @@ -348,15 +404,16 @@ exports.handleMessage = async (socket:any, message:typeof ChatMessage) => { stats.counter('pendingEdits').inc(); await padChannels.enqueue(thisSession.padId, {socket, message}); break; - case 'USERINFO_UPDATE': await handleUserInfoUpdate(socket, message); break; - case 'CHAT_MESSAGE': await handleChatMessage(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; + case 'CHAT_MESSAGE': await handleChatMessage(socket, message as unknown as ChatMessageMessage); break; case 'GET_CHAT_MESSAGES': await handleGetChatMessages(socket, message); break; - case 'SAVE_REVISION': await handleSaveRevisionMessage(socket, message); break; + case 'SAVE_REVISION': await handleSaveRevisionMessage(socket, message as unknown as ClientSaveRevisionMessage); break; case 'CLIENT_MESSAGE': { const {type} = message.data.payload; try { switch (type) { - case 'suggestUserName': handleSuggestUserName(socket, message); break; + case 'suggestUserName': handleSuggestUserName(socket, message as unknown as ClientSuggestUserName); break; default: throw new Error('unknown message type'); } } catch (err) { @@ -384,7 +441,7 @@ exports.handleMessage = async (socket:any, message:typeof ChatMessage) => { * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleSaveRevisionMessage = async (socket:any, message: string) => { +const handleSaveRevisionMessage = async (socket:any, message: ClientSaveRevisionMessage) => { const {padId, author: authorId} = sessioninfos[socket.id]; const pad = await padManager.getPad(padId, null, authorId); await pad.addSavedRevision(pad.head, authorId); @@ -397,7 +454,7 @@ const handleSaveRevisionMessage = async (socket:any, message: string) => { * @param msg {Object} the message we're sending * @param sessionID {string} the socketIO session to which we're sending this message */ -exports.handleCustomObjectMessage = (msg: typeof ChatMessage, sessionID: string) => { +exports.handleCustomObjectMessage = (msg: CustomMessage, sessionID: string) => { if (msg.data.type === 'CUSTOM') { if (sessionID) { // a sessionID is targeted: directly to this sessionID @@ -432,7 +489,7 @@ exports.handleCustomMessage = (padID: string, msgString:string) => { * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleChatMessage = async (socket:any, message: typeof ChatMessage) => { +const handleChatMessage = async (socket:any, message: ChatMessageMessage) => { const chatMessage = ChatMessage.fromObject(message.data.message); const {padId, author: authorId} = sessioninfos[socket.id]; // Don't trust the user-supplied values. @@ -452,7 +509,7 @@ const handleChatMessage = async (socket:any, message: typeof ChatMessage) => { * @param {string} [padId] - The destination pad ID. Deprecated; pass a chat message * object as the first argument and the destination pad ID as the second argument instead. */ -exports.sendChatMessageToPadClients = async (mt: typeof ChatMessage|number, puId: string, text:string|null = null, padId:string|null = null) => { +exports.sendChatMessageToPadClients = async (mt: ChatMessage|number, puId: string, text:string|null = null, padId:string|null = null) => { const message = mt instanceof ChatMessage ? mt : new ChatMessage(text, puId, mt); padId = mt instanceof ChatMessage ? puId : padId; const pad = await padManager.getPad(padId, null, message.authorId); @@ -499,7 +556,7 @@ const handleGetChatMessages = async (socket:any, {data: {start, end}}:any) => { * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleSuggestUserName = (socket:any, message: typeof ChatMessage) => { +const handleSuggestUserName = (socket:any, message: ClientSuggestUserName) => { const {newName, unnamedId} = message.data.payload; if (newName == null) throw new Error('missing newName'); if (unnamedId == null) throw new Error('missing unnamedId'); @@ -519,7 +576,7 @@ const handleSuggestUserName = (socket:any, message: typeof ChatMessage) => { * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleUserInfoUpdate = async (socket:any, {data: {userInfo: {name, colorId}}}: PadUserInfo) => { +const handleUserInfoUpdate = async (socket:any, {data: {userInfo: {name, colorId}}}: UserNewInfoMessage) => { if (colorId == null) throw new Error('missing colorId'); if (!name) name = null; const session = sessioninfos[socket.id]; @@ -567,7 +624,9 @@ const handleUserInfoUpdate = async (socket:any, {data: {userInfo: {name, colorId * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleUserChanges = async (socket:any, message: typeof ChatMessage) => { +const handleUserChanges = async (socket:any, message: { + data: ClientUserChangesMessage +}) => { // This one's no longer pending, as we're gonna process it now stats.counter('pendingEdits').dec(); @@ -591,10 +650,10 @@ const handleUserChanges = async (socket:any, message: typeof ChatMessage) => { const pad = await padManager.getPad(thisSession.padId, null, thisSession.author); // Verify that the changeset has valid syntax and is in canonical form - Changeset.checkRep(changeset); + checkRep(changeset); // Validate all added 'author' attribs to be the same value as the current user - for (const op of Changeset.deserializeOps(Changeset.unpack(changeset).ops)) { + for (const op of deserializeOps(unpack(changeset).ops)) { // + can add text with attribs // = can change or add attribs // - can have attribs, but they are discarded and don't show up in the attribs - @@ -613,7 +672,7 @@ const handleUserChanges = async (socket:any, message: typeof ChatMessage) => { // ex. adoptChangesetAttribs // Afaik, it copies the new attributes from the changeset, to the global Attribute Pool - let rebasedChangeset = Changeset.moveOpsToNewPool(changeset, wireApool, pad.pool); + let rebasedChangeset = moveOpsToNewPool(changeset, wireApool, pad.pool); // ex. applyUserChanges let r = baseRev; @@ -626,21 +685,21 @@ const handleUserChanges = async (socket:any, message: typeof ChatMessage) => { const {changeset: c, meta: {author: authorId}} = await pad.getRevision(r); if (changeset === c && thisSession.author === authorId) { // Assume this is a retransmission of an already applied changeset. - rebasedChangeset = Changeset.identity(Changeset.unpack(changeset).oldLen); + rebasedChangeset = identity(unpack(changeset).oldLen); } // At this point, both "c" (from the pad) and "changeset" (from the // client) are relative to revision r - 1. The follow function // rebases "changeset" so that it is relative to revision r // and can be applied after "c". - rebasedChangeset = Changeset.follow(c, rebasedChangeset, false, pad.pool); + rebasedChangeset = follow(c, rebasedChangeset, false, pad.pool); } const prevText = pad.text(); - if (Changeset.oldLen(rebasedChangeset) !== prevText.length) { + if (oldLen(rebasedChangeset) !== prevText.length) { throw new Error( `Can't apply changeset ${rebasedChangeset} with oldLen ` + - `${Changeset.oldLen(rebasedChangeset)} to document of length ${prevText.length}`); + `${oldLen(rebasedChangeset)} to document of length ${prevText.length}`); } const newRev = await pad.appendRevision(rebasedChangeset, thisSession.author); @@ -655,7 +714,7 @@ const handleUserChanges = async (socket:any, message: typeof ChatMessage) => { // Make sure the pad always ends with an empty line. if (pad.text().lastIndexOf('\n') !== pad.text().length - 1) { - const nlChangeset = Changeset.makeSplice(pad.text(), pad.text().length - 1, 0, '\n'); + const nlChangeset = makeSplice(pad.text(), pad.text().length - 1, 0, '\n'); await pad.appendRevision(nlChangeset, thisSession.author); } @@ -710,7 +769,7 @@ exports.updatePadClients = async (pad: PadType) => { const revChangeset = revision.changeset; const currentTime = revision.meta.timestamp; - const forWire = Changeset.prepareForWire(revChangeset, pad.pool); + const forWire = prepareForWire(revChangeset, pad.pool); const msg = { type: 'COLLABROOM', data: { @@ -738,14 +797,14 @@ exports.updatePadClients = async (pad: PadType) => { /** * Copied from the Etherpad Source Code. Don't know what this method does excatly... */ -const _correctMarkersInPad = (atext: AText, apool: APool) => { +const _correctMarkersInPad = (atext: AText, apool: AttributePool) => { const text = atext.text; // collect char positions of line markers (e.g. bullets) in new atext // that aren't at the start of a line const badMarkers = []; let offset = 0; - for (const op of Changeset.deserializeOps(atext.attribs)) { + for (const op of deserializeOps(atext.attribs)) { const attribs = AttributeMap.fromString(op.attribs, apool); const hasMarker = AttributeManager.lineAttributes.some((a: string) => attribs.has(a)); if (hasMarker) { @@ -767,7 +826,7 @@ const _correctMarkersInPad = (atext: AText, apool: APool) => { // create changeset that removes these bad markers offset = 0; - const builder = Changeset.builder(text.length); + const builder = new Builder(text.length); badMarkers.forEach((pos) => { builder.keepText(text.substring(offset, pos)); @@ -785,7 +844,7 @@ const _correctMarkersInPad = (atext: AText, apool: APool) => { * @param socket the socket.io Socket object for the client * @param message the message from the client */ -const handleClientReady = async (socket:any, message: typeof ChatMessage) => { +const handleClientReady = async (socket:any, message: ClientReadyMessage) => { const sessionInfo = sessioninfos[socket.id]; if (sessionInfo == null) throw new Error('client disconnected'); assert(sessionInfo.author); @@ -793,8 +852,9 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { await hooks.aCallAll('clientReady', message); // Deprecated due to awkward context. let {colorId: authorColorId, name: authorName} = message.userInfo || {}; - if (authorColorId && !/^#(?:[0-9A-F]{3}){1,2}$/i.test(authorColorId)) { + if (authorColorId && !/^#(?:[0-9A-F]{3}){1,2}$/i.test(authorColorId as string)) { messageLogger.warn(`Ignoring invalid colorId in CLIENT_READY message: ${authorColorId}`); + // @ts-ignore authorColorId = null; } await Promise.all([ @@ -872,7 +932,7 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { const revisionsNeeded = []; const changesets:MapArrayType = {}; - let startNum = message.client_rev + 1; + let startNum = message.client_rev! + 1; let endNum = pad.getHeadRevisionNumber() + 1; const headNum = pad.getHeadRevisionNumber(); @@ -901,7 +961,7 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { // return pending changesets for (const r of revisionsNeeded) { - const forWire = Changeset.prepareForWire(changesets[r].changeset, pad.pool); + const forWire = prepareForWire(changesets[r].changeset, pad.pool); const wireMsg = {type: 'COLLABROOM', data: {type: 'CLIENT_RECONNECT', headRev: pad.getHeadRevisionNumber(), @@ -926,8 +986,8 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { let apool; // prepare all values for the wire, there's a chance that this throws, if the pad is corrupted try { - atext = Changeset.cloneAText(pad.atext); - const attribsForWire = Changeset.prepareForWire(atext.attribs, pad.pool); + atext = cloneAText(pad.atext); + const attribsForWire = prepareForWire(atext.attribs, pad.pool); apool = attribsForWire.pool.toJsonable(); atext.attribs = attribsForWire.translated; } catch (e:any) { @@ -945,6 +1005,7 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { accountPrivs: { maxRevisions: 100, }, + enableDarkMode: settings.enableDarkMode, automaticReconnectionTimeout: settings.automaticReconnectionTimeout, initialRevisionList: [], initialOptions: {}, @@ -975,9 +1036,9 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { serverTimestamp: Date.now(), sessionRefreshInterval: settings.cookie.sessionRefreshInterval, userId: sessionInfo.author, - abiwordAvailable: settings.abiwordAvailable(), - sofficeAvailable: settings.sofficeAvailable(), - exportAvailable: settings.exportAvailable(), + abiwordAvailable: abiwordAvailable(), + sofficeAvailable: sofficeAvailable(), + exportAvailable: exportAvailable(), plugins: { plugins: plugins.plugins, parts: plugins.parts, @@ -996,7 +1057,8 @@ const handleClientReady = async (socket:any, message: typeof ChatMessage) => { percentageToScrollWhenUserPressesArrowUp: settings.scrollWhenFocusLineIsOutOfViewport.percentageToScrollWhenUserPressesArrowUp, }, - initialChangesets: [], // FIXME: REMOVE THIS SHIT + initialChangesets: [], // FIXME: REMOVE THIS SHIT, + mode: process.env.NODE_ENV }; // Add a username to the clientVars if one avaiable @@ -1141,13 +1203,13 @@ const getChangesetInfo = async (pad: PadType, startNum: number, endNum:number, g getPadLines(pad, startNum - 1), // Get all needed composite Changesets. ...compositesChangesetNeeded.map(async (item) => { - const changeset = await composePadChangesets(pad, item.start, item.end); + const changeset = await exports.composePadChangesets(pad, item.start, item.end); composedChangesets[`${item.start}/${item.end}`] = changeset; }), // Get all needed revision Dates. ...revTimesNeeded.map(async (revNum) => { const revDate = await pad.getRevisionDate(revNum); - revisionDate[revNum] = Math.floor(revDate / 1000); + revisionDate[revNum] = revDate; }), ]); @@ -1162,13 +1224,13 @@ const getChangesetInfo = async (pad: PadType, startNum: number, endNum:number, g if (compositeEnd > endNum || compositeEnd > headRevision + 1) break; const forwards = composedChangesets[`${compositeStart}/${compositeEnd}`]; - const backwards = Changeset.inverse(forwards, lines.textlines, lines.alines, pad.apool()); + const backwards = inverse(forwards, lines.textlines, lines.alines, pad.apool()); - Changeset.mutateAttributionLines(forwards, lines.alines, pad.apool()); - Changeset.mutateTextLines(forwards, lines.textlines); + mutateAttributionLines(forwards, lines.alines, pad.apool()); + mutateTextLines(forwards, lines.textlines); - const forwards2 = Changeset.moveOpsToNewPool(forwards, pad.apool(), apool); - const backwards2 = Changeset.moveOpsToNewPool(backwards, pad.apool(), apool); + const forwards2 = moveOpsToNewPool(forwards, pad.apool(), apool); + const backwards2 = moveOpsToNewPool(backwards, pad.apool(), apool); const t1 = (compositeStart === 0) ? revisionDate[0] : revisionDate[compositeStart - 1]; const t2 = revisionDate[compositeEnd - 1]; @@ -1194,12 +1256,12 @@ const getPadLines = async (pad: PadType, revNum: number) => { if (revNum >= 0) { atext = await pad.getInternalRevisionAText(revNum); } else { - atext = Changeset.makeAText('\n'); + atext = makeAText('\n'); } return { - textlines: Changeset.splitTextLines(atext.text), - alines: Changeset.splitAttributionLines(atext.attribs, atext.text), + textlines: splitTextLines(atext.text), + alines: splitAttributionLines(atext.attribs, atext.text), }; }; @@ -1207,7 +1269,7 @@ const getPadLines = async (pad: PadType, revNum: number) => { * Tries to rebuild the composePadChangeset function of the original Etherpad * https://github.com/ether/pad/blob/master/etherpad/src/etherpad/control/pad/pad_changeset_control.js#L241 */ -const composePadChangesets = async (pad: PadType, startNum: number, endNum: number) => { +exports.composePadChangesets = async (pad: PadType, startNum: number, endNum: number) => { // fetch all changesets we need const headNum = pad.getHeadRevisionNumber(); endNum = Math.min(endNum, headNum + 1); @@ -1234,7 +1296,7 @@ const composePadChangesets = async (pad: PadType, startNum: number, endNum: numb for (r = startNum + 1; r < endNum; r++) { const cs = changesets[r]; - changeset = Changeset.compose(changeset, cs, pool); + changeset = compose(changeset as string, cs as string, pool); } return changeset; } catch (e) { diff --git a/src/node/handler/RestAPI.ts b/src/node/handler/RestAPI.ts new file mode 100644 index 000000000..1b0d1d09d --- /dev/null +++ b/src/node/handler/RestAPI.ts @@ -0,0 +1,1527 @@ +import {ArgsExpressType} from "../types/ArgsExpressType"; +import {MapArrayType} from "../types/MapType"; +import {IncomingForm} from "formidable"; +import {ErrorCaused} from "../types/ErrorCaused"; +import createHTTPError from "http-errors"; + +const apiHandler = require('./APIHandler') +import {serve, setup} from 'swagger-ui-express' +import express from "express"; + +import settings from '../utils/Settings'; + + +type RestAPIMapping = { + apiVersion: string; + functionName: string, + summary?: string, + operationId?: string, + requestBody?: any, + responses?: any, + tags?: string[], +} + + +const mapping = new Map> + + +const GET = "GET" +const POST = "POST" +const PUT = "PUT" +const DELETE = "DELETE" +const PATCH = "PATCH" + + +const defaultResponses = { + "200": { + "description": "ok (code 0)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 0 + }, + "message": { + "type": "string", + "example": "ok" + }, + "data": { + "type": "object", + "properties": { + "groupID": { + "type": "string" + } + } + } + } + } + } + } + }, + "400": { + "description": "generic api error (code 1)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 1 + }, + "message": { + "type": "string", + "example": "error message" + }, + "data": { + "type": "object", + "example": null + } + } + } + } + } + }, + "401": { + "description": "no or wrong API key (code 4)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 4 + }, + "message": { + "type": "string", + "example": "no or wrong API key" + }, + "data": { + "type": "object", + "example": null + } + } + } + } + } + }, + "500": { + "description": "internal api error (code 2)", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "example": 2 + }, + "message": { + "type": "string", + "example": "internal error" + }, + "data": { + "type": "object", + "example": null + } + } + } + } + } + }, + "tags": [ + "group" + ], + "parameters": [] +} + +const prepareResponses = (data: { + type: string, + properties: Record, + properties?: Record, + }>, +}) => { + return { + ...defaultResponses, + 200: { + ...defaultResponses["200"], + content: { + ...defaultResponses["200"].content, + "application/json": { + schema: { + type: "object", + properties: { + ...defaultResponses["200"].content["application/json"].schema.properties, + data: data + } + } + } + } + } + } +} + + +const prepareDefinition = (mapping: Map>, address: string) => { + const authenticationMethod = settings.authenticationMethod + + + const definitions: { + "openapi": string, + "info": { + "title": string, + "description": string, + "termsOfService": string, + "contact": { + "name": string, + "url": string, + "email": string, + }, + }, + "components": { + "securitySchemes": { + "apiKey": { + "type": string, + "name": string, + "in": string + + }, + "sso"?: { + "type": string, + "flows": { + "authorizationCode": { + "authorizationUrl": string, + "tokenUrl": string, + "scopes": { + "openid": string, + "profile": string, + "email": string, + "admin": string + } + } + } + } + }, + }, + "servers": [ + { + "url": string + } + ], + "paths": Record, + }>>, + "security": any[] + } = { + "openapi": "3.0.2", + "info": { + "title": "Etherpad API", + "description": "Etherpad is a real-time collaborative editor scalable to thousands of simultaneous real time users. It provides full data export capabilities, and runs on your server, under your control.", + "termsOfService": "https://etherpad.org/", + "contact": { + "name": "The Etherpad Foundation", + "url": "https://etherpad.org/", + "email": "", + }, + }, + "components": { + "securitySchemes": { + "apiKey": { + "type": "apiKey", + "name": "apikey", + "in": "query" + + }, + }, + }, + "servers": [ + { + "url": `${address}/api/2` + } + ], + "paths": {}, + "security": [] + } + + if (authenticationMethod === "apikey") { + definitions.security = [ + { + "apiKey": [] + } + ] + } else if (authenticationMethod === "sso") { + definitions.components.securitySchemes.sso = { + type: "oauth2", + flows: { + authorizationCode: { + authorizationUrl: settings.sso.issuer + "/oidc/auth", + tokenUrl: settings.sso.issuer + "/oidc/token", + scopes: { + openid: "openid", + profile: "profile", + email: "email", + admin: "admin" + } + } + }, + } + + definitions.security = [ + { + "sso": [] + } + ] + } + + + for (const [method, value] of mapping) { + for (const [path, mapping] of Object.entries(value)) { + const {apiVersion, functionName, summary, operationId, requestBody, responses, tags} = mapping + if (!definitions.paths[path]) { + definitions.paths[path] = {} + } + + const methodLowercased = method.toLowerCase() + + definitions.paths[path][methodLowercased] = { + summary: summary!, + operationId: operationId!, + responses, + tags: tags! + } + + if (method === GET) { + definitions.paths[path][methodLowercased].parameters = requestBody + } else { + definitions.paths[path][methodLowercased].requestBody = requestBody + } + } + } + return definitions +} + + +export const expressCreateServer = async (hookName: string, {app}: ArgsExpressType) => { + mapping.set(GET, {}) + mapping.set(POST, {}) + mapping.set(PUT, {}) + mapping.set(DELETE, {}) + mapping.set(PATCH, {}) + + // Version 1 + mapping.get(POST)!["/groups"] = { + apiVersion: '1', + functionName: 'createGroup', summary: 'Creates a new group', + operationId: 'createGroup', tags: ['group'], responses: prepareResponses({type: "object", properties: {groupID: {type: "string"}}}) + + } + mapping.get(POST)!["/groups/createIfNotExistsFor"] = { + apiVersion: '1', functionName: 'createGroupIfNotExistsFor', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + groupMapper: { + type: "string" + } + }, + required: ["groupMapper"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {groupID: {type: "string"}}}), + summary: "Creates a new group if it doesn't exist", operationId: 'createGroupIfNotExistsFor', tags: ['group'] + }; + mapping.get(GET)!["/groups/pads"] = { + apiVersion: '1', functionName: 'listPads', + summary: "Lists all pads in a group", tags: ['group'], + operationId: 'listPads', responses: prepareResponses({type: "object", properties: {padIDs: {type: "string"}}}), + requestBody: [ + { + "name": "groupID", + "in": "query", + "schema": { + "type": "string" + } + } + ] + } + mapping.get(DELETE)!["/groups"] = { + apiVersion: '1', functionName: 'deleteGroup', responses: prepareResponses({type: "object", properties: {}}), requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + groupID: { + type: "string" + } + }, + required: ["groupID"] + } + } + } + }, summary: "Deletes a group", operationId: 'deleteGroup', tags: ['group'] + } + + mapping.get(POST)!["/authors"] = { + apiVersion: '1', functionName: 'createAuthor', requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + name: { + type: "string" + } + }, + required: ["name"] + } + } + } + }, tags: ["author"] + } + + + mapping.get(POST)!["/authors/createIfNotExistsFor"] = { + apiVersion: '1', functionName: 'createAuthorIfNotExistsFor', + responses: prepareResponses({type: "object", properties: {authorID: {type: "string"}}}), + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + authorMapper: { + type: "string" + }, + name: { + type: "string" + } + }, + required: ["authorMapper", "name"] + } + } + } + }, + tags: ["author"], + } + + + mapping.get(GET)!["/authors/pads"] = { + apiVersion: '1', functionName: 'listPadsOfAuthor', + requestBody: [ + { + "name": "authorID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + responses: prepareResponses({type: "object", properties: {padIDs: {type: "array", items: {type: "string"}}}}), + tags: ["author"] + } + mapping.get(POST)!["/sessions"] = { + apiVersion: '1', functionName: 'createSession', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + groupID: { + type: "string" + }, + authorID: { + type: "string" + }, + validUntil: { + type: "string" + } + }, + required: ["groupID", "authorID", "validUntil"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {sessionID: {type: "string"}}}), + tags: ['session'] + } + + mapping.get(DELETE)!["/sessions"] = { + apiVersion: '1', functionName: 'deleteSession', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + sessionID: { + type: "string" + } + }, + required: ["sessionID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + tags: ['session'] + } + + + mapping.get(GET)!["/sessions/info"] = { + apiVersion: '1', functionName: 'getSessionInfo', + requestBody: [ + { + "name": "sessionID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + responses: prepareResponses({ + "type": "object", + "properties": { + id: { + type: "string" + }, + "groupID": { + "type": "string" + }, + "authorID": { + "type": "string" + }, + "validUntil": { + "type": "string" + } + } + }), + tags: ['session'] + } + + + mapping.get(GET)!["/sessions/group"] = { + apiVersion: '1', functionName: 'listSessionsOfGroup', summary: 'Lists all sessions in a group', + operationId: 'listSessionsOfGroup', tags: ['session'], + responses: prepareResponses({ + type: "object", "properties": { + "sessions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "authorID": { + "type": "string" + }, + "groupID": { + "type": "string" + }, + "validUntil": { + "type": "integer" + } + } + } + } + } + }), + requestBody: [ + { + "name": "groupID", + "in": "query", + "schema": { + "type": "string" + } + } + ] + } + mapping.get(GET)!["/sessions/author"] = { + apiVersion: '1', functionName: 'listSessionsOfAuthor', + summary: 'Lists all sessions of an author', operationId: 'listSessionsOfAuthor', tags: ['session'], + responses: prepareResponses({ + type: "object", "properties": { + "sessions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "authorID": { + "type": "string" + }, + "groupID": { + "type": "string" + }, + "validUntil": { + "type": "integer" + } + } + } + } + } + }), + requestBody: [ + { + "name": "authorID", + "in": "query", + "schema": { + "type": "string" + } + } + ] + } + + + mapping.get(GET)!["/pads/text"] = { + apiVersion: '1', functionName: 'getText', + responses: prepareResponses({type: "object", properties: {text: {type: "string"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + tags: ['pad'] + } + + + mapping.get(GET)!["/pads/html"] = { + apiVersion: '1', functionName: 'getHTML', + responses: prepareResponses({type: "object", properties: {html: {type: "string"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the HTML of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/revisions"] = { + apiVersion: '1', functionName: 'getRevisionsCount', + responses: prepareResponses({type: "object", properties: {revisions: {type: "integer"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the number of revisions of a pad', + tags: ['pad'] + } + + mapping.get(GET)!["/pads/lastEdited"] = { + apiVersion: '1', functionName: 'getLastEdited', + responses: prepareResponses({type: "object", properties: {lastEdited: {type: "integer"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the timestamp of the last revision of a pad', + tags: ['pad'] + } + + + mapping.get(DELETE)!["/pads"] = { + apiVersion: '1', functionName: 'deletePad', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + } + }, + required: ["padID"] + } + } + } + }, + summary: 'Deletes a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/readonly"] = { + apiVersion: '1', functionName: 'getReadOnlyID', + responses: prepareResponses({type: "object", properties: {readOnlyID: {type: "string"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the read only id of a pad', + tags: ['pad'] + } + + mapping.get(POST)!["/pads/publicStatus"] = { + apiVersion: '1', functionName: 'setPublicStatus', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + publicStatus: { + type: "boolean" + } + }, + required: ["padID", "publicStatus"] + } + } + } + }, + summary: 'Set the public status of a pad', + tags: ['pad'] + + } + mapping.get(GET)!["/pads/publicStatus"] = { + apiVersion: '1', functionName: 'getPublicStatus', + responses: prepareResponses({type: "object", properties: {publicStatus: {type: "boolean"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the public status of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/authors"] = { + apiVersion: '1', functionName: 'listAuthorsOfPad', + responses: prepareResponses({type: "object", properties: {authorIDs: {type: "array", items: {type: "string"}}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the authors of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/usersCount"] = { + apiVersion: '1', functionName: 'padUsersCount', + responses: prepareResponses({type: "object", properties: {padUsersCount: {type: "integer"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the number of users currently editing a pad', + tags: ['pad'] + } + + + // Version 1.1 + mapping.get(GET)!["/authors/name"] = { + apiVersion: '1.1', functionName: 'getAuthorName', + responses: prepareResponses({type: "object", properties: {authorName: {type: "string"}}}), + requestBody: [ + { + "name": "authorID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the name of an author', + tags: ['author'] + } + mapping.get(GET)!["/pads/users"] = { + apiVersion: '1.1', functionName: 'padUsers', + responses: prepareResponses({ + type: "object", properties: { + padUsers: { + type: "array", "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "colorId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "timestamp": { + "type": "integer" + } + } + } + } + } + }), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the users currently editing a pad', + tags: ['pad'] + } + + + mapping.get(POST)!["/pads/clientsMessage"] = { + apiVersion: '1.1', functionName: 'sendClientsMessage', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + msg: { + type: "string" + } + }, + required: ["padID", "msg"] + } + } + } + }, + summary: 'Send a message to all clients of a pad', + tags: ['pad'] + } + + + mapping.get(GET)!["/groups"] = { + apiVersion: '1.1', functionName: 'listAllGroups', + responses: prepareResponses({type: "object", properties: {groupIDs: {type: "array", items: {type: "string"}}}}), + summary: 'Lists all groups', + tags: ['group'] + } + + + // Version 1.2 + mapping.get(GET)!["/checkToken"] = { + apiVersion: '1.2', functionName: 'checkToken', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: [ + { + "name": "token", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Check if a token is valid', + tags: ['token'] + + } + + // Version 1.2.1 + mapping.get(GET)!["/pads"] = { + apiVersion: '1.2.1', functionName: 'listAllPads', + summary: 'Lists all pads', + tags: ['pad'], + requestBody: [ + { + "name": "groupID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + responses: prepareResponses({type: "object", properties: {padIDs: {type: "array", items: {type: "string"}}}}) + } + + // Version 1.2.7 + mapping.get(POST)!["/pads/diff"] = { + apiVersion: '1.2.7', functionName: 'createDiffHTML', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + startRev: { + type: "integer" + }, + endRev: { + type: "integer" + } + }, + required: ["padID", "startRev", "endRev"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Creates a diff of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/chatHistory"] = { + apiVersion: '1.2.7', functionName: 'getChatHistory', + responses: prepareResponses({ + type: "object", properties: { + messages: { + type: "array", items: { + type: "object", properties: { + "text": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "userName": { + "type": "string" + }, + "time": { + "type": "integer" + } + } + } + } + } + }), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the chat history of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/chatHead"] = { + apiVersion: '1.2.7', functionName: 'getChatHead', + responses: prepareResponses({ + type: "object", properties: { + chatHead: { + type: "object", + properties: { + "text": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "userName": { + "type": "string" + }, + "time": { + "type": "integer" + } + } + } + + } + }), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the chat head of a pad', + tags: ['pad'] + + } + + // Version 1.2.8 + mapping.get(GET)!["/pads/attributePool"] = { + apiVersion: '1.2.8', functionName: 'getAttributePool', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the attribute pool of a pad', + tags: ['pad'] + } + mapping.get(GET)!["/pads/revisionChangeset"] = { + apiVersion: '1.2.8', functionName: 'getRevisionChangeset', + responses: prepareResponses({type: "object", properties: {}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "rev", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + summary: 'Get the changeset of a revision of a pad', + tags: ['pad'] + } + + // Version 1.2.9 + mapping.get(POST)!["/pads/copypad"] = { + apiVersion: '1.2.9', functionName: 'copyPad', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + sourceID: { + type: "string" + }, + destinationID: { + type: "string" + }, + force: { + type: "boolean" + } + }, + required: ["sourceID", "destinationID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Copies a pad', + tags: ['pad'] + } + + + mapping.get(POST)!["/pads/movePad"] = { + apiVersion: '1.2.9', functionName: 'movePad', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + sourceID: { + type: "string" + }, + destinationID: { + type: "string" + }, + force: { + type: "boolean" + } + }, + required: ["sourceID", "destinationID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Moves a pad', + tags: ['pad'] + } + + // Version 1.2.10 + mapping.get(POST)!["/pads/padId"] = { + apiVersion: '1.2.10', functionName: 'getPadID', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + roID: { + type: "string" + } + }, + required: ["roID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Get the pad id of a pad', + tags: ['pad'] + } + + // Version 1.2.11 + mapping.get(GET)!["/savedRevisions"] = { + apiVersion: '1.2.11', functionName: 'listSavedRevisions', + responses: prepareResponses({type: "object", properties: {savedRevisions: {type: "array", items: {type: "object"}}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Lists all saved revisions of a pad', + tags: ['pad'] + } + + + mapping.get(POST)!["/savedRevisions"] = { + apiVersion: '1.2.11', functionName: 'saveRevision', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + rev: { + type: "integer" + } + }, + required: ["padID", "rev"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Saves a revision of a pad', + tags: ['pad'] + } + + mapping.get(GET)!["/savedRevisions/revisionsCount"] = { + apiVersion: '1.2.11', functionName: 'getSavedRevisionsCount', + responses: prepareResponses({type: "object", properties: {revisionsCount: {type: "integer"}}}), + requestBody: [ + { + "name": "padID", + "in": "query", + "schema": { + "type": "string" + } + } + ], + summary: 'Get the number of saved revisions of a pad', + tags: ['pad'] + } + + // Version 1.2.12 + mapping.get(PATCH)!["/chats/messages"] = { + apiVersion: '1.2.12', functionName: 'appendChatMessage', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + text: { + type: "string" + }, + authorID: { + type: "string" + }, + time: { + type: "string" + } + }, + required: ["padID", "text"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Appends a chat message to a pad', + tags: ['pad'] + } + + // Version 1.2.13 + + // Version 1.2.14 + mapping.get(GET)!["/stats"] = { + apiVersion: '1.2.14', functionName: 'getStats', + responses: prepareResponses({type: "object", properties: {stats: {type: "object"}}}), + summary: 'Get stats', + tags: ['stats'] + } + + // Version 1.2.15 + + // Version 1.3.0 + mapping.get(PATCH)!["/pads/text"] = { + apiVersion: '1.3.0', functionName: 'appendText', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + text: { + type: "string" + }, + authorID: { + type: "string" + }, + }, + required: ["padID", "text", "authorID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Appends text to a pad', + tags: ['pad'] + } + mapping.get(POST)!["/pads/copyWithoutHistory"] = { + apiVersion: '1.3.0', functionName: 'copyPadWithoutHistory', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + sourceID: { + type: "string" + }, + destinationID: { + type: "string" + }, + force: { + type: "string" + }, + authorID: { + type: "string" + } + }, + required: ["sourceID", "destinationID", "force", "authorID"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Copies a pad without its history', + tags: ['pad'] + } + mapping.get(POST)!["/pads/group"] = { + apiVersion: '1.3.0', functionName: 'createGroupPad', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + groupID: { + type: "string" + }, + padName: { + type: "string" + }, + text: { + type: "string" + }, + authorID: { + type: "string" + } + }, + required: ["groupID", "padName"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Creates a new pad in a group', + tags: ['pad'] + + } + mapping.get(POST)!["/pads"] = { + apiVersion: '1.3.0', functionName: 'createPad', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + text: { + type: "string" + }, + authorId: { + type: "string" + } + }, + required: ["padName"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Creates a new pad', + tags: ['pad'] + } + mapping.get(PATCH)!["/savedRevisions"] = { + apiVersion: '1.3.0', functionName: 'restoreRevision', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + rev: { + type: "integer" + }, + authorId: { + type: "string" + } + }, + required: ["padID", "rev", "authorId"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Restores a revision of a pad', + tags: ['pad'] + } + + + mapping.get(POST)!["/pads/html"] = { + apiVersion: '1.3.0', functionName: 'setHTML', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + html: { + type: "string" + }, + authorId: { + type: "string" + } + }, + required: ["padID", "html", "authorId"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Sets the HTML of a pad', + tags: ['pad'] + } + + mapping.get(POST)!["/pads/text"] = { + apiVersion: '1.3.0', functionName: 'setText', + requestBody: { + content: { + "application/json": { + schema: { + type: "object", + properties: { + padID: { + type: "string" + }, + text: { + type: "string" + }, + authorId: { + type: "string" + } + }, + required: ["padID", "text", "authorId"] + } + } + } + }, + responses: prepareResponses({type: "object", properties: {}}), + summary: 'Sets the text of a pad', + tags: ['pad'] + } + + + app.use('/api-docs', serve); + app.get('/api-docs', setup(undefined, { + swaggerOptions: { + url: '/api-docs.json', + }, + })); + + app.use(express.json()); + + app.get('/api-docs.json', (req, res) => { + const fullUrl = req.protocol + '://' + req.get('host'); + const generatedDefinition = prepareDefinition(mapping, fullUrl) + res.json(generatedDefinition) + }) + app.use('/api/2', async (req, res, next) => { + const method = req.method + const pathToFunction = req.path + // parse fields from request + const {headers, params, query} = req; + + // read form data if method was POST + let formData: MapArrayType = {}; + if (method.toLowerCase() === 'post' || method.toLowerCase() === "delete") { + if (!req.headers['content-type'] || req.headers['content-type']!.startsWith('application/json')) { + // parse json + formData = req.body; + } else { + const form = new IncomingForm(); + formData = (await form.parse(req))[0]; + for (const k of Object.keys(formData)) { + if (formData[k] instanceof Array) { + formData[k] = formData[k][0]; + } + } + } + } + + const fields = Object.assign({}, headers, params, query, formData); + + if (mapping.has(method) && pathToFunction in mapping.get(method)!) { + const {apiVersion, functionName} = mapping.get(method)![pathToFunction]! + // pass to api handler + let response; + try { + try { + let data = await apiHandler.handle(apiVersion, functionName, fields, req, res); + + // return in common format + response = {code: 0, message: 'ok', data: data || null}; + } catch (err) { + const errCaused = err as ErrorCaused + // convert all errors to http errors + if (createHTTPError.isHttpError(err)) { + // pass http errors thrown by handler forward + throw err; + } else if (errCaused.name === 'apierror') { + // parameters were wrong and the api stopped execution, pass the error + // convert to http error + throw new createHTTPError.BadRequest(errCaused.message); + } else { + // an unknown error happened + // log it and throw internal error + console.error(errCaused.stack || errCaused.toString()); + throw new createHTTPError.InternalServerError('internal error'); + } + } + } catch (err) { + const errCaused = err as ErrorCaused + // handle http errors + // @ts-ignore + res.statusCode = errCaused.statusCode || 500; + + // convert to our json response format + // https://github.com/ether/etherpad-lite/tree/master/doc/api/http_api.md#response-format + switch (res.statusCode) { + case 403: // forbidden + response = {code: 4, message: errCaused.message, data: null}; + break; + case 401: // unauthorized (no or wrong api key) + response = {code: 4, message: errCaused.message, data: null}; + break; + case 404: // not found (no such function) + response = {code: 3, message: errCaused.message, data: null}; + break; + case 500: // server error (internal error) + response = {code: 2, message: errCaused.message, data: null}; + break; + case 400: // bad request (wrong parameters) + // respond with 200 OK to keep old behavior and pass tests + res.statusCode = 200; // @TODO: this is bad api design + response = {code: 1, message: errCaused.message, data: null}; + break; + default: + response = {code: 1, message: errCaused.message, data: null}; + break; + } + } + + + console.debug(`RESPONSE, ${functionName}, ${JSON.stringify(response)}`); + + // return the response data + res.json(response); + } else { + res.json({code: 1, message: 'not found'}); + } + }) +} diff --git a/src/node/handler/SocketIORouter.ts b/src/node/handler/SocketIORouter.ts index 482276834..9e5f4e5cd 100644 --- a/src/node/handler/SocketIORouter.ts +++ b/src/node/handler/SocketIORouter.ts @@ -22,8 +22,8 @@ import {MapArrayType} from "../types/MapType"; import {SocketModule} from "../types/SocketModule"; -const log4js = require('log4js'); -const settings = require('../utils/Settings'); +import log4js from 'log4js'; +import settings from '../utils/Settings'; const stats = require('../../node/stats') const logger = log4js.getLogger('socket.io'); diff --git a/src/node/hooks/express.ts b/src/node/hooks/express.ts index 29da71ac3..fb24cbfe6 100644 --- a/src/node/hooks/express.ts +++ b/src/node/hooks/express.ts @@ -4,17 +4,15 @@ import {Socket} from "node:net"; import type {MapArrayType} from "../types/MapType"; import _ from 'underscore'; -// @ts-ignore import cookieParser from 'cookie-parser'; import events from 'events'; import express from 'express'; -// @ts-ignore -import expressSession from 'express-session'; +import expressSession, {Store} from 'express-session'; import fs from 'fs'; const hooks = require('../../static/js/pluginfw/hooks'); import log4js from 'log4js'; const SessionStore = require('../db/SessionStore'); -const settings = require('../utils/Settings'); +import settings, {getEpVersion, getGitCommit} from '../utils/Settings'; const stats = require('../stats') import util from 'util'; const webaccess = require('./express/webaccess'); @@ -24,7 +22,7 @@ import SecretRotator from '../security/SecretRotator'; let secretRotator: SecretRotator|null = null; const logger = log4js.getLogger('http'); let serverName:string; -let sessionStore: { shutdown: () => void; } | null; +let sessionStore: Store | null; const sockets:Set = new Set(); const socketsEvents = new events.EventEmitter(); const startTime = stats.settableGauge('httpStartTime'); @@ -59,6 +57,7 @@ const closeServer = async () => { startTime.setValue(0); logger.info('HTTP server closed'); } + // @ts-ignore if (sessionStore) sessionStore.shutdown(); sessionStore = null; if (secretRotator) secretRotator.stop(); @@ -68,9 +67,9 @@ const closeServer = async () => { exports.createServer = async () => { console.log('Report bugs at https://github.com/ether/etherpad-lite/issues'); - serverName = `Etherpad ${settings.getGitCommit()} (https://etherpad.org)`; + serverName = `Etherpad ${getGitCommit()} (https://etherpad.org)`; - console.log(`Your Etherpad version is ${settings.getEpVersion()} (${settings.getGitCommit()})`); + console.log(`Your Etherpad version is ${getEpVersion()} (${getGitCommit()})`); await exports.restartServer(); @@ -177,7 +176,7 @@ exports.restartServer = async () => { // starts listening to requests as reported in issue #158. Not installing the log4js connect // logger when the log level has a higher severity than INFO since it would not log at that level // anyway. - if (!(settings.loglevel === 'WARN' && settings.loglevel === 'ERROR')) { + if (!(settings.loglevel === 'WARN' || settings.loglevel === 'ERROR')) { app.use(log4js.connectLogger(logger, { level: log4js.levels.DEBUG.levelStr, format: ':status, :method :url', @@ -190,7 +189,12 @@ exports.restartServer = async () => { secretRotator = new SecretRotator( 'expressSessionSecrets', keyRotationInterval, sessionLifetime, settings.sessionKey); await secretRotator.start(); - secret = secretRotator.secrets; + const secrets = secretRotator.secrets; + if (Array.isArray(secrets)) { + secret = secrets[0]; + } else { + secret = secretRotator.secrets as unknown as string; + } } if (!secret) throw new Error('missing cookie signing secret'); @@ -198,17 +202,16 @@ exports.restartServer = async () => { sessionStore = new SessionStore(settings.cookie.sessionRefreshInterval); exports.sessionMiddleware = expressSession({ - propagateTouch: true, rolling: true, secret, - store: sessionStore, + store: sessionStore ?? undefined, resave: false, saveUninitialized: false, // Set the cookie name to a javascript identifier compatible string. Makes code handling it // cleaner :) name: 'express_sid', cookie: { - maxAge: sessionLifetime || null, // Convert 0 to null. + maxAge: sessionLifetime || undefined, // Convert 0 to null. sameSite: settings.cookie.sameSite, // The automatic express-session mechanism for determining if the application is being served @@ -234,7 +237,7 @@ exports.restartServer = async () => { // Give plugins an opportunity to install handlers/middleware before the express-session // middleware. This allows plugins to avoid creating an express-session record in the database // when it is not needed (e.g., public static content). - await hooks.aCallAll('expressPreSession', {app}); + await hooks.aCallAll('expressPreSession', {app, settings}); app.use(exports.sessionMiddleware); app.use(webaccess.checkAccess); diff --git a/src/node/hooks/express/admin.ts b/src/node/hooks/express/admin.ts index 5a88379f2..7e9e6316b 100644 --- a/src/node/hooks/express/admin.ts +++ b/src/node/hooks/express/admin.ts @@ -2,11 +2,12 @@ import {ArgsExpressType} from "../../types/ArgsExpressType"; import path from "path"; import fs from "fs"; -import express from "express"; -const settings = require('ep_etherpad-lite/node/utils/Settings'); +import {MapArrayType} from "../../types/MapType"; -const ADMIN_PATH = path.join(settings.root, 'src', 'templates', 'admin'); +import settings from 'ep_etherpad-lite/node/utils/Settings'; +const ADMIN_PATH = path.join(settings.root, 'src', 'templates'); +const PROXY_HEADER = "x-proxy-path" /** * Add the admin navigation link * @param hookName {String} the name of the hook @@ -14,13 +15,76 @@ const ADMIN_PATH = path.join(settings.root, 'src', 'templates', 'admin'); * @param {Function} cb the callback function * @return {*} */ -exports.expressCreateServer = (hookName:string, args: ArgsExpressType, cb:Function): any => { - args.app.use('/admin/', express.static(path.join(__dirname, '../../../templates/admin'), {maxAge: 1000 * 60 * 60 * 24})); - args.app.get('/admin/*', (_request:any, response:any)=>{ - response.sendFile(path.resolve(__dirname,'../../../templates/admin', 'index.html')); - } ) - args.app.get('/admin', (req:any, res:any, next:Function) => { - if ('/' !== req.path[req.path.length - 1]) return res.redirect('./admin/'); +exports.expressCreateServer = (hookName: string, args: ArgsExpressType, cb: Function): any => { + + if (!fs.existsSync(ADMIN_PATH)) { + console.error('admin template not found, skipping admin interface. You need to rebuild it in /admin with pnpm run build-copy') + return cb(); + } + args.app.get('/admin/{*filename}', (req: any, res: any) => { + // extract URL path + let pathname = path.join(ADMIN_PATH, req.url); + pathname = path.normalize(pathname) + + if (!pathname.startsWith(ADMIN_PATH)) { + res.statusCode = 403; + return res.end("Forbidden"); + } + // based on the URL path, extract the file extension. e.g. .js, .doc, ... + let ext = path.parse(pathname).ext; + // maps file extension to MIME typere + const map: MapArrayType = { + '.ico': 'image/x-icon', + '.html': 'text/html', + '.js': 'text/javascript', + '.json': 'application/json', + '.css': 'text/css', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.wav': 'audio/wav', + '.mp3': 'audio/mpeg', + '.svg': 'image/svg+xml', + '.pdf': 'application/pdf', + '.doc': 'application/msword' + }; + + fs.exists(pathname, function (exist) { + if (!exist) { + // if the file is not found, return 404 + res.statusCode = 200; + pathname = ADMIN_PATH + "/admin/index.html" + ext = path.parse(pathname).ext; + } + + // if is a directory search for index file matching the extension + if (exist && fs.statSync(pathname).isDirectory()) { + pathname = pathname + '/index.html'; + ext = path.parse(pathname).ext; + } + + // read file from file system + fs.readFile(pathname, function (err, data) { + if (err) { + res.statusCode = 500; + res.end(`Error getting the file: ${err}.`); + } else { + let dataToSend:Buffer|string = data + // if the file is found, set Content-type and send data + res.setHeader('Content-type', map[ext] || 'text/plain'); + if (ext === ".html" || ext === ".js" || ext === ".css") { + if (req.header(PROXY_HEADER)) { + let string = data.toString() + dataToSend = string.replaceAll("/admin", req.header(PROXY_HEADER) + "/admin") + dataToSend = dataToSend.replaceAll("/socket.io", req.header(PROXY_HEADER) + "/socket.io") + } + } + res.end(dataToSend); + } + }); + }) + }); + args.app.get('/admin', (req: any, res: any, next: Function) => { + if ('/' !== req.path[req.path.length - 1]) return res.redirect('./admin/'); }) return cb(); }; diff --git a/src/node/hooks/express/adminplugins.ts b/src/node/hooks/express/adminplugins.ts index 5272719f5..47f06c513 100644 --- a/src/node/hooks/express/adminplugins.ts +++ b/src/node/hooks/express/adminplugins.ts @@ -5,10 +5,13 @@ import {ErrorCaused} from "../../types/ErrorCaused"; import {QueryType} from "../../types/QueryType"; import {getAvailablePlugins, install, search, uninstall} from "../../../static/js/pluginfw/installer"; -import {PackageData} from "../../types/PackageInfo"; +import {PackageData, PackageInfo} from "../../types/PackageInfo"; +import semver from 'semver'; +import log4js from 'log4js'; +import {MapArrayType} from "../../types/MapType"; const pluginDefs = require('../../../static/js/pluginfw/plugin_defs'); -import semver from 'semver'; +const logger = log4js.getLogger('adminPlugins'); exports.socketio = (hookName:string, args:ArgsExpressType, cb:Function) => { @@ -18,27 +21,48 @@ exports.socketio = (hookName:string, args:ArgsExpressType, cb:Function) => { const {session: {user: {is_admin: isAdmin} = {}} = {}} = socket.conn.request; if (!isAdmin) return; - socket.on('getInstalled', (query:string) => { + const checkPluginForUpdates = async () => { + let results: MapArrayType + try { + results = await getAvailablePlugins(/* maxCacheAge:*/ 60 * 10); + } catch (error) { + console.error('Error checking for plugin updates:', error); + return []; + } + return Object.keys(pluginDefs.plugins).filter((plugin) => { + if (!results[plugin]) return false; + + const latestVersion = results[plugin].version; + const currentVersion = pluginDefs.plugins[plugin].package.version; + + return semver.gt(latestVersion, currentVersion); + }) + } + + socket.on('getStats', ()=>{ + console.log("Getting stats for admin plugins"); + socket.emit('results:stats', require('../../stats').toJSON()); + }) + + socket.on('getInstalled', async (query: string) => { // send currently installed plugins const installed = - Object.keys(pluginDefs.plugins).map((plugin) => pluginDefs.plugins[plugin].package); + Object.keys(pluginDefs.plugins).map((plugin) => pluginDefs.plugins[plugin].package); + + const updatable = await checkPluginForUpdates(); + + installed.forEach((plugin) => { + plugin.updatable = updatable.includes(plugin.name); + }) socket.emit('results:installed', {installed}); }); + socket.on('checkUpdates', async () => { // Check plugins for updates try { - const results = await getAvailablePlugins(/* maxCacheAge:*/ 60 * 10); - - const updatable = Object.keys(pluginDefs.plugins).filter((plugin) => { - if (!results[plugin]) return false; - - const latestVersion = results[plugin].version; - const currentVersion = pluginDefs.plugins[plugin].package.version; - - return semver.gt(latestVersion, currentVersion); - }); + const updatable = checkPluginForUpdates(); socket.emit('results:updatable', {updatable}); } catch (err) { @@ -61,6 +85,7 @@ exports.socketio = (hookName:string, args:ArgsExpressType, cb:Function) => { socket.on('search', async (query: QueryType) => { try { + if (query.searchTerm) logger.info(`Plugin search: ${query.searchTerm}'`); const results = await search(query.searchTerm, /* maxCacheAge:*/ 60 * 10); let res = Object.keys(results) .map((pluginName) => results[pluginName]) @@ -68,10 +93,9 @@ exports.socketio = (hookName:string, args:ArgsExpressType, cb:Function) => { res = sortPluginList(res, query.sortBy, query.sortDir) .slice(query.offset, query.offset + query.limit); socket.emit('results:search', {results: res, query}); - } catch (er) { - console.error(er); - - socket.emit('results:search', {results: {}, query}); + } catch (err: any) { + logger.error(`Error searching plugins: ${err}`); + socket.emit('results:searcherror', {error: err.message, query}); } }); diff --git a/src/node/hooks/express/adminsettings.ts b/src/node/hooks/express/adminsettings.ts index 732b64f20..a782c6d40 100644 --- a/src/node/hooks/express/adminsettings.ts +++ b/src/node/hooks/express/adminsettings.ts @@ -2,19 +2,20 @@ import {PadQueryResult, PadSearchQuery} from "../../types/PadSearchQuery"; -import {PadType} from "../../types/PadType"; +import log4js from 'log4js'; -const eejs = require('../../eejs'); const fsp = require('fs').promises; const hooks = require('../../../static/js/pluginfw/hooks'); const plugins = require('../../../static/js/pluginfw/plugins'); -const settings = require('../../utils/Settings'); -const UpdateCheck = require('../../utils/UpdateCheck'); +import settings, {getEpVersion, getGitCommit, reloadSettings} from '../../utils/Settings'; +import {getLatestVersion} from '../../utils/UpdateCheck'; const padManager = require('../../db/PadManager'); const api = require('../../db/API'); +import {deleteRevisions} from '../../utils/Cleanup'; const queryPadLimit = 12; +const logger = log4js.getLogger('adminSettings'); exports.socketio = (hookName: string, {io}: any) => { @@ -28,7 +29,7 @@ exports.socketio = (hookName: string, {io}: any) => { try { data = await fsp.readFile(settings.settingsFilename, 'utf8'); } catch (err) { - return console.log(err); + return logger.error(`Error loading settings: ${err}`); } // if showSettingsInAdminPage is set to false, then return NOT_ALLOWED in the result if (settings.showSettingsInAdminPage === false) { @@ -39,8 +40,12 @@ exports.socketio = (hookName: string, {io}: any) => { }); socket.on('saveSettings', async (newSettings: string) => { - console.log('Admin request to save settings through a socket on /admin/settings'); - await fsp.writeFile(settings.settingsFilename, newSettings); + logger.info('Admin request to save settings through a socket on /admin/settings'); + try { + await fsp.writeFile(settings.settingsFilename, newSettings); + } catch (err) { + logger.error(`Error saving settings: ${err}`); + } socket.emit('saveprogress', 'saved'); }); @@ -68,8 +73,8 @@ exports.socketio = (hookName: string, {io}: any) => { socket.on('help', () => { - const gitCommit = settings.getGitCommit(); - const epVersion = settings.getEpVersion(); + const gitCommit = getGitCommit(); + const epVersion = getEpVersion(); const hooks: Map> = plugins.getHooks('hooks', false); const clientHooks: Map> = plugins.getHooks('client_hooks', false); @@ -93,7 +98,7 @@ exports.socketio = (hookName: string, {io}: any) => { installedParts: plugins.getParts(), installedServerHooks: mapToObject(hooks), installedClientHooks: mapToObject(clientHooks), - latestVersion: UpdateCheck.getLatestVersion(), + latestVersion: getLatestVersion(), }) }); @@ -122,6 +127,7 @@ exports.socketio = (hookName: string, {io}: any) => { maxResult = 0; } + // Reset to default values if out of bounds if (query.offset && query.offset < 0) { query.offset = 0; } else if (query.offset > maxResult) { @@ -129,11 +135,14 @@ exports.socketio = (hookName: string, {io}: any) => { } if (query.limit && query.limit < 0) { + // Too small query.limit = 0; } else if (query.limit > queryPadLimit) { + // Too big query.limit = queryPadLimit; } + if (query.sortBy === 'padName') { result = result.sort((a, b) => { if (a < b) return query.ascending ? -1 : 1; @@ -154,53 +163,78 @@ exports.socketio = (hookName: string, {io}: any) => { revisionNumber } })); - } else { + } else if (query.sortBy === "revisionNumber") { const currentWinners: PadQueryResult[] = [] - let queryOffsetCounter = 0 + const padMapping = [] as {padId: string, revisionNumber: number}[] for (let res of result) { - const pad = await padManager.getPad(res); - const padType = { - padName: res, - lastEdited: await pad.getLastEdit(), - userCount: api.padUsersCount(res).padUsersCount, - revisionNumber: pad.getHeadRevisionNumber() - }; - - if (currentWinners.length < query.limit) { - if (queryOffsetCounter < query.offset) { - queryOffsetCounter++ - continue - } - currentWinners.push({ - padName: res, - lastEdited: await pad.getLastEdit(), - userCount: api.padUsersCount(res).padUsersCount, - revisionNumber: pad.getHeadRevisionNumber() - }) - } else { - // Kick out worst pad and replace by current pad - let worstPad = currentWinners.sort((a, b) => { - if (a[query.sortBy] < b[query.sortBy]) return query.ascending ? -1 : 1; - if (a[query.sortBy] > b[query.sortBy]) return query.ascending ? 1 : -1; - return 0; - }) - if (worstPad[0] && worstPad[0][query.sortBy] < padType[query.sortBy]) { - if (queryOffsetCounter < query.offset) { - queryOffsetCounter++ - continue - } - currentWinners.splice(currentWinners.indexOf(worstPad[0]), 1) - currentWinners.push({ - padName: res, - lastEdited: await pad.getLastEdit(), - userCount: api.padUsersCount(res).padUsersCount, - revisionNumber: pad.getHeadRevisionNumber() - }) - } - } + const revisionNumber = pad.getHeadRevisionNumber() + padMapping.push({padId: res, revisionNumber}) } - data.results = currentWinners; + padMapping.sort((a, b) => { + if (a.revisionNumber < b.revisionNumber) return query.ascending ? -1 : 1; + if (a.revisionNumber > b.revisionNumber) return query.ascending ? 1 : -1; + return 0; + }) + + for (const padRetrieval of padMapping.slice(query.offset, query.offset + query.limit)) { + let pad = await padManager.getPad(padRetrieval.padId); + currentWinners.push({ + padName: padRetrieval.padId, + lastEdited: await pad.getLastEdit(), + userCount: api.padUsersCount(pad.padName).padUsersCount, + revisionNumber: padRetrieval.revisionNumber + }) + } + + data.results = currentWinners; + } else if (query.sortBy === "userCount") { + const currentWinners: PadQueryResult[] = [] + const padMapping = [] as {padId: string, userCount: number}[] + for (let res of result) { + const userCount = api.padUsersCount(res).padUsersCount + padMapping.push({padId: res, userCount}) + } + padMapping.sort((a, b) => { + if (a.userCount < b.userCount) return query.ascending ? -1 : 1; + if (a.userCount > b.userCount) return query.ascending ? 1 : -1; + return 0; + }) + + for (const padRetrieval of padMapping.slice(query.offset, query.offset + query.limit)) { + let pad = await padManager.getPad(padRetrieval.padId); + currentWinners.push({ + padName: padRetrieval.padId, + lastEdited: await pad.getLastEdit(), + userCount: padRetrieval.userCount, + revisionNumber: pad.getHeadRevisionNumber() + }) + } + data.results = currentWinners; + } else if (query.sortBy === "lastEdited") { + const currentWinners: PadQueryResult[] = [] + const padMapping = [] as {padId: string, lastEdited: string}[] + for (let res of result) { + const pad = await padManager.getPad(res); + const lastEdited = await pad.getLastEdit(); + padMapping.push({padId: res, lastEdited}) + } + padMapping.sort((a, b) => { + if (a.lastEdited < b.lastEdited) return query.ascending ? -1 : 1; + if (a.lastEdited > b.lastEdited) return query.ascending ? 1 : -1; + return 0; + }) + + for (const padRetrieval of padMapping.slice(query.offset, query.offset + query.limit)) { + let pad = await padManager.getPad(padRetrieval.padId); + currentWinners.push({ + padName: padRetrieval.padId, + lastEdited: padRetrieval.lastEdited, + userCount: api.padUsersCount(pad.padName).padUsersCount, + revisionNumber: pad.getHeadRevisionNumber() + }) + } + data.results = currentWinners; } socket.emit('results:padLoad', data); @@ -210,15 +244,69 @@ exports.socketio = (hookName: string, {io}: any) => { socket.on('deletePad', async (padId: string) => { const padExists = await padManager.doesPadExists(padId); if (padExists) { + logger.info(`Deleting pad: ${padId}`); const pad = await padManager.getPad(padId); await pad.remove(); socket.emit('results:deletePad', padId); } }) + type PadCreationOptions = { + padName: string, + } + + socket.on('createPad', async ({padName}: PadCreationOptions)=>{ + const padExists = await padManager.doesPadExists(padName); + if (padExists) { + socket.emit('results:createPad', { + error: 'Pad already exists', + }); + return; + } + padManager.getPad(padName); + socket.emit('results:createPad', { + success: `Pad created ${padName}`, + }); + return; + }) + + socket.on('cleanupPadRevisions', async (padId: string) => { + if (!settings.cleanup.enabled) { + socket.emit('results:cleanupPadRevisions', { + error: 'Cleanup disabled. Enable cleanup in settings.json: cleanup.enabled => true', + }); + return; + } + + const padExists = await padManager.doesPadExists(padId); + if (padExists) { + logger.info(`Cleanup pad revisions: ${padId}`); + try { + const result = await deleteRevisions(padId, settings.cleanup.keepRevisions) + if (result) { + socket.emit('results:cleanupPadRevisions', { + padId: padId, + keepRevisions: settings.cleanup.keepRevisions, + }); + logger.info('successful cleaned up pad: ', padId) + } else { + socket.emit('results:cleanupPadRevisions', { + error: 'Error cleaning up pad', + }); + } + } catch (err: any) { + logger.error(`Error in pad ${padId}: ${err.stack || err}`); + socket.emit('results:cleanupPadRevisions', { + error: err.toString(), + }); + return; + } + } + }) + socket.on('restartServer', async () => { - console.log('Admin request to restart server through a socket on /admin/settings'); - settings.reloadSettings(); + logger.info('Admin request to restart server through a socket on /admin/settings'); + reloadSettings(); await plugins.update(); await hooks.aCallAll('loadSettings', {settings}); await hooks.aCallAll('restartServer'); @@ -230,4 +318,3 @@ exports.socketio = (hookName: string, {io}: any) => { const searchPad = async (query: PadSearchQuery) => { } - diff --git a/src/node/hooks/express/apicalls.ts b/src/node/hooks/express/apicalls.ts index 91c44e389..946e86549 100644 --- a/src/node/hooks/express/apicalls.ts +++ b/src/node/hooks/express/apicalls.ts @@ -1,16 +1,39 @@ 'use strict'; +import express from "express"; + const log4js = require('log4js'); const clientLogger = log4js.getLogger('client'); const {Formidable} = require('formidable'); const apiHandler = require('../../handler/APIHandler'); const util = require('util'); + +function objectAsString(obj: any): string { + let output = ''; + for (const property in obj) { + if(obj.hasOwnProperty(property) && typeof obj[property] !== 'function') { + let value = obj[property]; + if(typeof value === 'object' && !Array.isArray(value) && value !== null) { + value = '{' + objectAsString(value) + '}'; + } + output += property + ': ' + value +'; '; + } + } + return output; +} + exports.expressPreSession = async (hookName:string, {app}:any) => { + app.use(express.json()); // The Etherpad client side sends information about how a disconnect happened app.post('/ep/pad/connection-diagnostic-info', async (req:any, res:any) => { - const [fields, files] = await (new Formidable({})).parse(req); - clientLogger.info(`DIAGNOSTIC-INFO: ${fields.diagnosticInfo}`); + if (!req.body ||!req.body.diagnosticInfo || typeof req.body.diagnosticInfo !== 'object') { + clientLogger.warn('DIAGNOSTIC-INFO: No diagnostic info provided'); + res.status(400).end('No diagnostic info provided'); + return; + } + + clientLogger.info(`DIAGNOSTIC-INFO: ${objectAsString(req.body.diagnosticInfo)}`); res.end('OK'); }); diff --git a/src/node/hooks/express/importexport.ts b/src/node/hooks/express/importexport.ts index 898606e49..7f9356844 100644 --- a/src/node/hooks/express/importexport.ts +++ b/src/node/hooks/express/importexport.ts @@ -3,11 +3,11 @@ import {ArgsExpressType} from "../../types/ArgsExpressType"; const hasPadAccess = require('../../padaccess'); -const settings = require('../../utils/Settings'); +import settings, {exportAvailable} from '../../utils/Settings'; const exportHandler = require('../../handler/ExportHandler'); const importHandler = require('../../handler/ImportHandler'); const padManager = require('../../db/PadManager'); -const readOnlyManager = require('../../db/ReadOnlyManager'); +import readOnlyManager from '../../db/ReadOnlyManager'; const rateLimit = require('express-rate-limit'); const securityManager = require('../../db/SecurityManager'); const webaccess = require('./webaccess'); @@ -25,8 +25,8 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio }); // handle export requests - args.app.use('/p/:pad/:rev?/export/:type', limiter); - args.app.get('/p/:pad/:rev?/export/:type', (req:any, res:any, next:Function) => { + args.app.use('/p/:pad{/:rev}/export/:type', limiter); + args.app.get('/p/:pad{/:rev}/export/:type', (req:any, res:any, next:Function) => { (async () => { const types = ['pdf', 'doc', 'txt', 'html', 'odt', 'etherpad']; // send a 404 if we don't support this filetype @@ -35,7 +35,7 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio } // if abiword is disabled, and this is a format we only support with abiword, output a message - if (settings.exportAvailable() === 'no' && + if (exportAvailable() === 'no' && ['odt', 'pdf', 'doc'].indexOf(req.params.type) !== -1) { console.error(`Impossible to export pad "${req.params.pad}" in ${req.params.type} format.` + ' There is no converter configured'); diff --git a/src/node/hooks/express/openapi.ts b/src/node/hooks/express/openapi.ts index a55e67871..ddd557dc1 100644 --- a/src/node/hooks/express/openapi.ts +++ b/src/node/hooks/express/openapi.ts @@ -24,9 +24,9 @@ const cloneDeep = require('lodash.clonedeep'); const createHTTPError = require('http-errors'); const apiHandler = require('../../handler/APIHandler'); -const settings = require('../../utils/Settings'); +import settings from '../../utils/Settings'; -const log4js = require('log4js'); +import log4js from 'log4js'; const logger = log4js.getLogger('API'); // https://github.com/OAI/OpenAPI-Specification/tree/master/schemas/v3.0 @@ -608,7 +608,7 @@ exports.expressPreSession = async (hookName:string, {app}:any) => { for (const funcName of Object.keys(apiHandler.version[version])) { const handler = async (c: any, req:any, res:any) => { // parse fields from request - const {header, params, query} = c.request; + const {headers, params, query} = c.request; // read form data if method was POST let formData:MapArrayType = {}; @@ -622,8 +622,7 @@ exports.expressPreSession = async (hookName:string, {app}:any) => { } } - const fields = Object.assign({}, header, params, query, formData); - + const fields = Object.assign({}, headers, params, query, formData); if (logger.isDebugEnabled()) { logger.debug(`REQUEST, v${version}:${funcName}, ${JSON.stringify(fields)}`); } diff --git a/src/node/hooks/express/pwa.ts b/src/node/hooks/express/pwa.ts new file mode 100644 index 000000000..a763af5b4 --- /dev/null +++ b/src/node/hooks/express/pwa.ts @@ -0,0 +1,32 @@ +import {ArgsExpressType} from "../../types/ArgsExpressType"; +import settings from '../../utils/Settings'; + +const pwa = { + name: settings.title || "Etherpad", + short_name: settings.title, + description: "A collaborative online editor", + icons: [ + { + "src": "/static/skins/colibris/images/fond.jpg", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "/favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + type: "image/png" + } + ], + start_url: "/", + display: "fullscreen", + theme_color: "#0f775b", + background_color: "#0f775b" +} + +exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Function) => { + args.app.get('/manifest.json', (req:any, res:any) => { + res.json(pwa); + }); + + return cb(); +} diff --git a/src/node/hooks/express/socketio.ts b/src/node/hooks/express/socketio.ts index bbdec1c1c..9184eff88 100644 --- a/src/node/hooks/express/socketio.ts +++ b/src/node/hooks/express/socketio.ts @@ -6,7 +6,7 @@ import events from 'events'; const express = require('../express'); import log4js from 'log4js'; const proxyaddr = require('proxy-addr'); -const settings = require('../../utils/Settings'); +import settings from '../../utils/Settings'; import {Server, Socket} from 'socket.io' const socketIORouter = require('../../handler/SocketIORouter'); const hooks = require('../../../static/js/pluginfw/hooks'); diff --git a/src/node/hooks/express/specialpages.ts b/src/node/hooks/express/specialpages.ts index 85a23479f..1f4ce3302 100644 --- a/src/node/hooks/express/specialpages.ts +++ b/src/node/hooks/express/specialpages.ts @@ -1,37 +1,63 @@ 'use strict'; -const path = require('path'); -const eejs = require('../../eejs'); -const fs = require('fs'); +import path from 'node:path'; +const eejs = require('../../eejs') +import fs from 'node:fs'; const fsp = fs.promises; const toolbar = require('../../utils/toolbar'); const hooks = require('../../../static/js/pluginfw/hooks'); -const settings = require('../../utils/Settings'); -const util = require('util'); +import settings, {getEpVersion} from '../../utils/Settings'; +import util from 'node:util'; const webaccess = require('./webaccess'); +const plugins = require('../../../static/js/pluginfw/plugin_defs'); -exports.expressPreSession = async (hookName:string, {app}:any) => { +import {build, buildSync} from 'esbuild' +import {ArgsExpressType} from "../../types/ArgsExpressType"; +import prometheus from "../../prometheus"; + +let ioI: { sockets: { sockets: any[]; }; } | null = null + + +exports.socketio = (hookName: string, {io}: any) => { + ioI = io +} + + +exports.expressPreSession = async (hookName:string, {app}:ArgsExpressType) => { // This endpoint is intended to conform to: // https://www.ietf.org/archive/id/draft-inadarei-api-health-check-06.html app.get('/health', (req:any, res:any) => { res.set('Content-Type', 'application/health+json'); res.json({ status: 'pass', - releaseId: settings.getEpVersion(), + releaseId: getEpVersion(), }); }); - app.get('/stats', (req:any, res:any) => { - res.json(require('../../stats').toJSON()); - }); + if (settings.enableMetrics) { + app.get('/stats', (req:any, res:any) => { + res.json(require('../../stats').toJSON()); + }); + + app.get('/stats/prometheus', async (req, res) => { + const metrics = await prometheus() + res.setHeader('Content-Type', metrics.contentType) + res.send(await metrics.metrics()) + }) + } + app.get('/javascript', (req:any, res:any) => { res.send(eejs.require('ep_etherpad-lite/templates/javascript.html', {req})); }); app.get('/robots.txt', (req:any, res:any) => { + if (!settings.skinName) { + // if no skin is set, send the default robots.txt + return res.sendFile(path.join(settings.root, 'src', 'static', 'robots.txt')); + } let filePath = - path.join(settings.root, 'src', 'static', 'skins', settings.skinName, 'robots.txt'); + path.join(settings.root, 'src', 'static', 'skins', settings.skinName, 'robots.txt'); res.sendFile(filePath, (err:any) => { // there is no custom robots.txt, send the default robots.txt which dissallows all if (err) { @@ -55,9 +81,9 @@ exports.expressPreSession = async (hookName:string, {app}:any) => { const fns = [ ...(settings.favicon ? [path.resolve(settings.root, settings.favicon)] : []), - path.join(settings.root, 'src', 'static', 'skins', settings.skinName, 'favicon.ico'), + settings.skinName && path.join(settings.root, 'src', 'static', 'skins', settings.skinName, 'favicon.ico'), path.join(settings.root, 'src', 'static', 'favicon.ico'), - ]; + ].filter(f=>f != null); for (const fn of fns) { try { await fsp.access(fn, fs.constants.R_OK); @@ -73,49 +99,283 @@ exports.expressPreSession = async (hookName:string, {app}:any) => { }); }; -exports.expressCreateServer = (hookName:string, args:any, cb:Function) => { - // serve index.html under / - args.app.get('/', (req:any, res:any) => { - res.send(eejs.require('ep_etherpad-lite/templates/index.html', {req})); + + +const convertTypescript = (content: string) => { + const outputRaw = buildSync({ + stdin: { + contents: content, + resolveDir: path.join(settings.root, 'var','js'), + loader: 'js' + }, + alias:{ + "ep_etherpad-lite/static/js/browser": 'ep_etherpad-lite/static/js/vendors/browser', + "ep_etherpad-lite/static/js/nice-select": 'ep_etherpad-lite/static/js/vendors/nice-select' + }, + bundle: true, // Bundle the files together + minify: process.env.NODE_ENV === "production", // Minify the output + sourcemap: !(process.env.NODE_ENV === "production"), // Generate source maps + sourceRoot: settings.root+"/src/static/js/", + target: ['es2020'], // Target ECMAScript version + metafile: true, + write: false, // Do not write to file system, + }) + const output = outputRaw.outputFiles[0].text + + return { + output, + hash: outputRaw.outputFiles[0].hash.replaceAll('/','2').replaceAll("+",'5').replaceAll("^","7") + } +} + +const handleLiveReload = async (args: ArgsExpressType, padString: string, timeSliderString: string, indexString: any) => { + const chokidar = await import('chokidar') + const watcher = chokidar.watch(path.join(settings.root, 'src', 'static', 'js'), {}); + let routeHandlers: { [key: string]: Function } = {}; + + const setRouteHandler = (path: string, newHandler: Function) => { + routeHandlers[path] = newHandler; + }; + args.app.use((req: any, res: any, next: Function) => { + if (req.path.startsWith('/p/') && req.path.split('/').length == 3) { + req.params = { + pad: req.path.split('/')[2] + } + routeHandlers['/p/:pad'](req, res); + } else if (req.path.startsWith('/p/') && req.path.split('/').length == 4) { + req.params = { + pad: req.path.split('/')[2] + } + routeHandlers['/p/:pad/timeslider'](req, res); + } else if (req.path == "/"){ + routeHandlers['/'](req, res); + } else if (routeHandlers[req.path]) { + routeHandlers[req.path](req, res); + } else { + next(); + } }); - // serve pad.html under /p - args.app.get('/p/:pad', (req:any, res:any, next:Function) => { - // The below might break for pads being rewritten - const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + function handleUpdate() { - hooks.callAll('padInitToolbar', { - toolbar, - isReadOnly, + convertTypescriptWatched(indexString, (output, hash) => { + setRouteHandler('/watch/index', (req: any, res: any) => { + res.header('Content-Type', 'application/javascript'); + res.send(output) + }) + setRouteHandler('/', (req: any, res: any) => { + res.send(eejs.require('ep_etherpad-lite/templates/index.html', {req, entrypoint: '/watch/index?hash=' + hash, settings})); + }) + }) + + convertTypescriptWatched(padString, (output, hash) => { + console.log("New pad hash is", hash) + setRouteHandler('/watch/pad', (req: any, res: any) => { + res.header('Content-Type', 'application/javascript'); + res.send(output) + }) + + + + + setRouteHandler("/p/:pad", (req: any, res: any, next: Function) => { + // The below might break for pads being rewritten + const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + + hooks.callAll('padInitToolbar', { + toolbar, + isReadOnly + }); + + const content = eejs.require('ep_etherpad-lite/templates/pad.html', { + req, + toolbar, + isReadOnly, + entrypoint: '/watch/pad?hash=' + hash, + settings: settings.getPublicSettings() + }) + res.send(content); + }) + ioI!.sockets.sockets.forEach(socket => socket.emit('liveupdate')) + }) + convertTypescriptWatched(timeSliderString, (output, hash) => { + // serve timeslider.html under /p/$padname/timeslider + console.log("New timeslider hash is", hash) + + setRouteHandler('/watch/timeslider', (req: any, res: any) => { + res.header('Content-Type', 'application/javascript'); + res.send(output) + }) + + setRouteHandler("/p/:pad/timeslider", (req: any, res: any, next: Function) => { + console.log("Reloading pad") + // The below might break for pads being rewritten + const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + + hooks.callAll('padInitToolbar', { + toolbar, + isReadOnly + }); + + const content = eejs.require('ep_etherpad-lite/templates/timeslider.html', { + req, + toolbar, + isReadOnly, + entrypoint: '/watch/timeslider?hash=' + hash, + settings: settings.getPublicSettings() + }) + res.send(content); + }) + }) + } + + watcher.on('change', path => { + console.log(`File ${path} has been changed`); + handleUpdate(); + }); + handleUpdate() +} + +const convertTypescriptWatched = (content: string, cb: (output:string, hash: string)=>void) => { + build({ + stdin: { + contents: content, + resolveDir: path.join(settings.root, 'var','js'), + loader: 'js' + }, + alias:{ + "ep_etherpad-lite/static/js/browser": 'ep_etherpad-lite/static/js/vendors/browser', + "ep_etherpad-lite/static/js/nice-select": 'ep_etherpad-lite/static/js/vendors/nice-select' + }, + bundle: true, // Bundle the files together + minify: process.env.NODE_ENV === "production", // Minify the output + sourcemap: !(process.env.NODE_ENV === "production"), // Generate source maps + sourceRoot: settings.root+"/src/static/js/", + target: ['es2020'], // Target ECMAScript version + metafile: true, + write: false, // Do not write to file system, + }).then((outputRaw) => { + cb( + outputRaw.outputFiles[0].text, + outputRaw.outputFiles[0].hash.replaceAll('/','2').replaceAll("+",'5').replaceAll("^","7") + ) + }) +} + +exports.expressCreateServer = async (_hookName: string, args: ArgsExpressType, cb: Function) => { + const padString = eejs.require('ep_etherpad-lite/templates/padBootstrap.js', { + pluginModules: (() => { + const pluginModules = new Set(); + for (const part of plugins.parts) { + for (const [, hookFnName] of Object.entries(part.client_hooks || {})) { + // @ts-ignore + pluginModules.add(hookFnName.split(':')[0]); + } + } + return [...pluginModules]; + })(), + settings, + }) + + const indexString = eejs.require('ep_etherpad-lite/templates/indexBootstrap.js', { + }) + + const timeSliderString = eejs.require('ep_etherpad-lite/templates/timeSliderBootstrap.js', { + pluginModules: (() => { + const pluginModules = new Set(); + for (const part of plugins.parts) { + for (const [, hookFnName] of Object.entries(part.client_hooks || {})) { + // @ts-ignore + pluginModules.add(hookFnName.split(':')[0]); + } + } + return [...pluginModules]; + })(), + settings, + }) + + + + const outdir = path.join(settings.root, 'var','js') + // Create the outdir if it doesn't exist + if (!fs.existsSync(outdir)) { + fs.mkdirSync(outdir); + } + + let fileNamePad: string + let fileNameTimeSlider: string + let fileNameIndex: string + if(process.env.NODE_ENV === "production"){ + const padSliderWrite = convertTypescript(padString) + const timeSliderWrite = convertTypescript(timeSliderString) + const indexWrite = convertTypescript(indexString) + + fileNamePad = `padbootstrap-${padSliderWrite.hash}.min.js` + fileNameTimeSlider = `timeSliderBootstrap-${timeSliderWrite.hash}.min.js` + fileNameIndex = `indexBootstrap-${indexWrite.hash}.min.js` + + args.app.get("/"+fileNamePad, (_req, res) => { + res.header('Content-Type', 'application/javascript'); + res.send(padSliderWrite.output) + }) + + args.app.get("/"+fileNameIndex, (_req, res) => { + res.header('Content-Type', 'application/javascript'); + res.send(indexWrite.output) + }) + + args.app.get("/"+fileNameTimeSlider, (_req, res) => { + res.header('Content-Type', 'application/javascript'); + res.send(timeSliderWrite.output) + }) + + // serve index.html under / + args.app.get('/', (req: any, res: any) => { + res.send(eejs.require('ep_etherpad-lite/templates/index.html', {req, settings, entrypoint: "./"+fileNameIndex})); }); - // can be removed when require-kernel is dropped - res.header('Feature-Policy', 'sync-xhr \'self\''); - res.send(eejs.require('ep_etherpad-lite/templates/pad.html', { - req, - toolbar, - isReadOnly, - })); - }); - // serve timeslider.html under /p/$padname/timeslider - args.app.get('/p/:pad/timeslider', (req:any, res:any, next:Function) => { - hooks.callAll('padInitToolbar', { - toolbar, + // serve pad.html under /p + args.app.get('/p/:pad', (req: any, res: any, next: Function) => { + // The below might break for pads being rewritten + const isReadOnly = !webaccess.userCanModify(req.params.pad, req); + + hooks.callAll('padInitToolbar', { + toolbar, + isReadOnly + }); + + const content = eejs.require('ep_etherpad-lite/templates/pad.html', { + req, + toolbar, + isReadOnly, + entrypoint: "../"+fileNamePad, + settings: settings.getPublicSettings() + }) + res.send(content); }); - res.send(eejs.require('ep_etherpad-lite/templates/timeslider.html', { - req, - toolbar, - })); - }); + // serve timeslider.html under /p/$padname/timeslider + args.app.get('/p/:pad/timeslider', (req: any, res: any, next: Function) => { + hooks.callAll('padInitToolbar', { + toolbar, + }); + + res.send(eejs.require('ep_etherpad-lite/templates/timeslider.html', { + req, + toolbar, + entrypoint: "../../"+fileNameTimeSlider, + settings: settings.getPublicSettings() + })); + }); + } else { + await handleLiveReload(args, padString, timeSliderString, indexString) + } // The client occasionally polls this endpoint to get an updated expiration for the express_sid // cookie. This handler must be installed after the express-session middleware. - args.app.put('/_extendExpressSessionLifetime', (req:any, res:any) => { + args.app.put('/_extendExpressSessionLifetime', (req: any, res: any) => { // express-session automatically calls req.session.touch() so we don't need to do it here. res.json({status: 'ok'}); }); - - return cb(); }; diff --git a/src/node/hooks/express/static.ts b/src/node/hooks/express/static.ts index 1d9ba01e9..9a8adfa4a 100644 --- a/src/node/hooks/express/static.ts +++ b/src/node/hooks/express/static.ts @@ -4,12 +4,11 @@ import {MapArrayType} from "../../types/MapType"; import {PartType} from "../../types/PartType"; const fs = require('fs').promises; -const minify = require('../../utils/Minify'); -const path = require('path'); +import {minify} from '../../utils/Minify'; +import path from 'node:path'; +import {ArgsExpressType} from "../../types/ArgsExpressType"; const plugins = require('../../../static/js/pluginfw/plugin_defs'); -const settings = require('../../utils/Settings'); -import CachingMiddleware from '../../utils/caching_middleware'; -const Yajsml = require('etherpad-yajsml'); +import settings from '../../utils/Settings'; // Rewrite tar to include modules with no extensions and proper rooted paths. const getTar = async () => { @@ -32,39 +31,16 @@ const getTar = async () => { return tar; }; -exports.expressPreSession = async (hookName:string, {app}:any) => { - // Cache both minified and static. - const assetCache = new CachingMiddleware(); - // Cache static assets - app.all(/\/js\/(.*)/, assetCache.handle.bind(assetCache)); - app.all(/\/css\/(.*)/, assetCache.handle.bind(assetCache)); +exports.expressPreSession = async (hookName:string, {app}:ArgsExpressType) => { // Minify will serve static files compressed (minify enabled). It also has // file-specific hacks for ace/require-kernel/etc. - app.all('/static/:filename(*)', minify.minify); - - // Setup middleware that will package JavaScript files served by minify for - // CommonJS loader on the client-side. - // Hostname "invalid.invalid" is a dummy value to allow parsing as a URI. - const jsServer = new (Yajsml.Server)({ - rootPath: 'javascripts/src/', - rootURI: 'http://invalid.invalid/static/js/', - libraryPath: 'javascripts/lib/', - libraryURI: 'http://invalid.invalid/static/plugins/', - requestURIs: minify.requestURIs, // Loop-back is causing problems, this is a workaround. - }); - - const StaticAssociator = Yajsml.associators.StaticAssociator; - const associations = Yajsml.associators.associationsForSimpleMapping(await getTar()); - const associator = new StaticAssociator(associations); - jsServer.setAssociator(associator); - - app.use(jsServer.handle.bind(jsServer)); + app.all('/static/*filename', minify); // serve plugin definitions // not very static, but served here so that client can do // require("pluginfw/static/js/plugin-definitions.js"); - app.get('/pluginfw/plugin-definitions.json', (req: any, res:any, next:Function) => { + app.get('/pluginfw/plugin-definitions.json', (_req, res) => { const clientParts = plugins.parts.filter((part: PartType) => part.client_hooks != null); const clientPlugins:MapArrayType = {}; for (const name of new Set(clientParts.map((part: PartType) => part.plugin))) { diff --git a/src/node/hooks/express/tests.ts b/src/node/hooks/express/tests.ts deleted file mode 100644 index f8a1417ef..000000000 --- a/src/node/hooks/express/tests.ts +++ /dev/null @@ -1,83 +0,0 @@ -'use strict'; - -import {Dirent} from "node:fs"; -import {PluginDef} from "../../types/PartType"; - -const path = require('path'); -const fsp = require('fs').promises; -const plugins = require('../../../static/js/pluginfw/plugin_defs'); -const sanitizePathname = require('../../utils/sanitizePathname'); -const settings = require('../../utils/Settings'); - -// Returns all *.js files under specDir (recursively) as relative paths to specDir, using '/' -// instead of path.sep to separate pathname components. -const findSpecs = async (specDir: string) => { - let dirents: Dirent[]; - try { - dirents = await fsp.readdir(specDir, {withFileTypes: true}); - } catch (err:any) { - if (['ENOENT', 'ENOTDIR'].includes(err.code)) return []; - throw err; - } - const specs: string[] = []; - await Promise.all(dirents.map(async (dirent) => { - if (dirent.isDirectory()) { - const subdirSpecs = await findSpecs(path.join(specDir, dirent.name)); - specs.push(...subdirSpecs.map((spec) => `${dirent.name}/${spec}`)); - return; - } - if (!dirent.name.endsWith('.js')) return; - specs.push(dirent.name); - })); - return specs; -}; - -exports.expressPreSession = async (hookName:string, {app}:any) => { - app.get('/tests/frontend/frontendTestSpecs.json', (req:any, res:any, next:Function) => { - (async () => { - const modules:string[] = []; - await Promise.all(Object.entries(plugins.plugins).map(async ([plugin, def]) => { - let {package: {path: pluginPath}} = def as PluginDef; - if (!pluginPath.endsWith(path.sep)) pluginPath += path.sep; - const specDir = `${plugin === 'ep_etherpad-lite' ? '' : 'static/'}tests/frontend/specs`; - for (const spec of await findSpecs(path.join(pluginPath, specDir))) { - if (plugin === 'ep_etherpad-lite' && !settings.enableAdminUITests && - spec.startsWith('admin')) continue; - modules.push(`${plugin}/${specDir}/${spec.replace(/\.js$/, '')}`); - } - })); - // Sort plugin tests before core tests. - modules.sort((a, b) => { - a = String(a); - b = String(b); - const aCore = a.startsWith('ep_etherpad-lite/'); - const bCore = b.startsWith('ep_etherpad-lite/'); - if (aCore === bCore) return a.localeCompare(b); - return aCore ? 1 : -1; - }); - console.debug('Sent browser the following test spec modules:', modules); - res.json(modules); - })().catch((err) => next(err || new Error(err))); - }); - - const rootTestFolder = path.join(settings.root, 'src/tests/frontend/'); - - app.get('/tests/frontend/index.html', (req:any, res:any) => { - res.redirect(['./', ...req.url.split('?').slice(1)].join('?')); - }); - - // The regexp /[\d\D]{0,}/ is equivalent to the regexp /.*/. The Express route path used here - // uses the more verbose /[\d\D]{0,}/ pattern instead of /.*/ because path-to-regexp v0.1.7 (the - // version used with Express v4.x) interprets '.' and '*' differently than regexp. - app.get('/tests/frontend/:file([\\d\\D]{0,})', (req:any, res:any, next:Function) => { - (async () => { - let file = sanitizePathname(req.params.file); - if (['', '.', './'].includes(file)) file = 'index.html'; - res.sendFile(path.join(rootTestFolder, file)); - })().catch((err) => next(err || new Error(err))); - }); - - app.get('/tests/frontend', (req:any, res:any) => { - res.redirect(['./frontend/', ...req.url.split('?').slice(1)].join('?')); - }); -}; diff --git a/src/node/hooks/express/tokenTransfer.ts b/src/node/hooks/express/tokenTransfer.ts new file mode 100644 index 000000000..9a6bb25f1 --- /dev/null +++ b/src/node/hooks/express/tokenTransfer.ts @@ -0,0 +1,45 @@ +import {ArgsExpressType} from "../../types/ArgsExpressType"; +const db = require('../../db/DB'); +import crypto from 'crypto' + + +type TokenTransferRequest = { + token: string; + prefsHttp: string, + createdAt?: number; +} + +const tokenTransferKey = "tokenTransfer:"; + +export const expressCreateServer = (hookName:string, {app}:ArgsExpressType) => { + app.post('/tokenTransfer', async (req, res) => { + const token = req.body as TokenTransferRequest; + if (!token || !token.token) { + return res.status(400).send({error: 'Invalid request'}); + } + + const id = crypto.randomUUID() + token.createdAt = Date.now(); + + await db.set(`${tokenTransferKey}:${id}`, token) + res.send({id}); + }) + + app.get('/tokenTransfer/:token', async (req, res) => { + const id = req.params.token; + if (!id) { + return res.status(400).send({error: 'Invalid request'}); + } + + const tokenData = await db.get(`${tokenTransferKey}:${id}`); + if (!tokenData) { + return res.status(404).send({error: 'Token not found'}); + } + + const token = await db.get(`${tokenTransferKey}:${id}`) + + res.cookie('token', tokenData.token, {path: '/', maxAge: 1000*60*60*24*365}); + res.cookie('prefsHttp', tokenData.prefsHttp, {path: '/', maxAge: 1000*60*60*24*365}); + res.send(token); + }) +} diff --git a/src/node/hooks/express/webaccess.ts b/src/node/hooks/express/webaccess.ts index cb6884dc3..031224f68 100644 --- a/src/node/hooks/express/webaccess.ts +++ b/src/node/hooks/express/webaccess.ts @@ -6,9 +6,9 @@ import {SocketClientRequest} from "../../types/SocketClientRequest"; import {WebAccessTypes} from "../../types/WebAccessTypes"; import {SettingsUser} from "../../types/SettingsUser"; const httpLogger = log4js.getLogger('http'); -const settings = require('../../utils/Settings'); +import settings from '../../utils/Settings'; const hooks = require('../../../static/js/pluginfw/hooks'); -const readOnlyManager = require('../../db/ReadOnlyManager'); +import readOnlyManager from '../../db/ReadOnlyManager'; hooks.deprecationNotices.authFailure = 'use the authnFailure and authzFailure hooks instead'; @@ -49,8 +49,21 @@ exports.userCanModify = (padId: string, req: SocketClientRequest) => { // Exported so that tests can set this to 0 to avoid unnecessary test slowness. exports.authnFailureDelayMs = 1000; +const staticResources = [ + /^\/padbootstrap-[a-zA-Z0-9]+\.min\.js$/, + /^\/timeSliderBootstrap-[a-zA-Z0-9]+\.min\.js$/, + /^\/manifest.json$/ +] + const checkAccess = async (req:any, res:any, next: Function) => { const requireAdmin = req.path.toLowerCase().startsWith('/admin-auth'); + for (const staticResource of staticResources) { + if (req.path.match(staticResource)) { + console.log(`Loading [${staticResource}] ${req.path}`); + return next() + } + } + // /////////////////////////////////////////////////////////////////////////////////////////////// // Step 1: Check the preAuthorize hook for early permit/deny (permit is only allowed for non-admin @@ -177,6 +190,10 @@ const checkAccess = async (req:any, res:any, next: Function) => { res.status(401).send('Authentication Required'); return; } + if (ctx.username === '__proto__' || ctx.username === 'constructor' || ctx.username === 'prototype') { + res.end(403); + return; + } settings.users[ctx.username].username = ctx.username; // Make a shallow copy so that the password property can be deleted (to prevent it from // appearing in logs or in the database) without breaking future authentication attempts. diff --git a/src/node/hooks/i18n.ts b/src/node/hooks/i18n.ts index 500f1f887..a59de913f 100644 --- a/src/node/hooks/i18n.ts +++ b/src/node/hooks/i18n.ts @@ -4,12 +4,12 @@ import type {MapArrayType} from "../types/MapType"; import {I18nPluginDefs} from "../types/I18nPluginDefs"; const languages = require('languages4translatewiki'); -const fs = require('fs'); -const path = require('path'); -const _ = require('underscore'); -const pluginDefs = require('../../static/js/pluginfw/plugin_defs.js'); -const existsSync = require('../utils/path_exists'); -const settings = require('../utils/Settings'); +import fs from 'fs'; +import path from 'path'; +import _ from 'underscore'; +const pluginDefs = require('../../static/js/pluginfw/plugin_defs'); +import existsSync from '../utils/path_exists'; +import settings from '../utils/Settings'; // returns all existing messages merged together and grouped by langcode // {es: {"foo": "string"}, en:...} @@ -73,7 +73,7 @@ const getAllLocales = () => { 'for Customization for Administrators, under Localization.'); if (settings.customLocaleStrings) { if (typeof settings.customLocaleStrings !== 'object') throw wrongFormatErr; - _.each(settings.customLocaleStrings, (overrides:MapArrayType , langcode:string) => { + _.each(settings.customLocaleStrings, (overrides , langcode) => { if (typeof overrides !== 'object') throw wrongFormatErr; _.each(overrides, (localeString:string|object, key:string) => { if (typeof localeString !== 'string') throw wrongFormatErr; diff --git a/src/node/metrics.ts b/src/node/metrics.ts new file mode 100644 index 000000000..5afc72654 --- /dev/null +++ b/src/node/metrics.ts @@ -0,0 +1,11 @@ +import Prometheus from 'prom-client'; + +export const metrics = { + 'cpu': new Prometheus.Gauge({ name: 'nodejs_cpu_gauge', help: 'gauge for nodejs cpu' ,labelNames: ['type'] }), + 'memory_process': new Prometheus.Gauge({ name: 'nodejs_memory_process_gauge', help: 'gauge for nodejs memory_process' ,labelNames: ['type'] }), + 'memory_physical': new Prometheus.Gauge({ name: 'nodejs_memory_physical_gauge', help: 'gauge for nodejs_memory_physical' ,labelNames: ['type'] }), + 'eventloop_latency': new Prometheus.Gauge({ name: 'nodejs_eventloop_latency_gauge' , help: 'gauge for nodejs_eventloop_latency' ,labelNames: ['type'] }), + 'gc': new Prometheus.Gauge({ name: 'nodejs_gc_gauge' , help: 'gause for nodejs_gc' ,labelNames: ['type']}), + 'gc_duration': new Prometheus.Summary({ name: 'nodejs_gc_duration' , help: 'gause for nodejs_gc_duration', percentiles: [ 0.5, 0.75, 0.95 ] }), + 'http_duration': new Prometheus.Summary({ name: 'http_duration', help: 'summary for http_duration', percentiles: [ 0.5, 0.75, 0.95 ] ,labelNames: ['url'] }) +}; diff --git a/src/node/prometheus.ts b/src/node/prometheus.ts new file mode 100644 index 000000000..8b0ac7598 --- /dev/null +++ b/src/node/prometheus.ts @@ -0,0 +1,38 @@ +import client from 'prom-client'; + +const db = require('./db/DB').db; +const PadMessageHandler = require('./handler/PadMessageHandler'); + +const register = new client.Registry(); +const gaugeDB = new client.Gauge({ + name: 'ueberdb_stats', + help: 'ueberdb stats', + labelNames: ['type'], +}); +register.registerMetric(gaugeDB); + +const totalUsersGauge = new client.Gauge({ + name: 'etherpad_total_users', + help: 'Total number of users', +}); +register.registerMetric(totalUsersGauge); + +const activePadsGauge = new client.Gauge({ + name: 'etherpad_active_pads', + help: 'Total number of active pads', +}); +register.registerMetric(activePadsGauge); + +client.collectDefaultMetrics({register}); + +const monitor = async function () { + for (const [metric, value] of Object.entries(db.metrics)) { + if (typeof value !== 'number') continue; + gaugeDB.set({type: metric}, value); + } + activePadsGauge.set(PadMessageHandler.getActivePadCountFromSessionInfos()); + totalUsersGauge.set(PadMessageHandler.getTotalActiveUsers()); + return register; +}; + +export default monitor; diff --git a/src/node/security/OAuth2Provider.ts b/src/node/security/OAuth2Provider.ts index e21211350..6c069359d 100644 --- a/src/node/security/OAuth2Provider.ts +++ b/src/node/security/OAuth2Provider.ts @@ -1,14 +1,13 @@ import {ArgsExpressType} from "../types/ArgsExpressType"; import Provider, {Account, Configuration} from 'oidc-provider'; -import {generateKeyPair, exportJWK, KeyLike} from 'jose' +import {generateKeyPair, exportJWK, CryptoKey} from 'jose' import MemoryAdapter from "./OIDCAdapter"; import path from "path"; -const settings = require('../utils/Settings'); +import settings from '../utils/Settings'; import {IncomingForm} from 'formidable' -import express, {Request, Response} from 'express'; +import express from 'express'; import {format} from 'url' import {ParsedUrlQuery} from "node:querystring"; -import {Http2ServerRequest, Http2ServerResponse} from "node:http2"; import {MapArrayType} from "../types/MapType"; const configuration: Configuration = { @@ -30,7 +29,7 @@ const configuration: Configuration = { if(account === undefined) { return undefined } - if (account.is_admin) { + if (account.is_admin ) { return { accountId: id, claims: () => ({ @@ -64,14 +63,16 @@ const configuration: Configuration = { }; -export let publicKeyExported: KeyLike|null -export let privateKeyExported: KeyLike|null +export let publicKeyExported: CryptoKey|null +export let privateKeyExported: CryptoKey|null /* This function is used to initialize the OAuth2 provider */ export const expressCreateServer = async (hookName: string, args: ArgsExpressType, cb: Function) => { - const {privateKey, publicKey} = await generateKeyPair('RS256'); + const {privateKey, publicKey} = await generateKeyPair('RS256', { + extractable: true + }); const privateKeyJWK = await exportJWK(privateKey); publicKeyExported = publicKey privateKeyExported = privateKey @@ -137,7 +138,7 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp } else if (token.kind === "ClientCredentials") { let extraParams: MapArrayType = {} - settings.sso.clients + settings.sso.clients && settings.sso.clients .filter((client:any) => client.client_id === token.clientId) .forEach((client:any) => { if(client.extraParams !== undefined) { @@ -153,7 +154,7 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp }); - args.app.post('/interaction/:uid', async (req: Http2ServerRequest, res: Http2ServerResponse, next:Function) => { + args.app.post('/interaction/:uid', async (req, res, next) => { const formid = new IncomingForm(); try { // @ts-ignore @@ -226,7 +227,7 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp }) - args.app.get('/interaction/:uid', async (req: Request, res: Response, next: Function) => { + args.app.get('/interaction/:uid', async (req, res, next) => { try { const { uid, prompt, params, session, diff --git a/src/node/server.ts b/src/node/server.ts index f96db3ab1..331136746 100755 --- a/src/node/server.ts +++ b/src/node/server.ts @@ -29,7 +29,7 @@ import pkg from '../package.json'; import {checkForMigration} from "../static/js/pluginfw/installer"; import axios from "axios"; -const settings = require('./utils/Settings'); +import settings from './utils/Settings'; let wtfnode: any; if (settings.dumpOnUncleanExit) { @@ -42,6 +42,10 @@ if (settings.dumpOnUncleanExit) { const addProxyToAxios = (url: URL) => { axios.defaults.proxy = { host: url.hostname, + auth: { + username: url.username, + password: url.password, + }, port: Number(url.port), protocol: url.protocol, } @@ -64,17 +68,17 @@ if (process.env['https_proxy']) { * early check for version compatibility before calling * any modules that require newer versions of NodeJS */ -const NodeVersion = require('./utils/NodeVersion'); -NodeVersion.enforceMinNodeVersion(pkg.engines.node.replace(">=", "")); -NodeVersion.checkDeprecationStatus(pkg.engines.node.replace(">=", ""), '2.1.0'); +import {enforceMinNodeVersion, checkDeprecationStatus} from './utils/NodeVersion'; +enforceMinNodeVersion(pkg.engines.node.replace(">=", "")); +checkDeprecationStatus(pkg.engines.node.replace(">=", ""), '2.1.0'); -const UpdateCheck = require('./utils/UpdateCheck'); +import {check} from './utils/UpdateCheck'; const db = require('./db/DB'); const express = require('./hooks/express'); const hooks = require('../static/js/pluginfw/hooks'); const pluginDefs = require('../static/js/pluginfw/plugin_defs'); const plugins = require('../static/js/pluginfw/plugins'); -const {Gate} = require('./utils/promises'); +import {Gate} from './utils/promises'; const stats = require('./stats') const logger = log4js.getLogger('server'); @@ -92,7 +96,7 @@ const State = { let state = State.INITIAL; -const removeSignalListener = (signal: NodeJS.Signals, listener: NodeJS.SignalsListener) => { +const removeSignalListener = (signal: NodeJS.Signals, listener: any) => { logger.debug(`Removing ${signal} listener because it might interfere with shutdown tasks. ` + `Function code:\n${listener.toString()}\n` + `Current stack:\n${new Error()!.stack!.split('\n').slice(1).join('\n')}`); @@ -100,7 +104,7 @@ const removeSignalListener = (signal: NodeJS.Signals, listener: NodeJS.SignalsLi }; -let startDoneGate: { resolve: () => void; } +let startDoneGate: Gate exports.start = async () => { switch (state) { case State.INITIAL: @@ -124,8 +128,8 @@ exports.start = async () => { startDoneGate = new Gate(); state = State.STARTING; try { - // Check if Etherpad version is up-to-date - UpdateCheck.check(); + // Check if the Etherpad version is up to date + check(); // @ts-ignore stats.gauge('memoryUsage', () => process.memoryUsage().rss); @@ -181,12 +185,14 @@ exports.start = async () => { } catch (err) { logger.error('Error occurred while starting Etherpad'); state = State.STATE_TRANSITION_FAILED; + // @ts-ignore startDoneGate.resolve(); return await exports.exit(err); } logger.info('Etherpad is running'); state = State.RUNNING; + // @ts-ignore startDoneGate.resolve(); // Return the HTTP server to make it easier to write tests. @@ -228,11 +234,13 @@ exports.stop = async () => { } catch (err) { logger.error('Error occurred while stopping Etherpad'); state = State.STATE_TRANSITION_FAILED; + // @ts-ignore stopDoneGate.resolve(); return await exports.exit(err); } logger.info('Etherpad stopped'); state = State.STOPPED; + // @ts-ignore stopDoneGate.resolve(); }; diff --git a/src/node/types/ArgsExpressType.ts b/src/node/types/ArgsExpressType.ts index 5c0675b97..996aee757 100644 --- a/src/node/types/ArgsExpressType.ts +++ b/src/node/types/ArgsExpressType.ts @@ -1,5 +1,10 @@ +import {Express} from "express"; +import {MapArrayType} from "./MapType"; +import {SettingsType} from "../utils/Settings"; + export type ArgsExpressType = { - app:any, + app:Express, io: any, server:any -} \ No newline at end of file + settings: SettingsType +} diff --git a/src/node/types/PadType.ts b/src/node/types/PadType.ts index b344ed8c5..f35b51361 100644 --- a/src/node/types/PadType.ts +++ b/src/node/types/PadType.ts @@ -1,10 +1,11 @@ import {MapArrayType} from "./MapType"; +import AttributePool from "../../static/js/AttributePool"; export type PadType = { id: string, - apool: ()=>APool, + apool: ()=>AttributePool, atext: AText, - pool: APool, + pool: AttributePool, getInternalRevisionAText: (text:number|string)=>Promise, getValidRevisionRange: (fromRev: string, toRev: string)=>PadRange, getRevisionAuthor: (rev: number)=>Promise, @@ -35,6 +36,7 @@ export type APool = { clone: ()=>APool, check: ()=>Promise, eachAttrib: (callback: (key: string, value: any)=>void)=>void, + getAttrib: (key: number)=>any, } diff --git a/src/node/types/Revision.ts b/src/node/types/Revision.ts new file mode 100644 index 000000000..8a9d65e29 --- /dev/null +++ b/src/node/types/Revision.ts @@ -0,0 +1,9 @@ +import {AChangeSet} from "./PadType"; + +export type Revision = { + changeset: AChangeSet, + meta: { + author: string, + timestamp: number, + } +} diff --git a/src/node/utils/Abiword.ts b/src/node/utils/Abiword.ts index c0937fcd9..fd17497ed 100644 --- a/src/node/utils/Abiword.ts +++ b/src/node/utils/Abiword.ts @@ -24,7 +24,7 @@ import {AsyncQueueTask} from "../types/AsyncQueueTask"; const spawn = require('child_process').spawn; const async = require('async'); -const settings = require('./Settings'); +import settings from './Settings'; const os = require('os'); // on windows we have to spawn a process for each convertion, diff --git a/src/node/utils/AbsolutePaths.ts b/src/node/utils/AbsolutePaths.ts index c257440a1..6423ae4d7 100644 --- a/src/node/utils/AbsolutePaths.ts +++ b/src/node/utils/AbsolutePaths.ts @@ -18,9 +18,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const log4js = require('log4js'); -const path = require('path'); -const _ = require('underscore'); +import log4js from 'log4js'; +import path from 'path'; +import _ from 'underscore'; const absPathLogger = log4js.getLogger('AbsolutePaths'); @@ -74,7 +74,7 @@ const popIfEndsWith = (stringArray: string[], lastDesiredElements: string[]): st * @return {string} The identified absolute base path. If such path cannot be * identified, prints a log and exits the application. */ -exports.findEtherpadRoot = () => { +export const findEtherpadRoot = () => { if (etherpadRoot != null) { return etherpadRoot; } @@ -130,12 +130,12 @@ exports.findEtherpadRoot = () => { * it is returned unchanged. Otherwise it is interpreted * relative to exports.root. */ -exports.makeAbsolute = (somePath: string) => { +export const makeAbsolute = (somePath: string) => { if (path.isAbsolute(somePath)) { return somePath; } - const rewrittenPath = path.join(exports.findEtherpadRoot(), somePath); + const rewrittenPath = path.join(findEtherpadRoot(), somePath); absPathLogger.debug(`Relative path "${somePath}" can be rewritten to "${rewrittenPath}"`); return rewrittenPath; @@ -149,7 +149,7 @@ exports.makeAbsolute = (somePath: string) => { * a subdirectory of the base one * @return {boolean} */ -exports.isSubdir = (parent: string, arbitraryDir: string): boolean => { +export const isSubdir = (parent: string, arbitraryDir: string): boolean => { // modified from: https://stackoverflow.com/questions/37521893/determine-if-a-path-is-subdirectory-of-another-in-node-js#45242825 const relative = path.relative(parent, arbitraryDir); return !!relative && !relative.startsWith('..') && !path.isAbsolute(relative); diff --git a/src/node/utils/Cleanup.ts b/src/node/utils/Cleanup.ts new file mode 100644 index 000000000..30967654f --- /dev/null +++ b/src/node/utils/Cleanup.ts @@ -0,0 +1,169 @@ +'use strict' + +import {AChangeSet} from "../types/PadType"; +import {Revision} from "../types/Revision"; + +import {timesLimit, firstSatisfies} from './promises'; +const padManager = require('ep_etherpad-lite/node/db/PadManager'); +const db = require('ep_etherpad-lite/node/db/DB'); +const Changeset = require('ep_etherpad-lite/static/js/Changeset'); +const padMessageHandler = require('ep_etherpad-lite/node/handler/PadMessageHandler'); +import log4js from 'log4js'; +const logger = log4js.getLogger('cleanup'); + + +export const deleteAllRevisions = async (padID: string): Promise => { + + const randomPadId = padID + 'aertdfdf' + Math.random().toString(10) + + let pad = await padManager.getPad(padID); + await pad.copyPadWithoutHistory(randomPadId, false); + pad = await padManager.getPad(randomPadId); + await pad.copyPadWithoutHistory(padID, true); + await pad.remove(); +} + +const createRevision = async (aChangeset: AChangeSet, timestamp: number, isKeyRev: boolean, authorId: string, atext: any, pool: any) => { + + if (authorId !== '') pool.putAttrib(['author', authorId]); + + return { + changeset: aChangeset, + meta: { + author: authorId, + timestamp: timestamp, + ...isKeyRev ? { + pool: pool, + atext: atext, + } : {}, + }, + }; +} + +export const deleteRevisions = async (padId: string, keepRevisions: number): Promise => { + + logger.debug('Start cleanup revisions', padId) + + let pad = await padManager.getPad(padId); + await pad.check() + + logger.debug('Initial pad is valid') + + if (pad.head <= keepRevisions) { + logger.debug('Pad has not enough revisions') + return false + } + + padMessageHandler.kickSessionsFromPad(padId) + + const cleanupUntilRevision = pad.head - keepRevisions + logger.debug('Composing changesets: ', cleanupUntilRevision) + const changeset = await padMessageHandler.composePadChangesets(pad, 0, cleanupUntilRevision + 1) + + const revisions: Revision[] = []; + + await timesLimit(keepRevisions + 1, 500, async (i: number) => { + const rev = i + cleanupUntilRevision + revisions[rev] = await pad.getRevision(rev) + }); + + logger.debug('Loaded revisions: ', revisions.length) + + await timesLimit(pad.head + 1, 500, async (i: string) => { + await db.remove(`pad:${padId}:revs:${i}`, null); + }); + + let padContent = await db.get(`pad:${padId}`) + padContent.head = keepRevisions + if (padContent.savedRevisions) { + let newSavedRevisions = [] + + for (let i = 0; i < padContent.savedRevisions.length; i++) { + if (padContent.savedRevisions[i].revNum > cleanupUntilRevision) { + padContent.savedRevisions[i].revNum = padContent.savedRevisions[i].revNum - cleanupUntilRevision + newSavedRevisions.push(padContent.savedRevisions[i]) + } + } + padContent.savedRevisions = newSavedRevisions + } + await db.set(`pad:${padId}`, padContent); + + let newAText = Changeset.makeAText('\n'); + let pool = pad.apool() + + newAText = Changeset.applyToAText(changeset, newAText, pool); + + const revision = await createRevision( + changeset, + revisions[cleanupUntilRevision].meta.timestamp, + 0 === pad.getKeyRevisionNumber(0), + '', + newAText, + pool + ); + + const p: Promise[] = []; + + p.push(db.set(`pad:${padId}:revs:0`, revision)) + + p.push(timesLimit(keepRevisions, 500, async (i: number) => { + const rev = i + cleanupUntilRevision + 1 + const newRev = rev - cleanupUntilRevision; + + newAText = Changeset.applyToAText(revisions[rev].changeset, newAText, pool); + + const revision = await createRevision( + revisions[rev].changeset, + revisions[rev].meta.timestamp, + newRev === pad.getKeyRevisionNumber(newRev), + revisions[rev].meta.author, + newAText, + pool + ); + + await db.set(`pad:${padId}:revs:${newRev}`, revision); + })); + + await Promise.all(p) + + logger.debug('Finished migration. Checking pad now') + + padManager.unloadPad(padId); + + let newPad = await padManager.getPad(padId); + await newPad.check(); + + return true +} + +export const checkTodos = async () => { + await new Promise(resolve => setTimeout(resolve, 5000)); + + // TODO: Move to settings + const settings = { + minHead: 100, + keepRevisions: 100, + minAge: 1,//1000 * 60 * 60 * 24, + } + + await Promise.all((await padManager.listAllPads()).padIDs.map(async (padId: string) => { + // TODO: Handle concurrency + const pad = await padManager.getPad(padId); + + const revisionDate = await pad.getRevisionDate(pad.getHeadRevisionNumber()) + + if (pad.head < settings.minHead || padMessageHandler.padUsersCount(padId) > 0 || Date.now() < revisionDate + settings.minAge) { + return + } + + try { + const result = await deleteRevisions(padId, settings.keepRevisions) + if (result) { + logger.info('successful cleaned up pad: ', padId) + } + } catch (err: any) { + logger.error(`Error in pad ${padId}: ${err.stack || err}`); + return; + } + })); +} diff --git a/src/node/utils/Cli.ts b/src/node/utils/Cli.ts index 1b2938196..6a6c0974f 100644 --- a/src/node/utils/Cli.ts +++ b/src/node/utils/Cli.ts @@ -21,28 +21,38 @@ */ // An object containing the parsed command-line options -exports.argv = {}; -const argv = process.argv.slice(2); -let arg, prevArg; +export const argv: Record = {}; + +const argvInternal = process.argv.slice(2); +let arg, prevArg = ""; // Loop through args -for (let i = 0; i < argv.length; i++) { - arg = argv[i]; +for (let i = 0; i < argvInternal.length; i++) { + arg = argvInternal[i]; // Override location of settings.json file - if (prevArg === '--settings' || prevArg === '-s') { - exports.argv.settings = arg; + if (prevArg && prevArg === '--settings' || prevArg === '-s') { + console.log("Using specified settings from command line"); + argv.settings = arg; } // Override location of credentials.json file - if (prevArg === '--credentials') { - exports.argv.credentials = arg; + if (prevArg && prevArg === '--credentials') { + console.log("Using specified credentials from command line"); + argv.credentials = arg; } // Override location of settings.json file - if (prevArg === '--sessionkey') { - exports.argv.sessionkey = arg; + if (prevArg && prevArg === '--sessionkey') { + console.log("Using specified session key from command line"); + argv.sessionkey = arg; + } + + // Override location of APIKEY.txt file + if (prevArg && prevArg === '--apikey') { + console.log("Using specified API key from command line"); + argv.apikey = arg; } prevArg = arg; diff --git a/src/node/utils/ExportHelper.ts b/src/node/utils/ExportHelper.ts index f3a438e86..4c29534f4 100644 --- a/src/node/utils/ExportHelper.ts +++ b/src/node/utils/ExportHelper.ts @@ -19,8 +19,9 @@ * limitations under the License. */ -const AttributeMap = require('../../static/js/AttributeMap'); -const Changeset = require('../../static/js/Changeset'); +import AttributeMap from '../../static/js/AttributeMap'; +import AttributePool from "../../static/js/AttributePool"; +import {deserializeOps, splitAttributionLines, subattribution} from '../../static/js/Changeset'; const { checkValidRev } = require('./checkValidRev'); /* @@ -30,7 +31,7 @@ exports.getPadPlainText = (pad: { getInternalRevisionAText: (arg0: any) => any; const _analyzeLine = exports._analyzeLine; const atext = ((revNum !== undefined) ? pad.getInternalRevisionAText(checkValidRev(revNum)) : pad.atext); const textLines = atext.text.slice(0, -1).split('\n'); - const attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); + const attribLines = splitAttributionLines(atext.attribs, atext.text); const apool = pad.pool; const pieces = []; @@ -51,14 +52,14 @@ type LineModel = { [id:string]:string|number|LineModel } -exports._analyzeLine = (text:string, aline: LineModel, apool: Function) => { +exports._analyzeLine = (text:string, aline: string, apool: AttributePool) => { const line: LineModel = {}; // identify list let lineMarker = 0; line.listLevel = 0; if (aline) { - const [op] = Changeset.deserializeOps(aline); + const [op] = deserializeOps(aline); if (op != null) { const attribs = AttributeMap.fromString(op.attribs, apool); let listType = attribs.get('list'); @@ -78,7 +79,7 @@ exports._analyzeLine = (text:string, aline: LineModel, apool: Function) => { } if (lineMarker) { line.text = text.substring(1); - line.aline = Changeset.subattribution(aline, 1); + line.aline = subattribution(aline, 1); } else { line.text = text; line.aline = aline; diff --git a/src/node/utils/ExportHtml.ts b/src/node/utils/ExportHtml.ts index 3b84c4380..29b171c8f 100644 --- a/src/node/utils/ExportHtml.ts +++ b/src/node/utils/ExportHtml.ts @@ -18,7 +18,7 @@ import {MapArrayType} from "../types/MapType"; * limitations under the License. */ -const Changeset = require('../../static/js/Changeset'); +import {deserializeOps, splitAttributionLines, subattribution} from '../../static/js/Changeset'; const attributes = require('../../static/js/attributes'); const padManager = require('../db/PadManager'); const _ = require('underscore'); @@ -27,7 +27,9 @@ const hooks = require('../../static/js/pluginfw/hooks'); const eejs = require('../eejs'); const _analyzeLine = require('./ExportHelper')._analyzeLine; const _encodeWhitespace = require('./ExportHelper')._encodeWhitespace; -const padutils = require('../../static/js/pad_utils').padutils; +import padutils from "../../static/js/pad_utils"; +import {StringIterator} from "../../static/js/StringIterator"; +import {StringAssembler} from "../../static/js/StringAssembler"; const getPadHTML = async (pad: PadType, revNum: string) => { let atext = pad.atext; @@ -44,7 +46,7 @@ const getPadHTML = async (pad: PadType, revNum: string) => { const getHTMLFromAtext = async (pad:PadType, atext: AText, authorColors?: string[]) => { const apool = pad.apool(); const textLines = atext.text.slice(0, -1).split('\n'); - const attribLines = Changeset.splitAttributionLines(atext.attribs, atext.text); + const attribLines = splitAttributionLines(atext.attribs, atext.text); const tags = ['h1', 'h2', 'strong', 'em', 'u', 's']; const props = ['heading1', 'heading2', 'bold', 'italic', 'underline', 'strikethrough']; @@ -80,6 +82,7 @@ const getHTMLFromAtext = async (pad:PadType, atext: AText, authorColors?: string css += ' + + + + + + + + + + +
+
+ + + + +
+ + + +
+ + + + + + + +
+ +
+ +
+

+ You do not have permission to access this pad +

+
+ + +

+
+ Loading... +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
{ setSearchParams({ ...searchParams, @@ -112,19 +214,19 @@ export const PadPage = ()=>{ ascending: !searchParams.ascending }) }}>{ - setSearchParams({ - ...searchParams, - sortBy: 'lastEdited', - ascending: !searchParams.ascending - }) - }}> { setSearchParams({ ...searchParams, sortBy: 'userCount', ascending: !searchParams.ascending }) + }}>{ + setSearchParams({ + ...searchParams, + sortBy: 'lastEdited', + ascending: !searchParams.ascending + }) }}> { setSearchParams({ @@ -136,7 +238,7 @@ export const PadPage = ()=>{
+ +
+
+
+ +
+ + + + + + +
+ + + 0 +
+ +
+
+
+

+ + █   +
+
+
+ +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
JavaScript license information
+ + + diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 2ce13f8f7..d28dd0d93 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -3,10 +3,10 @@ import { resolve } from 'path' import { defineConfig } from 'vite' export default defineConfig({ - base: '/views/', + base: '/views/', build: { outDir: resolve(__dirname, '../src/static/oidc'), - rollupOptions: { + rolldownOptions: { input: { main: resolve(__dirname, 'consent.html'), nested: resolve(__dirname, 'login.html'), @@ -14,4 +14,31 @@ export default defineConfig({ }, emptyOutDir: true, }, + server:{ + proxy:{ + '/static':{ + target: 'http://localhost:9001', + changeOrigin: true, + secure: false, + }, + '/views/manifest.json':{ + target: 'http://localhost:9001', + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/views/, ''), + }, + '/locales.json':{ + target: 'http://localhost:9001', + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/views/, ''), + }, + '/locales':{ + target: 'http://localhost:9001', + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/views/, ''), + }, + } + } }) diff --git a/var/.gitignore b/var/.gitignore index 1dea48383..d75cb9e42 100644 --- a/var/.gitignore +++ b/var/.gitignore @@ -1,3 +1,5 @@ sqlite.db minified* -installed_plugins.json \ No newline at end of file +installed_plugins.json +dirty.db +rusty.db