diff --git a/.github/workflows/build-hoppscotch-agent.yml b/.github/workflows/build-hoppscotch-agent.yml index f041f121834..0b935afbcd1 100644 --- a/.github/workflows/build-hoppscotch-agent.yml +++ b/.github/workflows/build-hoppscotch-agent.yml @@ -1,249 +1,670 @@ +name: Build Agent Self Host - AIO on: workflow_dispatch: inputs: version: description: Tag of the version to build required: true - + branch: + description: Branch to checkout + required: true + default: "main" + release_notes: + description: Release notes for the update + required: false + default: "PLACEHOLDER RELEASE NOTES" + build_macos_x64: + description: Build for macOS x64 + type: boolean + required: false + default: true + build_macos_arm64: + description: Build for macOS ARM64 + type: boolean + required: false + default: true + build_linux_deb: + description: Build Linux DEB package + type: boolean + required: false + default: true + build_linux_appimage: + description: Build Linux AppImage + type: boolean + required: false + default: true + build_windows_installer: + description: Build Windows MSI installer + type: boolean + required: false + default: true + build_windows_portable: + description: Build Windows portable executable + type: boolean + required: false + default: true env: CARGO_TERM_COLOR: always - jobs: - build: - strategy: - fail-fast: false - matrix: - platform: [macos-latest, ubuntu-22.04, windows-latest] - - runs-on: ${{ matrix.platform }} + build-macos-x86_64: + name: Build MacOS x86_64 (.dmg) + runs-on: macos-latest + if: ${{ inputs.build_macos_x64 }} defaults: run: shell: bash - + timeout-minutes: 60 steps: - - name: Checkout hoppscotch/hoppscotch - uses: actions/checkout@v3 - with: - repository: hoppscotch/hoppscotch - ref: main - token: ${{ secrets.CHECKOUT_GITHUB_TOKEN }} - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 20 - - - name: Setup pnpm - uses: pnpm/action-setup@v2 - with: - version: 9 - - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - - name: Install Rust targets (Mac) - if: matrix.platform == 'macos-latest' - run: | - rustup target add aarch64-apple-darwin - rustup target add x86_64-apple-darwin - - - name: Install additional tools (Linux) - if: matrix.platform == 'ubuntu-22.04' - run: | - # Install Tauri CLI (binary) - curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-x86_64-unknown-linux-gnu.tgz" - tar -xzf cargo-tauri-x86_64-unknown-linux-gnu.tgz - chmod +x cargo-tauri - sudo mv cargo-tauri /usr/local/bin/tauri - - # Install Trunk (binary) - curl -LO "https://github.com/thedodd/trunk/releases/download/v0.17.5/trunk-x86_64-unknown-linux-gnu.tar.gz" - tar -xzf trunk-x86_64-unknown-linux-gnu.tar.gz - chmod +x trunk - sudo mv trunk /usr/local/bin/ - - - name: Install additional tools (Mac) - if: matrix.platform == 'macos-latest' - run: | - # Install Tauri CLI (binary) - mkdir __dist/ - cd __dist/ - curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-aarch64-apple-darwin.zip" - unzip cargo-tauri-aarch64-apple-darwin.zip - chmod +x cargo-tauri - sudo mv cargo-tauri /usr/local/bin/tauri - - - name: Install system dependencies (Ubuntu only) - if: matrix.platform == 'ubuntu-22.04' - run: | - sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.1-dev \ - build-essential \ - curl \ - wget \ - file \ - libxdo-dev \ - libssl-dev \ - libayatana-appindicator3-dev \ - librsvg2-dev - - - name: Setting up Windows Environment and injecting before bundle command (Windows only) - if: matrix.platform == 'windows-latest' - shell: bash - env: - WINDOWS_SIGN_COMMAND: trusted-signing-cli -e ${{ secrets.AZURE_ENDPOINT }} -a ${{ secrets.AZURE_CODE_SIGNING_NAME }} -c ${{ secrets.AZURE_CERT_PROFILE_NAME }} %1 - run: | - cd packages/hoppscotch-agent - # Inject signing command into main conf. - cat './src-tauri/tauri.conf.json' | jq '.bundle .windows += { "signCommand": env.WINDOWS_SIGN_COMMAND}' > './src-tauri/temp.json' && mv './src-tauri/temp.json' './src-tauri/tauri.conf.json' - # Inject signing command into portable conf. - cat './src-tauri/tauri.portable.conf.json' | jq '.bundle .windows += { "signCommand": env.WINDOWS_SIGN_COMMAND}' > './src-tauri/temp_portable.json' && mv './src-tauri/temp_portable.json' './src-tauri/tauri.portable.conf.json' - cargo install trusted-signing-cli@0.3.0 - - - name: Set platform-specific variables - run: | - if [ "${{ matrix.platform }}" = "ubuntu-22.04" ]; then - echo "target_arch=$(rustc -Vv | grep host | awk '{print $2}')" >> $GITHUB_ENV - echo "target_ext=" >> $GITHUB_ENV - echo "target_os_name=linux" >> $GITHUB_ENV - elif [ "${{ matrix.platform }}" = "windows-latest" ]; then - echo "target_arch=x86_64-pc-windows-msvc" >> $GITHUB_ENV - echo "target_ext=.exe" >> $GITHUB_ENV - echo "target_os_name=win" >> $GITHUB_ENV - elif [ "${{ matrix.platform }}" = "macos-latest" ]; then - echo "target_os_name=mac" >> $GITHUB_ENV - fi - - - name: Setup macOS code signing - if: matrix.platform == 'macos-latest' - env: - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - run: | - echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12 - security create-keychain -p $KEYCHAIN_PASSWORD build.keychain - security default-keychain -s build.keychain - security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain - security import certificate.p12 -k build.keychain -P $APPLE_CERTIFICATE_PASSWORD -T /usr/bin/codesign - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain - - - name: Cache Rust dependencies - uses: actions/cache@v3 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install dependencies - shell: bash - run: | - cd packages/hoppscotch-agent - pnpm install --filter hoppscotch-agent - - - name: Build Tauri app (Linux) - if: matrix.platform == 'ubuntu-22.04' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} - TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} - run: | - cd packages/hoppscotch-agent - pnpm tauri build --verbose -b deb -b appimage -b updater - - - name: Build Tauri app (Mac) - if: matrix.platform == 'macos-latest' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} - TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - run: | - cd packages/hoppscotch-agent - pnpm tauri build --verbose --target x86_64-apple-darwin - pnpm tauri build --verbose --target aarch64-apple-darwin - - - name: Build Tauri app (Windows) - if: matrix.platform == 'windows-latest' - shell: powershell - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} - TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - run: | - cd packages/hoppscotch-agent - # Build the portable version first and move it. - # This way the next build will regenerate `hoppscotch-agent.exe`. - pnpm tauri build --verbose --config src-tauri/tauri.portable.conf.json -- --no-default-features --features portable - Rename-Item -Path "src-tauri/target/release/hoppscotch-agent.exe" -NewName "hoppscotch-agent-portable.exe" - - # Build the installer version. - pnpm tauri build --verbose -b msi -b updater - - - name: Zip portable executable (Windows) - if: matrix.platform == 'windows-latest' - shell: powershell - run: | - Compress-Archive -Path "packages/hoppscotch-agent/src-tauri/target/release/hoppscotch-agent-portable.exe" -DestinationPath "packages/hoppscotch-agent/src-tauri/target/release/Hoppscotch_Agent_win_x64_portable.zip" - - - name: Prepare artifacts - shell: bash - run: | - mkdir artifacts - mkdir artifacts/sigs - if [ "${{ matrix.platform }}" = "ubuntu-22.04" ]; then - mv packages/hoppscotch-agent/src-tauri/target/release/bundle/appimage/*.AppImage artifacts/Hoppscotch_Agent_linux_x64.AppImage - mv packages/hoppscotch-agent/src-tauri/target/release/bundle/appimage/*.AppImage.sig artifacts/sigs/Hoppscotch_Agent_linux_x64.AppImage.sig - mv packages/hoppscotch-agent/src-tauri/target/release/bundle/deb/*.deb artifacts/Hoppscotch_Agent_linux_x64.deb - elif [ "${{ matrix.platform }}" = "macos-latest" ]; then + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Install Rust target + timeout-minutes: 5 + run: rustup target add x86_64-apple-darwin + - name: Install additional tools + timeout-minutes: 5 + run: | + mkdir __dist/ + cd __dist/ + curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-x86_64-apple-darwin.zip" + unzip cargo-tauri-x86_64-apple-darwin.zip + chmod +x cargo-tauri + sudo mv cargo-tauri /usr/local/bin/tauri + - name: Import Code-Signing Certificates + uses: apple-actions/import-codesign-certs@v3 + with: + p12-file-base64: ${{ secrets.HOPPSCOTCH_APPLE_CERTIFICATE }} + p12-password: ${{ secrets.HOPPSCOTCH_APPLE_CERTIFICATE_PASSWORD }} + keychain-password: ${{ secrets.KEYCHAIN_PASSWORD }} + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-x86-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} + APPLE_ID: ${{ secrets.HOPPSCOTCH_APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.HOPPSCOTCH_APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.HOPPSCOTCH_APPLE_TEAM_ID }} + APPLE_SIGNING_IDENTITY: ${{ secrets.HOPPSCOTCH_APPLE_SIGNING_IDENTITY }} + run: | + cd packages/hoppscotch-agent + echo "Starting x86_64 build..." + pnpm tauri build --verbose --target x86_64-apple-darwin + echo "Build completed" + - name: Prepare artifacts + run: | + mkdir -p artifacts/{sigs,updaters,shas} mv packages/hoppscotch-agent/src-tauri/target/x86_64-apple-darwin/release/bundle/dmg/*_x64.dmg artifacts/Hoppscotch_Agent_mac_x64.dmg - mv packages/hoppscotch-agent/src-tauri/target/x86_64-apple-darwin/release/bundle/macos/*.app.tar.gz artifacts/Hoppscotch_Agent_mac_update_x64.tar.gz + mv packages/hoppscotch-agent/src-tauri/target/x86_64-apple-darwin/release/bundle/macos/*.app.tar.gz artifacts/updaters/Hoppscotch_Agent_mac_update_x64.tar.gz mv packages/hoppscotch-agent/src-tauri/target/x86_64-apple-darwin/release/bundle/macos/*.app.tar.gz.sig artifacts/sigs/Hoppscotch_Agent_mac_update_x64.tar.gz.sig + - name: Generate checksums + timeout-minutes: 2 + run: | + cd artifacts + for file in *; do + if [ -f "$file" ]; then + shasum -a 256 "$file" > "shas/${file}.sha256" + fi + done + cd updaters + for file in *; do + if [ -f "$file" ]; then + shasum -a 256 "$file" > "../shas/${file}.sha256" + fi + done + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-macos-x86_64 + path: artifacts/* + build-macos-aarch64: + name: Build MacOS ARM64 (.dmg) + runs-on: macos-latest + if: ${{ inputs.build_macos_arm64 }} + defaults: + run: + shell: bash + timeout-minutes: 60 + steps: + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Install Rust target + timeout-minutes: 5 + run: rustup target add aarch64-apple-darwin + - name: Install additional tools + timeout-minutes: 5 + run: | + mkdir __dist/ + cd __dist/ + curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-aarch64-apple-darwin.zip" + unzip cargo-tauri-aarch64-apple-darwin.zip + chmod +x cargo-tauri + sudo mv cargo-tauri /usr/local/bin/tauri + - name: Import Code-Signing Certificates + uses: apple-actions/import-codesign-certs@v3 + with: + p12-file-base64: ${{ secrets.HOPPSCOTCH_APPLE_CERTIFICATE }} + p12-password: ${{ secrets.HOPPSCOTCH_APPLE_CERTIFICATE_PASSWORD }} + keychain-password: ${{ secrets.KEYCHAIN_PASSWORD }} + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-arm-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} + APPLE_ID: ${{ secrets.HOPPSCOTCH_APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.HOPPSCOTCH_APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.HOPPSCOTCH_APPLE_TEAM_ID }} + APPLE_SIGNING_IDENTITY: ${{ secrets.HOPPSCOTCH_APPLE_SIGNING_IDENTITY }} + run: | + cd packages/hoppscotch-agent + echo "Starting ARM64 build..." + pnpm tauri build --verbose --target aarch64-apple-darwin + echo "Build completed" + - name: Prepare artifacts + run: | + mkdir -p artifacts/{sigs,updaters,shas} mv packages/hoppscotch-agent/src-tauri/target/aarch64-apple-darwin/release/bundle/dmg/*_aarch64.dmg artifacts/Hoppscotch_Agent_mac_aarch64.dmg - mv packages/hoppscotch-agent/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz artifacts/Hoppscotch_Agent_mac_update_aarch64.tar.gz + mv packages/hoppscotch-agent/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz artifacts/updaters/Hoppscotch_Agent_mac_update_aarch64.tar.gz mv packages/hoppscotch-agent/src-tauri/target/aarch64-apple-darwin/release/bundle/macos/*.app.tar.gz.sig artifacts/sigs/Hoppscotch_Agent_mac_update_aarch64.tar.gz.sig - elif [ "${{ matrix.platform }}" = "windows-latest" ]; then + - name: Generate checksums + timeout-minutes: 2 + run: | + cd artifacts + for file in *; do + if [ -f "$file" ]; then + shasum -a 256 "$file" > "shas/${file}.sha256" + fi + done + cd updaters + for file in *; do + if [ -f "$file" ]; then + shasum -a 256 "$file" > "../shas/${file}.sha256" + fi + done + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-macos-arm64 + path: artifacts/* + build-linux-deb: + name: Build Linux x86_64 (.deb) + runs-on: ubuntu-22.04 + if: ${{ inputs.build_linux_deb }} + defaults: + run: + shell: bash + timeout-minutes: 60 + steps: + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Install system dependencies + timeout-minutes: 5 + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev \ + build-essential \ + curl \ + wget \ + file \ + libxdo-dev \ + libssl-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev + - name: Install additional tools + timeout-minutes: 5 + run: | + curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-x86_64-unknown-linux-gnu.tgz" + tar -xzf cargo-tauri-x86_64-unknown-linux-gnu.tgz + chmod +x cargo-tauri + sudo mv cargo-tauri /usr/local/bin/tauri + + curl -LO "https://github.com/thedodd/trunk/releases/download/v0.17.5/trunk-x86_64-unknown-linux-gnu.tar.gz" + tar -xzf trunk-x86_64-unknown-linux-gnu.tar.gz + chmod +x trunk + sudo mv trunk /usr/local/bin/ + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + run: | + cd packages/hoppscotch-agent + pnpm tauri build --verbose -b deb -b updater + - name: Prepare artifacts + run: | + mkdir -p artifacts/{sigs,shas} + mv packages/hoppscotch-agent/src-tauri/target/release/bundle/deb/*.deb artifacts/Hoppscotch_Agent_linux_x64.deb + - name: Generate checksums + run: | + cd artifacts + for file in *; do + if [ -f "$file" ]; then + sha256sum "$file" > "shas/${file}.sha256" + fi + done + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-linux-deb + path: artifacts/* + build-linux-appimage: + name: Build Linux x86_64 (.AppImage) + runs-on: ubuntu-22.04 + if: ${{ inputs.build_linux_appimage }} + defaults: + run: + shell: bash + timeout-minutes: 60 + steps: + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Install system dependencies + timeout-minutes: 5 + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev \ + build-essential \ + curl \ + wget \ + file \ + libxdo-dev \ + libssl-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev + - name: Install additional tools + timeout-minutes: 5 + run: | + curl -LO "https://github.com/tauri-apps/tauri/releases/download/tauri-cli-v2.0.1/cargo-tauri-x86_64-unknown-linux-gnu.tgz" + tar -xzf cargo-tauri-x86_64-unknown-linux-gnu.tgz + chmod +x cargo-tauri + sudo mv cargo-tauri /usr/local/bin/tauri + + curl -LO "https://github.com/thedodd/trunk/releases/download/v0.17.5/trunk-x86_64-unknown-linux-gnu.tar.gz" + tar -xzf trunk-x86_64-unknown-linux-gnu.tar.gz + chmod +x trunk + sudo mv trunk /usr/local/bin/ + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + run: | + cd packages/hoppscotch-agent + pnpm tauri build --verbose -b appimage -b updater + - name: Prepare artifacts + run: | + mkdir -p artifacts/{sigs,shas} + mv packages/hoppscotch-agent/src-tauri/target/release/bundle/appimage/*.AppImage artifacts/Hoppscotch_Agent_linux_x64.AppImage + mv packages/hoppscotch-agent/src-tauri/target/release/bundle/appimage/*.AppImage.sig artifacts/sigs/Hoppscotch_Agent_linux_x64.AppImage.sig + - name: Generate checksums + run: | + cd artifacts + for file in *; do + if [ -f "$file" ]; then + sha256sum "$file" > "shas/${file}.sha256" + fi + done + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-linux-appimage + path: artifacts/* + build-windows-installer: + name: Build Windows x86_64 (.msi) + runs-on: windows-latest + if: ${{ inputs.build_windows_installer }} + defaults: + run: + shell: bash + timeout-minutes: 60 + steps: + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Download trusted-signing-cli + shell: pwsh + run: | + $ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri "https://github.com/Levminer/trusted-signing-cli/releases/download/0.8.0/trusted-signing-cli.exe" -OutFile "trusted-signing-cli.exe" + Move-Item -Path "trusted-signing-cli.exe" -Destination "$env:GITHUB_WORKSPACE\trusted-signing-cli.exe" + echo "$env:GITHUB_WORKSPACE" | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8 + - name: Setting up Windows Environment + timeout-minutes: 20 + shell: bash + env: + WINDOWS_SIGN_COMMAND: trusted-signing-cli -e ${{ secrets.AZURE_ENDPOINT }} -a ${{ secrets.AZURE_CODE_SIGNING_NAME }} -c ${{ secrets.AZURE_CERT_PROFILE_NAME }} %1 + run: | + cd packages/hoppscotch-agent + cat './src-tauri/tauri.conf.json' | jq '.bundle .windows += { "signCommand": env.WINDOWS_SIGN_COMMAND}' > './src-tauri/temp.json' && mv './src-tauri/temp.json' './src-tauri/tauri.conf.json' + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + shell: bash + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + shell: powershell + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + run: | + cd packages/hoppscotch-agent + pnpm tauri build --verbose -b msi -b updater + - name: Prepare artifacts + shell: bash + run: | + mkdir -p artifacts/{sigs,shas} mv packages/hoppscotch-agent/src-tauri/target/release/bundle/msi/*_x64_en-US.msi artifacts/Hoppscotch_Agent_win_x64.msi mv packages/hoppscotch-agent/src-tauri/target/release/bundle/msi/*_x64_en-US.msi.sig artifacts/sigs/Hoppscotch_Agent_win_x64.msi.sig + - name: Generate checksums + shell: powershell + run: | + cd artifacts + Get-ChildItem -File | ForEach-Object { + $hash = Get-FileHash -Algorithm SHA256 $_.Name + $hash.Hash + " " + $_.Name | Out-File -Encoding UTF8 "shas/$($_.Name).sha256" + } + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-windows-installer + path: artifacts/* + build-windows-portable: + name: Build Windows x86_64 Portable + runs-on: windows-latest + if: ${{ inputs.build_windows_portable }} + defaults: + run: + shell: bash + timeout-minutes: 60 + steps: + - name: Checkout hoppscotch/hoppscotch + uses: actions/checkout@v3 + with: + repository: hoppscotch/hoppscotch + ref: ${{ inputs.branch }} + token: ${{ secrets.HOPPSCOTCH_GITHUB_CHECKOUT_TOKEN }} + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 20 + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.15.0 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - name: Download trusted-signing-cli + shell: pwsh + run: | + $ProgressPreference = 'SilentlyContinue' + Invoke-WebRequest -Uri "https://github.com/Levminer/trusted-signing-cli/releases/download/0.8.0/trusted-signing-cli.exe" -OutFile "trusted-signing-cli.exe" + Move-Item -Path "trusted-signing-cli.exe" -Destination "$env:GITHUB_WORKSPACE\trusted-signing-cli.exe" + echo "$env:GITHUB_WORKSPACE" | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8 + - name: Setting up Windows Environment + timeout-minutes: 20 + shell: bash + env: + WINDOWS_SIGN_COMMAND: trusted-signing-cli -e ${{ secrets.AZURE_ENDPOINT }} -a ${{ secrets.AZURE_CODE_SIGNING_NAME }} -c ${{ secrets.AZURE_CERT_PROFILE_NAME }} %1 + run: | + cd packages/hoppscotch-agent + cat './src-tauri/tauri.portable.conf.json' | jq '.bundle .windows += { "signCommand": env.WINDOWS_SIGN_COMMAND}' > './src-tauri/temp_portable.json' && mv './src-tauri/temp_portable.json' './src-tauri/tauri.portable.conf.json' + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Install dependencies + timeout-minutes: 15 + shell: bash + run: | + cd packages/hoppscotch-agent + pnpm install --filter hoppscotch-agent + - name: Build Tauri app + timeout-minutes: 30 + shell: powershell + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.AGENT_TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.AGENT_TAURI_SIGNING_PASSWORD }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + run: | + cd packages/hoppscotch-agent + pnpm tauri build --verbose --config src-tauri/tauri.portable.conf.json -- --no-default-features --features portable + - name: Sign portable executable + shell: powershell + env: + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} + AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} + run: | + cd packages/hoppscotch-agent + trusted-signing-cli -e ${{ secrets.AZURE_ENDPOINT }} -a ${{ secrets.AZURE_CODE_SIGNING_NAME }} -c ${{ secrets.AZURE_CERT_PROFILE_NAME }} "src-tauri/target/release/hoppscotch-agent.exe" + - name: Zip portable executable + shell: powershell + run: | + Compress-Archive -Path "packages/hoppscotch-agent/src-tauri/target/release/hoppscotch-agent.exe" -DestinationPath "packages/hoppscotch-agent/src-tauri/target/release/Hoppscotch_Agent_win_x64_portable.zip" + - name: Prepare artifacts + shell: bash + run: | + mkdir -p artifacts/{sigs,shas} mv packages/hoppscotch-agent/src-tauri/target/release/Hoppscotch_Agent_win_x64_portable.zip artifacts/Hoppscotch_Agent_win_x64_portable.zip - fi - - - name: Generate checksums (Linux) - if: matrix.platform == 'ubuntu-22.04' - run: | - cd artifacts - mkdir shas - for file in *; do - if [ -f "$file" ]; then - sha256sum "$file" > "shas/${file}.sha256" - fi - done - - - name: Generate checksums (Mac) - if: matrix.platform == 'macos-latest' - run: | - cd artifacts - mkdir shas - for file in *; do - if [ -f "$file" ]; then - shasum -a 256 "$file" > "shas/${file}.sha256" - fi - done + - name: Generate checksums + shell: powershell + run: | + cd artifacts + Get-ChildItem -File | ForEach-Object { + $hash = Get-FileHash -Algorithm SHA256 $_.Name + $hash.Hash + " " + $_.Name | Out-File -Encoding UTF8 "shas/$($_.Name).sha256" + } + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: Hoppscotch_Agent-windows-portable + path: artifacts/* + create-update-manifest: + name: Create Update Manifest + needs: [build-macos-x86_64, build-macos-aarch64, build-linux-deb, build-linux-appimage, build-windows-installer, build-windows-portable] + runs-on: ubuntu-latest + if: ${{ inputs.build_macos_x64 && inputs.build_macos_arm64 && inputs.build_linux_appimage && inputs.build_windows_installer }} + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + - name: List downloaded artifacts + run: find artifacts -type f | sort + - name: Create update manifest + run: | + VERSION="${{ inputs.version }}" + CURRENT_DATE=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ") - - name: Upload artifacts - uses: actions/upload-artifact@v4 - with: - name: Hoppscotch_Agent-${{ matrix.platform }} - path: artifacts/* + cat > artifacts/hoppscotch-agent-update.json << EOF + { + "version": "${VERSION}", + "notes": "${{ inputs.release_notes }}", + "pub_date": "${CURRENT_DATE}", + "platforms": { + "darwin-x86_64": { + "signature": "$(cat artifacts/Hoppscotch_Agent-macos-x86_64/sigs/Hoppscotch_Agent_mac_update_x64.tar.gz.sig)", + "url": "https://github.com/hoppscotch/agent-releases/releases/download/${VERSION}/Hoppscotch_Agent_mac_update_x64.tar.gz" + }, + "darwin-aarch64": { + "signature": "$(cat artifacts/Hoppscotch_Agent-macos-arm64/sigs/Hoppscotch_Agent_mac_update_aarch64.tar.gz.sig)", + "url": "https://github.com/hoppscotch/agent-releases/releases/download/${VERSION}/Hoppscotch_Agent_mac_update_aarch64.tar.gz" + }, + "linux-x86_64": { + "signature": "$(cat artifacts/Hoppscotch_Agent-linux-appimage/sigs/Hoppscotch_Agent_linux_x64.AppImage.sig)", + "url": "https://github.com/hoppscotch/agent-releases/releases/download/${VERSION}/Hoppscotch_Agent_linux_x64.AppImage" + }, + "windows-x86_64": { + "signature": "$(cat artifacts/Hoppscotch_Agent-windows-installer/sigs/Hoppscotch_Agent_win_x64.msi.sig)", + "url": "https://github.com/hoppscotch/agent-releases/releases/download/${VERSION}/Hoppscotch_Agent_win_x64.msi" + } + } + } + EOF + - name: Upload manifest + uses: actions/upload-artifact@v4 + with: + name: update-manifest + path: artifacts/hoppscotch-agent-update.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5d281bca1c2..e58af774e4a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,10 @@ jobs: strategy: matrix: - node-version: ["lts/*"] + # Pinned to Node.js 22 to maintain compatibility with isolated-vm v5.x + # Node.js 24 requires isolated-vm v6+ due to V8 API changes + # TODO: Upgrade to isolated-vm v6 and support Node.js 24 in future dependency update cycle + node-version: ["22"] steps: - name: Checkout diff --git a/README.md b/README.md index 42a99c19cbb..ffe946ee471 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@

-[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?logo=github)](CODE_OF_CONDUCT.md) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fhoppscotch.io&logo=hoppscotch)](https://hoppscotch.io) [![Tests](https://github.com/hoppscotch/hoppscotch/actions/workflows/tests.yml/badge.svg)](https://github.com/hoppscotch/hoppscotch/actions) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fhoppscotch.io%2F)](https://twitter.com/share?text=%F0%9F%91%BD%20Hoppscotch%20%E2%80%A2%20Open%20source%20API%20development%20ecosystem%20-%20Helps%20you%20create%20requests%20faster,%20saving%20precious%20time%20on%20development.&url=https://hoppscotch.io&hashtags=hoppscotch&via=hoppscotch_io) +[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?logo=github)](CODE_OF_CONDUCT.md) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fhoppscotch.io&logo=hoppscotch)](https://hoppscotch.io) [![Tests](https://github.com/hoppscotch/hoppscotch/actions/workflows/tests.yml/badge.svg)](https://github.com/hoppscotch/hoppscotch/actions) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fhoppscotch.io%2F)](https://x.com/share?text=%F0%9F%91%BD%20Hoppscotch%20%E2%80%A2%20Open%20source%20API%20development%20ecosystem%20-%20Helps%20you%20create%20requests%20faster,%20saving%20precious%20time%20on%20development.&url=https://hoppscotch.io&hashtags=hoppscotch&via=hoppscotch_io)

diff --git a/aio-multiport-setup.Caddyfile b/aio-multiport-setup.Caddyfile index 6140f464e0f..6a00ebba07a 100644 --- a/aio-multiport-setup.Caddyfile +++ b/aio-multiport-setup.Caddyfile @@ -16,5 +16,16 @@ } :3170 { - reverse_proxy localhost:8080 + @mock { + header_regexp host Host ^[^.]+\.mock\..*$ + } + + handle @mock { + rewrite * /mock{uri} + reverse_proxy localhost:8080 + } + + handle { + reverse_proxy localhost:8080 + } } diff --git a/aio-subpath-access.Caddyfile b/aio-subpath-access.Caddyfile index 10b8bf5511a..4bf8e3b7ac1 100644 --- a/aio-subpath-access.Caddyfile +++ b/aio-subpath-access.Caddyfile @@ -18,7 +18,18 @@ # Handle requests under `/backend*` path handle_path /backend* { - reverse_proxy localhost:8080 + @mock { + header_regexp host Host ^[^.]+\.mock\..*$ + } + + handle @mock { + rewrite * /mock{uri} + reverse_proxy localhost:8080 + } + + handle { + reverse_proxy localhost:8080 + } } # Handle requests under `/desktop-app-server*` path diff --git a/healthcheck.sh b/healthcheck.sh index 9b3939f1799..8777c74d872 100644 --- a/healthcheck.sh +++ b/healthcheck.sh @@ -8,6 +8,14 @@ curlCheck() { fi } +# Wait for initial startup period to avoid unnecessary error logs +# Check if the container has been running for at least 15 seconds +UPTIME=$(awk '{print int($1)}' /proc/uptime) +if [ "$UPTIME" -lt 15 ]; then + echo "Container still starting up (uptime: ${UPTIME}s), skipping health check..." + exit 0 +fi + if [ "$ENABLE_SUBPATH_BASED_ACCESS" = "true" ]; then curlCheck "http://localhost:${HOPP_AIO_ALTERNATE_PORT:-80}/backend/ping" || exit 1 else diff --git a/netlify.toml b/netlify.toml index 80f0ee912fa..4a3899f4743 100644 --- a/netlify.toml +++ b/netlify.toml @@ -45,7 +45,7 @@ [[redirects]] from = "/twitter" - to = "https://twitter.com/hoppscotch_io" + to = "https://x.com/hoppscotch_io" status = 301 force = true diff --git a/package.json b/package.json index 3e6a5ad5a53..07f82832013 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Hoppscotch (support@hoppscotch.io)", "private": true, "license": "MIT", - "packageManager": "pnpm@10.15.0", + "packageManager": "pnpm@10.18.3", "scripts": { "preinstall": "npx only-allow pnpm", "prepare": "husky", @@ -24,14 +24,14 @@ "./packages/*" ], "devDependencies": { - "@commitlint/cli": "19.8.1", - "@commitlint/config-conventional": "19.8.1", + "@commitlint/cli": "20.1.0", + "@commitlint/config-conventional": "20.0.0", "@hoppscotch/ui": "0.2.5", - "@types/node": "24.5.2", - "cross-env": "10.0.0", + "@types/node": "24.9.1", + "cross-env": "10.1.0", "http-server": "14.1.1", "husky": "9.1.7", - "lint-staged": "16.2.1" + "lint-staged": "16.2.5" }, "pnpm": { "overrides": { @@ -39,6 +39,7 @@ "apiconnect-wsdl": "2.0.36", "cross-spawn": "7.0.6", "execa@0.10.0": "2.0.0", + "nodemailer@<7.0.7": "7.0.7", "sha.js@2.4.11": "2.4.12", "subscriptions-transport-ws>ws": "7.5.10", "vue": "3.5.22", diff --git a/packages/codemirror-lang-graphql/package.json b/packages/codemirror-lang-graphql/package.json index 9c393d355fd..536fe442a86 100644 --- a/packages/codemirror-lang-graphql/package.json +++ b/packages/codemirror-lang-graphql/package.json @@ -24,8 +24,8 @@ "devDependencies": { "@lezer/generator": "1.8.0", "@rollup/plugin-typescript": "12.1.4", - "mocha": "11.7.2", - "rollup": "4.52.2", - "typescript": "5.9.2" + "mocha": "11.7.4", + "rollup": "4.52.5", + "typescript": "5.9.3" } } diff --git a/packages/hoppscotch-agent/package.json b/packages/hoppscotch-agent/package.json index 5623c2f767c..e5d6ce6d7f0 100644 --- a/packages/hoppscotch-agent/package.json +++ b/packages/hoppscotch-agent/package.json @@ -1,7 +1,7 @@ { "name": "hoppscotch-agent", "private": true, - "version": "0.1.14", + "version": "0.1.15", "type": "module", "scripts": { "dev": "vite", @@ -23,12 +23,12 @@ "@iconify-json/lucide": "1.2.68", "@tauri-apps/cli": "^2.0.3", "@types/lodash-es": "4.17.12", - "@types/node": "24.3.0", + "@types/node": "24.9.1", "@vitejs/plugin-vue": "5.1.4", "autoprefixer": "10.4.21", "postcss": "8.5.6", "tailwindcss": "3.4.16", - "typescript": "5.9.2", + "typescript": "5.9.3", "unplugin-icons": "22.2.0", "unplugin-vue-components": "29.0.0", "vite": "6.3.6", diff --git a/packages/hoppscotch-agent/src-tauri/Cargo.lock b/packages/hoppscotch-agent/src-tauri/Cargo.lock index 1b6481bae00..32b752d2fee 100644 --- a/packages/hoppscotch-agent/src-tauri/Cargo.lock +++ b/packages/hoppscotch-agent/src-tauri/Cargo.lock @@ -2,20 +2,11 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aead" @@ -54,9 +45,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -76,12 +67,6 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -93,9 +78,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -108,50 +93,50 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -171,12 +156,15 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.0", + "rand 0.9.2", "raw-window-handle 0.6.2", "serde", "serde_repr", "tokio", "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", "zbus", ] @@ -194,9 +182,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -206,65 +194,54 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.21" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cf008e5e1a9e9e22a7d3c9a4992e21a350290069e36d8fb72304ed17e8f2d2" +checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" dependencies = [ - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", ] [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-io" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.1.2", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", @@ -273,9 +250,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -286,8 +263,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 0.38.44", - "tracing", + "rustix 1.1.2", ] [[package]] @@ -298,14 +274,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -313,10 +289,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -327,13 +303,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -378,9 +354,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" @@ -461,21 +437,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base16" version = "0.2.1" @@ -502,11 +463,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -535,18 +496,18 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d59b4c170e16f0405a2e95aff44432a0d41aa97675f3d52623effe95792a037" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.0", + "objc2 0.6.3", ] [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -578,15 +539,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -615,7 +576,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cairo-sys-rs", "glib", "libc", @@ -636,11 +597,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.9" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -663,7 +624,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -673,15 +634,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.9.7", + "toml 0.9.8", ] [[package]] name = "cc" -version = "1.2.16" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -714,9 +676,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -726,17 +688,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -781,9 +742,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "combine" @@ -795,6 +756,23 @@ dependencies = [ "memchr", ] +[[package]] +name = "compression-codecs" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +dependencies = [ + "compression-core", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -851,9 +829,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -884,8 +862,8 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.0", + "bitflags 2.10.0", + "core-foundation 0.10.1", "core-graphics-types 0.2.0", "foreign-types 0.5.0", "libc", @@ -908,8 +886,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.9.0", - "core-foundation 0.10.0", + "bitflags 2.10.0", + "core-foundation 0.10.1", "libc", ] @@ -924,18 +902,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -981,7 +959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -991,7 +969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1012,7 +990,7 @@ dependencies = [ "libc", "openssl-probe", "openssl-sys", - "socket2", + "socket2 0.5.10", ] [[package]] @@ -1051,14 +1029,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -1066,27 +1044,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1106,42 +1084,42 @@ dependencies = [ [[package]] name = "data-url" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1201,8 +1179,8 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.5.0", - "windows-sys 0.59.0", + "redox_users 0.5.2", + "windows-sys 0.61.2", ] [[package]] @@ -1224,14 +1202,14 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dispatch2" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.0", + "objc2 0.6.3", ] [[package]] @@ -1242,7 +1220,16 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.9", ] [[package]] @@ -1259,29 +1246,35 @@ dependencies = [ [[package]] name = "dlopen2_derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" dependencies = [ "serde", ] @@ -1309,9 +1302,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -1321,16 +1314,16 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embed-resource" -version = "3.0.2" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.20", + "toml 0.9.8", "vswhom", - "winreg 0.52.0", + "winreg 0.55.0", ] [[package]] @@ -1356,9 +1349,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1366,20 +1359,20 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -1387,9 +1380,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3716d7a920fb4fac5d84e9d4bce8ceb321e9414b4409da61b07b75c1e3d0697" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", @@ -1406,29 +1399,30 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1437,9 +1431,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", @@ -1488,21 +1482,27 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -1541,7 +1541,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1558,9 +1558,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1609,9 +1609,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -1628,7 +1628,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -1791,28 +1791,28 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -1826,12 +1826,6 @@ dependencies = [ "polyval", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "gio" version = "0.18.4" @@ -1870,7 +1864,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", @@ -1894,11 +1888,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.0", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1913,9 +1907,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gobject-sys" @@ -1977,14 +1971,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "h2" -version = "0.4.8" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1992,7 +1986,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -2013,17 +2007,17 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "headers" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "headers-core", "http", @@ -2055,9 +2049,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2067,16 +2061,16 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "hoppscotch-agent" -version = "0.1.14" +version = "0.1.15" dependencies = [ "aes-gcm", "axum", @@ -2185,13 +2179,14 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", @@ -2199,6 +2194,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -2206,11 +2202,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -2224,35 +2219,43 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.1", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.62.2", ] [[package]] @@ -2271,26 +2274,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" dependencies = [ "byteorder", - "png", + "png 0.17.16", ] [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -2299,99 +2303,61 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2400,9 +2366,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2411,9 +2377,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2421,14 +2387,15 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.25.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" dependencies = [ "bytemuck", "byteorder-lite", + "moxcms", "num-traits", - "png", + "png 0.18.0", ] [[package]] @@ -2444,12 +2411,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.0", "serde", "serde_core", ] @@ -2487,6 +2454,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-docker" version = "0.2.0" @@ -2508,9 +2485,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -2552,9 +2529,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.4" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d699bc6dfc879fb1bf9bdff0d4c56f0884fc6f0d0eb0fba397a6d00cd9a6b85e" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" dependencies = [ "jiff-static", "log", @@ -2565,13 +2542,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.4" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d16e75759ee0aa64c57a56acbf43916987b20c77373cb7e808979e02b93c9f9" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2598,9 +2575,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -2634,7 +2611,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "serde", "unicode-segmentation", ] @@ -2647,7 +2624,7 @@ checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 2.11.4", + "indexmap 2.12.0", "selectors", ] @@ -2677,15 +2654,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", - "libloading", + "libloading 0.7.4", "once_cell", ] [[package]] name = "libc" -version = "0.2.171" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -2697,13 +2674,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "libc", "redox_syscall", ] @@ -2728,37 +2715,42 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" -version = "0.4.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.26" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "mac" @@ -2797,16 +2789,16 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -2823,9 +2815,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -2850,15 +2842,15 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "minisign-verify" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" +checksum = "e856fdd13623a2f5f2f54676a4ee49502a96a80ef4a62bcedd23d52427c44d43" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -2866,33 +2858,43 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] -name = "muda" -version = "0.17.1" +name = "moxcms" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" dependencies = [ - "crossbeam-channel", - "dpi", + "num-traits", + "pxfm", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", "gtk", "keyboard-types", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "windows-sys 0.60.2", ] @@ -2942,7 +2944,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys", @@ -2974,11 +2976,11 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -3003,12 +3005,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -3028,23 +3029,24 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -3085,9 +3087,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", "objc2-exception-helper", @@ -3095,75 +3097,104 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-cloud-kit", "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-image", - "objc2-foundation 0.3.0", - "objc2-quartz-core 0.3.0", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] name = "objc2-cloud-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1948a9be5f469deadbd6bcb86ad7ff9e47b4f632380139722f7d9840c0d42c" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-data" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f860f8e841f6d32f754836f51e6bc7777cd7e7053cf18528233f6811d3eceb4" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-foundation" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", ] [[package]] name = "objc2-core-graphics" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-io-surface", ] [[package]] name = "objc2-core-image" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffa6bea72bf42c78b0b34e89c0bafac877d5f80bf91e159a5d96ea7f693ca56" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", ] [[package]] @@ -3187,7 +3218,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -3195,25 +3226,35 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" -version = "0.3.0" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161a8b87e32610086e1a7a9e9ec39f84459db7b3a0881c1f16ca5a2605581c19" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -3223,7 +3264,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3231,14 +3272,14 @@ dependencies = [ [[package]] name = "objc2-osa-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ac59da3ceebc4a82179b35dc550431ad9458f9cc326e053f49ba371ce76c5a" +checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", ] [[package]] @@ -3247,7 +3288,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -3256,50 +3297,51 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-security" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3126341c65c5d5728423ae95d788e1b660756486ad0592307ab87ba02d9a7268" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-ui-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777a571be14a42a3990d4ebedaeb8b54cd17377ec21b92e8200ac03797b3bee1" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-web-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b717127e4014b0f9f3e8bba3d3f2acec81f1bde01f656823036e823ed2c94dce" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", + "objc2-javascript-core", "objc2-security", ] @@ -3313,19 +3355,16 @@ dependencies = [ ] [[package]] -name = "object" -version = "0.36.7" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "once_cell" -version = "1.21.1" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "opaque-debug" @@ -3347,11 +3386,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3368,7 +3407,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -3379,18 +3418,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.2+3.4.1" +version = "300.5.4+3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -3417,12 +3456,12 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3431,20 +3470,14 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" dependencies = [ - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "objc2-osa-kit", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "pango" version = "0.18.3" @@ -3478,9 +3511,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -3488,15 +3521,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -3507,9 +3540,9 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -3615,7 +3648,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -3676,13 +3709,13 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.11.4", - "quick-xml", + "indexmap 2.12.0", + "quick-xml 0.38.3", "serde", "time", ] @@ -3700,19 +3733,31 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -3729,9 +3774,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -3742,6 +3787,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3775,20 +3829,21 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_edit 0.20.7", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.23.7", ] [[package]] @@ -3823,9 +3878,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -3846,20 +3901,38 @@ dependencies = [ "psl-types", ] +[[package]] +name = "pxfm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +dependencies = [ + "num-traits", +] + [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ "memchr", ] [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -3868,8 +3941,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2", - "thiserror 2.0.12", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3877,19 +3950,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.2", - "rand 0.9.0", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3897,32 +3971,32 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.10" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.6.1", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -3951,13 +4025,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy", ] [[package]] @@ -4005,7 +4078,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -4014,7 +4087,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.4", ] [[package]] @@ -4049,11 +4122,11 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", ] [[package]] @@ -4062,70 +4135,75 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] -name = "regex" -version = "1.11.1" +name = "ref-cast" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "ref-cast-impl", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "ref-cast-impl" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ - "regex-syntax 0.6.29", + "proc-macro2", + "quote", + "syn 2.0.108", ] [[package]] -name = "regex-automata" -version = "0.4.9" +name = "regex" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-automata" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "relay" version = "0.1.1" -source = "git+https://github.com/CuriousCorrelation/relay.git#7270b956321972269eea7cecdccbb2ae839bd0ff" +source = "git+https://github.com/CuriousCorrelation/relay.git#ed2329e4ebb71bb984c4705aa950cb9c3f9ff931" dependencies = [ "bytes", "curl", @@ -4153,9 +4231,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "async-compression", "base64 0.22.1", @@ -4172,26 +4250,23 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -4199,27 +4274,26 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", ] [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", - "block2 0.6.0", + "block2 0.6.2", "dispatch2", "glib-sys", "gobject-sys", "gtk-sys", "js-sys", "log", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "raw-window-handle 0.6.2", "wasm-bindgen", "wasm-bindgen-futures", @@ -4235,18 +4309,12 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -4268,7 +4336,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4277,22 +4345,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.3" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.25" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ "once_cell", "ring", @@ -4302,29 +4370,21 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", + "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.0" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa4eeac2588ffff23e9d7a7e9b3f971c5fb5b7ebc9452745e0c232c64f83b2f" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -4333,9 +4393,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -4367,6 +4427,30 @@ dependencies = [ "uuid", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -4376,9 +4460,15 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.100", + "syn 2.0.108", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -4405,18 +4495,19 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -4424,33 +4515,34 @@ dependencies = [ [[package]] name = "serde-untagged" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" dependencies = [ "erased-serde", "serde", + "serde_core", "typeid", ] [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4461,29 +4553,31 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -4494,23 +4588,23 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] [[package]] name = "serde_spanned" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -4529,17 +4623,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", - "serde", - "serde_derive", + "indexmap 2.12.0", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -4547,14 +4642,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4576,7 +4671,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4602,9 +4697,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -4622,12 +4717,13 @@ dependencies = [ [[package]] name = "shared_child" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" dependencies = [ "libc", - "windows-sys 0.59.0", + "sigchld", + "windows-sys 0.60.2", ] [[package]] @@ -4636,11 +4732,32 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -4665,29 +4782,36 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "softbuffer" version = "0.4.6" @@ -4744,9 +4868,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -4756,9 +4880,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", @@ -4804,7 +4928,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4837,9 +4961,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -4857,13 +4981,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4872,7 +4996,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4896,19 +5020,19 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.20", + "toml 0.8.2", "version-compare", ] [[package]] name = "tao" -version = "0.34.3" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", - "core-foundation 0.10.0", + "bitflags 2.10.0", + "block2 0.6.2", + "core-foundation 0.10.1", "core-graphics 0.24.0", "crossbeam-channel", "dispatch", @@ -4924,9 +5048,9 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "parking_lot", "raw-window-handle 0.6.2", @@ -4948,7 +5072,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4970,9 +5094,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.8.5" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" +checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" dependencies = [ "anyhow", "bytes", @@ -4980,7 +5104,7 @@ dependencies = [ "dirs 6.0.0", "dunce", "embed_plist", - "getrandom 0.3.2", + "getrandom 0.3.4", "glob", "gtk", "heck 0.5.0", @@ -4991,9 +5115,9 @@ dependencies = [ "log", "mime", "muda", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "percent-encoding", @@ -5010,11 +5134,10 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", @@ -5023,9 +5146,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.4.1" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" +checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" dependencies = [ "anyhow", "cargo_toml", @@ -5033,37 +5156,37 @@ dependencies = [ "glob", "heck 0.5.0", "json-patch", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", - "toml 0.9.7", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" +checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" dependencies = [ "base64 0.22.1", "brotli", "ico", "json-patch", "plist", - "png", + "png 0.17.16", "proc-macro2", "quote", "semver", "serde", "serde_json", "sha2", - "syn 2.0.100", + "syn 2.0.108", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", "url", "uuid", @@ -5072,54 +5195,54 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" +checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.4.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9946a3cede302eac0c6eb6c6070ac47b1768e326092d32efbb91f21ed58d978f" +checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" dependencies = [ "anyhow", "glob", "plist", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "tauri-utils", - "toml 0.9.7", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-plugin-autostart" -version = "2.2.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c13f843e5e5df3eed270fc42b02923cc1a6b5c7e56b0f3ac1d858ab2c8b5fb" +checksum = "459383cebc193cdd03d1ba4acc40f2c408a7abce419d64bdcd2d745bc2886f70" dependencies = [ "auto-launch", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-dialog" -version = "2.2.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b59fd750551b1066744ab956a1cd6b1ea3e1b3763b0b9153ac27a044d596426" +checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" dependencies = [ "log", "raw-window-handle 0.6.2", @@ -5129,50 +5252,51 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", ] [[package]] name = "tauri-plugin-fs" -version = "2.2.0" +version = "2.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1edf18000f02903a7c2e5997fb89aca455ecbc0acc15c6535afbb883be223" +checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" dependencies = [ "anyhow", "dunce", "glob", "percent-encoding", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "serde_repr", "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.12", - "toml 0.8.20", + "thiserror 2.0.17", + "toml 0.9.8", "url", - "uuid", ] [[package]] name = "tauri-plugin-http" -version = "2.4.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "696ef548befeee6c6c17b80ef73e7c41205b6c2204e87ef78ccc231212389a5c" +checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70" dependencies = [ + "bytes", + "cookie_store", "data-url", "http", "regex", "reqwest", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "url", "urlpattern", @@ -5180,61 +5304,61 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" +checksum = "c374b6db45f2a8a304f0273a15080d98c70cde86178855fc24653ba657a1144c" dependencies = [ "encoding_rs", "log", "open", "os_pipe", "regex", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "shared_child", "tauri", "tauri-plugin", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] [[package]] name = "tauri-plugin-single-instance" -version = "2.2.2" +version = "2.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bbc73eed15bba8ad290a52614f2711280df4bf575b36ce78f64367074b90b7" +checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" dependencies = [ "serde", "serde_json", "tauri", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "zbus", ] [[package]] name = "tauri-plugin-store" -version = "2.2.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0c08fae6995909f5e9a0da6038273b750221319f2c0f3b526d6de1cde21505" +checksum = "59a77036340a97eb5bbe1b3209c31e5f27f75e6f92a52fd9dd4b211ef08bf310" dependencies = [ "dunce", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] [[package]] name = "tauri-plugin-updater" -version = "2.6.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31bfcfb4a8318008d2108ccfba439d8263cf48867baabf372cb0e9f24771896" +checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" dependencies = [ "base64 0.22.1", "dirs 6.0.0", @@ -5254,33 +5378,33 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", "tokio", "url", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "zip", ] [[package]] name = "tauri-runtime" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846" +checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" dependencies = [ "cookie", "dpi", "gtk", "http", "jni", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-ui-kit", "objc2-web-kit", "raw-window-handle 0.6.2", "serde", "serde_json", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "webkit2gtk", "webview2-com", @@ -5289,17 +5413,17 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.8.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" +checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" dependencies = [ "gtk", "http", "jni", "log", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "percent-encoding", "raw-window-handle 0.6.2", @@ -5316,9 +5440,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212" +checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" dependencies = [ "anyhow", "brotli", @@ -5337,15 +5461,15 @@ dependencies = [ "proc-macro2", "quote", "regex", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde-untagged", "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.12", - "toml 0.9.7", + "thiserror 2.0.17", + "toml 0.9.8", "url", "urlpattern", "uuid", @@ -5354,25 +5478,25 @@ dependencies = [ [[package]] name = "tauri-winres" -version = "0.3.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" +checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" dependencies = [ "embed-resource", - "toml 0.8.20", + "toml 0.9.8", ] [[package]] name = "tempfile" -version = "3.19.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.3.4", "once_cell", - "rustix 1.0.3", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -5397,11 +5521,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -5412,35 +5536,34 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.40" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d9c75b47bdff86fa3334a3db91356b8d7d86a9b839dab7d0bdc5c3d3a077618" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -5453,15 +5576,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.21" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aa485584182073ed57fd5004aa09c371f021325014694e432313345865fd04" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -5469,9 +5592,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -5479,9 +5602,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -5494,39 +5617,38 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.44.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.1", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -5534,9 +5656,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.14" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -5547,26 +5669,26 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", - "toml_edit 0.22.24", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] name = "toml" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", "toml_writer", "winnow 0.7.13", @@ -5574,18 +5696,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] @@ -5596,49 +5718,50 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.6.8", + "indexmap 2.12.0", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.6.8", + "indexmap 2.12.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.4", - "serde", - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", + "indexmap 2.12.0", + "toml_datetime 0.7.3", + "toml_parser", "winnow 0.7.13", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow 0.7.13", ] [[package]] name = "toml_writer" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tower" @@ -5658,14 +5781,18 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.2" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "bytes", + "futures-util", "http", + "http-body", + "iri-string", "pin-project-lite", + "tower", "tower-layer", "tower-service", ] @@ -5708,20 +5835,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -5750,14 +5877,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -5772,24 +5899,24 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.21.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d92153331e7d02ec09137538996a7786fe679c629c279e82a6be762b7e6fe2" +checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" dependencies = [ "crossbeam-channel", "dirs 6.0.0", "libappindicator", "muda", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "serde", - "thiserror 2.0.12", - "windows-sys 0.59.0", + "thiserror 2.0.17", + "windows-sys 0.60.2", ] [[package]] @@ -5806,9 +5933,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" @@ -5864,9 +5991,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -5892,9 +6019,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -5935,12 +6062,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -5955,13 +6076,15 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.2", - "rand 0.9.0", + "getrandom 0.3.4", + "js-sys", + "rand 0.9.2", "serde", + "wasm-bindgen", ] [[package]] @@ -6045,50 +6168,37 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.100", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -6099,9 +6209,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6109,22 +6219,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.100", - "wasm-bindgen-backend", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -6142,11 +6252,71 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.2", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.10.0", + "rustix 1.1.2", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -6208,9 +6378,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.8" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] @@ -6237,7 +6407,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -6246,16 +6416,16 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.17", "windows", "windows-core 0.61.2", ] [[package]] name = "wfd" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e713040b67aae5bf1a0ae3e1ebba8cc29ab2b90da9aa1bff6e09031a8a41d7a8" +checksum = "0c17bbfb155305bcb79144f568c3b796275ba4db5d5856597bc85acefe29b819" dependencies = [ "libc", "winapi", @@ -6291,11 +6461,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6310,10 +6480,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "raw-window-handle 0.6.2", "windows-sys 0.59.0", "windows-version", @@ -6328,7 +6498,7 @@ dependencies = [ "windows-collections", "windows-core 0.61.2", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -6343,24 +6513,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -6370,30 +6544,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", "windows-threading", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -6402,6 +6576,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -6409,18 +6589,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", ] [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -6429,16 +6609,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] -name = "windows-strings" -version = "0.3.1" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -6447,7 +6627,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -6492,7 +6681,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -6543,19 +6741,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -6564,16 +6762,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] name = "windows-version" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -6596,9 +6794,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -6620,9 +6818,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -6644,9 +6842,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -6656,9 +6854,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -6680,9 +6878,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -6704,9 +6902,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -6728,9 +6926,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -6752,9 +6950,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -6794,34 +6992,35 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "winreg" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" dependencies = [ - "bitflags 2.9.0", + "cfg-if", + "windows-sys 0.59.0", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wry" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0e9642a0d061f6236c54ccae64c2722a7879ad4ec7dff59bd376d446d8e90" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", - "block2 0.6.0", + "block2 0.6.2", "cookie", "crossbeam-channel", "dirs 6.0.0", @@ -6836,10 +7035,10 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -6848,7 +7047,7 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "webkit2gtk", "webkit2gtk-sys", @@ -6894,31 +7093,20 @@ dependencies = [ [[package]] name = "xattr" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" -dependencies = [ - "libc", - "rustix 1.0.3", -] - -[[package]] -name = "xdg-home" -version = "1.3.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "windows-sys 0.59.0", + "rustix 1.1.2", ] [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -6926,25 +7114,24 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "synstructure", ] [[package]] name = "zbus" -version = "5.5.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -6961,13 +7148,12 @@ dependencies = [ "ordered-stream", "serde", "serde_repr", - "static_assertions", "tokio", "tracing", "uds_windows", - "windows-sys 0.59.0", + "uuid", + "windows-sys 0.61.2", "winnow 0.7.13", - "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -6975,14 +7161,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.5.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "zbus_names", "zvariant", "zvariant_utils", @@ -7002,22 +7188,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -7037,15 +7223,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -7058,14 +7244,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -7074,40 +7271,36 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "zip" -version = "2.4.2" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" dependencies = [ "arbitrary", "crc32fast", - "crossbeam-utils", - "displaydoc", - "indexmap 2.11.4", + "indexmap 2.12.0", "memchr", - "thiserror 2.0.12", ] [[package]] name = "zvariant" -version = "5.4.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", "url", "winnow 0.7.13", "zvariant_derive", @@ -7116,27 +7309,26 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ "proc-macro2", "quote", "serde", - "static_assertions", - "syn 2.0.100", + "syn 2.0.108", "winnow 0.7.13", ] diff --git a/packages/hoppscotch-agent/src-tauri/Cargo.toml b/packages/hoppscotch-agent/src-tauri/Cargo.toml index 9e35d09075e..9518ddbf6a4 100644 --- a/packages/hoppscotch-agent/src-tauri/Cargo.toml +++ b/packages/hoppscotch-agent/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hoppscotch-agent" -version = "0.1.14" +version = "0.1.15" description = "A cross-platform HTTP request agent for Hoppscotch for advanced request handling including custom headers, certificates, proxies, and local system integration." authors = ["AndrewBastin", "CuriousCorrelation"] edition = "2021" diff --git a/packages/hoppscotch-agent/src-tauri/tauri.conf.json b/packages/hoppscotch-agent/src-tauri/tauri.conf.json index 7dea33109bc..1cf24c6f2c8 100644 --- a/packages/hoppscotch-agent/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-agent/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2.0.0-rc", "productName": "Hoppscotch Agent", - "version": "0.1.14", + "version": "0.1.15", "identifier": "io.hoppscotch.agent", "build": { "beforeDevCommand": "pnpm dev", diff --git a/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json b/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json index 804f1465595..72f604a8018 100644 --- a/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json +++ b/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2.0.0-rc", "productName": "Hoppscotch Agent Portable", - "version": "0.1.14", + "version": "0.1.15", "identifier": "io.hoppscotch.agent", "build": { "beforeDevCommand": "pnpm dev", diff --git a/packages/hoppscotch-backend/backend.Caddyfile b/packages/hoppscotch-backend/backend.Caddyfile index 523516b8b5a..4c6599c4359 100644 --- a/packages/hoppscotch-backend/backend.Caddyfile +++ b/packages/hoppscotch-backend/backend.Caddyfile @@ -4,5 +4,16 @@ } :80 :3170 { - reverse_proxy localhost:8080 + @mock { + header_regexp host Host ^[^.]+\.mock\..*$ + } + + handle @mock { + rewrite * /mock{uri} + reverse_proxy localhost:8080 + } + + handle { + reverse_proxy localhost:8080 + } } diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index ba40830fa78..0dcb3d57f4b 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -1,6 +1,6 @@ { "name": "hoppscotch-backend", - "version": "2025.9.2", + "version": "2025.10.0", "description": "", "author": "", "private": true, @@ -31,20 +31,21 @@ }, "dependencies": { "@apollo/server": "4.12.1", + "@as-integrations/express5": "1.1.2", "@nestjs-modules/mailer": "2.0.2", - "@nestjs/apollo": "13.1.0", + "@nestjs/apollo": "13.2.1", "@nestjs/common": "11.1.6", "@nestjs/config": "4.0.2", "@nestjs/core": "11.1.6", - "@nestjs/graphql": "13.1.0", - "@nestjs/jwt": "11.0.0", + "@nestjs/graphql": "13.2.0", + "@nestjs/jwt": "11.0.1", "@nestjs/passport": "11.0.0", "@nestjs/platform-express": "11.1.6", "@nestjs/schedule": "6.0.1", - "@nestjs/swagger": "11.2.0", + "@nestjs/swagger": "11.2.1", "@nestjs/terminus": "11.0.0", "@nestjs/throttler": "6.4.0", - "@prisma/client": "6.16.2", + "@prisma/client": "6.17.1", "argon2": "0.44.0", "bcrypt": "6.0.0", "class-transformer": "0.5.1", @@ -61,54 +62,54 @@ "handlebars": "4.7.8", "io-ts": "2.2.22", "morgan": "1.10.1", - "nodemailer": "7.0.6", + "nodemailer": "7.0.9", "passport": "0.7.0", "passport-github2": "0.1.12", "passport-google-oauth20": "2.0.0", "passport-jwt": "4.0.1", "passport-local": "1.0.0", "passport-microsoft": "2.1.0", - "posthog-node": "5.8.8", - "prisma": "6.16.2", + "posthog-node": "5.10.0", + "prisma": "6.17.1", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.36.0", + "@eslint/js": "9.37.0", "@nestjs/cli": "11.0.10", - "@nestjs/schematics": "11.0.7", + "@nestjs/schematics": "11.0.9", "@nestjs/testing": "11.1.6", "@relmify/jest-fp-ts": "2.1.1", "@types/bcrypt": "6.0.0", "@types/cookie-parser": "1.4.9", "@types/express": "5.0.3", "@types/jest": "30.0.0", - "@types/node": "24.5.2", - "@types/nodemailer": "7.0.1", + "@types/node": "24.9.1", + "@types/nodemailer": "7.0.2", "@types/passport-github2": "1.2.9", "@types/passport-google-oauth20": "2.0.16", "@types/passport-jwt": "4.0.1", "@types/passport-microsoft": "2.1.0", "@types/supertest": "6.0.3", - "@typescript-eslint/eslint-plugin": "8.44.1", - "@typescript-eslint/parser": "8.44.1", - "cross-env": "10.0.0", - "eslint": "9.36.0", + "@typescript-eslint/eslint-plugin": "8.46.1", + "@typescript-eslint/parser": "8.46.1", + "cross-env": "10.1.0", + "eslint": "9.37.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-prettier": "5.5.4", "globals": "16.4.0", - "jest": "30.1.3", + "jest": "30.2.0", "jest-mock-extended": "4.0.0", "prettier": "3.6.2", "source-map-support": "0.5.21", "supertest": "7.1.4", - "ts-jest": "29.4.4", + "ts-jest": "29.4.5", "ts-loader": "9.5.4", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "typescript": "5.9.2" + "typescript": "5.9.3" }, "jest": { "moduleFileExtensions": [ diff --git a/packages/hoppscotch-backend/prisma/migrations/20251016080714_mock_server/migration.sql b/packages/hoppscotch-backend/prisma/migrations/20251016080714_mock_server/migration.sql new file mode 100644 index 00000000000..b0caa4c5f58 --- /dev/null +++ b/packages/hoppscotch-backend/prisma/migrations/20251016080714_mock_server/migration.sql @@ -0,0 +1,142 @@ +-- CreateEnum +CREATE TYPE "WorkspaceType" AS ENUM ('USER', 'TEAM'); + +-- CreateEnum +CREATE TYPE "MockServerAction" AS ENUM ('CREATED', 'DELETED', 'ACTIVATED', 'DEACTIVATED'); + +-- CreateTable +CREATE TABLE "MockServer" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "subdomain" TEXT NOT NULL, + "creatorUid" TEXT, + "collectionID" TEXT NOT NULL, + "workspaceType" "WorkspaceType" NOT NULL, + "workspaceID" TEXT NOT NULL, + "delayInMs" INTEGER NOT NULL DEFAULT 0, + "isPublic" BOOLEAN NOT NULL DEFAULT true, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "hitCount" INTEGER NOT NULL DEFAULT 0, + "lastHitAt" TIMESTAMPTZ(3), + "createdOn" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedOn" TIMESTAMPTZ(3) NOT NULL, + "deletedAt" TIMESTAMPTZ(3), + + CONSTRAINT "MockServer_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MockServerLog" ( + "id" TEXT NOT NULL, + "mockServerID" TEXT NOT NULL, + "requestMethod" TEXT NOT NULL, + "requestPath" TEXT NOT NULL, + "requestHeaders" JSONB NOT NULL, + "requestBody" JSONB, + "requestQuery" JSONB, + "responseStatus" INTEGER NOT NULL, + "responseHeaders" JSONB NOT NULL, + "responseBody" JSONB, + "responseTime" INTEGER NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "executedAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MockServerLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MockServerActivity" ( + "id" TEXT NOT NULL, + "mockServerID" TEXT NOT NULL, + "action" "MockServerAction" NOT NULL, + "performedBy" TEXT, + "performedAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "MockServerActivity_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "MockServer_subdomain_key" ON "MockServer"("subdomain"); + +-- CreateIndex +CREATE INDEX "MockServerLog_mockServerID_idx" ON "MockServerLog"("mockServerID"); + +-- CreateIndex +CREATE INDEX "MockServerLog_mockServerID_executedAt_idx" ON "MockServerLog"("mockServerID", "executedAt"); + +-- CreateIndex +CREATE INDEX "MockServerActivity_mockServerID_idx" ON "MockServerActivity"("mockServerID"); + +-- AddForeignKey +ALTER TABLE "MockServer" ADD CONSTRAINT "MockServer_creatorUid_fkey" FOREIGN KEY ("creatorUid") REFERENCES "User"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MockServerLog" ADD CONSTRAINT "MockServerLog_mockServerID_fkey" FOREIGN KEY ("mockServerID") REFERENCES "MockServer"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MockServerActivity" ADD CONSTRAINT "MockServerActivity_mockServerID_fkey" FOREIGN KEY ("mockServerID") REFERENCES "MockServer"("id") ON DELETE CASCADE ON UPDATE CASCADE; + + + +-- Add mockExamples column to UserRequest +ALTER TABLE "UserRequest" +ADD COLUMN "mockExamples" JSONB; + +-- Add mockExamples column to TeamRequest +ALTER TABLE "TeamRequest" +ADD COLUMN "mockExamples" JSONB; + +-- Create function to sync mock examples +CREATE OR REPLACE FUNCTION sync_mock_examples() +RETURNS TRIGGER AS $$ +BEGIN + NEW."mockExamples" := jsonb_build_object( + 'examples', + COALESCE( + ( + SELECT jsonb_agg( + jsonb_build_object( + 'key', key, + 'name', value->>'name', + 'endpoint', value->'originalRequest'->>'endpoint', + 'method', value->'originalRequest'->>'method', + 'headers', COALESCE(value->'originalRequest'->'headers', '[]'::jsonb), + 'statusCode', (value->>'code')::int, + 'statusText', value->>'status', + 'responseBody', value->>'body', + 'responseHeaders', COALESCE(value->'headers', '[]'::jsonb) + ) + ) + FROM jsonb_each(NEW.request->'responses') AS responses(key, value) + WHERE jsonb_typeof(NEW.request->'responses') = 'object' + ), + '[]'::jsonb + ) + ); + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Create trigger for UserRequest +CREATE TRIGGER trigger_sync_mock_examples_user_request +BEFORE INSERT OR UPDATE OF request ON "UserRequest" +FOR EACH ROW +EXECUTE FUNCTION sync_mock_examples(); + +-- Create trigger for TeamRequest +CREATE TRIGGER trigger_sync_mock_examples_team_request +BEFORE INSERT OR UPDATE OF request ON "TeamRequest" +FOR EACH ROW +EXECUTE FUNCTION sync_mock_examples(); + +-- Backfill existing data for UserRequest +UPDATE "UserRequest" SET request = request WHERE request IS NOT NULL; + +-- Backfill existing data for TeamRequest +UPDATE "TeamRequest" SET request = request WHERE request IS NOT NULL; + +-- Add GIN indexes +CREATE INDEX "idx_mock_examples_user_requests_gin" ON "UserRequest" USING GIN ("mockExamples"); +CREATE INDEX "idx_mock_examples_team_requests_gin" ON "TeamRequest" USING GIN ("mockExamples"); \ No newline at end of file diff --git a/packages/hoppscotch-backend/prisma/schema.prisma b/packages/hoppscotch-backend/prisma/schema.prisma index dfc8df01dd8..fb31d5aa393 100644 --- a/packages/hoppscotch-backend/prisma/schema.prisma +++ b/packages/hoppscotch-backend/prisma/schema.prisma @@ -1,25 +1,25 @@ -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-1.1.x", "debian-openssl-3.0.x"] } +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + model Team { id String @id @default(cuid()) name String - members TeamMember[] - TeamInvitation TeamInvitation[] TeamCollection TeamCollection[] - TeamRequest TeamRequest[] TeamEnvironment TeamEnvironment[] + TeamInvitation TeamInvitation[] + members TeamMember[] + TeamRequest TeamRequest[] } model TeamMember { - id String @id @default(uuid()) // Membership ID + id String @id @default(uuid()) role TeamAccessRole userUid String teamID String @@ -31,10 +31,10 @@ model TeamMember { model TeamInvitation { id String @id @default(cuid()) teamID String - team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) creatorUid String inviteeEmail String inviteeRole TeamAccessRole + team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) @@unique([teamID, inviteeEmail]) @@index([teamID]) @@ -43,16 +43,16 @@ model TeamInvitation { model TeamCollection { id String @id @default(cuid()) parentID String? - data Json? - parent TeamCollection? @relation("TeamCollectionChildParent", fields: [parentID], references: [id]) - children TeamCollection[] @relation("TeamCollectionChildParent") - requests TeamRequest[] teamID String - team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) title String orderIndex Int createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + data Json? + parent TeamCollection? @relation("TeamCollectionChildParent", fields: [parentID], references: [id]) + children TeamCollection[] @relation("TeamCollectionChildParent") + team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) + requests TeamRequest[] @@unique([teamID, parentID, orderIndex]) } @@ -60,14 +60,15 @@ model TeamCollection { model TeamRequest { id String @id @default(cuid()) collectionID String - collection TeamCollection @relation(fields: [collectionID], references: [id], onDelete: Cascade) teamID String - team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) title String request Json + mockExamples Json? orderIndex Int createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + collection TeamCollection @relation(fields: [collectionID], references: [id], onDelete: Cascade) + team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) @@unique([teamID, collectionID, orderIndex]) } @@ -75,21 +76,21 @@ model TeamRequest { model Shortcode { id String @id @unique request Json - embedProperties Json? creatorUid String? - User User? @relation(fields: [creatorUid], references: [uid]) createdOn DateTime @default(now()) @db.Timestamptz(3) + embedProperties Json? updatedOn DateTime @default(now()) @updatedAt @db.Timestamptz(3) + User User? @relation(fields: [creatorUid], references: [uid]) - @@unique(fields: [id, creatorUid], name: "creator_uid_shortcode_unique") + @@unique([id, creatorUid], name: "creator_uid_shortcode_unique") } model TeamEnvironment { id String @id @default(cuid()) teamID String - team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) name String variables Json + team Team @relation(fields: [teamID], references: [id], onDelete: Cascade) } model User { @@ -99,100 +100,97 @@ model User { photoURL String? isAdmin Boolean @default(false) refreshToken String? - providerAccounts Account[] - VerificationToken VerificationToken[] - settings UserSettings? - UserHistory UserHistory[] - UserEnvironments UserEnvironment[] - userCollections UserCollection[] - userRequests UserRequest[] currentRESTSession Json? currentGQLSession Json? + createdOn DateTime @default(now()) @db.Timestamptz(3) lastLoggedOn DateTime? @db.Timestamptz(3) lastActiveOn DateTime? @db.Timestamptz(3) - createdOn DateTime @default(now()) @db.Timestamptz(3) + providerAccounts Account[] invitedUsers InvitedUsers[] - shortcodes Shortcode[] + mockServers MockServer[] personalAccessTokens PersonalAccessToken[] + shortcodes Shortcode[] + userCollections UserCollection[] + UserEnvironments UserEnvironment[] + UserHistory UserHistory[] + userRequests UserRequest[] + settings UserSettings? + VerificationToken VerificationToken[] } model Account { id String @id @default(cuid()) userId String - user User @relation(fields: [userId], references: [uid], onDelete: Cascade) provider String providerAccountId String providerRefreshToken String? providerAccessToken String? providerScope String? loggedIn DateTime @default(now()) @db.Timestamptz(3) + user User @relation(fields: [userId], references: [uid], onDelete: Cascade) - @@unique(fields: [provider, providerAccountId], name: "verifyProviderAccount") + @@unique([provider, providerAccountId], name: "verifyProviderAccount") } model VerificationToken { deviceIdentifier String token String @unique @default(cuid()) userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) expiresOn DateTime @db.Timestamptz(3) + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) - @@unique(fields: [deviceIdentifier, token], name: "passwordless_deviceIdentifier_tokens") + @@unique([deviceIdentifier, token], name: "passwordless_deviceIdentifier_tokens") } model UserSettings { id String @id @default(cuid()) userUid String @unique - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) properties Json updatedOn DateTime @updatedAt @db.Timestamptz(3) + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) } model UserHistory { id String @id @default(cuid()) userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) reqType ReqType request Json responseMetadata Json isStarred Boolean executedOn DateTime @default(now()) @db.Timestamptz(3) -} - -enum ReqType { - REST - GQL + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) } model UserEnvironment { id String @id @default(cuid()) userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) name String? variables Json isGlobal Boolean + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) } model InvitedUsers { adminUid String - user User @relation(fields: [adminUid], references: [uid], onDelete: Cascade) adminEmail String inviteeEmail String @unique invitedOn DateTime @default(now()) @db.Timestamptz(3) + user User @relation(fields: [adminUid], references: [uid], onDelete: Cascade) } model UserRequest { id String @id @default(cuid()) - userCollection UserCollection @relation(fields: [collectionID], references: [id]) collectionID String userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) title String request Json + mockExamples Json? type ReqType orderIndex Int createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + userCollection UserCollection @relation(fields: [collectionID], references: [id]) + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) @@unique([userUid, collectionID, orderIndex]) } @@ -200,46 +198,40 @@ model UserRequest { model UserCollection { id String @id @default(cuid()) parentID String? - parent UserCollection? @relation("ParentUserCollection", fields: [parentID], references: [id], onDelete: Cascade) - children UserCollection[] @relation("ParentUserCollection") - requests UserRequest[] userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) title String - data Json? orderIndex Int type ReqType createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + data Json? + parent UserCollection? @relation("ParentUserCollection", fields: [parentID], references: [id], onDelete: Cascade) + children UserCollection[] @relation("ParentUserCollection") + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) + requests UserRequest[] @@unique([userUid, parentID, orderIndex]) } -enum TeamAccessRole { - OWNER - VIEWER - EDITOR -} - model InfraConfig { id String @id @default(cuid()) name String @unique value String? - lastSyncedEnvFileValue String? // deprecated, use `value` instead - isEncrypted Boolean @default(false) // Use case: Let's say, Admin wants to store a Secret Key, but doesn't want to store it in plain text in `value` column createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + isEncrypted Boolean @default(false) + lastSyncedEnvFileValue String? } model PersonalAccessToken { id String @id @default(cuid()) userUid String - user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) label String token String @unique @default(uuid()) expiresOn DateTime? @db.Timestamptz(3) createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @updatedAt @db.Timestamptz(3) + user User @relation(fields: [userUid], references: [uid], onDelete: Cascade) } model InfraToken { @@ -251,3 +243,79 @@ model InfraToken { createdOn DateTime @default(now()) @db.Timestamptz(3) updatedOn DateTime @default(now()) @db.Timestamptz(3) } + +model MockServer { + id String @id @default(cuid()) + name String + subdomain String @unique + creatorUid String? + collectionID String + workspaceType WorkspaceType + workspaceID String + delayInMs Int @default(0) + isPublic Boolean @default(true) + isActive Boolean @default(true) + hitCount Int @default(0) + lastHitAt DateTime? @db.Timestamptz(3) + createdOn DateTime @default(now()) @db.Timestamptz(3) + updatedOn DateTime @updatedAt @db.Timestamptz(3) + deletedAt DateTime? @db.Timestamptz(3) + user User? @relation(fields: [creatorUid], references: [uid], onDelete: SetNull) + requestLogs MockServerLog[] + activityHistory MockServerActivity[] +} + +model MockServerLog { + id String @id @default(cuid()) + mockServerID String + requestMethod String + requestPath String + requestHeaders Json + requestBody Json? + requestQuery Json? + responseStatus Int + responseHeaders Json + responseBody Json? + responseTime Int + ipAddress String? + userAgent String? + executedAt DateTime @default(now()) @db.Timestamptz(3) + mockServer MockServer @relation(fields: [mockServerID], references: [id], onDelete: Cascade) + + @@index([mockServerID]) + @@index([mockServerID, executedAt]) +} + +model MockServerActivity { + id String @id @default(cuid()) + mockServerID String + action MockServerAction + performedBy String? + performedAt DateTime @default(now()) @db.Timestamptz(3) + mockServer MockServer @relation(fields: [mockServerID], references: [id], onDelete: Cascade) + + @@index([mockServerID]) +} + +enum WorkspaceType { + USER + TEAM +} + +enum ReqType { + REST + GQL +} + +enum TeamAccessRole { + OWNER + VIEWER + EDITOR +} + +enum MockServerAction { + CREATED + DELETED + ACTIVATED + DEACTIVATED +} diff --git a/packages/hoppscotch-backend/src/app.module.ts b/packages/hoppscotch-backend/src/app.module.ts index 18859d8f8b5..aeaea85b9cd 100644 --- a/packages/hoppscotch-backend/src/app.module.ts +++ b/packages/hoppscotch-backend/src/app.module.ts @@ -36,6 +36,7 @@ import { InfraTokenModule } from './infra-token/infra-token.module'; import { PrismaModule } from './prisma/prisma.module'; import { PubSubModule } from './pubsub/pubsub.module'; import { SortModule } from './orchestration/sort/sort.module'; +import { MockServerModule } from './mock-server/mock-server.module'; @Module({ imports: [ @@ -124,6 +125,7 @@ import { SortModule } from './orchestration/sort/sort.module'; AccessTokenModule, InfraTokenModule, SortModule, + MockServerModule, ], providers: [ GQLComplexityPlugin, diff --git a/packages/hoppscotch-backend/src/auth/auth.controller.ts b/packages/hoppscotch-backend/src/auth/auth.controller.ts index c713dad5d1b..be0a0a314fc 100644 --- a/packages/hoppscotch-backend/src/auth/auth.controller.ts +++ b/packages/hoppscotch-backend/src/auth/auth.controller.ts @@ -22,7 +22,7 @@ import { RTCookie } from 'src/decorators/rt-cookie.decorator'; import { AuthProvider, authCookieHandler, authProviderCheck } from './helper'; import { GoogleSSOGuard } from './guards/google-sso.guard'; import { GithubSSOGuard } from './guards/github-sso.guard'; -import { MicrosoftSSOGuard } from './guards/microsoft-sso-.guard'; +import { MicrosoftSSOGuard } from './guards/microsoft-sso.guard'; import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard'; import { SkipThrottle } from '@nestjs/throttler'; import { AUTH_PROVIDER_NOT_SPECIFIED } from 'src/errors'; diff --git a/packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts b/packages/hoppscotch-backend/src/auth/guards/microsoft-sso.guard.ts similarity index 100% rename from packages/hoppscotch-backend/src/auth/guards/microsoft-sso-.guard.ts rename to packages/hoppscotch-backend/src/auth/guards/microsoft-sso.guard.ts diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index 435cc42a5fa..d5efd94750a 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -22,19 +22,19 @@ export const ADMIN_CAN_NOT_BE_DELETED = * Token Authorization failed (Check 'Authorization' Header) * (GqlAuthGuard) */ -export const AUTH_FAIL = 'auth/fail'; +export const AUTH_FAIL = 'auth/fail' as const; /** * Invalid JSON * (Utils) */ -export const JSON_INVALID = 'json_invalid'; +export const JSON_INVALID = 'json_invalid' as const; /** * Auth Provider not specified * (Auth) */ -export const AUTH_PROVIDER_NOT_SPECIFIED = 'auth/provider_not_specified'; +export const AUTH_PROVIDER_NOT_SPECIFIED = 'auth/provider_not_specified' as const; /** * Email not provided by OAuth provider @@ -168,7 +168,7 @@ export const TEAM_NOT_REQUIRED_ROLE = 'team/not_required_role' as const; * Team name validation failure * (TeamService) */ -export const TEAM_NAME_INVALID = 'team/name_invalid'; +export const TEAM_NAME_INVALID = 'team/name_invalid' as const; /** * Couldn't find the sync data from the user @@ -432,7 +432,6 @@ export const USER_ENVIRONMENT_GLOBAL_ENV_DOES_NOT_EXISTS = */ export const USER_ENVIRONMENT_GLOBAL_ENV_EXISTS = 'user_environment/global_env_already_exists' as const; -/* /** * User environment doesn't exist for the user @@ -440,7 +439,6 @@ export const USER_ENVIRONMENT_GLOBAL_ENV_EXISTS = */ export const USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS = 'user_environment/user_env_does_not_exists' as const; -/* /** * Cannot delete the global user environment @@ -448,7 +446,6 @@ export const USER_ENVIRONMENT_ENV_DOES_NOT_EXISTS = */ export const USER_ENVIRONMENT_GLOBAL_ENV_DELETION_FAILED = 'user_environment/user_env_global_env_deletion_failed' as const; -/* /** * User environment is not a global environment @@ -456,7 +453,6 @@ export const USER_ENVIRONMENT_GLOBAL_ENV_DELETION_FAILED = */ export const USER_ENVIRONMENT_IS_NOT_GLOBAL = 'user_environment/user_env_is_not_global' as const; -/* /** * User environment update failed @@ -464,7 +460,6 @@ export const USER_ENVIRONMENT_IS_NOT_GLOBAL = */ export const USER_ENVIRONMENT_UPDATE_FAILED = 'user_environment/user_env_update_failed' as const; -/* /** * User environment invalid environment name @@ -472,7 +467,6 @@ export const USER_ENVIRONMENT_UPDATE_FAILED = */ export const USER_ENVIRONMENT_INVALID_ENVIRONMENT_NAME = 'user_environment/user_env_invalid_env_name' as const; -/* /** * User history not found @@ -884,3 +878,52 @@ export const INFRA_TOKEN_EXPIRED = 'infra_token/expired'; * (InfraTokenService) */ export const INFRA_TOKEN_CREATOR_NOT_FOUND = 'infra_token/creator_not_found'; + +/** + * Mock server not found + * (MockServerService) + */ +export const MOCK_SERVER_NOT_FOUND = 'mock_server/not_found'; + +/** + * Mock server invalid collection + * (MockServerService) + */ +export const MOCK_SERVER_INVALID_COLLECTION = 'mock_server/invalid_collection'; + +/** + * Mock server already exists for this collection + * (MockServerService) + */ +export const MOCK_SERVER_ALREADY_EXISTS = 'mock_server/already_exists'; + +/** + * Mock server creation failed + * (MockServerService) + */ +export const MOCK_SERVER_CREATION_FAILED = 'mock_server/creation_failed'; + +/** + * Mock server update failed + * (MockServerService) + */ +export const MOCK_SERVER_UPDATE_FAILED = 'mock_server/update_failed'; + +/** + * Mock server deletion failed + * (MockServerService) + */ +export const MOCK_SERVER_DELETION_FAILED = 'mock_server/deletion_failed'; + +/** + * Mock server log not found + * (MockServerService) + */ +export const MOCK_SERVER_LOG_NOT_FOUND = 'mock_server/log_not_found'; + +/** + * Mock server log deletion failed + * (MockServerService) + */ +export const MOCK_SERVER_LOG_DELETION_FAILED = + 'mock_server/log_deletion_failed'; diff --git a/packages/hoppscotch-backend/src/gql-schema.ts b/packages/hoppscotch-backend/src/gql-schema.ts index fc43384b3ae..34e613e2c61 100644 --- a/packages/hoppscotch-backend/src/gql-schema.ts +++ b/packages/hoppscotch-backend/src/gql-schema.ts @@ -32,6 +32,7 @@ import { InfraConfigResolver } from './infra-config/infra-config.resolver'; import { InfraTokenResolver } from './infra-token/infra-token.resolver'; import { SortTeamCollectionResolver } from './orchestration/sort/sort-team-collection.resolver'; import { SortUserCollectionResolver } from './orchestration/sort/sort-user-collection.resolver'; +import { MockServerResolver } from './mock-server/mock-server.resolver'; /** * All the resolvers present in the application. @@ -66,6 +67,7 @@ const RESOLVERS = [ InfraTokenResolver, SortUserCollectionResolver, SortTeamCollectionResolver, + MockServerResolver, ]; /** diff --git a/packages/hoppscotch-backend/src/infra-config/helper.ts b/packages/hoppscotch-backend/src/infra-config/helper.ts index c07b696f6ab..76b2b1da2ca 100644 --- a/packages/hoppscotch-backend/src/infra-config/helper.ts +++ b/packages/hoppscotch-backend/src/infra-config/helper.ts @@ -127,6 +127,11 @@ export async function getDefaultInfraConfigs(): Promise { value: encrypt(randomBytes(32).toString('hex')), isEncrypted: true, }, + { + name: InfraConfigEnum.SESSION_COOKIE_NAME, + value: null, + isEncrypted: false, + }, { name: InfraConfigEnum.TOKEN_SALT_COMPLEXITY, value: '10', @@ -302,6 +307,11 @@ export async function getDefaultInfraConfigs(): Promise { value: 'true', isEncrypted: false, }, + { + name: InfraConfigEnum.MOCK_SERVER_WILDCARD_DOMAIN, + value: null, + isEncrypted: false, + }, ]; return infraConfigDefaultObjs; @@ -370,14 +380,16 @@ export async function isInfraConfigTablePopulated(): Promise { } /** - * Stop the app after 5 seconds - * (Docker will re-start the app) + * Stop the app after 5 seconds with graceful shutdown + * (Sends SIGTERM to trigger NestJS graceful shutdown, then Docker container stops) */ export function stopApp() { console.log('Stopping app in 5 seconds...'); setTimeout(() => { - console.log('Stopping app now...'); + console.log('Stopping app now with graceful shutdown...'); + // Send SIGTERM to the current process to trigger graceful shutdown + // This will call app.close() which triggers onModuleDestroy lifecycle hooks process.kill(process.pid, 'SIGTERM'); }, 5000); } diff --git a/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts index 5a78bb33fe4..28086d27c2f 100644 --- a/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts +++ b/packages/hoppscotch-backend/src/infra-config/infra-config.service.ts @@ -615,21 +615,26 @@ export class InfraConfigService implements OnModuleInit { InfraConfigEnum.ALLOW_ANALYTICS_COLLECTION, ]; try { - const infraConfigDefaultObjs = await getDefaultInfraConfigs(); - const updatedInfraConfigDefaultObjs = infraConfigDefaultObjs.filter( + const defaultConfigs = await getDefaultInfraConfigs(); + + const configsToReset = defaultConfigs.filter( (p) => RESET_EXCLUSION_LIST.includes(p.name) === false, ); + // Update ONBOARDING_COMPLETED value to false + const onboardingCompletedIndex = configsToReset.findIndex( + (p) => p.name === InfraConfigEnum.ONBOARDING_COMPLETED, + ); + if (onboardingCompletedIndex !== -1) { + configsToReset[onboardingCompletedIndex].value = 'false'; + } + await this.prisma.infraConfig.deleteMany({ - where: { - name: { - in: updatedInfraConfigDefaultObjs.map((p) => p.name), - }, - }, + where: { name: { in: configsToReset.map((p) => p.name) } }, }); await this.prisma.infraConfig.createMany({ - data: updatedInfraConfigDefaultObjs, + data: configsToReset, }); stopApp(); @@ -673,6 +678,17 @@ export class InfraConfigService implements OnModuleInit { if (!validateSMTPEmail(value)) return fail(); break; + case InfraConfigEnum.MOCK_SERVER_WILDCARD_DOMAIN: + if (!value) break; // Allow empty value + + if (!value.startsWith('*.mock.')) return fail(); + // Validate domain format after *.mock. + const domainPart = value.substring(7); // Remove '*.mock.' + const domainRegex = + /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; + if (!domainPart || !domainRegex.test(domainPart)) return fail(); + break; + case InfraConfigEnum.MAILER_SMTP_HOST: case InfraConfigEnum.MAILER_SMTP_PORT: case InfraConfigEnum.MAILER_SMTP_USER: @@ -718,6 +734,11 @@ export class InfraConfigService implements OnModuleInit { return fail(); break; + case InfraConfigEnum.SESSION_COOKIE_NAME: + // Allow empty to fall back to default; otherwise enforce allowed characters + if (value && !/^[A-Za-z0-9_-]+$/.test(value)) return fail(); + break; + default: break; } diff --git a/packages/hoppscotch-backend/src/main.ts b/packages/hoppscotch-backend/src/main.ts index 6b2b056cc2e..7c39255707d 100644 --- a/packages/hoppscotch-backend/src/main.ts +++ b/packages/hoppscotch-backend/src/main.ts @@ -12,7 +12,7 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { InfraTokenModule } from './infra-token/infra-token.module'; import { NestExpressApplication } from '@nestjs/platform-express'; -function setupSwagger(app, isProduction: boolean) { +function setupSwagger(app: NestExpressApplication, isProduction: boolean): void { const swaggerDocPath = '/api-docs'; const config = new DocumentBuilder() @@ -49,8 +49,13 @@ async function bootstrap() { app.use( session({ + // Allow overriding the default cookie name 'connect.sid' (which contains a dot). + // Some proxies/load balancers (like older Kong versions) cannot hash cookie names with dots, + // so we allow setting an alternative name via the INFRA.SESSION_COOKIE_NAME configuration. + name: + configService.get('INFRA.SESSION_COOKIE_NAME') || 'connect.sid', secret: - configService.get('INFRA.SESSION_SECRET') || + configService.get('INFRA.SESSION_SECRET') || crypto.randomBytes(16).toString('hex'), }), ); @@ -99,8 +104,10 @@ async function bootstrap() { // Graceful shutdown process.on('SIGTERM', async () => { - console.info('SIGTERM signal received'); + console.info('SIGTERM signal received, initiating graceful shutdown...'); await app.close(); + console.info('Application closed successfully'); + process.exit(0); }); } diff --git a/packages/hoppscotch-backend/src/mock-server/mock-request.guard.ts b/packages/hoppscotch-backend/src/mock-server/mock-request.guard.ts new file mode 100644 index 00000000000..1f55160ddf9 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-request.guard.ts @@ -0,0 +1,274 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + BadRequestException, + NotFoundException, + UnauthorizedException, +} from '@nestjs/common'; +import { Request } from 'express'; +import { MockServerService } from './mock-server.service'; +import * as E from 'fp-ts/Either'; +import { AccessTokenService } from 'src/access-token/access-token.service'; +import { TeamService } from 'src/team/team.service'; +import { WorkspaceType } from '@prisma/client'; + +/** + * Guard to extract and validate mock server ID from either: + * 1. Subdomain pattern: mock-server-id.mock.hopp.io/product + * 2. Route pattern: backend.hopp.io/mock/mock-server-id/product + */ +@Injectable() +export class MockRequestGuard implements CanActivate { + constructor( + private readonly mockServerService: MockServerService, + private readonly accessTokenService: AccessTokenService, + private readonly teamService: TeamService, + ) {} + + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest(); + + // Extract mock server ID from either subdomain or route + const mockServerSubdomain = this.extractMockServerSubdomain(request); + + if (!mockServerSubdomain) { + throw new BadRequestException( + 'Invalid mock server request. Mock server ID not found in subdomain or path.', + ); + } + + // Validate mock server exists (including inactive ones) + const mockServerResult = + await this.mockServerService.getMockServerBySubdomain( + mockServerSubdomain, + true, // includeInactive = true + ); + + if (E.isLeft(mockServerResult)) { + console.warn( + `Mock server lookup failed for subdomain: ${String(mockServerSubdomain).replace(/\r|\n/g, "")}, error: ${mockServerResult.left}`, + ); + throw new NotFoundException( + `Mock server '${mockServerSubdomain}' not found`, + ); + } + + const mockServer = mockServerResult.right; + + // Check if mock server is active and throw proper error if not + if (!mockServer.isActive) { + throw new BadRequestException( + `Mock server '${mockServerSubdomain}' is currently inactive`, + ); + } + + if (!mockServer.isPublic) { + const apiKey = request.get('x-api-key'); + + if (!apiKey) { + throw new BadRequestException( + 'API key is required. Please provide x-api-key header.', + ); + } + + // Validate the Personal Access Token (PAT) + await this.validatePAT(apiKey, mockServer); + } + + // Attach mock server info to request for downstream use + (request as any).mockServer = mockServer; + (request as any).mockServerId = mockServer.id; + + return true; + } + + /** + * Extract mock server ID from request using either subdomain or route-based pattern + * + * Supports two patterns: + * 1. Subdomain: mock-server-id.mock.hopp.io/product → mock-server-id (from host) + * After Caddy rewrite: path becomes /mock/product + * 2. Route: backend.hopp.io/mock/mock-server-id/product → mock-server-id (from path) + * + * @param request Express request object + * @returns Mock server ID or null if not found + */ + private extractMockServerSubdomain(request: Request): string | null { + const host = request.get('host') || ''; + const path = request.path || '/'; + + // Try subdomain pattern first (Option 1) + // For subdomain-based requests, Caddy rewrites path to /mock/... + // but the mock server ID comes from the subdomain, not the path + const subdomainId = this.extractFromSubdomain(host); + if (subdomainId) { + return subdomainId; + } + + // Try route-based pattern (Option 2) + // Only use route extraction if there's no subdomain match + // Route pattern: /mock/mock-server-id/... + const routeId = this.extractFromRoute(path); + if (routeId) { + return routeId; + } + + return null; + } + + /** + * Extract mock server ID from subdomain pattern + * Supports: mock-server-id.mock.hopp.io or mock-server-id.mock.localhost + * + * @param host Host header value + * @returns Mock server ID or null + */ + private extractFromSubdomain(host: string): string | null { + // Remove port if present + const hostname = host.split(':')[0]; + + // Split by dots + const parts = hostname.split('.'); + + // Check if this is a mock subdomain pattern + // For: mock-server-id.mock.hopp.io → ['mock-server-id', 'mock', 'hopp', 'io'] + // For: mock-server-id.mock.localhost → ['mock-server-id', 'mock', 'localhost'] + + if (parts.length >= 3) { + // Check if second part is 'mock' + if (parts[1] === 'mock') { + const mockServerId = parts[0]; + + // Validate it's not empty and follows a reasonable pattern + if (mockServerId && mockServerId.length > 0) { + return mockServerId; + } + } + } + + // Also support: mock-server-id.localhost (for simpler local dev) + if (parts.length === 2 && parts[1] === 'localhost') { + const mockServerId = parts[0]; + if (mockServerId && mockServerId.length > 0) { + return mockServerId; + } + } + + return null; + } + + /** + * Extract mock server ID from route pattern + * Supports: /mock/mock-server-id/product → mock-server-id + * Note: Caddy prepends /mock to subdomain requests, so subdomain pattern + * mock-server-id.mock.hopp.io/product becomes /mock/product + * + * @param path Request path + * @returns Mock server ID or null + */ + private extractFromRoute(path: string): string | null { + // Pattern: /mock/mock-server-id/... + // We need to match: /mock/{id} or /mock/{id}/... + + const mockPathRegex = /^\/mock\/([^\/]+)/; + const match = path.match(mockPathRegex); + + if (match && match[1]) { + const mockServerId = match[1]; + + // Validate it's not empty and not the word 'mock' itself + if (mockServerId && mockServerId !== 'mock' && mockServerId.length > 0) { + return mockServerId; + } + } + + return null; + } + + /** + * Validate Personal Access Token (PAT) for private mock server access + * + * Rules: + * - If mock server is in USER workspace: PAT must belong to that user + * - If mock server is in TEAM workspace: PAT creator must be a member of that team + * + * @param apiKey The x-api-key header value (PAT) + * @param mockServer The mock server being accessed + * @throws UnauthorizedException if PAT is invalid or user lacks access + */ + private async validatePAT(apiKey: string, mockServer: any): Promise { + // Get the PAT and associated user + const patResult = await this.accessTokenService.getUserPAT(apiKey); + + if (E.isLeft(patResult)) { + throw new UnauthorizedException( + 'Invalid or expired API key. Please provide a valid Personal Access Token.', + ); + } + + const pat = patResult.right; + const userUid = pat.user.uid; + + // Check if PAT has expired + if (pat.expiresOn !== null && new Date() > pat.expiresOn) { + throw new UnauthorizedException( + 'API key has expired. Please generate a new Personal Access Token.', + ); + } + + // Validate based on workspace type + if (mockServer.workspaceType === WorkspaceType.USER) { + // For USER workspace: PAT must belong to the workspace owner + if (userUid !== mockServer.workspaceID) { + throw new UnauthorizedException( + 'Access denied. This Personal Access Token does not have permission to access this mock server.', + ); + } + } else if (mockServer.workspaceType === WorkspaceType.TEAM) { + // For TEAM workspace: PAT creator must be a member of the team + const teamMember = await this.teamService.getTeamMember( + mockServer.workspaceID, + userUid, + ); + + if (!teamMember) { + throw new UnauthorizedException( + 'Access denied. You must be a member of the team to access this mock server.', + ); + } + } else { + throw new BadRequestException('Invalid workspace type for mock server.'); + } + + // Update last used timestamp for the PAT + await this.accessTokenService.updateLastUsedForPAT(apiKey); + } + + /** + * Get the actual path without the /mock/mock-server-id prefix + * This is useful for route-based pattern to get the actual endpoint path + * + * @param fullPath Full request path + * @param mockServerId Mock server ID + * @returns Clean path for the mock endpoint + */ + static getCleanPath(fullPath: string, mockServerId: string): string { + // If route-based: /mock/mock-server-id/product → /product + const routePrefix = `/mock/${mockServerId}`; + if (fullPath.startsWith(routePrefix)) { + const cleanPath = fullPath.substring(routePrefix.length); + return cleanPath || '/'; + } + + // If subdomain-based: Caddy rewrites to /mock/product → /product + // Strip the /mock prefix added by Caddy + if (fullPath.startsWith('/mock/')) { + const cleanPath = fullPath.substring(5); // Remove '/mock' + return cleanPath || '/'; + } + + // Fallback: return as-is + return fullPath; + } +} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server-analytics.service.ts b/packages/hoppscotch-backend/src/mock-server/mock-server-analytics.service.ts new file mode 100644 index 00000000000..92ac076ffe2 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server-analytics.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from 'src/prisma/prisma.service'; +import { MockServer as dbMockServer, MockServerAction } from '@prisma/client'; + +@Injectable() +export class MockServerAnalyticsService { + constructor(private readonly prisma: PrismaService) {} + + /** + * Record mock server activity + * @param mockServer The mock server database object + * @param action The action being performed (CREATED, ACTIVATED, DEACTIVATED, DELETED, UPDATED) + * @param performedBy Optional userUid who performed the action + */ + async recordActivity( + mockServer: dbMockServer, + action: MockServerAction, + performedBy?: string, + ): Promise { + try { + // Skip if trying to activate an already active server + if (action === MockServerAction.ACTIVATED && mockServer.isActive) { + return; + } + + // Skip if trying to deactivate an already inactive server + if (action === MockServerAction.DEACTIVATED && !mockServer.isActive) { + return; + } + + await this.prisma.mockServerActivity.create({ + data: { + mockServerID: mockServer.id, + action: action, + performedBy: performedBy || null, + }, + }); + } catch (error) { + // Log error but don't throw - analytics shouldn't break main flow + console.error('Failed to record mock server activity:', error); + } + } +} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server-logging.interceptor.ts b/packages/hoppscotch-backend/src/mock-server/mock-server-logging.interceptor.ts new file mode 100644 index 00000000000..275781a4ef0 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server-logging.interceptor.ts @@ -0,0 +1,169 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { Request, Response } from 'express'; +import { MockServer } from '@prisma/client'; +import { MockServerService } from './mock-server.service'; + +@Injectable() +export class MockServerLoggingInterceptor implements NestInterceptor { + constructor(private readonly mockServerService: MockServerService) {} + + intercept(context: ExecutionContext, next: CallHandler): Observable { + const httpContext = context.switchToHttp(); + const request = httpContext.getRequest(); + const response = httpContext.getResponse(); + + // Capture request start time + const startTime = Date.now(); + + // Extract mock server info (attached by MockRequestGuard) + const mockServer = (request as any).mockServer as MockServer; + const mockServerId = (request as any).mockServerId as string; + + // If no mock server info, skip logging + if (!mockServer || !mockServerId) { + return next.handle(); + } + + // Capture request details + const requestMethod = request.method; + const requestPath = request.path; + const requestHeaders = this.extractHeaders(request); + const requestBody = request.body || {}; + const requestQuery = this.extractQueryParams(request); + + if (!requestBody || typeof requestBody !== 'object') { + console.warn('Request body is not properly parsed'); + } + + // Extract client info + const ipAddress = + (request.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim() || + request.socket.remoteAddress || + undefined; + const userAgent = request.headers['user-agent'] as string | undefined; + + // Capture response - use finalize to ensure logging happens regardless of success/error + return next.handle().pipe( + tap({ + next: () => { + // Success case - log after response is sent + const responseTime = Date.now() - startTime; + const responseStatus = response.statusCode || 200; + const responseHeaders = this.extractResponseHeaders(response); + + // Log the request asynchronously (fire and forget) + this.mockServerService + .logRequest({ + mockServerID: mockServerId, + requestMethod, + requestPath, + requestHeaders, + requestBody, + requestQuery, + responseStatus, + responseHeaders, + responseTime, + ipAddress, + userAgent, + }) + .catch((err) => console.error('Failed to log mock request:', err)); + + // Increment hit count asynchronously (fire and forget) + this.mockServerService + .incrementHitCount(mockServerId) + .catch((err) => + console.error('Failed to increment hit count:', err), + ); + }, + error: (error) => { + // Error case - log the error but let it propagate to user + const responseTime = Date.now() - startTime; + const responseStatus = error.status || 500; + + // Log error response asynchronously + this.mockServerService + .logRequest({ + mockServerID: mockServerId, + requestMethod, + requestPath, + requestHeaders, + requestBody, + requestQuery, + responseStatus, + responseHeaders: {}, + responseTime, + ipAddress, + userAgent, + }) + .catch((err) => + console.error('Failed to log mock request error:', err), + ); + + // Still increment hit count even for errors + this.mockServerService + .incrementHitCount(mockServerId) + .catch((err) => + console.error('Failed to increment hit count:', err), + ); + + // Error will automatically propagate to user + // No need to re-throw, tap operator handles this + }, + }), + ); + } + + /** + * Extract request headers as a plain object + */ + private extractHeaders(request: Request): Record { + const headers: Record = {}; + Object.keys(request.headers).forEach((key) => { + const value = request.headers[key]; + if (typeof value === 'string') { + headers[key.toLowerCase()] = value; + } else if (Array.isArray(value)) { + headers[key.toLowerCase()] = value[0]; + } + }); + return headers; + } + + /** + * Extract query parameters as a plain object + */ + private extractQueryParams( + request: Request, + ): Record | undefined { + const queryParams = request.query as Record; + return Object.keys(queryParams).length > 0 ? queryParams : undefined; + } + + /** + * Extract response headers as a plain object + */ + private extractResponseHeaders(response: Response): Record { + const headers: Record = {}; + const headerNames = response.getHeaderNames(); + + headerNames.forEach((name) => { + const value = response.getHeader(name); + if (typeof value === 'string') { + headers[name.toLowerCase()] = value; + } else if (typeof value === 'number') { + headers[name.toLowerCase()] = value.toString(); + } else if (Array.isArray(value)) { + headers[name.toLowerCase()] = value.join(', '); + } + }); + + return headers; + } +} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.controller.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.controller.ts new file mode 100644 index 00000000000..b24327960e2 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.controller.ts @@ -0,0 +1,139 @@ +import { + Controller, + All, + Req, + Res, + HttpStatus, + UseGuards, + UseInterceptors, +} from '@nestjs/common'; +import { Request, Response } from 'express'; +import { MockServerService } from './mock-server.service'; +import { MockServerLoggingInterceptor } from './mock-server-logging.interceptor'; +import * as E from 'fp-ts/Either'; +import { MockRequestGuard } from './mock-request.guard'; +import { MockServer } from '@prisma/client'; +import { ThrottlerBehindProxyGuard } from 'src/guards/throttler-behind-proxy.guard'; + +/** + * Mock server controller with dual routing support: + * 1. Subdomain pattern: mock-server-id.mock.hopp.io/product + * 2. Route pattern: backend.hopp.io/mock/mock-server-id/product + * + * The MockRequestGuard handles extraction of mock server ID from both patterns + * The MockServerLoggingInterceptor handles logging of all requests + */ +@UseGuards(ThrottlerBehindProxyGuard) +@Controller({ path: 'mock' }) +export class MockServerController { + constructor(private readonly mockServerService: MockServerService) {} + + @All('*path') + @UseGuards(MockRequestGuard) + @UseInterceptors(MockServerLoggingInterceptor) + async handleMockRequest(@Req() req: Request, @Res() res: Response) { + // Mock server ID and info are attached by the guard + const mockServerId = (req as any).mockServerId as string; + const mockServer = (req as any).mockServer as MockServer; + + if (!mockServerId) { + return res.status(HttpStatus.NOT_FOUND).json({ + error: 'Not found', + message: 'Mock server ID not found', + }); + } + + const method = req.method; + // Get clean path (removes /mock/mock-server-id prefix for route-based pattern) + const path = MockRequestGuard.getCleanPath( + req.path || '/', + mockServer.subdomain, + ); + + // Extract query parameters + const queryParams = req.query as Record; + + // Extract request headers (convert to lowercase for case-insensitive matching) + const requestHeaders: Record = {}; + Object.keys(req.headers).forEach((key) => { + const value = req.headers[key]; + if (typeof value === 'string') { + requestHeaders[key.toLowerCase()] = value; + } else if (Array.isArray(value)) { + requestHeaders[key.toLowerCase()] = value[0]; + } + }); + + try { + const result = await this.mockServerService.handleMockRequest( + mockServer, + path, + method, + queryParams, + requestHeaders, + ); + + if (E.isLeft(result)) { + return res.status(HttpStatus.NOT_FOUND).json({ + error: 'Endpoint not found', + message: result.left, + }); + } + + const mockResponse = result.right; + + // Set response headers if any + if (mockResponse.headers) { + try { + const headers = JSON.parse(mockResponse.headers); + Object.keys(headers).forEach((key) => { + console.log('Setting header:', key, headers[key]); + res.setHeader(key, headers[key]); + }); + } catch (error) { + console.error('Error parsing response headers:', error); + } + } + + // Add delay if specified + if (mockServer.delayInMs && mockServer.delayInMs > 0) { + await new Promise((resolve) => + setTimeout(resolve, mockServer.delayInMs), + ); + } + + // Only set Content-Type if not already set + if (!res.getHeader('Content-Type')) { + let defaultContentType = 'text/plain'; + + // Check if body is a string and try to parse it to determine content type + if (typeof mockResponse.body === 'string') { + try { + JSON.parse(mockResponse.body); + // If parsing succeeds, it's JSON + defaultContentType = 'application/json'; + } catch { + // If parsing fails, it's plain text + defaultContentType = 'text/plain'; + } + } else if (typeof mockResponse.body === 'object') { + // If it's already an object, it's JSON + defaultContentType = 'application/json'; + } + + res.setHeader('Content-Type', defaultContentType); + } + // Security headers + res.setHeader('X-Content-Type-Options', 'nosniff'); + + // Send response + return res.status(mockResponse.statusCode).send(mockResponse.body); + } catch (error) { + console.error('Error handling mock request:', error); + return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ + error: 'Internal server error', + message: 'Failed to process mock request', + }); + } + } +} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts new file mode 100644 index 00000000000..8cf79e6513e --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.model.ts @@ -0,0 +1,307 @@ +import { + Field, + ID, + ObjectType, + ArgsType, + InputType, + registerEnumType, +} from '@nestjs/graphql'; +import { + IsNumber, + IsOptional, + IsString, + Matches, + Max, + MaxLength, + MinLength, +} from 'class-validator'; +import { WorkspaceType } from 'src/types/WorkspaceTypes'; + +// Regex pattern for mock server name validation +// Allows letters, numbers, spaces, dots, brackets, underscores, and hyphens +const MOCK_SERVER_NAME_PATTERN = /^[a-zA-Z0-9 .()[\]{}<>_-]+$/; +const MOCK_SERVER_NAME_ERROR_MESSAGE = + 'Name can only contain letters, numbers, spaces, dots, brackets, underscores, and hyphens'; + +@ObjectType() +export class MockServer { + @Field(() => ID, { + description: 'ID of the mock server', + }) + id: string; + + @Field({ + description: 'Name of the mock server', + }) + name: string; + + @Field({ + description: 'Subdomain for the mock server (e.g., mock-1234)', + }) + subdomain: string; + + @Field({ + nullable: true, + description: + 'Server URL for the mock server using subdomain pattern (e.g., https://1234.mock.backend-hoppscotch.io)', + }) + serverUrlDomainBased: string; + + @Field({ + description: + 'Server URL for the mock server using path pattern (e.g., https://backend.hoppscotch.io/mock/1234)', + }) + serverUrlPathBased: string; + + @Field(() => WorkspaceType, { + description: 'Type of workspace: USER or TEAM', + }) + workspaceType: WorkspaceType; + + @Field({ + nullable: true, + description: + 'ID of the workspace (user or team) to associate with the mock server', + }) + workspaceID?: string; + + @Field({ + description: 'Delay in milliseconds before responding', + }) + delayInMs: number; + + @Field({ + description: 'Whether the mock server is active', + }) + isActive: boolean; + + @Field({ + description: 'Whether the mock server is publicly accessible', + }) + isPublic: boolean; + + @Field({ + description: 'Date and time when the mock server was created', + }) + createdOn: Date; + + @Field({ + description: 'Date and time when the mock server was last updated', + }) + updatedOn: Date; +} + +@ObjectType() +export class MockServerCollection { + @Field(() => ID, { + description: 'ID of the collection', + }) + id: string; + + @Field({ + description: 'Title of the collection', + }) + title: string; +} + +@InputType() +export class CreateMockServerInput { + @Field({ + description: 'Name of the mock server', + }) + @IsString() + @MinLength(1) + @MaxLength(255) + @Matches(MOCK_SERVER_NAME_PATTERN, { + message: MOCK_SERVER_NAME_ERROR_MESSAGE, + }) + name: string; + + @Field({ + description: + 'ID of the (team or user) collection to associate with the mock server', + }) + collectionID: string; + + @Field(() => WorkspaceType, { + description: 'Type of workspace: USER or TEAM', + }) + workspaceType: WorkspaceType; + + @Field({ + nullable: true, + description: + 'ID of the workspace (user or team) to associate with the mock server', + }) + workspaceID?: string; + + @Field({ + nullable: true, + defaultValue: 0, + description: 'Delay in milliseconds before responding', + }) + @IsOptional() + @IsNumber() + @Max(60000) + delayInMs?: number; + + @Field({ + nullable: true, + defaultValue: true, + description: 'Whether the mock server is publicly accessible', + }) + isPublic?: boolean; +} + +@InputType() +export class UpdateMockServerInput { + @Field({ + nullable: true, + description: 'Name of the mock server', + }) + @IsString() + @IsOptional() + @MinLength(1) + @MaxLength(255) + @Matches(MOCK_SERVER_NAME_PATTERN, { + message: MOCK_SERVER_NAME_ERROR_MESSAGE, + }) + name?: string; + + @Field({ + nullable: true, + description: 'Delay in milliseconds before responding', + }) + @IsOptional() + @IsNumber() + @Max(60000) + delayInMs?: number; + + @Field({ + nullable: true, + description: 'Whether the mock server is active', + }) + isActive?: boolean; + + @Field({ + nullable: true, + description: 'Whether the mock server is publicly accessible', + }) + isPublic?: boolean; +} + +@ObjectType() +export class MockServerResponse { + @Field({ + description: 'HTTP status code to return', + }) + statusCode: number; + + @Field({ + nullable: true, + description: 'Response body to return', + }) + body?: string; + + @Field({ + nullable: true, + description: 'Response headers as JSON string', + }) + headers?: string; + + @Field({ + defaultValue: 0, + description: 'Delay in milliseconds before response', + }) + delay: number; +} + +@ArgsType() +export class MockServerMutationArgs { + @Field(() => ID, { + description: 'ID of the mock server', + }) + id: string; +} + +@ObjectType() +export class MockServerLog { + @Field(() => ID, { + description: 'ID of the log entry', + }) + id: string; + + @Field(() => ID, { + description: 'ID of the mock server', + }) + mockServerID: string; + + @Field({ + description: 'HTTP method of the request', + }) + requestMethod: string; + + @Field({ + description: 'Path of the request', + }) + requestPath: string; + + @Field({ + description: 'Request headers as JSON string', + }) + requestHeaders: string; + + @Field({ + nullable: true, + description: 'Request body as JSON string', + }) + requestBody?: string; + + @Field({ + nullable: true, + description: 'Request query parameters as JSON string', + }) + requestQuery?: string; + + @Field({ + description: 'HTTP status code of the response', + }) + responseStatus: number; + + @Field({ + description: 'Response headers as JSON string', + }) + responseHeaders: string; + + @Field({ + nullable: true, + description: 'Response body as JSON string', + }) + responseBody?: string; + + @Field({ + description: 'Response time in milliseconds', + }) + responseTime: number; + + @Field({ + nullable: true, + description: 'IP address of the requester', + }) + ipAddress?: string; + + @Field({ + nullable: true, + description: 'User agent of the requester', + }) + userAgent?: string; + + @Field({ + description: 'Date and time when the request was executed', + }) + executedAt: Date; +} + +registerEnumType(WorkspaceType, { + name: 'WorkspaceType', +}); diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.module.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.module.ts new file mode 100644 index 00000000000..c288d2c9287 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; +import { MockServerService } from './mock-server.service'; +import { MockServerAnalyticsService } from './mock-server-analytics.service'; +import { MockServerLoggingInterceptor } from './mock-server-logging.interceptor'; +import { MockServerResolver } from './mock-server.resolver'; +import { TeamModule } from 'src/team/team.module'; +import { TeamRequestModule } from 'src/team-request/team-request.module'; +import { MockServerController } from './mock-server.controller'; +import { AccessTokenModule } from 'src/access-token/access-token.module'; + +@Module({ + imports: [PrismaModule, TeamModule, TeamRequestModule, AccessTokenModule], + controllers: [MockServerController], + providers: [ + MockServerService, + MockServerAnalyticsService, + MockServerLoggingInterceptor, + MockServerResolver, + ], +}) +export class MockServerModule {} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts new file mode 100644 index 00000000000..1ea8c83dbbe --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.resolver.ts @@ -0,0 +1,223 @@ +import { + Resolver, + Query, + Mutation, + Args, + ID, + ResolveField, + Parent, +} from '@nestjs/graphql'; +import { UseGuards } from '@nestjs/common'; +import { GqlAuthGuard } from 'src/guards/gql-auth.guard'; +import { GqlUser } from 'src/decorators/gql-user.decorator'; +import { User } from 'src/user/user.model'; +import { MockServerService } from './mock-server.service'; +import { + MockServer, + CreateMockServerInput, + UpdateMockServerInput, + MockServerMutationArgs, + MockServerCollection, + MockServerLog, +} from './mock-server.model'; +import * as E from 'fp-ts/Either'; +import { OffsetPaginationArgs } from 'src/types/input-types.args'; +import { GqlTeamMemberGuard } from 'src/team/guards/gql-team-member.guard'; +import { RequiresTeamRole } from 'src/team/decorators/requires-team-role.decorator'; +import { TeamAccessRole } from 'src/team/team.model'; +import { throwErr } from 'src/utils'; +import { MockServerAnalyticsService } from './mock-server-analytics.service'; + +@Resolver(() => MockServer) +export class MockServerResolver { + constructor( + private readonly mockServerService: MockServerService, + private readonly mockServerAnalyticsService: MockServerAnalyticsService, + ) {} + + // Resolve Fields + + @ResolveField(() => User, { + nullable: true, + description: 'Returns the creator of the mock server', + }) + async creator(@Parent() mockServer: MockServer): Promise { + const creator = await this.mockServerService.getMockServerCreator( + mockServer.id, + ); + + if (E.isLeft(creator)) throwErr(creator.left); + return { + ...creator.right, + currentGQLSession: JSON.stringify(creator.right.currentGQLSession), + currentRESTSession: JSON.stringify(creator.right.currentRESTSession), + }; + } + + @ResolveField(() => MockServerCollection, { + nullable: true, + description: 'Returns the collection of the mock server', + }) + async collection( + @Parent() mockServer: MockServer, + ): Promise { + const collection = await this.mockServerService.getMockServerCollection( + mockServer.id, + ); + + if (E.isLeft(collection)) throwErr(collection.left); + return collection.right; + } + + // Queries + + @Query(() => [MockServer], { + description: 'Get all mock servers for the authenticated user', + }) + @UseGuards(GqlAuthGuard) + async myMockServers( + @GqlUser() user: User, + @Args() args: OffsetPaginationArgs, + ): Promise { + return this.mockServerService.getUserMockServers(user.uid, args); + } + + @Query(() => [MockServer], { + description: 'Get all mock servers for a specific team', + }) + @UseGuards(GqlAuthGuard, GqlTeamMemberGuard) + @RequiresTeamRole( + TeamAccessRole.VIEWER, + TeamAccessRole.EDITOR, + TeamAccessRole.OWNER, + ) + async teamMockServers( + @Args({ + name: 'teamID', + type: () => ID, + description: 'Id of the team to add to', + }) + teamID: string, + @Args() args: OffsetPaginationArgs, + ): Promise { + return this.mockServerService.getTeamMockServers(teamID, args); + } + + @Query(() => MockServer, { + description: 'Get a specific mock server by ID', + }) + @UseGuards(GqlAuthGuard) + async mockServer( + @GqlUser() user: User, + @Args({ + name: 'id', + type: () => ID, + description: 'Id of the mock server to retrieve', + }) + id: string, + ): Promise { + const result = await this.mockServerService.getMockServer(id, user.uid); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + + @Query(() => [MockServerLog], { + description: + 'Get logs for a specific mock server with pagination, sorted by execution time (most recent first)', + }) + @UseGuards(GqlAuthGuard) + async mockServerLogs( + @GqlUser() user: User, + @Args({ + name: 'mockServerID', + type: () => ID, + description: 'ID of the mock server', + }) + mockServerID: string, + @Args() args: OffsetPaginationArgs, + ): Promise { + const result = await this.mockServerService.getMockServerLogs( + mockServerID, + user.uid, + args, + ); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + + // Mutations + + @Mutation(() => MockServer, { + description: 'Create a new mock server', + }) + @UseGuards(GqlAuthGuard) + async createMockServer( + @Args('input') input: CreateMockServerInput, + @GqlUser() user: User, + ): Promise { + const result = await this.mockServerService.createMockServer(user, input); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + + @Mutation(() => MockServer, { + description: 'Update a mock server', + }) + @UseGuards(GqlAuthGuard) + async updateMockServer( + @GqlUser() user: User, + @Args() args: MockServerMutationArgs, + @Args('input') input: UpdateMockServerInput, + ): Promise { + const result = await this.mockServerService.updateMockServer( + args.id, + user.uid, + input, + ); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + + @Mutation(() => Boolean, { + description: 'Delete a mock server', + }) + @UseGuards(GqlAuthGuard) + async deleteMockServer( + @GqlUser() user: User, + @Args() args: MockServerMutationArgs, + ): Promise { + const result = await this.mockServerService.deleteMockServer( + args.id, + user.uid, + ); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + + @Mutation(() => Boolean, { + description: 'Delete a mock server log by log ID', + }) + @UseGuards(GqlAuthGuard) + async deleteMockServerLog( + @GqlUser() user: User, + @Args({ + name: 'logID', + type: () => ID, + description: 'Id of the log to delete', + }) + logID: string, + ): Promise { + const result = await this.mockServerService.deleteMockServerLog( + logID, + user.uid, + ); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } +} diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts new file mode 100644 index 00000000000..83801fac313 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.service.spec.ts @@ -0,0 +1,1166 @@ +import { MockServerService } from './mock-server.service'; +import { PrismaService } from '../prisma/prisma.service'; +import { ConfigService } from '@nestjs/config'; +import { MockServerAnalyticsService } from './mock-server-analytics.service'; +import { mockDeep, mockReset } from 'jest-mock-extended'; +import * as E from 'fp-ts/Either'; +import { + MOCK_SERVER_NOT_FOUND, + MOCK_SERVER_INVALID_COLLECTION, + TEAM_INVALID_ID, + MOCK_SERVER_LOG_NOT_FOUND, +} from '../errors'; +import { + MockServer as dbMockServer, + TeamAccessRole, + MockServerAction, + UserCollection, + TeamCollection, + UserRequest, +} from '@prisma/client'; +import { WorkspaceType } from '../types/WorkspaceTypes'; +import { User } from '../user/user.model'; +import { + CreateMockServerInput, + UpdateMockServerInput, +} from './mock-server.model'; + +const mockPrisma = mockDeep(); +const mockAnalyticsService = mockDeep(); +const mockConfigService = mockDeep(); + +const mockServerService = new MockServerService( + mockAnalyticsService, + mockPrisma, + mockConfigService, +); + +beforeEach(() => { + mockReset(mockPrisma); + mockReset(mockAnalyticsService); + mockReset(mockConfigService); + + // Default config values + mockConfigService.get.mockImplementation((key: string) => { + if (key === 'VITE_BACKEND_API_URL') return 'http://localhost:3170/v1'; + if (key === 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN') return '*.mock.hopp.io'; + if (key === 'INFRA.ALLOW_SECURE_COOKIES') return 'false'; + return undefined; + }); +}); + +const currentTime = new Date(); + +const user: User = { + uid: 'user123', + displayName: 'Test User', + email: 'test@example.com', + photoURL: null, + isAdmin: false, + currentGQLSession: '{}', + currentRESTSession: '{}', + createdOn: currentTime, + lastLoggedOn: currentTime, + lastActiveOn: currentTime, +}; + +const dbMockServer: dbMockServer = { + id: 'mock123', + name: 'Test Mock Server', + subdomain: 'test-subdomain', + creatorUid: user.uid, + collectionID: 'coll123', + workspaceType: WorkspaceType.USER, + workspaceID: user.uid, + delayInMs: 0, + isPublic: true, + isActive: true, + hitCount: 0, + lastHitAt: null, + createdOn: currentTime, + updatedOn: currentTime, + deletedAt: null, +}; + +const userCollection: UserCollection = { + id: 'coll123', + title: 'Test Collection', + userUid: user.uid, + parentID: null, + orderIndex: 1, + type: 'REST', + data: {}, + createdOn: currentTime, + updatedOn: currentTime, +}; + +const teamCollection: TeamCollection = { + id: 'team-coll123', + title: 'Team Collection', + teamID: 'team123', + parentID: null, + orderIndex: 1, + data: {}, + createdOn: currentTime, + updatedOn: currentTime, +}; + +describe('MockServerService', () => { + describe('getUserMockServers', () => { + test('should return user mock servers with pagination', async () => { + mockPrisma.mockServer.findMany.mockResolvedValue([dbMockServer]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result).toHaveLength(1); + expect(result[0].id).toBe(dbMockServer.id); + expect(result[0].name).toBe(dbMockServer.name); + expect(mockPrisma.mockServer.findMany).toHaveBeenCalledWith({ + where: { + workspaceType: WorkspaceType.USER, + creatorUid: user.uid, + deletedAt: null, + }, + orderBy: { createdOn: 'desc' }, + take: 10, + skip: 0, + }); + }); + + test('should return empty array when no mock servers exist', async () => { + mockPrisma.mockServer.findMany.mockResolvedValue([]); + + const result = await mockServerService.getUserMockServers(user.uid, { + take: 10, + skip: 0, + }); + + expect(result).toHaveLength(0); + }); + }); + + describe('getTeamMockServers', () => { + test('should return team mock servers with pagination', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + mockPrisma.mockServer.findMany.mockResolvedValue([teamMockServer]); + + const result = await mockServerService.getTeamMockServers('team123', { + take: 10, + skip: 0, + }); + + expect(result).toHaveLength(1); + expect(result[0].workspaceType).toBe(WorkspaceType.TEAM); + expect(mockPrisma.mockServer.findMany).toHaveBeenCalledWith({ + where: { + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + deletedAt: null, + }, + orderBy: { createdOn: 'desc' }, + take: 10, + skip: 0, + }); + }); + }); + + describe('getMockServer', () => { + test('should return mock server when user has access', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.getMockServer( + dbMockServer.id, + user.uid, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).id).toBe(dbMockServer.id); + expect((result.right as any).name).toBe(dbMockServer.name); + } + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(null); + + const result = await mockServerService.getMockServer( + 'invalid-id', + user.uid, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + + test('should return error when user does not have access', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.getMockServer( + dbMockServer.id, + 'different-user', + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + + test('should allow team member access to team mock server', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + mockPrisma.mockServer.findFirst.mockResolvedValue(teamMockServer); + mockPrisma.team.findFirst.mockResolvedValue({ + id: 'team123', + name: 'Test Team', + } as any); + + const result = await mockServerService.getMockServer( + teamMockServer.id, + user.uid, + ); + + expect(E.isRight(result)).toBe(true); + }); + }); + + describe('getMockServerBySubdomain', () => { + test('should return active mock server by subdomain', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.getMockServerBySubdomain( + dbMockServer.subdomain, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).id).toBe(dbMockServer.id); + } + expect(mockPrisma.mockServer.findFirst).toHaveBeenCalledWith({ + where: { + subdomain: { equals: dbMockServer.subdomain, mode: 'insensitive' }, + isActive: true, + deletedAt: null, + }, + }); + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(null); + + const result = + await mockServerService.getMockServerBySubdomain('non-existent'); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + }); + + describe('getMockServerCreator', () => { + test('should return mock server creator', async () => { + mockPrisma.mockServer.findUnique.mockResolvedValue({ + ...dbMockServer, + user: user as any, + } as any); + + const result = await mockServerService.getMockServerCreator( + dbMockServer.id, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).uid).toBe(user.uid); + } + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + + const result = await mockServerService.getMockServerCreator('invalid-id'); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + }); + + describe('getMockServerCollection', () => { + test('should return user collection for user workspace', async () => { + mockPrisma.mockServer.findUnique.mockResolvedValue(dbMockServer); + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + + const result = await mockServerService.getMockServerCollection( + dbMockServer.id, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).id).toBe(userCollection.id); + expect((result.right as any).title).toBe(userCollection.title); + } + }); + + test('should return team collection for team workspace', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + collectionID: teamCollection.id, + }; + mockPrisma.mockServer.findUnique.mockResolvedValue(teamMockServer); + mockPrisma.teamCollection.findUnique.mockResolvedValue(teamCollection); + + const result = await mockServerService.getMockServerCollection( + teamMockServer.id, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).id).toBe(teamCollection.id); + expect((result.right as any).title).toBe(teamCollection.title); + } + }); + + test('should return null when collection not found', async () => { + mockPrisma.mockServer.findUnique.mockResolvedValue(dbMockServer); + mockPrisma.userCollection.findUnique.mockResolvedValue(null); + + const result = await mockServerService.getMockServerCollection( + dbMockServer.id, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect(result.right).toBe(null); + } + }); + }); + + describe('createMockServer', () => { + const createInput: CreateMockServerInput = { + name: 'New Mock Server', + collectionID: userCollection.id, + workspaceType: WorkspaceType.USER, + workspaceID: undefined, + delayInMs: 0, + }; + + test('should create user mock server successfully', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + mockPrisma.mockServer.create.mockResolvedValue(dbMockServer); + + const result = await mockServerService.createMockServer( + user, + createInput, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).name).toBe(dbMockServer.name); + } + expect(mockAnalyticsService.recordActivity).toHaveBeenCalledWith( + dbMockServer, + MockServerAction.CREATED, + user.uid, + ); + }); + + test('should create team mock server successfully', async () => { + const teamInput: CreateMockServerInput = { + name: 'Team Mock Server', + collectionID: teamCollection.id, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + delayInMs: 0, + }; + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + + mockPrisma.team.findFirst.mockResolvedValue({ id: 'team123' } as any); + mockPrisma.teamCollection.findUnique.mockResolvedValue(teamCollection); + mockPrisma.mockServer.findUnique.mockResolvedValue(null); + mockPrisma.mockServer.create.mockResolvedValue(teamMockServer); + + const result = await mockServerService.createMockServer(user, teamInput); + + expect(E.isRight(result)).toBe(true); + }); + + test('should return error when collection not found', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(null); + + const result = await mockServerService.createMockServer( + user, + createInput, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_INVALID_COLLECTION); + } + }); + + test('should return error when team is invalid', async () => { + const teamInput: CreateMockServerInput = { + name: 'Team Mock Server', + collectionID: teamCollection.id, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'invalid-team', + delayInMs: 0, + }; + + mockPrisma.team.findFirst.mockResolvedValue(null); + + const result = await mockServerService.createMockServer(user, teamInput); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(TEAM_INVALID_ID); + } + }); + + test('should retry subdomain generation on conflict', async () => { + const PrismaError = { UNIQUE_CONSTRAINT_VIOLATION: 'P2002' }; + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.create + .mockRejectedValueOnce({ + code: PrismaError.UNIQUE_CONSTRAINT_VIOLATION, + }) // First attempt conflicts + .mockResolvedValueOnce(dbMockServer); // Second attempt succeeds + + const result = await mockServerService.createMockServer( + user, + createInput, + ); + + expect(E.isRight(result)).toBe(true); + expect(mockPrisma.mockServer.create).toHaveBeenCalledTimes(2); + }); + + test('should return creation failed error on non-constraint errors', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.mockServer.create.mockRejectedValue( + new Error('Database error'), + ); + + const result = await mockServerService.createMockServer( + user, + createInput, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe('mock_server/creation_failed'); + } + }); + }); + + describe('updateMockServer', () => { + const updateInput: UpdateMockServerInput = { + name: 'Updated Name', + isActive: false, + delayInMs: 100, + }; + + test('should update mock server successfully', async () => { + const updatedMockServer = { ...dbMockServer, ...updateInput }; + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + mockPrisma.mockServer.update.mockResolvedValue(updatedMockServer); + + const result = await mockServerService.updateMockServer( + dbMockServer.id, + user.uid, + updateInput, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).name).toBe(updateInput.name); + } + expect(mockPrisma.mockServer.update).toHaveBeenCalledWith({ + where: { id: dbMockServer.id }, + data: updateInput, + }); + }); + + test('should record deactivation analytics', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + mockPrisma.mockServer.update.mockResolvedValue({ + ...dbMockServer, + isActive: false, + }); + + await mockServerService.updateMockServer(dbMockServer.id, user.uid, { + isActive: false, + }); + + expect(mockAnalyticsService.recordActivity).toHaveBeenCalledWith( + dbMockServer, + MockServerAction.DEACTIVATED, + user.uid, + ); + }); + + test('should record activation analytics', async () => { + const inactiveMockServer = { ...dbMockServer, isActive: false }; + mockPrisma.mockServer.findFirst.mockResolvedValue(inactiveMockServer); + mockPrisma.mockServer.update.mockResolvedValue({ + ...inactiveMockServer, + isActive: true, + }); + + await mockServerService.updateMockServer(dbMockServer.id, user.uid, { + isActive: true, + }); + + expect(mockAnalyticsService.recordActivity).toHaveBeenCalledWith( + inactiveMockServer, + MockServerAction.ACTIVATED, + user.uid, + ); + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(null); + + const result = await mockServerService.updateMockServer( + 'invalid-id', + user.uid, + updateInput, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + + test('should return error when user lacks permission', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.updateMockServer( + dbMockServer.id, + 'different-user', + updateInput, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + }); + + describe('deleteMockServer', () => { + test('should soft delete mock server successfully', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + mockPrisma.mockServer.update.mockResolvedValue({ + ...dbMockServer, + isActive: false, + deletedAt: currentTime, + }); + + const result = await mockServerService.deleteMockServer( + dbMockServer.id, + user.uid, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect(result.right).toBe(true); + } + expect(mockPrisma.mockServer.update).toHaveBeenCalledWith({ + where: { id: dbMockServer.id }, + data: { isActive: false, deletedAt: expect.any(Date) }, + }); + expect(mockAnalyticsService.recordActivity).toHaveBeenCalledWith( + dbMockServer, + MockServerAction.DELETED, + user.uid, + ); + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(null); + + const result = await mockServerService.deleteMockServer( + 'invalid-id', + user.uid, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + + test('should return error when user lacks permission', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.deleteMockServer( + dbMockServer.id, + 'different-user', + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + }); + + describe('logRequest', () => { + const logParams = { + mockServerID: dbMockServer.id, + requestMethod: 'GET', + requestPath: '/api/users', + requestHeaders: { 'content-type': 'application/json' }, + requestBody: { test: 'data' }, + requestQuery: { page: '1' }, + responseStatus: 200, + responseHeaders: { 'content-type': 'application/json' }, + responseTime: 150, + ipAddress: '127.0.0.1', + userAgent: 'Mozilla/5.0', + }; + + test('should log request successfully', async () => { + mockPrisma.mockServerLog.create.mockResolvedValue({ + id: 'log123', + ...logParams, + responseBody: null, + executedAt: currentTime, + } as any); + + await mockServerService.logRequest(logParams); + + expect(mockPrisma.mockServerLog.create).toHaveBeenCalledWith({ + data: { + mockServerID: logParams.mockServerID, + requestMethod: logParams.requestMethod, + requestPath: logParams.requestPath, + requestHeaders: logParams.requestHeaders, + requestBody: logParams.requestBody, + requestQuery: logParams.requestQuery, + responseStatus: logParams.responseStatus, + responseHeaders: logParams.responseHeaders, + responseBody: null, + responseTime: logParams.responseTime, + ipAddress: logParams.ipAddress, + userAgent: logParams.userAgent, + }, + }); + }); + + test('should handle logging errors gracefully', async () => { + mockPrisma.mockServerLog.create.mockRejectedValue(new Error('DB Error')); + + // Should not throw + await expect( + mockServerService.logRequest(logParams), + ).resolves.not.toThrow(); + }); + }); + + describe('getMockServerLogs', () => { + const mockLog = { + id: 'log123', + mockServerID: dbMockServer.id, + requestMethod: 'GET', + requestPath: '/api/users', + requestHeaders: { 'content-type': 'application/json' }, + requestBody: null, + requestQuery: { page: '1' }, + responseStatus: 200, + responseHeaders: { 'content-type': 'application/json' }, + responseBody: null, + responseTime: 150, + ipAddress: '127.0.0.1', + userAgent: 'Mozilla/5.0', + executedAt: currentTime, + }; + + test('should return logs with pagination', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + mockPrisma.mockServerLog.findMany.mockResolvedValue([mockLog] as any); + + const result = await mockServerService.getMockServerLogs( + dbMockServer.id, + user.uid, + { take: 10, skip: 0 }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect(result.right as any).toHaveLength(1); + expect((result.right as any)[0].requestMethod).toBe('GET'); + expect((result.right as any)[0].requestHeaders).toBe( + JSON.stringify(mockLog.requestHeaders), + ); + } + expect(mockPrisma.mockServerLog.findMany).toHaveBeenCalledWith({ + where: { mockServerID: dbMockServer.id }, + orderBy: { executedAt: 'desc' }, + take: 10, + skip: 0, + }); + }); + + test('should return error when mock server not found', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(null); + + const result = await mockServerService.getMockServerLogs( + 'invalid-id', + user.uid, + { take: 10, skip: 0 }, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_NOT_FOUND); + } + }); + + test('should return error when user lacks access', async () => { + mockPrisma.mockServer.findFirst.mockResolvedValue(dbMockServer); + + const result = await mockServerService.getMockServerLogs( + dbMockServer.id, + 'different-user', + { take: 10, skip: 0 }, + ); + + expect(E.isLeft(result)).toBe(true); + }); + }); + + describe('deleteMockServerLog', () => { + const mockLog = { + id: 'log123', + mockServerID: dbMockServer.id, + mockServer: dbMockServer, + }; + + test('should delete log successfully', async () => { + mockPrisma.mockServerLog.findUnique.mockResolvedValue(mockLog as any); + mockPrisma.mockServerLog.delete.mockResolvedValue(mockLog as any); + + const result = await mockServerService.deleteMockServerLog( + 'log123', + user.uid, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect(result.right).toBe(true); + } + expect(mockPrisma.mockServerLog.delete).toHaveBeenCalledWith({ + where: { id: 'log123' }, + }); + }); + + test('should return error when log not found', async () => { + mockPrisma.mockServerLog.findUnique.mockResolvedValue(null); + + const result = await mockServerService.deleteMockServerLog( + 'invalid-id', + user.uid, + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_LOG_NOT_FOUND); + } + }); + + test('should return error when user lacks permission', async () => { + mockPrisma.mockServerLog.findUnique.mockResolvedValue(mockLog as any); + + const result = await mockServerService.deleteMockServerLog( + 'log123', + 'different-user', + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toBe(MOCK_SERVER_LOG_NOT_FOUND); + } + }); + }); + + describe('incrementHitCount', () => { + test('should increment hit count and update last hit timestamp', async () => { + mockPrisma.mockServer.update.mockResolvedValue({ + ...dbMockServer, + hitCount: 1, + lastHitAt: currentTime, + }); + + await mockServerService.incrementHitCount(dbMockServer.id); + + expect(mockPrisma.mockServer.update).toHaveBeenCalledWith({ + where: { id: dbMockServer.id }, + data: { + hitCount: { increment: 1 }, + lastHitAt: expect.any(Date), + }, + }); + }); + + test('should handle errors gracefully', async () => { + mockPrisma.mockServer.update.mockRejectedValue(new Error('DB Error')); + + // Should not throw + await expect( + mockServerService.incrementHitCount(dbMockServer.id), + ).resolves.not.toThrow(); + }); + }); + + describe('handleMockRequest', () => { + const mockExample = { + key: 'example1', + name: 'Success Response', + method: 'GET', + endpoint: 'http://api.example.com/users?page=1', + statusCode: 200, + statusText: 'OK', + responseBody: '{"success": true}', + responseHeaders: [{ key: 'content-type', value: 'application/json' }], + headers: [], + }; + + const userRequest: UserRequest = { + id: 'req123', + collectionID: userCollection.id, + teamID: null, + title: 'Get Users', + request: {}, + mockExamples: { + examples: [mockExample], + }, + orderIndex: 1, + createdOn: currentTime, + updatedOn: currentTime, + } as any; + + test('should return example by ID header', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userCollection.findMany.mockResolvedValue([]); // No child collections + mockPrisma.userRequest.findMany.mockResolvedValue([userRequest] as any); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + {}, + { 'x-mock-response-id': 'example1' }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).statusCode).toBe(200); + expect((result.right as any).body).toBe('{"success": true}'); + } + }); + + test('should return example by name header', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userCollection.findMany.mockResolvedValue([]); // No child collections + mockPrisma.userRequest.findMany.mockResolvedValue([userRequest] as any); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + {}, + { 'x-mock-response-name': 'Success Response' }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).statusCode).toBe(200); + } + }); + + test('should filter by status code header', async () => { + const example404 = { + ...mockExample, + key: 'example2', + endpoint: 'http://api.example.com/users', // Same endpoint + statusCode: 404, + statusText: 'Not Found', + responseBody: '{"error": "not found"}', + }; + const requestWith404 = { + ...userRequest, + mockExamples: { + examples: [mockExample, example404], + }, + }; + + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userCollection.findMany.mockResolvedValue([]); // No child collections + mockPrisma.userRequest.findMany.mockResolvedValue([ + requestWith404, + ] as any); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + {}, + { 'x-mock-response-code': '404' }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).statusCode).toBe(404); + expect((result.right as any).body).toBe('{"error": "not found"}'); + } + }); + + test('should match exact path', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userRequest.findMany.mockResolvedValue([userRequest] as any); + mockPrisma.userCollection.findMany.mockResolvedValue([]); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + { page: '1' }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).statusCode).toBe(200); + } + }); + + test('should match path with variables', async () => { + const variableExample = { + ...mockExample, + endpoint: 'http://api.example.com/users/<>', + }; + const variableRequest = { + ...userRequest, + mockExamples: { + examples: [variableExample], + }, + }; + + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userRequest.findMany.mockResolvedValue([ + variableRequest, + ] as any); + mockPrisma.userCollection.findMany.mockResolvedValue([]); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users/123', + 'GET', + ); + + expect(E.isRight(result)).toBe(true); + }); + + test('should return error when no examples found', async () => { + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userRequest.findMany.mockResolvedValue([]); + mockPrisma.userCollection.findMany.mockResolvedValue([]); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + ); + + expect(E.isLeft(result)).toBe(true); + if (E.isLeft(result)) { + expect(result.left).toContain('No examples found'); + } + }); + + test('should prefer 200 status when scores are equal', async () => { + const example200 = { ...mockExample, statusCode: 200 }; + const example404 = { ...mockExample, key: 'example2', statusCode: 404 }; + const multipleExamples = { + ...userRequest, + mockExamples: { + examples: [example404, example200], // 404 first, but 200 should be preferred + }, + }; + + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userRequest.findMany.mockResolvedValue([ + multipleExamples, + ] as any); + mockPrisma.userCollection.findMany.mockResolvedValue([]); + + const result = await mockServerService.handleMockRequest( + dbMockServer, + '/users', + 'GET', + { page: '1' }, + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).statusCode).toBe(200); + } + }); + + test('should include delay in response', async () => { + const delayedMockServer = { ...dbMockServer, delayInMs: 500 }; + const simpleRequest = { + ...userRequest, + mockExamples: { + examples: [ + { + ...mockExample, + endpoint: 'http://api.example.com/users', // Remove query params + }, + ], + }, + }; + + mockPrisma.userCollection.findUnique.mockResolvedValue(userCollection); + mockPrisma.userCollection.findMany.mockResolvedValue([]); // No child collections + mockPrisma.userRequest.findMany.mockResolvedValue([simpleRequest] as any); + + const result = await mockServerService.handleMockRequest( + delayedMockServer, + '/users', + 'GET', + ); + + expect(E.isRight(result)).toBe(true); + if (E.isRight(result)) { + expect((result.right as any).delay).toBe(500); + } + }); + + test('should work with team collections', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + collectionID: teamCollection.id, + }; + const teamRequest = { + ...userRequest, + collectionID: teamCollection.id, + mockExamples: { + examples: [ + { + ...mockExample, + endpoint: 'http://api.example.com/users', // Remove query params + }, + ], + }, + }; + + mockPrisma.teamCollection.findUnique.mockResolvedValue(teamCollection); + mockPrisma.teamCollection.findMany.mockResolvedValue([]); // No child collections + mockPrisma.teamRequest.findMany.mockResolvedValue([teamRequest] as any); + + const result = await mockServerService.handleMockRequest( + teamMockServer, + '/users', + 'GET', + ); + + expect(E.isRight(result)).toBe(true); + }); + }); + + describe('checkMockServerAccess', () => { + test('should allow user access to their own mock server', async () => { + const hasAccess = await mockServerService.checkMockServerAccess( + dbMockServer, + user.uid, + ); + + expect(hasAccess).toBe(true); + }); + + test('should deny user access to other users mock server', async () => { + const hasAccess = await mockServerService.checkMockServerAccess( + dbMockServer, + 'different-user', + ); + + expect(hasAccess).toBe(false); + }); + + test('should allow team member access to team mock server', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + + mockPrisma.team.findFirst.mockResolvedValue({ id: 'team123' } as any); + + const hasAccess = await mockServerService.checkMockServerAccess( + teamMockServer, + user.uid, + ); + + expect(hasAccess).toBe(true); + }); + + test('should deny non-member access to team mock server', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + + mockPrisma.team.findFirst.mockResolvedValue(null); + + const hasAccess = await mockServerService.checkMockServerAccess( + teamMockServer, + user.uid, + ); + + expect(hasAccess).toBe(false); + }); + + test('should respect role restrictions', async () => { + const teamMockServer = { + ...dbMockServer, + workspaceType: WorkspaceType.TEAM, + workspaceID: 'team123', + }; + + mockPrisma.team.findFirst.mockResolvedValue(null); + + const hasAccess = await mockServerService.checkMockServerAccess( + teamMockServer, + user.uid, + [TeamAccessRole.OWNER], // Only owners + ); + + expect(hasAccess).toBe(false); + }); + }); +}); diff --git a/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts b/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts new file mode 100644 index 00000000000..133a77cb736 --- /dev/null +++ b/packages/hoppscotch-backend/src/mock-server/mock-server.service.ts @@ -0,0 +1,1063 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from 'src/prisma/prisma.service'; +import { + CreateMockServerInput, + UpdateMockServerInput, + MockServerResponse, + MockServer, + MockServerCollection, + MockServerLog, +} from './mock-server.model'; +import { User } from 'src/user/user.model'; +import * as E from 'fp-ts/Either'; +import { + MOCK_SERVER_NOT_FOUND, + MOCK_SERVER_INVALID_COLLECTION, + TEAM_INVALID_ID, + MOCK_SERVER_CREATION_FAILED, + MOCK_SERVER_UPDATE_FAILED, + MOCK_SERVER_DELETION_FAILED, + MOCK_SERVER_LOG_NOT_FOUND, + MOCK_SERVER_LOG_DELETION_FAILED, +} from 'src/errors'; +import { randomBytes } from 'crypto'; +import { WorkspaceType } from 'src/types/WorkspaceTypes'; +import { + MockServerAction, + TeamAccessRole, + MockServer as dbMockServer, +} from '@prisma/client'; +import { OffsetPaginationArgs } from 'src/types/input-types.args'; +import { ConfigService } from '@nestjs/config'; +import { MockServerAnalyticsService } from './mock-server-analytics.service'; +import { PrismaError } from 'src/prisma/prisma-error-codes'; + +@Injectable() +export class MockServerService { + constructor( + private readonly mockServerAnalyticsService: MockServerAnalyticsService, + private readonly prisma: PrismaService, + private readonly configService: ConfigService, + ) {} + + /** + * Cast database model to GraphQL model + */ + private cast(dbMockServer: dbMockServer): MockServer { + // Generate path based mock server URL + const backendUrl = this.configService.get('VITE_BACKEND_API_URL'); + const base = backendUrl.substring(0, backendUrl.lastIndexOf('/')); // "http(s)://localhost:3170" + const serverUrlPathBased = base + '/mock/' + dbMockServer.subdomain; + + // Generate domain based mock server URL + // MOCK_SERVER_WILDCARD_DOMAIN = '*.mock.hopp.io' + const wildcardDomain = this.configService.get( + 'INFRA.MOCK_SERVER_WILDCARD_DOMAIN', + ); + const isSecure = + this.configService.get('INFRA.ALLOW_SECURE_COOKIES') === 'true'; + const protocol = isSecure ? 'https://' : 'http://'; + const serverUrlDomainBased = wildcardDomain + ? protocol + dbMockServer.subdomain + wildcardDomain.substring(1) + : null; + + return { + id: dbMockServer.id, + name: dbMockServer.name, + subdomain: dbMockServer.subdomain, + serverUrlPathBased, + serverUrlDomainBased, + workspaceType: dbMockServer.workspaceType, + workspaceID: dbMockServer.workspaceID, + delayInMs: dbMockServer.delayInMs, + isActive: dbMockServer.isActive, + isPublic: dbMockServer.isPublic, + createdOn: dbMockServer.createdOn, + updatedOn: dbMockServer.updatedOn, + } as MockServer; + } + + /** + * Get mock servers for a user + */ + async getUserMockServers(userUid: string, args: OffsetPaginationArgs) { + const mockServers = await this.prisma.mockServer.findMany({ + where: { + workspaceType: WorkspaceType.USER, + creatorUid: userUid, + deletedAt: null, + }, + orderBy: { createdOn: 'desc' }, + take: args?.take, + skip: args?.skip, + }); + + return mockServers.map((ms) => this.cast(ms)); + } + + /** + * Get mock servers for a team + */ + async getTeamMockServers(teamID: string, args: OffsetPaginationArgs) { + const mockServers = await this.prisma.mockServer.findMany({ + where: { + workspaceType: WorkspaceType.TEAM, + workspaceID: teamID, + deletedAt: null, + }, + orderBy: { createdOn: 'desc' }, + take: args?.take, + skip: args?.skip, + }); + + return mockServers.map((ms) => this.cast(ms)); + } + + /** + * Check if user has access to a team with specific roles + */ + private async checkTeamAccess( + teamId: string, + userUid: string, + requiredRoles: TeamAccessRole[], + ): Promise { + const team = await this.prisma.team.findFirst({ + where: { + id: teamId, + members: { + some: { + userUid, + role: { in: requiredRoles }, + }, + }, + }, + }); + return !!team; + } + + /** + * Check if user has access to a mock server with specific roles + */ + async checkMockServerAccess( + mockServer: dbMockServer, + userUid: string, + requiredRoles: TeamAccessRole[] = [ + TeamAccessRole.OWNER, + TeamAccessRole.EDITOR, + TeamAccessRole.VIEWER, + ], + ): Promise { + if (mockServer.workspaceType === WorkspaceType.USER) { + return mockServer.creatorUid === userUid; + } else if (mockServer.workspaceType === WorkspaceType.TEAM) { + return this.checkTeamAccess( + mockServer.workspaceID, + userUid, + requiredRoles, + ); + } + return false; + } + + /** + * Get a specific mock server by ID + */ + async getMockServer(id: string, userUid: string) { + const mockServer = await this.prisma.mockServer.findFirst({ + where: { id, deletedAt: null }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + // Check access permissions + const hasAccess = await this.checkMockServerAccess(mockServer, userUid); + if (!hasAccess) return E.left(MOCK_SERVER_NOT_FOUND); + + return E.right(this.cast(mockServer)); + } + + /** + * Get a mock server by subdomain (for incoming mock requests) + * Returns database model with collectionID for internal use + * @param subdomain - The subdomain of the mock server + * @param includeInactive - If true, returns mock server regardless of active status (default: false) + */ + async getMockServerBySubdomain(subdomain: string, includeInactive = false) { + const mockServer = await this.prisma.mockServer.findFirst({ + where: { + subdomain: { equals: subdomain, mode: 'insensitive' }, + ...(includeInactive ? {} : { isActive: true }), + deletedAt: null, + }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + // Return database model directly (includes collectionID) + return E.right(mockServer); + } + + /** + * (Field resolver) + * Get the creator of a mock server + */ + async getMockServerCreator(mockServerId: string) { + const mockServer = await this.prisma.mockServer.findUnique({ + where: { id: mockServerId, deletedAt: null }, + include: { user: true }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + return E.right(mockServer.user); + } + + /** + * (Field resolver) + * Get the collection of a mock server + */ + async getMockServerCollection(mockServerId: string) { + const mockServer = await this.prisma.mockServer.findUnique({ + where: { id: mockServerId, deletedAt: null }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + if (mockServer.workspaceType === WorkspaceType.USER) { + const collection = await this.prisma.userCollection.findUnique({ + where: { id: mockServer.collectionID }, + }); + if (!collection) return E.right(null); + return E.right({ + id: collection.id, + title: collection.title, + } as MockServerCollection); + } else if (mockServer.workspaceType === WorkspaceType.TEAM) { + const collection = await this.prisma.teamCollection.findUnique({ + where: { id: mockServer.collectionID }, + }); + if (!collection) return E.right(null); + return E.right({ + id: collection.id, + title: collection.title, + } as MockServerCollection); + } + + return E.left(MOCK_SERVER_INVALID_COLLECTION); + } + + /** + * Generate a unique subdomain for the mock server + */ + private generateMockServerSubdomain(): string { + const id = randomBytes(10).toString('base64url').substring(0, 13); + return `${id}`; + } + + /** + * Validate workspace access permission and existence + */ + private async validateWorkspace(user: User, input: CreateMockServerInput) { + if (input.workspaceType === WorkspaceType.TEAM) { + if (!input.workspaceID) return E.left(TEAM_INVALID_ID); + + const hasAccess = await this.checkTeamAccess( + input.workspaceID, + user.uid, + [TeamAccessRole.OWNER, TeamAccessRole.EDITOR], + ); + + if (!hasAccess) return E.left(TEAM_INVALID_ID); + } + + return E.right(true); + } + + /** + * Validate collection exists and user has access + */ + private async validateCollection(user: User, input: CreateMockServerInput) { + if (input.workspaceType === WorkspaceType.TEAM) { + const collection = await this.prisma.teamCollection.findUnique({ + where: { id: input.collectionID, teamID: input.workspaceID }, + }); + return collection + ? E.right(collection) + : E.left(MOCK_SERVER_INVALID_COLLECTION); + } else if (input.workspaceType === WorkspaceType.USER) { + const collection = await this.prisma.userCollection.findUnique({ + where: { id: input.collectionID, userUid: user.uid }, + }); + return collection + ? E.right(collection) + : E.left(MOCK_SERVER_INVALID_COLLECTION); + } + + return E.left(MOCK_SERVER_INVALID_COLLECTION); + } + + /** + * Create a new mock server + */ + async createMockServer( + user: User, + input: CreateMockServerInput, + ): Promise> { + try { + // Validate workspace type and ID + const workspaceValidation = await this.validateWorkspace(user, input); + if (E.isLeft(workspaceValidation)) { + return E.left(workspaceValidation.left); + } + + // Validate collection exists and user has access + const collectionValidation = await this.validateCollection(user, input); + if (E.isLeft(collectionValidation)) { + return E.left(collectionValidation.left); + } + + // Create mock server + const subdomain: string = this.generateMockServerSubdomain(); + const mockServer = await this.prisma.mockServer.create({ + data: { + name: input.name, + subdomain, + creatorUid: user.uid, + collectionID: input.collectionID, + workspaceType: input.workspaceType, + workspaceID: + input.workspaceType === WorkspaceType.TEAM + ? input.workspaceID + : user.uid, + delayInMs: input.delayInMs, + }, + }); + this.mockServerAnalyticsService.recordActivity( + mockServer, + MockServerAction.CREATED, + user.uid, + ); + + return E.right(this.cast(mockServer)); + } catch (error) { + if (error.code === PrismaError.UNIQUE_CONSTRAINT_VIOLATION) { + return this.createMockServer(user, input); // Retry on subdomain conflict + } + console.error('Error creating mock server:', error); + return E.left(MOCK_SERVER_CREATION_FAILED); + } + } + + /** + * Update a mock server + */ + async updateMockServer( + id: string, + userUid: string, + input: UpdateMockServerInput, + ) { + try { + const mockServer = await this.prisma.mockServer.findFirst({ + where: { id, deletedAt: null }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + // Check access permissions (only OWNER and EDITOR can update) + const hasAccess = await this.checkMockServerAccess(mockServer, userUid, [ + TeamAccessRole.OWNER, + TeamAccessRole.EDITOR, + ]); + if (!hasAccess) return E.left(MOCK_SERVER_NOT_FOUND); + + // Update the mock server + const updated = await this.prisma.mockServer.update({ + where: { id }, + data: input, + }); + if (input.isActive !== undefined) { + this.mockServerAnalyticsService.recordActivity( + mockServer, // use pre-update state to determine action + input.isActive + ? MockServerAction.ACTIVATED + : MockServerAction.DEACTIVATED, + userUid, + ); + } + + return E.right(this.cast(updated)); + } catch (error) { + console.error('Error updating mock server:', error); + return E.left(MOCK_SERVER_UPDATE_FAILED); + } + } + + /** + * Delete a mock server + */ + async deleteMockServer(id: string, userUid: string) { + try { + const mockServer = await this.prisma.mockServer.findFirst({ + where: { id, deletedAt: null }, + }); + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + // Check access permissions (only OWNER and EDITOR can delete) + const hasAccess = await this.checkMockServerAccess(mockServer, userUid, [ + TeamAccessRole.OWNER, + TeamAccessRole.EDITOR, + ]); + if (!hasAccess) return E.left(MOCK_SERVER_NOT_FOUND); + + // Soft delete the mock server + await this.prisma.mockServer.update({ + where: { id }, + data: { isActive: false, deletedAt: new Date() }, + }); + this.mockServerAnalyticsService.recordActivity( + mockServer, // use pre-update state to determine action + MockServerAction.DELETED, + userUid, + ); + + return E.right(true); + } catch (error) { + console.error('Error deleting mock server:', error); + return E.left(MOCK_SERVER_DELETION_FAILED); + } + } + + /** + * Log a mock server request and response + */ + async logRequest(params: { + mockServerID: string; + requestMethod: string; + requestPath: string; + requestHeaders: Record; + requestBody?: any; + requestQuery?: Record; + responseStatus: number; + responseHeaders: Record; + responseTime: number; + ipAddress?: string; + userAgent?: string; + }): Promise { + try { + await this.prisma.mockServerLog.create({ + data: { + mockServerID: params.mockServerID, + requestMethod: params.requestMethod, + requestPath: params.requestPath, + requestHeaders: params.requestHeaders, + requestBody: params.requestBody || null, + requestQuery: params.requestQuery || null, + responseStatus: params.responseStatus, + responseHeaders: params.responseHeaders, + responseBody: null, // We'll capture response body separately if needed + responseTime: params.responseTime, + ipAddress: params.ipAddress || null, + userAgent: params.userAgent || null, + }, + }); + } catch (error) { + console.error('Error logging request:', error); + // Don't throw error - analytics shouldn't break the main flow + } + } + + /** + * Get logs for a mock server with pagination + * Logs are sorted by execution time in descending order (most recent first) + */ + async getMockServerLogs( + mockServerId: string, + userUid: string, + args: OffsetPaginationArgs, + ) { + try { + // First, get the mock server and verify it exists + const mockServer = await this.prisma.mockServer.findFirst({ + where: { id: mockServerId, deletedAt: null }, + }); + + if (!mockServer) return E.left(MOCK_SERVER_NOT_FOUND); + + // Check access permissions - user must have access to the mock server + const hasAccess = await this.checkMockServerAccess(mockServer, userUid, [ + TeamAccessRole.OWNER, + TeamAccessRole.EDITOR, + TeamAccessRole.VIEWER, + ]); + if (!hasAccess) return E.left(MOCK_SERVER_NOT_FOUND); + + // Fetch logs with pagination, sorted by executedAt descending + const logs = await this.prisma.mockServerLog.findMany({ + where: { mockServerID: mockServerId }, + orderBy: { executedAt: 'desc' }, + take: args?.take, + skip: args?.skip, + }); + + // Convert JSON fields to strings for GraphQL + const formattedLogs = logs.map( + (log) => + ({ + id: log.id, + mockServerID: log.mockServerID, + requestMethod: log.requestMethod, + requestPath: log.requestPath, + requestHeaders: JSON.stringify(log.requestHeaders), + requestBody: log.requestBody + ? JSON.stringify(log.requestBody) + : null, + requestQuery: log.requestQuery + ? JSON.stringify(log.requestQuery) + : null, + responseStatus: log.responseStatus, + responseHeaders: JSON.stringify(log.responseHeaders), + responseBody: log.responseBody + ? JSON.stringify(log.responseBody) + : null, + responseTime: log.responseTime, + ipAddress: log.ipAddress, + userAgent: log.userAgent, + executedAt: log.executedAt, + }) as MockServerLog, + ); + + return E.right(formattedLogs); + } catch (error) { + console.error('Error fetching mock server logs:', error); + return E.left(MOCK_SERVER_NOT_FOUND); + } + } + + /** + * Delete a mock server log by logId + */ + async deleteMockServerLog(logId: string, userUid: string) { + try { + // First, find the log and verify it exists + const log = await this.prisma.mockServerLog.findUnique({ + where: { id: logId }, + include: { mockServer: true }, + }); + + if (!log) return E.left(MOCK_SERVER_LOG_NOT_FOUND); + + // Check access permissions - user must have access to the mock server + const hasAccess = await this.checkMockServerAccess( + log.mockServer, + userUid, + [TeamAccessRole.OWNER, TeamAccessRole.EDITOR], + ); + if (!hasAccess) return E.left(MOCK_SERVER_LOG_NOT_FOUND); + + // Delete the log + await this.prisma.mockServerLog.delete({ + where: { id: logId }, + }); + + return E.right(true); + } catch (error) { + console.error('Error deleting mock server log:', error); + return E.left(MOCK_SERVER_LOG_DELETION_FAILED); + } + } + + /** + * Increment hit count and update last hit timestamp for a mock server + */ + async incrementHitCount(mockServerID: string): Promise { + try { + await this.prisma.mockServer.update({ + where: { id: mockServerID }, + data: { + hitCount: { increment: 1 }, + lastHitAt: new Date(), + }, + }); + } catch (error) { + console.error('Error incrementing hit count:', error); + // Don't throw error - analytics shouldn't break the main flow + } + } + + /** + * Handle mock request - find matching request in collection and return response + * Optimized implementation with database-level filtering: + * 1. Fetch collection IDs once (used for all subsequent queries) + * 2. Check custom headers first (fastest path) + * 3. Fetch only relevant requests from DB (filtered by collection) + * 4. Filter and score examples in-memory + * 5. Return highest scoring example + */ + async handleMockRequest( + mockServer: dbMockServer, + path: string, + method: string, + queryParams?: Record, + requestHeaders?: Record, + ): Promise> { + try { + // OPTIMIZATION: Fetch collection IDs once (recursive DB query) + // This is used by both custom header lookup and candidate fetching + const collectionIds = await this.getCollectionIds(mockServer); + + if (collectionIds.length === 0) { + return E.left( + `The collection associated with this mock has been deleted.`, + ); + } + + // OPTIMIZATION: Fetch all requests with examples once (single DB query) + // This is shared between custom header lookup and candidate matching + const requests = await this.fetchRequestsWithExamples( + mockServer, + collectionIds, + ); + + // OPTIMIZATION: Check for custom headers first (fastest path) + // If user specified exact example, return it immediately without scoring + if (requestHeaders) { + const mockResponseId = requestHeaders['x-mock-response-id']; + const mockResponseName = requestHeaders['x-mock-response-name']; + + if (mockResponseId || mockResponseName) { + const exactMatch = this.findExampleByIdOrName( + requests, + mockResponseId, + mockResponseName, + method, + ); + if (exactMatch) { + return this.formatExampleResponse(exactMatch, mockServer.delayInMs); + } + } + } + + // OPTIMIZATION: Fetch only requests with mockExamples (database-level filter) + // This is much faster than loading all requests and filtering in memory + const candidateExamples = this.fetchCandidateExamples( + requests, + method, + path, + ); + + if (candidateExamples.length === 0) { + return E.left(`No examples found for ${method.toUpperCase()} ${path}`); + } + + // OPTIMIZATION: Filter by status code if header provided + let filteredExamples = candidateExamples; + if (requestHeaders?.['x-mock-response-code']) { + const statusCode = parseInt(requestHeaders['x-mock-response-code'], 10); + const codeFiltered = candidateExamples.filter( + (ex) => ex.statusCode === statusCode, + ); + if (codeFiltered.length > 0) { + filteredExamples = codeFiltered; + } + } + + // OPTIMIZATION: Score examples based on URL and query parameter matching + const scoredExamples = filteredExamples + .map((example) => ({ + example, + score: this.calculateMatchScore(example, path, queryParams || {}), + })) + .filter((scored) => scored.score > 0) // Remove non-matching examples + .sort((a, b) => b.score - a.score); // Sort by score descending + + if (scoredExamples.length === 0) { + return E.left( + `No matching examples found for ${method.toUpperCase()} ${path}`, + ); + } + + // Step 6: Return highest scoring example + // If multiple examples have same high score, prefer 200 status code + const highestScore = scoredExamples[0].score; + const topExamples = scoredExamples.filter( + (scored) => scored.score === highestScore, + ); + + const selectedExample = + topExamples.find((scored) => scored.example.statusCode === 200) || + topExamples[0]; + + return this.formatExampleResponse( + selectedExample.example, + mockServer.delayInMs, + ); + } catch (error) { + console.error('Error handling mock request:', error); + return E.left('Failed to handle mock request'); + } + } + + /** + * Fetch all requests with mock examples from the database + * Shared helper to avoid code duplication + */ + private async fetchRequestsWithExamples( + mockServer: dbMockServer, + collectionIds: string[], + ) { + return mockServer.workspaceType === WorkspaceType.USER + ? await this.prisma.userRequest.findMany({ + where: { + collectionID: { in: collectionIds }, + mockExamples: { not: null }, + }, + select: { + id: true, + mockExamples: true, + }, + }) + : await this.prisma.teamRequest.findMany({ + where: { + collectionID: { in: collectionIds }, + mockExamples: { not: null }, + }, + select: { + id: true, + mockExamples: true, + }, + }); + } + + /** + * OPTIMIZED: Find example by ID or name from already-fetched requests + * This avoids loading all examples when user specifies exact match + */ + private findExampleByIdOrName( + requests: Array<{ id: string; mockExamples: any }>, + exampleId?: string, + exampleName?: string, + method?: string, + ) { + // Search through examples + for (const request of requests) { + const mockExamples = request.mockExamples as any; + if (mockExamples?.examples && Array.isArray(mockExamples.examples)) { + for (const exampleData of mockExamples.examples) { + // Check if method matches (if specified) + if ( + method && + exampleData.method?.toUpperCase() !== method.toUpperCase() + ) { + continue; + } + + const parsedExample = this.parseExample(exampleData, request.id); + if (!parsedExample) continue; + + // Check for ID match + if (exampleId && parsedExample.id === exampleId) { + return parsedExample; + } + + // Check for name match + if (exampleName && parsedExample.name === exampleName) { + return parsedExample; + } + } + } + } + + return null; + } + + /** + * OPTIMIZED: Fetch only candidate examples that could match the request + * Uses in-memory filtering from already-fetched requests + */ + private fetchCandidateExamples( + requests: Array<{ id: string; mockExamples: any }>, + method: string, + path: string, + ) { + interface Example { + id: string; + name: string; + method: string; + endpoint: string; + path: string; + queryParams: Record; + statusCode: number; + statusText: string; + responseBody: string; + responseHeaders: Array<{ key: string; value: string }>; + requestHeaders?: Array<{ key: string; value: string }>; + } + + const examples: Example[] = []; + + // Parse and filter examples + for (const request of requests) { + const mockExamples = request.mockExamples as any; + if (mockExamples?.examples && Array.isArray(mockExamples.examples)) { + for (const exampleData of mockExamples.examples) { + // OPTIMIZATION: Filter by method immediately + if (exampleData.method?.toUpperCase() !== method.toUpperCase()) { + continue; + } + + const parsedExample = this.parseExample(exampleData, request.id); + if (!parsedExample) continue; + + // OPTIMIZATION: Quick path match check before adding to candidates + // This reduces the number of examples we need to score + if (this.couldPathMatch(parsedExample.path, path)) { + examples.push(parsedExample); + } + } + } + } + + return examples; + } + + /** + * OPTIMIZED: Quick check if paths could potentially match + * Returns true if we should include this example for scoring + */ + private couldPathMatch(examplePath: string, requestPath: string): boolean { + // Exact match + if (examplePath === requestPath) return true; + + // Check if path structure could match (same number of segments) + const exampleParts = examplePath.split('/').filter(Boolean); + const requestParts = requestPath.split('/').filter(Boolean); + + if (exampleParts.length !== requestParts.length) { + return false; // Different structure, can't match + } + + // Quick check: if example has variables (Hoppscotch uses <> syntax), it could match + if (examplePath.includes('<<')) { + return true; // Has variables, needs full scoring + } + + // No variables and not exact match = no match + return false; + } + + /** + * Get collection IDs for the mock server (no caching) + */ + private async getCollectionIds(mockServer: dbMockServer): Promise { + return mockServer.workspaceType === WorkspaceType.USER + ? await this.getAllUserCollectionIds(mockServer.collectionID) + : await this.getAllTeamCollectionIds(mockServer.collectionID); + } + + /** + * Get all collection IDs including children (recursive) + */ + private async getAllUserCollectionIds( + rootCollectionId: string, + ): Promise { + // First verify the root collection exists + const rootCollection = await this.prisma.userCollection.findUnique({ + where: { id: rootCollectionId }, + }); + + if (!rootCollection) return []; // Collection doesn't exist + + const ids = [rootCollectionId]; + const children = await this.prisma.userCollection.findMany({ + where: { parentID: rootCollectionId }, + select: { id: true }, + }); + + for (const child of children) { + const childIds = await this.getAllUserCollectionIds(child.id); + ids.push(...childIds); + } + + return ids; + } + + /** + * Get all team collection IDs including children (recursive) + */ + private async getAllTeamCollectionIds( + rootCollectionId: string, + ): Promise { + // First verify the root collection exists + const rootCollection = await this.prisma.teamCollection.findUnique({ + where: { id: rootCollectionId }, + }); + + if (!rootCollection) return []; // Collection doesn't exist + + const ids = [rootCollectionId]; + const children = await this.prisma.teamCollection.findMany({ + where: { parentID: rootCollectionId }, + select: { id: true }, + }); + + for (const child of children) { + const childIds = await this.getAllTeamCollectionIds(child.id); + ids.push(...childIds); + } + + return ids; + } + + /** + * Parse example from database format to internal format + */ + private parseExample(exampleData: any, requestId: string) { + try { + // Parse endpoint to extract path and query parameters + let path = '/'; + const queryParams: Record = {}; + + if (exampleData.endpoint) { + const url = new URL( + exampleData.endpoint, + 'http://dummy.com', // Base URL for parsing + ); + // Decode the pathname to preserve Hoppscotch variable syntax (<>) + path = decodeURIComponent(url.pathname); + + // Extract query parameters + url.searchParams.forEach((value, key) => { + queryParams[key] = value; + }); + } + + return { + id: exampleData.key || `${requestId}-${exampleData.name}`, + name: exampleData.name, + method: exampleData.method || 'GET', + endpoint: exampleData.endpoint, + path, + queryParams, + statusCode: exampleData.statusCode || 200, + statusText: exampleData.statusText || 'OK', + responseBody: exampleData.responseBody || '', + responseHeaders: exampleData.responseHeaders || [], + requestHeaders: exampleData.headers || [], + }; + } catch (error) { + console.error('Error parsing example:', error); + return null; + } + } + + /** + * Calculate match score for an example based on Postman's algorithm + * Starting score: 100 + * URL path match: exact match keeps 100, no match = 0 + * Query parameters: percentage based on matches + */ + private calculateMatchScore( + example: any, + requestPath: string, + requestQueryParams: Record, + ): number { + let score = 100; + + // URL Path matching + if (example.path !== requestPath) { + // Try wildcard matching (basic implementation) + const examplePathParts = example.path.split('/').filter(Boolean); + const requestPathParts = requestPath.split('/').filter(Boolean); + + if (examplePathParts.length !== requestPathParts.length) { + return 0; // Path structure doesn't match + } + + // Check each segment + let pathMatches = true; + for (let i = 0; i < examplePathParts.length; i++) { + const examplePart = examplePathParts[i]; + const requestPart = requestPathParts[i]; + + // Check if it's a variable (Hoppscotch uses <> syntax) + if ( + examplePart === requestPart || + examplePart.startsWith('<<') || + examplePart.includes('<<') + ) { + continue; // Match + } else { + pathMatches = false; + break; + } + } + + if (!pathMatches) { + return 0; // No path match + } + + // Path has variables, reduce score slightly + score -= 5; + } + + // Query parameter matching + const exampleParams = example.queryParams || {}; + const exampleParamKeys = Object.keys(exampleParams); + const requestParamKeys = Object.keys(requestQueryParams); + + if (exampleParamKeys.length > 0 || requestParamKeys.length > 0) { + let paramMatches = 0; + let partialMatches = 0; + let missingParams = 0; + + // Check for matches + exampleParamKeys.forEach((key) => { + if (requestQueryParams[key] !== undefined) { + if (requestQueryParams[key] === exampleParams[key]) { + paramMatches++; + } else { + partialMatches++; + } + } else { + missingParams++; + } + }); + + // Check for extra params in request + requestParamKeys.forEach((key) => { + if (exampleParams[key] === undefined) { + missingParams++; + } + }); + + // Calculate parameter matching percentage + const totalParams = paramMatches + partialMatches + missingParams; + if (totalParams > 0) { + const matchPercentage = (paramMatches / totalParams) * 100; + // Adjust score based on parameter matching + score = score * (matchPercentage / 100); + } + } + + return score; + } + + /** + * Format example response for return + */ + private formatExampleResponse( + example: any, + delayInMs: number, + ): E.Either { + // Convert response headers array to object + const headersObj: Record = {}; + if (example.responseHeaders && Array.isArray(example.responseHeaders)) { + example.responseHeaders.forEach((header: any) => { + if (header.key && header.value) { + headersObj[header.key] = header.value; + } + }); + } + + return E.right({ + statusCode: example.statusCode || 200, + body: example.responseBody || '', + headers: JSON.stringify(headersObj), + delay: delayInMs || 0, + }); + } +} diff --git a/packages/hoppscotch-backend/src/orchestration/sort/sort.service.spec.ts b/packages/hoppscotch-backend/src/orchestration/sort/sort.service.spec.ts index 5a9db450d65..8a1d1e8aace 100644 --- a/packages/hoppscotch-backend/src/orchestration/sort/sort.service.spec.ts +++ b/packages/hoppscotch-backend/src/orchestration/sort/sort.service.spec.ts @@ -1,4 +1,4 @@ -import { mockDeep, mockReset } from 'jest-mock-extended'; +import { mockDeep } from 'jest-mock-extended'; import { PubSubService } from 'src/pubsub/pubsub.service'; import { TeamCollectionService } from 'src/team-collection/team-collection.service'; import { TeamRequestService } from 'src/team-request/team-request.service'; diff --git a/packages/hoppscotch-backend/src/pubsub/pubsub.service.ts b/packages/hoppscotch-backend/src/pubsub/pubsub.service.ts index b80d27965e5..5cdf57b0bd7 100644 --- a/packages/hoppscotch-backend/src/pubsub/pubsub.service.ts +++ b/packages/hoppscotch-backend/src/pubsub/pubsub.service.ts @@ -1,5 +1,4 @@ -import { OnModuleInit } from '@nestjs/common'; -import { Injectable } from '@nestjs/common'; +import { OnModuleInit, Injectable } from '@nestjs/common'; import { PubSub as LocalPubSub } from 'graphql-subscriptions'; import { TopicDef } from './topicsDefs'; diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts index ac6f9147a0c..44d8064b51a 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts @@ -27,6 +27,7 @@ import { escapeSqlLikeString, isValidLength, transformCollectionData, + stringToJson, } from 'src/utils'; import * as E from 'fp-ts/Either'; import * as O from 'fp-ts/Option'; @@ -36,7 +37,6 @@ import { TeamRequest, } from '@prisma/client'; import { CollectionFolder } from 'src/types/CollectionFolder'; -import { stringToJson } from 'src/utils'; import { CollectionSearchNode } from 'src/types/CollectionSearchNode'; import { GetCollectionResponse, diff --git a/packages/hoppscotch-backend/src/team-request/team-request.service.spec.ts b/packages/hoppscotch-backend/src/team-request/team-request.service.spec.ts index 5388c84cfc7..feda8ed1367 100644 --- a/packages/hoppscotch-backend/src/team-request/team-request.service.spec.ts +++ b/packages/hoppscotch-backend/src/team-request/team-request.service.spec.ts @@ -55,6 +55,7 @@ for (let i = 1; i <= 10; i++) { collectionID: teamCollection.id, teamID: team.id, request: {}, + mockExamples: {}, title: `Test Request ${i}`, orderIndex: i, createdOn: new Date(), diff --git a/packages/hoppscotch-backend/src/types/InfraConfig.ts b/packages/hoppscotch-backend/src/types/InfraConfig.ts index 6563ae63a03..0a86e088b7c 100644 --- a/packages/hoppscotch-backend/src/types/InfraConfig.ts +++ b/packages/hoppscotch-backend/src/types/InfraConfig.ts @@ -4,6 +4,7 @@ export enum InfraConfigEnum { JWT_SECRET = 'JWT_SECRET', SESSION_SECRET = 'SESSION_SECRET', + SESSION_COOKIE_NAME = 'SESSION_COOKIE_NAME', TOKEN_SALT_COMPLEXITY = 'TOKEN_SALT_COMPLEXITY', MAGIC_LINK_TOKEN_VALIDITY = 'MAGIC_LINK_TOKEN_VALIDITY', REFRESH_TOKEN_VALIDITY = 'REFRESH_TOKEN_VALIDITY', @@ -48,4 +49,6 @@ export enum InfraConfigEnum { IS_FIRST_TIME_INFRA_SETUP = 'IS_FIRST_TIME_INFRA_SETUP', USER_HISTORY_STORE_ENABLED = 'USER_HISTORY_STORE_ENABLED', + + MOCK_SERVER_WILDCARD_DOMAIN = 'MOCK_SERVER_WILDCARD_DOMAIN', } diff --git a/packages/hoppscotch-backend/src/types/WorkspaceTypes.ts b/packages/hoppscotch-backend/src/types/WorkspaceTypes.ts new file mode 100644 index 00000000000..ea85b4192c7 --- /dev/null +++ b/packages/hoppscotch-backend/src/types/WorkspaceTypes.ts @@ -0,0 +1,4 @@ +export enum WorkspaceType { + USER = 'USER', + TEAM = 'TEAM', +} diff --git a/packages/hoppscotch-backend/src/user-request/user-request.service.spec.ts b/packages/hoppscotch-backend/src/user-request/user-request.service.spec.ts index 3aefec33afd..69618a6d3b8 100644 --- a/packages/hoppscotch-backend/src/user-request/user-request.service.spec.ts +++ b/packages/hoppscotch-backend/src/user-request/user-request.service.spec.ts @@ -51,6 +51,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 1', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -62,6 +63,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 2', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -73,6 +75,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 3', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -84,6 +87,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 4', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -95,6 +99,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 1', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -106,6 +111,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 2', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -117,6 +123,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 3', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), @@ -128,6 +135,7 @@ const dbUserRequests: DbUserRequest[] = [ userUid: user.uid, title: 'Request 4', request: {}, + mockExamples: {}, type: DbRequestType.REST, createdOn: new Date(), updatedOn: new Date(), diff --git a/packages/hoppscotch-backend/src/user/user.service.ts b/packages/hoppscotch-backend/src/user/user.service.ts index cb271e22f92..d9c3136193f 100644 --- a/packages/hoppscotch-backend/src/user/user.service.ts +++ b/packages/hoppscotch-backend/src/user/user.service.ts @@ -12,9 +12,9 @@ import { USERS_NOT_FOUND, USER_NOT_FOUND, USER_SHORT_DISPLAY_NAME, + USER_UPDATE_FAILED, } from 'src/errors'; import { SessionType, User } from './user.model'; -import { USER_UPDATE_FAILED } from 'src/errors'; import { PubSubService } from 'src/pubsub/pubsub.service'; import { encrypt, stringToJson, taskEitherValidateArraySeq } from 'src/utils'; import { UserDataHandler } from './user.data.handler'; diff --git a/packages/hoppscotch-cli/package.json b/packages/hoppscotch-cli/package.json index 5797f06e91c..c752f4131d3 100644 --- a/packages/hoppscotch-cli/package.json +++ b/packages/hoppscotch-cli/package.json @@ -1,6 +1,6 @@ { "name": "@hoppscotch/cli", - "version": "0.25.0", + "version": "0.26.0", "description": "A CLI to run Hoppscotch test scripts in CI environments.", "homepage": "https://hoppscotch.io", "type": "module", @@ -64,9 +64,9 @@ "fp-ts": "2.16.11", "prettier": "3.6.2", "qs": "6.11.2", - "semver": "7.7.2", + "semver": "7.7.3", "tsup": "8.5.0", - "typescript": "5.9.2", + "typescript": "5.9.3", "vitest": "3.2.4" } } diff --git a/packages/hoppscotch-cli/src/__tests__/e2e/fixtures/collections/scripting-revamp-coll.json b/packages/hoppscotch-cli/src/__tests__/e2e/fixtures/collections/scripting-revamp-coll.json index bce7446fd31..c513f23a361 100644 --- a/packages/hoppscotch-cli/src/__tests__/e2e/fixtures/collections/scripting-revamp-coll.json +++ b/packages/hoppscotch-cli/src/__tests__/e2e/fixtures/collections/scripting-revamp-coll.json @@ -70,7 +70,7 @@ "params": [], "headers": [], "preRequestScript": "export {};\nhopp.env.set('test_key', 'test_value')\nhopp.env.set('recursive_key', '<>')\nhopp.env.global.set('global_key', 'global_value')\nhopp.env.active.set('active_key', 'active_value')\n\n// `pm` namespace equivalents\npm.variables.set('pm_test_key', 'pm_test_value')\npm.environment.set('pm_active_key', 'pm_active_value')\npm.globals.set('pm_global_key', 'pm_global_value')\n", - "testScript": "export {};\n\nhopp.test('`hopp.env.get()` retrieves environment variables', () => {\n const value = hopp.env.get('test_key')\n hopp.expect(value).toBe('test_value')\n})\n\npm.test('`pm.variables.get()` retrieves environment variables', () => {\n const value = pm.variables.get('test_key')\n pm.expect(value).toBe('test_value')\n})\n\nhopp.test('`hopp.env.getRaw()` retrieves raw environment variables without resolution', () => {\n const rawValue = hopp.env.getRaw('recursive_key')\n hopp.expect(rawValue).toBe('<>')\n})\n\nhopp.test('`hopp.env.get()` resolves recursive environment variables', () => {\n const resolvedValue = hopp.env.get('recursive_key')\n hopp.expect(resolvedValue).toBe('test_value')\n})\n\npm.test('`pm.variables.replaceIn()` resolves template variables', () => {\n const resolved = pm.variables.replaceIn('Value is {{test_key}}')\n pm.expect(resolved).toBe('Value is test_value')\n})\n\nhopp.test('`hopp.env.global.get()` retrieves global environment variables', () => {\n const globalValue = hopp.env.global.get('global_key')\n\n // `hopp.env.global` would be empty for the CLI\n if (globalValue) {\n hopp.expect(globalValue).toBe('global_value')\n }\n})\n\npm.test('`pm.globals.get()` retrieves global environment variables', () => {\n const globalValue = pm.globals.get('global_key')\n\n // `pm.globals` would be empty for the CLI\n if (globalValue) {\n pm.expect(globalValue).toBe('global_value')\n }\n})\n\nhopp.test('`hopp.env.active.get()` retrieves active environment variables', () => {\n const activeValue = hopp.env.active.get('active_key')\n hopp.expect(activeValue).toBe('active_value')\n})\n\npm.test('`pm.environment.get()` retrieves active environment variables', () => {\n const activeValue = pm.environment.get('active_key')\n pm.expect(activeValue).toBe('active_value')\n})\n\nhopp.test('Environment methods return null for non-existent keys', () => {\n hopp.expect(hopp.env.get('non_existent')).toBe(null)\n hopp.expect(hopp.env.getRaw('non_existent')).toBe(null)\n hopp.expect(hopp.env.global.get('non_existent')).toBe(null)\n hopp.expect(hopp.env.active.get('non_existent')).toBe(null)\n})\n\npm.test('`pm` environment methods handle non-existent keys correctly', () => {\n pm.expect(pm.variables.get('non_existent')).toBe(null)\n pm.expect(pm.environment.get('non_existent')).toBe(null)\n pm.expect(pm.globals.get('non_existent')).toBe(null)\n pm.expect(pm.variables.has('non_existent')).toBe(false)\n pm.expect(pm.environment.has('non_existent')).toBe(false)\n pm.expect(pm.globals.has('non_existent')).toBe(false)\n})\n\npm.test('`pm` variables set in pre-request script are accessible', () => {\n pm.expect(pm.variables.get('pm_test_key')).toBe('pm_test_value')\n pm.expect(pm.environment.get('pm_active_key')).toBe('pm_active_value')\n\n const pmGlobalValue = hopp.env.global.get('pm_global_key')\n\n // `hopp.env.global` would be empty for the CLI\n if (pmGlobalValue) {\n hopp.expect(pmGlobalValue).toBe('pm_global_value')\n }\n})\n", + "testScript": "export {};\n\nhopp.test('`hopp.env.get()` retrieves environment variables', () => {\n const value = hopp.env.get('test_key')\n hopp.expect(value).toBe('test_value')\n})\n\npm.test('`pm.variables.get()` retrieves environment variables', () => {\n const value = pm.variables.get('test_key')\n pm.expect(value).toBe('test_value')\n})\n\nhopp.test('`hopp.env.getRaw()` retrieves raw environment variables without resolution', () => {\n const rawValue = hopp.env.getRaw('recursive_key')\n hopp.expect(rawValue).toBe('<>')\n})\n\nhopp.test('`hopp.env.get()` resolves recursive environment variables', () => {\n const resolvedValue = hopp.env.get('recursive_key')\n hopp.expect(resolvedValue).toBe('test_value')\n})\n\npm.test('`pm.variables.replaceIn()` resolves template variables', () => {\n const resolved = pm.variables.replaceIn('Value is {{test_key}}')\n pm.expect(resolved).toBe('Value is test_value')\n})\n\nhopp.test('`hopp.env.global.get()` retrieves global environment variables', () => {\n const globalValue = hopp.env.global.get('global_key')\n\n // `hopp.env.global` would be empty for the CLI\n if (globalValue) {\n hopp.expect(globalValue).toBe('global_value')\n }\n})\n\npm.test('`pm.globals.get()` retrieves global environment variables', () => {\n const globalValue = pm.globals.get('global_key')\n\n // `pm.globals` would be empty for the CLI\n if (globalValue) {\n pm.expect(globalValue).toBe('global_value')\n }\n})\n\nhopp.test('`hopp.env.active.get()` retrieves active environment variables', () => {\n const activeValue = hopp.env.active.get('active_key')\n hopp.expect(activeValue).toBe('active_value')\n})\n\npm.test('`pm.environment.get()` retrieves active environment variables', () => {\n const activeValue = pm.environment.get('active_key')\n pm.expect(activeValue).toBe('active_value')\n})\n\nhopp.test('Environment methods return null for non-existent keys', () => {\n hopp.expect(hopp.env.get('non_existent')).toBe(null)\n hopp.expect(hopp.env.getRaw('non_existent')).toBe(null)\n hopp.expect(hopp.env.global.get('non_existent')).toBe(null)\n hopp.expect(hopp.env.active.get('non_existent')).toBe(null)\n})\n\npm.test('`pm` environment methods handle non-existent keys correctly', () => {\n pm.expect(pm.variables.get('non_existent')).toBe(undefined)\n pm.expect(pm.environment.get('non_existent')).toBe(undefined)\n pm.expect(pm.globals.get('non_existent')).toBe(undefined)\n pm.expect(pm.variables.has('non_existent')).toBe(false)\n pm.expect(pm.environment.has('non_existent')).toBe(false)\n pm.expect(pm.globals.has('non_existent')).toBe(false)\n})\n\npm.test('`pm` variables set in pre-request script are accessible', () => {\n pm.expect(pm.variables.get('pm_test_key')).toBe('pm_test_value')\n pm.expect(pm.environment.get('pm_active_key')).toBe('pm_active_value')\n\n const pmGlobalValue = hopp.env.global.get('pm_global_key')\n\n // `hopp.env.global` would be empty for the CLI\n if (pmGlobalValue) {\n hopp.expect(pmGlobalValue).toBe('pm_global_value')\n }\n})\n", "auth": { "authType": "inherit", "authActive": true @@ -133,7 +133,7 @@ } ], "preRequestScript": "export {};\n", - "testScript": "export {};\n\nhopp.test('`hopp.response.statusCode` returns the response status code', () => {\n hopp.expect(hopp.response.statusCode).toBe(200)\n})\n\npm.test('`pm.response.code` returns the response status code', () => {\n pm.expect(pm.response.code).toBe(200)\n})\n\nhopp.test('`hopp.response.statusText` returns the response status text', () => {\n hopp.expect(hopp.response.statusText).toBeType('string')\n})\n\npm.test('`pm.response.status` returns the response status text', () => {\n pm.expect(pm.response.status).toBeType('string')\n})\n\nhopp.test('`hopp.response.headers` contains response headers', () => {\n const { headers } = hopp.response\n\n hopp.expect(headers).toBeType('object')\n hopp.expect(headers.length > 0).toBe(true)\n})\n\npm.test('`pm.response.headers` contains response headers', () => {\n const headersAll = pm.response.headers.all()\n pm.expect(headersAll).toBeType('object')\n pm.expect(Object.keys(headersAll).length > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.responseTime` is a positive number', () => {\n hopp.expect(hopp.response.responseTime).toBeType('number')\n hopp.expect(hopp.response.responseTime > 0).toBe(true)\n})\n\npm.test('`pm.response.responseTime` is a positive number', () => {\n pm.expect(pm.response.responseTime).toBeType('number')\n pm.expect(pm.response.responseTime > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.text()` returns response as text', () => {\n const responseText = hopp.response.body.asText()\n hopp.expect(responseText).toBeType('string')\n hopp.expect(responseText.length > 0).toBe(true)\n})\n\npm.test('`pm.response.text()` returns response as text', () => {\n const responseText = pm.response.text()\n pm.expect(responseText).toBeType('string')\n pm.expect(responseText.length > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.json()` parses JSON response', () => {\n const responseJSON = hopp.response.body.asJSON()\n hopp.expect(responseJSON).toBeType('object')\n})\n\npm.test('`pm.response.json()` parses JSON response', () => {\n const responseJSON = pm.response.json()\n pm.expect(responseJSON).toBeType('object')\n})\n\n\nhopp.test('`hopp.response.bytes()` returns the raw response', () => {\n const responseBuffer = hopp.response.body.bytes()\n hopp.expect(responseBuffer).toBeType('object')\n hopp.expect(responseBuffer.constructor.name).toBe('Object')\n})\n\npm.test('`pm.response.stream` returns the raw response', () => {\n const responseBuffer = pm.response.stream\n pm.expect(responseBuffer).toBeType('object')\n pm.expect(responseBuffer.constructor.name).toBe('Object')\n})", + "testScript": "export {};\n\nhopp.test('`hopp.response.statusCode` returns the response status code', () => {\n hopp.expect(hopp.response.statusCode).toBe(200)\n})\n\npm.test('`pm.response.code` returns the response status code', () => {\n pm.expect(pm.response.code).toBe(200)\n})\n\nhopp.test('`hopp.response.statusText` returns the response status text', () => {\n hopp.expect(hopp.response.statusText).toBeType('string')\n})\n\npm.test('`pm.response.status` returns the response status text', () => {\n pm.expect(pm.response.status).toBeType('string')\n})\n\nhopp.test('`hopp.response.headers` contains response headers', () => {\n const { headers }\u00a0= hopp.response\n\n hopp.expect(headers).toBeType('object')\n hopp.expect(headers.length > 0).toBe(true)\n})\n\npm.test('`pm.response.headers` contains response headers', () => {\n const headersAll = pm.response.headers.all()\n pm.expect(headersAll).toBeType('object')\n pm.expect(Object.keys(headersAll).length > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.responseTime` is a positive number', () => {\n hopp.expect(hopp.response.responseTime).toBeType('number')\n hopp.expect(hopp.response.responseTime > 0).toBe(true)\n})\n\npm.test('`pm.response.responseTime` is a positive number', () => {\n pm.expect(pm.response.responseTime).toBeType('number')\n pm.expect(pm.response.responseTime > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.text()` returns response as text', () => {\n const responseText = hopp.response.body.asText()\n hopp.expect(responseText).toBeType('string')\n hopp.expect(responseText.length > 0).toBe(true)\n})\n\npm.test('`pm.response.text()` returns response as text', () => {\n const responseText = pm.response.text()\n pm.expect(responseText).toBeType('string')\n pm.expect(responseText.length > 0).toBe(true)\n})\n\nhopp.test('`hopp.response.json()` parses JSON response', () => {\n const responseJSON = hopp.response.body.asJSON()\n hopp.expect(responseJSON).toBeType('object')\n})\n\npm.test('`pm.response.json()` parses JSON response', () => {\n const responseJSON = pm.response.json()\n pm.expect(responseJSON).toBeType('object')\n})\n\n\nhopp.test('`hopp.response.bytes()` returns the raw response', () => {\n const responseBuffer = hopp.response.body.bytes()\n hopp.expect(responseBuffer).toBeType('object')\n hopp.expect(responseBuffer.constructor.name).toBe('Object')\n})\n\npm.test('`pm.response.stream` returns the raw response', () => {\n const responseBuffer = pm.response.stream\n pm.expect(responseBuffer).toBeType('object')\n pm.expect(responseBuffer.constructor.name).toBe('Object')\n})", "auth": { "authType": "inherit", "authActive": true @@ -191,7 +191,7 @@ "params": [], "headers": [], "preRequestScript": "export {};\n", - "testScript": "export {};\n\npm.test('`pm.info.eventName` indicates the script context', () => {\n pm.expect(pm.info.eventName).toBe('post-request')\n})\n\npm.test('`pm.info.requestName` returns the request name', () => {\n pm.expect(pm.info.requestName).toBe('info-context-test')\n})\n\npm.test('`pm.info.requestId` returns an optional request identifier', () => {\n const requestId = pm.info.requestId\n if (requestId) {\n pm.expect(requestId).toBeType('string')\n pm.expect(requestId?.length > 0).toBe(true)\n } else {\n pm.expect(requestId).toBe(undefined)\n }\n})", + "testScript": "export {};\n\npm.test('`pm.info.eventName` indicates the script context', () => {\n pm.expect(pm.info.eventName).toBe('test')\n})\n\npm.test('`pm.info.requestName` returns the request name', () => {\n pm.expect(pm.info.requestName).toBe('info-context-test')\n})\n\npm.test('`pm.info.requestId` returns an optional request identifier', () => {\n const requestId = pm.info.requestId\n if (requestId) {\n pm.expect(requestId).toBeType('string')\n pm.expect(requestId?.length > 0).toBe(true)\n } else {\n pm.expect(requestId).toBe(undefined)\n }\n})", "auth": { "authType": "inherit", "authActive": true @@ -244,6 +244,550 @@ }, "requestVariables": [], "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00chai1qt0inext01", + "name": "chai-assertions-hopp-extended", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\n// EQUALITY ASSERTIONS\nhopp.test('Chai equality - equal() method', () => {\n hopp.expect(5).to.equal(5)\n hopp.expect('hello').to.equal('hello')\n hopp.expect(true).to.equal(true)\n})\n\nhopp.test('Chai equality - eql() for deep equality', () => {\n hopp.expect({ a: 1 }).to.eql({ a: 1 })\n hopp.expect([1, 2, 3]).to.eql([1, 2, 3])\n})\n\nhopp.test('Chai equality - negation with .not', () => {\n hopp.expect(5).to.not.equal(10)\n hopp.expect('hello').to.not.equal('world')\n})\n\n// TYPE ASSERTIONS\nhopp.test('Chai type - .a() and .an() assertions', () => {\n hopp.expect('test').to.be.a('string')\n hopp.expect(42).to.be.a('number')\n hopp.expect([]).to.be.an('array')\n hopp.expect({}).to.be.an('object')\n})\n\nhopp.test('Chai type - instanceof assertions', () => {\n hopp.expect([1, 2, 3]).to.be.instanceof(Array)\n hopp.expect(new Date()).to.be.instanceof(Date)\n hopp.expect(new Error('test')).to.be.instanceof(Error)\n})\n\n// TRUTHINESS ASSERTIONS\nhopp.test('Chai truthiness - .true, .false, .null, .undefined', () => {\n hopp.expect(true).to.be.true\n hopp.expect(false).to.be.false\n hopp.expect(null).to.be.null\n hopp.expect(undefined).to.be.undefined\n})\n\nhopp.test('Chai truthiness - .ok and .exist', () => {\n hopp.expect(1).to.be.ok\n hopp.expect('string').to.exist\n hopp.expect(0).to.not.be.ok\n})\n\nhopp.test('Chai truthiness - .NaN assertion', () => {\n hopp.expect(NaN).to.be.NaN\n hopp.expect(42).to.not.be.NaN\n})\n\n// NUMERICAL COMPARISONS\nhopp.test('Chai numbers - .above() and .below()', () => {\n hopp.expect(10).to.be.above(5)\n hopp.expect(5).to.be.below(10)\n hopp.expect(5).to.not.be.above(10)\n})\n\nhopp.test('Chai numbers - aliases gt, lt, gte, lte', () => {\n hopp.expect(10).to.be.gt(5)\n hopp.expect(5).to.be.lt(10)\n hopp.expect(5).to.be.gte(5)\n hopp.expect(5).to.be.lte(5)\n})\n\nhopp.test('Chai numbers - .least() and .most()', () => {\n hopp.expect(10).to.be.at.least(10)\n hopp.expect(10).to.be.at.most(10)\n hopp.expect(15).to.be.at.least(10)\n})\n\nhopp.test('Chai numbers - .within() range', () => {\n hopp.expect(7).to.be.within(5, 10)\n hopp.expect(5).to.be.within(5, 10)\n hopp.expect(10).to.be.within(5, 10)\n})\n\nhopp.test('Chai numbers - .closeTo() with delta', () => {\n hopp.expect(10).to.be.closeTo(10.5, 0.6)\n hopp.expect(9.99).to.be.closeTo(10, 0.1)\n})\n\n// PROPERTY ASSERTIONS\nhopp.test('Chai properties - .property() checks', () => {\n const obj = { name: 'test', nested: { value: 42 } }\n hopp.expect(obj).to.have.property('name')\n hopp.expect(obj).to.have.property('name', 'test')\n hopp.expect(obj).to.have.nested.property('nested.value', 42)\n})\n\nhopp.test('Chai properties - .ownProperty() checks', () => {\n const obj = { own: 'value' }\n hopp.expect(obj).to.have.ownProperty('own')\n hopp.expect(obj).to.not.have.ownProperty('toString')\n})\n\n// LENGTH ASSERTIONS\nhopp.test('Chai length - .lengthOf() for arrays and strings', () => {\n hopp.expect([1, 2, 3]).to.have.lengthOf(3)\n hopp.expect('hello').to.have.lengthOf(5)\n hopp.expect([]).to.have.lengthOf(0)\n})\n\n// COLLECTION ASSERTIONS\nhopp.test('Chai collections - .keys() assertions', () => {\n const obj = { a: 1, b: 2, c: 3 }\n hopp.expect(obj).to.have.keys('a', 'b', 'c')\n hopp.expect(obj).to.have.all.keys('a', 'b', 'c')\n hopp.expect(obj).to.have.any.keys('a', 'd')\n})\n\nhopp.test('Chai collections - .members() for arrays', () => {\n hopp.expect([1, 2, 3]).to.have.members([3, 2, 1])\n hopp.expect([1, 2, 3]).to.include.members([1, 2])\n})\n\nhopp.test('Chai collections - .deep.members() for object arrays', () => {\n hopp.expect([{ a: 1 }, { b: 2 }]).to.have.deep.members([{ b: 2 }, { a: 1 }])\n})\n\nhopp.test('Chai collections - .oneOf() checks', () => {\n hopp.expect(2).to.be.oneOf([1, 2, 3])\n hopp.expect('a').to.be.oneOf(['a', 'b', 'c'])\n})\n\n// INCLUSION ASSERTIONS\nhopp.test('Chai inclusion - .include() for arrays and strings', () => {\n hopp.expect([1, 2, 3]).to.include(2)\n hopp.expect('hello world').to.include('world')\n})\n\nhopp.test('Chai inclusion - .deep.include() for objects', () => {\n hopp.expect([{ a: 1 }, { b: 2 }]).to.deep.include({ a: 1 })\n})\n\n// FUNCTION/ERROR ASSERTIONS\nhopp.test('Chai functions - .throw() assertions', () => {\n const throwFn = () => { throw new Error('test error') }\n const noThrow = () => { return 42 }\n \n hopp.expect(throwFn).to.throw()\n hopp.expect(throwFn).to.throw(Error)\n hopp.expect(throwFn).to.throw('test error')\n hopp.expect(noThrow).to.not.throw()\n})\n\nhopp.test('Chai functions - .respondTo() method checks', () => {\n const obj = { method: function() {} }\n hopp.expect(obj).to.respondTo('method')\n hopp.expect([]).to.respondTo('push')\n})\n\nhopp.test('Chai functions - .satisfy() custom matcher', () => {\n hopp.expect(10).to.satisfy((num) => num > 5)\n hopp.expect('hello').to.satisfy((str) => str.length === 5)\n})\n\n// OBJECT STATE ASSERTIONS\nhopp.test('Chai object state - .sealed, .frozen, .extensible', () => {\n const sealed = Object.seal({ a: 1 })\n const frozen = Object.freeze({ b: 2 })\n const extensible = { c: 3 }\n \n hopp.expect(sealed).to.be.sealed\n hopp.expect(frozen).to.be.frozen\n hopp.expect(extensible).to.be.extensible\n})\n\nhopp.test('Chai number state - .finite', () => {\n hopp.expect(42).to.be.finite\n hopp.expect(Infinity).to.not.be.finite\n})\n\n// EXOTIC OBJECTS\nhopp.test('Chai exotic - Set assertions', () => {\n const mySet = new Set([1, 2, 3])\n hopp.expect(mySet).to.be.instanceof(Set)\n hopp.expect(mySet).to.have.lengthOf(3)\n})\n\nhopp.test('Chai exotic - Map assertions', () => {\n const myMap = new Map([['key', 'value']])\n hopp.expect(myMap).to.be.instanceof(Map)\n hopp.expect(myMap).to.have.lengthOf(1)\n})\n\n// SIDE-EFFECT ASSERTIONS\nhopp.test('Chai side-effects - .change() assertions', () => {\n const obj = { count: 0 }\n const changeFn = () => { obj.count = 5 }\n hopp.expect(changeFn).to.change(obj, 'count')\n \n const noChangeFn = () => {} \n hopp.expect(noChangeFn).to.not.change(obj, 'count')\n})\n\nhopp.test('Chai side-effects - .change().by() delta', () => {\n const obj = { count: 10 }\n const addFive = () => { obj.count += 5 }\n hopp.expect(addFive).to.change(obj, 'count').by(5)\n})\n\nhopp.test('Chai side-effects - .increase() assertions', () => {\n const obj = { count: 0 }\n const incFn = () => { obj.count++ }\n hopp.expect(incFn).to.increase(obj, 'count')\n})\n\nhopp.test('Chai side-effects - .decrease() assertions', () => {\n const obj = { count: 10 }\n const decFn = () => { obj.count-- }\n hopp.expect(decFn).to.decrease(obj, 'count')\n})\n\n// LANGUAGE CHAINS AND MODIFIERS\nhopp.test('Chai chains - Complex chaining with multiple modifiers', () => {\n hopp.expect([1, 2, 3]).to.be.an('array').that.includes(2)\n hopp.expect({ a: 1, b: 2 }).to.be.an('object').that.has.property('a')\n})\n\nhopp.test('Chai modifiers - .deep with .equal()', () => {\n hopp.expect({ a: { b: 1 } }).to.deep.equal({ a: { b: 1 } })\n hopp.expect([{ a: 1 }]).to.deep.equal([{ a: 1 }])\n})\n\n// RESPONSE-BASED TESTS\nhopp.test('Chai with response - status code checks', () => {\n hopp.expect(hopp.response.statusCode).to.equal(200)\n hopp.expect(hopp.response.statusCode).to.be.within(200, 299)\n})\n\nhopp.test('Chai with response - body parsing', () => {\n const response = hopp.response.body.asJSON()\n hopp.expect(response).to.be.an('object')\n hopp.expect(response).to.have.property('data')\n \n const body = JSON.parse(response.data)\n hopp.expect(body).to.have.property('testData')\n hopp.expect(body.testData).to.have.property('number', 42)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"testData\": {\n \"number\": 42,\n \"string\": \"hello world\",\n \"array\": [1, 2, 3, 4, 5],\n \"object\": { \"nested\": { \"value\": true } },\n \"bool\": true,\n \"nullValue\": null\n }\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00chai2qt0inext02", + "name": "chai-assertions-pm-parity", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('PM Chai - equality assertions', () => {\n pm.expect(5).to.equal(5)\n pm.expect('test').to.not.equal('other')\n pm.expect({ a: 1 }).to.eql({ a: 1 })\n})\n\npm.test('PM Chai - type assertions', () => {\n pm.expect('string').to.be.a('string')\n pm.expect(42).to.be.a('number')\n pm.expect([]).to.be.an('array')\n})\n\npm.test('PM Chai - truthiness assertions', () => {\n pm.expect(true).to.be.true\n pm.expect(false).to.be.false\n pm.expect(null).to.be.null\n})\n\npm.test('PM Chai - numerical comparisons', () => {\n pm.expect(10).to.be.above(5)\n pm.expect(5).to.be.below(10)\n pm.expect(7).to.be.within(5, 10)\n})\n\npm.test('PM Chai - property and length assertions', () => {\n const obj = { name: 'test' }\n pm.expect(obj).to.have.property('name')\n pm.expect([1, 2, 3]).to.have.lengthOf(3)\n pm.expect('hello').to.have.lengthOf(5)\n})\n\npm.test('PM Chai - string and collection assertions', () => {\n pm.expect('hello world').to.include('world')\n pm.expect([1, 2, 3]).to.include(2)\n pm.expect({ a: 1, b: 2 }).to.have.keys('a', 'b')\n})\n\npm.test('PM Chai - function assertions', () => {\n const throwFn = () => { throw new Error('test') }\n pm.expect(throwFn).to.throw()\n pm.expect([]).to.respondTo('push')\n})\n\npm.test('PM Chai - response validation', () => {\n pm.expect(pm.response.code).to.equal(200)\n pm.expect(pm.response.responseTime).to.be.a('number')\n \n const response = pm.response.json()\n pm.expect(response).to.have.property('data')\n \n const body = JSON.parse(response.data)\n pm.expect(body).to.have.property('pmTest')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"pmTest\": {\n \"value\": 42,\n \"text\": \"postman compatible\"\n }\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00cookies01", + "name": "cookie-assertions-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [ + { + "key": "Cookie", + "value": "session_id=abc123; user_token=xyz789; preferences=theme%3Ddark", + "active": true, + "description": "Test cookies" + } + ], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\n// NOTE: Full cookie behavior with Set-Cookie headers is tested in js-sandbox unit tests\n// (see packages/hoppscotch-js-sandbox/src/__tests__/pm-namespace/response/cookies.spec.ts)\n// These CLI E2E tests verify API contracts and integration behavior\n\npm.test('pm.response.cookies API contract - all methods exist', () => {\n pm.expect(pm.response.cookies).to.be.an('object')\n pm.expect(typeof pm.response.cookies.get).to.equal('function')\n pm.expect(typeof pm.response.cookies.has).to.equal('function')\n pm.expect(typeof pm.response.cookies.toObject).to.equal('function')\n})\n\npm.test('pm.response.cookies.toObject() returns proper structure', () => {\n const allCookies = pm.response.cookies.toObject()\n pm.expect(allCookies).to.be.an('object')\n pm.expect(typeof allCookies).to.equal('object')\n})\n\npm.test('pm.response.cookies.has() returns boolean for cookie checks', () => {\n const hasCookie = pm.response.cookies.has('test_cookie_name')\n pm.expect(hasCookie).to.be.a('boolean')\n})\n\npm.test('pm.response.cookies.get() returns null for non-existent cookies', () => {\n const cookieValue = pm.response.cookies.get('non_existent_cookie_xyz')\n pm.expect(cookieValue).to.be.null\n})\n\npm.test('pm.response.cookies API integrates with response object', () => {\n pm.expect(pm.response.code).to.equal(200)\n \n // Verify cookies object is accessible from response\n pm.expect(pm.response).to.have.property('cookies')\n pm.expect(pm.response.cookies).to.not.be.null\n pm.expect(pm.response.cookies).to.not.be.undefined\n})\n\npm.test('Request cookies are properly sent via Cookie header', () => {\n const hasCookieHeader = pm.request.headers.has('Cookie')\n \n if (hasCookieHeader) {\n const cookieHeader = pm.request.headers.get('Cookie')\n pm.expect(cookieHeader).to.be.a('string')\n pm.expect(cookieHeader).to.include('session_id')\n pm.expect(cookieHeader).to.include('user_token')\n }\n})\n\npm.test('pm.response.to.have.cookie() assertion method exists', () => {\n // Verify the cookie assertion is defined in the type system\n pm.expect(typeof pm.response.to.have.cookie).to.equal('function')\n})\n\nhopp.test('hopp.cookies API contract matches pm.response.cookies', () => {\n hopp.expect(typeof hopp.cookies).toBe('object')\n hopp.expect(typeof hopp.cookies.get).toBe('function')\n hopp.expect(typeof hopp.cookies.has).toBe('function')\n hopp.expect(typeof hopp.cookies.getAll).toBe('function')\n hopp.expect(typeof hopp.cookies.set).toBe('function')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00schema01", + "name": "json-schema-validation-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.response.to.have.jsonSchema() validates response structure', () => {\n const schema = {\n type: 'object',\n required: ['data'],\n properties: {\n data: { type: 'string' },\n headers: { type: 'object' }\n }\n }\n \n pm.response.to.have.jsonSchema(schema)\n \n // Explicit assertions to ensure schema validation passed\n const json = pm.response.json()\n pm.expect(json).to.have.property('data')\n pm.expect(json.data).to.be.a('string')\n})\n\npm.test('JSON Schema validation with nested properties', () => {\n const response = pm.response.json()\n const body = JSON.parse(response.data)\n \n const userSchema = {\n type: 'object',\n required: ['name', 'age'],\n properties: {\n name: { type: 'string' },\n age: { type: 'number', minimum: 0, maximum: 150 },\n email: { type: 'string' }\n }\n }\n \n pm.expect(body).to.have.jsonSchema(userSchema)\n \n // Explicit assertions to ensure schema validation passed\n pm.expect(body).to.have.property('name')\n pm.expect(body).to.have.property('age')\n pm.expect(body.name).to.equal('Alice Smith')\n pm.expect(body.age).to.equal(28)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"name\": \"Alice Smith\",\n \"age\": 28,\n \"email\": \"alice@example.com\"\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00charset01", + "name": "charset-validation-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\n// NOTE: Full charset behavior with actual charset values is tested in js-sandbox unit tests\n// (see packages/hoppscotch-js-sandbox/src/__tests__/pm-namespace/advanced-assertions.spec.ts)\n// These CLI E2E tests verify API contracts and header parsing behavior\n\npm.test('pm.expect().to.have.charset() assertion API contract exists', () => {\n const testString = 'test'\n pm.expect(typeof pm.expect(testString).to.have.charset).to.equal('function')\n})\n\npm.test('pm.response.to.have.charset() assertion API contract exists', () => {\n pm.expect(typeof pm.response.to.have.charset).to.equal('function')\n})\n\npm.test('Response Content-Type header is accessible and parseable', () => {\n const contentType = pm.response.headers.get('content-type')\n pm.expect(contentType).to.be.a('string')\n pm.expect(contentType.length).to.be.above(0)\n pm.expect(contentType).to.include('application/')\n})\n\npm.test('Content-Type header parsing logic validates structure', () => {\n const contentType = pm.response.headers.get('content-type')\n \n // Test charset detection logic\n const hasCharset = contentType.includes('charset=')\n pm.expect(typeof hasCharset).to.equal('boolean')\n \n // Test charset extraction pattern\n const charsetMatch = contentType.match(/charset=([^;\\s]+)/i)\n if (hasCharset) {\n pm.expect(charsetMatch).to.be.an('array')\n pm.expect(charsetMatch[1]).to.be.a('string')\n } else {\n pm.expect(charsetMatch).to.be.null\n }\n})\n\npm.test('Charset handling works with or without explicit charset', () => {\n const contentType = pm.response.headers.get('content-type')\n const hasExplicitCharset = contentType.toLowerCase().includes('charset=')\n \n // Whether charset is present or not, response decoding should work\n const responseText = pm.response.text()\n pm.expect(responseText).to.be.a('string')\n pm.expect(responseText.length).to.be.above(0)\n})\n\npm.test('Response text decoding works with UTF-8 default', () => {\n const responseText = pm.response.text()\n pm.expect(responseText).to.be.a('string')\n \n // Verify JSON parsing works (implies correct encoding)\n const responseJson = pm.response.json()\n pm.expect(responseJson).to.be.an('object')\n pm.expect(responseJson).to.have.property('data')\n})\n\npm.test('Response headers integrate correctly with charset assertions', () => {\n const allHeaders = pm.response.headers.all()\n pm.expect(allHeaders).to.be.an('object')\n pm.expect(Object.keys(allHeaders).length).to.be.above(0)\n})\n\nhopp.test('hopp namespace handles response encoding with proper defaults', () => {\n const textResponse = hopp.response.body.asText()\n hopp.expect(textResponse).toBeType('string')\n hopp.expect(textResponse.length > 0).toBe(true)\n \n // Verify JSON parsing works with default encoding\n const jsonResponse = hopp.response.body.asJSON()\n hopp.expect(jsonResponse).toBeType('object')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00jsonpath01", + "name": "jsonpath-query-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.response.to.have.jsonPath() queries nested JSON data', () => {\n const response = pm.response.json()\n const body = JSON.parse(response.data)\n \n pm.expect(body).to.have.jsonPath('$.users[0].name')\n pm.expect(body).to.have.jsonPath('$.users[*].active')\n pm.expect(body).to.have.jsonPath('$.metadata.version')\n})\n\npm.test('JSONPath with value validation', () => {\n const response = pm.response.json()\n const body = JSON.parse(response.data)\n \n pm.expect(body).to.have.jsonPath('$.users[0].name', 'John')\n pm.expect(body).to.have.jsonPath('$.metadata.version', '1.0')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"users\": [\n { \"name\": \"John\", \"active\": true },\n { \"name\": \"Jane\", \"active\": false }\n ],\n \"metadata\": {\n \"version\": \"1.0\",\n \"timestamp\": \"2025-01-15\"\n }\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00envext01", + "name": "environment-extensions-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\npm.environment.set('template_var', 'world')\npm.environment.set('user_id', '12345')\npm.globals.set('api_base', 'https://api.example.com')\npm.globals.set('version', 'v2')\n", + "testScript": "export {};\n\npm.test('pm.environment.name returns environment identifier', () => {\n pm.expect(pm.environment.name).to.be.a('string')\n pm.expect(pm.environment.name).to.equal('active')\n})\n\npm.test('pm.environment.replaceIn() resolves template variables', () => {\n const template = 'Hello {{template_var}}, user {{user_id}}!'\n const resolved = pm.environment.replaceIn(template)\n pm.expect(resolved).to.equal('Hello world, user 12345!')\n})\n\npm.test('pm.globals.replaceIn() resolves global template variables', () => {\n const template = '{{api_base}}/{{version}}/users'\n const resolved = pm.globals.replaceIn(template)\n pm.expect(resolved).to.equal('https://api.example.com/v2/users')\n})\n\npm.test('pm.environment.toObject() returns all environment variables', () => {\n const allVars = pm.environment.toObject()\n pm.expect(allVars).to.be.an('object')\n pm.expect(allVars).to.have.property('template_var', 'world')\n pm.expect(allVars).to.have.property('user_id', '12345')\n})\n\npm.test('pm.globals.toObject() returns all global variables', () => {\n const allGlobals = pm.globals.toObject()\n pm.expect(allGlobals).to.be.an('object')\n \n // globals might be empty in CLI context\n if (Object.keys(allGlobals).length > 0) {\n pm.expect(allGlobals).to.have.property('api_base')\n }\n})\n\npm.test('pm.variables.toObject() returns combined variables with precedence', () => {\n const allVariables = pm.variables.toObject()\n pm.expect(allVariables).to.be.an('object')\n pm.expect(allVariables).to.have.property('template_var')\n})\n\npm.test('pm.environment.clear() removes all environment variables', () => {\n pm.environment.clear()\n const clearedVars = pm.environment.toObject()\n pm.expect(Object.keys(clearedVars).length).to.equal(0)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00respext01", + "name": "response-extensions-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.response.responseSize returns response body size in bytes', () => {\n pm.expect(pm.response.responseSize).to.be.a('number')\n pm.expect(pm.response.responseSize).to.be.above(0)\n})\n\npm.test('pm.response.responseSize matches actual body length', () => {\n const bodyText = pm.response.text()\n // Use the same workaround as pm.response.responseSize for QuickJS\n const encoder = new TextEncoder()\n const encoded = encoder.encode(bodyText)\n // QuickJS represents Uint8Array as object with numeric keys\n const actualSize = encoded && typeof encoded.length === 'number' && encoded.length > 0\n ? encoded.length\n : Object.keys(encoded).filter(k => !isNaN(k)).length\n pm.expect(pm.response.responseSize).to.equal(actualSize)\n})\n\npm.test('Response size is calculated correctly for JSON payload', () => {\n const response = pm.response.json()\n pm.expect(pm.response.responseSize).to.be.a('number')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"message\": \"Testing response size calculation\",\n \"data\": {\n \"items\": [1, 2, 3, 4, 5],\n \"metadata\": {\n \"count\": 5,\n \"type\": \"numeric\"\n }\n }\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00execext01", + "name": "execution-context-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.execution.location provides execution path', () => {\n pm.expect(pm.execution.location).to.be.an('array')\n pm.expect(pm.execution.location.length).to.be.above(0)\n})\n\npm.test('pm.execution.location.current returns current location', () => {\n pm.expect(pm.execution.location.current).to.be.a('string')\n pm.expect(pm.execution.location.current).to.equal('Hoppscotch')\n})\n\npm.test('pm.execution.location is immutable', () => {\n const location = pm.execution.location\n const throwFn = () => { location.push('test') }\n pm.expect(throwFn).to.throw()\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00bddassert01", + "name": "bdd-response-assertions-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [ + { + "key": "Content-Type", + "value": "application/json", + "active": true, + "description": "" + } + ], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.response.to.have.status() validates exact status code', () => {\n pm.response.to.have.status(200)\n pm.expect(pm.response.code).to.equal(200)\n})\n\npm.test('pm.response.to.be.ok validates 2xx status codes', () => {\n pm.response.to.be.ok()\n})\n\npm.test('pm.response.to.be.success validates 2xx status codes (alias)', () => {\n pm.response.to.be.success()\n})\n\npm.test('pm.response.to.have.header() validates response headers', () => {\n pm.response.to.have.header('content-type')\n pm.expect(pm.response.headers.has('content-type')).to.be.true\n})\n\npm.test('pm.response.to.have.jsonBody() validates JSON response', () => {\n pm.response.to.have.jsonBody()\n pm.response.to.have.jsonBody('data')\n \n const json = pm.response.json()\n pm.expect(json).to.have.property('data')\n})\n\npm.test('pm.response.to.be.json validates JSON content type', () => {\n pm.response.to.be.json()\n})\n\npm.test('pm.response.to.have.responseTime assertions', () => {\n pm.response.to.have.responseTime.below(5000)\n pm.expect(pm.response.responseTime).to.be.a('number')\n pm.expect(pm.response.responseTime).to.be.above(0)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"test\": \"BDD assertions\",\n \"status\": \"success\"\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00includecontain01", + "name": "include-contain-assertions-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.expect().to.include() validates string inclusion', () => {\n pm.expect('hello world').to.include('world')\n pm.expect('hello world').to.include('hello')\n pm.expect('test string').to.not.include('missing')\n})\n\npm.test('pm.expect().to.contain() validates array inclusion', () => {\n pm.expect([1, 2, 3]).to.contain(2)\n pm.expect([1, 2, 3]).to.include(1)\n pm.expect(['a', 'b', 'c']).to.contain('b')\n})\n\npm.test('pm.expect().to.includes() alias works', () => {\n pm.expect('testing').to.includes('test')\n pm.expect([10, 20, 30]).to.includes(20)\n})\n\npm.test('pm.expect().to.contains() alias works', () => {\n pm.expect('contains test').to.contains('contains')\n pm.expect([true, false]).to.contains(true)\n})\n\npm.test('include/contain with response data', () => {\n const response = pm.response.json()\n pm.expect(response).to.have.property('data')\n \n const bodyText = pm.response.text()\n pm.expect(bodyText).to.include('includeTest')\n})\n\nhopp.test('hopp.expect() also supports toInclude()', () => {\n hopp.expect('hopp test').toInclude('hopp')\n hopp.expect([1, 2]).toInclude(1)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"includeTest\": \"This text should be found\",\n \"array\": [1, 2, 3]\n}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00envunsetclear01", + "name": "environment-unset-clear-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\npm.environment.set('to_unset1', 'value1')\npm.environment.set('to_unset2', 'value2')\npm.environment.set('to_clear1', 'clear_value1')\npm.environment.set('to_clear2', 'clear_value2')\npm.environment.set('to_clear3', 'clear_value3')\npm.globals.set('global_to_unset', 'global_value')\npm.globals.set('global_to_clear1', 'global_clear1')\npm.globals.set('global_to_clear2', 'global_clear2')\n", + "testScript": "export {};\n\npm.test('pm.environment.unset() removes specific variables', () => {\n pm.expect(pm.environment.has('to_unset1')).to.be.true\n pm.environment.unset('to_unset1')\n pm.expect(pm.environment.has('to_unset1')).to.be.false\n pm.expect(pm.environment.get('to_unset1')).to.be.undefined\n})\n\npm.test('pm.environment.unset() handles non-existent keys gracefully', () => {\n pm.environment.unset('non_existent_key')\n pm.expect(pm.environment.has('non_existent_key')).to.be.false\n})\n\npm.test('pm.globals.unset() removes specific global variables', () => {\n const hasGlobal = pm.globals.has('global_to_unset')\n if (hasGlobal) {\n pm.globals.unset('global_to_unset')\n pm.expect(pm.globals.has('global_to_unset')).to.be.false\n }\n})\n\npm.test('pm.environment.clear() removes ALL environment variables', () => {\n // Verify variables exist before clear\n pm.expect(pm.environment.has('to_clear1')).to.be.true\n pm.expect(pm.environment.has('to_clear2')).to.be.true\n pm.expect(pm.environment.has('to_clear3')).to.be.true\n \n // Clear all environment variables\n pm.environment.clear()\n \n // Verify ALL variables are removed\n const allVars = pm.environment.toObject()\n pm.expect(Object.keys(allVars).length).to.equal(0)\n pm.expect(pm.environment.has('to_clear1')).to.be.false\n pm.expect(pm.environment.has('to_clear2')).to.be.false\n pm.expect(pm.environment.has('to_clear3')).to.be.false\n})\n\npm.test('pm.globals.clear() removes ALL global variables', () => {\n // Verify globals exist before clear (might be empty in CLI)\n const globalsBeforeClear = pm.globals.toObject()\n \n pm.globals.clear()\n \n // Verify all globals are removed\n const globalsAfterClear = pm.globals.toObject()\n pm.expect(Object.keys(globalsAfterClear).length).to.equal(0)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00pmmutate01", + "name": "pm-request-mutation-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io/original", + "params": [ + { + "key": "original_param", + "value": "original", + "active": true, + "description": "" + } + ], + "headers": [ + { + "key": "Original-Header", + "value": "original", + "active": true, + "description": "" + } + ], + "preRequestScript": "export {};\n// Test PM namespace mutability - URL string assignment\npm.request.url = 'https://echo.hoppscotch.io/mutated-via-string'\n\n// Test method mutation\npm.request.method = 'POST'\n\n// Test header mutations\npm.request.headers.add({ key: 'Added-Header', value: 'added-value' })\npm.request.headers.upsert({ key: 'Original-Header', value: 'mutated-value' })\n\n// Test body mutation via update()\npm.request.body.update({\n mode: 'raw',\n raw: JSON.stringify({ pmMutated: true, timestamp: Date.now() }),\n options: { raw: { language: 'json' } }\n})\n\n// Test auth mutation\npm.request.auth = {\n authType: 'bearer',\n authActive: true,\n token: 'pm-bearer-token-123'\n}\n", + "testScript": "export {};\n\npm.test('pm.request.url string assignment was applied', () => {\n const urlString = pm.request.url.toString()\n pm.expect(urlString).to.include('/mutated-via-string')\n pm.expect(urlString).to.not.include('/original')\n})\n\npm.test('pm.request.method mutation was applied', () => {\n pm.expect(pm.request.method).to.equal('POST')\n pm.expect(pm.request.method).to.not.equal('GET')\n})\n\npm.test('pm.request.headers.add() added new header', () => {\n pm.expect(pm.request.headers.has('Added-Header')).to.be.true\n pm.expect(pm.request.headers.get('Added-Header')).to.equal('added-value')\n})\n\npm.test('pm.request.headers.upsert() updated existing header', () => {\n pm.expect(pm.request.headers.has('Original-Header')).to.be.true\n pm.expect(pm.request.headers.get('Original-Header')).to.equal('mutated-value')\n pm.expect(pm.request.headers.get('Original-Header')).to.not.equal('original')\n})\n\npm.test('pm.request.body.update() changed body content', () => {\n pm.expect(pm.request.body.contentType).to.equal('application/json')\n const bodyString = typeof pm.request.body.body === 'string' \n ? pm.request.body.body \n : JSON.stringify(pm.request.body.body)\n pm.expect(bodyString).to.include('pmMutated')\n const bodyData = JSON.parse(bodyString)\n pm.expect(bodyData.pmMutated).to.be.true\n})\n\npm.test('pm.request.auth mutation was applied', () => {\n pm.expect(pm.request.auth.authType).to.equal('bearer')\n pm.expect(pm.request.auth.token).to.equal('pm-bearer-token-123')\n})\n\npm.test('pm.request.id and pm.request.name are accessible', () => {\n pm.expect(pm.request.id).to.be.a('string')\n pm.expect(pm.request.id.length).to.be.above(0)\n pm.expect(pm.request.name).to.equal('pm-request-mutation-test')\n})\n\nhopp.test('hopp.request reflects pm namespace mutations', () => {\n hopp.expect(hopp.request.url).toInclude('/mutated-via-string')\n hopp.expect(hopp.request.method).toBe('POST')\n const hasAddedHeader = hopp.request.headers.some(h => h.key === 'Added-Header')\n hopp.expect(hasAddedHeader).toBe(true)\n})\n", + "auth": { + "authType": "none", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00urlmutate01", + "name": "pm-url-property-mutations-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io/original?old=value", + "params": [], + "headers": [], + "preRequestScript": "export {};\n// Test URL object property mutations\npm.request.url.protocol = 'http'\npm.request.url.host = ['echo', 'hoppscotch', 'io']\npm.request.url.path = ['v2', 'test']\npm.request.url.port = '443'\npm.request.url.query.add({ key: 'new', value: 'param' })\npm.request.url.query.remove('old')\n", + "testScript": "export {};\n\npm.test('URL protocol mutation works', () => {\n const url = pm.request.url\n pm.expect(url.protocol).to.equal('http')\n pm.expect(url.toString()).to.include('http://')\n})\n\npm.test('URL host mutation works', () => {\n const url = pm.request.url\n pm.expect(url.host).to.be.an('array')\n pm.expect(url.host.join('.')).to.equal('echo.hoppscotch.io')\n pm.expect(url.toString()).to.include('echo.hoppscotch.io')\n})\n\npm.test('URL path mutation works', () => {\n const url = pm.request.url\n pm.expect(url.path).to.be.an('array')\n pm.expect(url.path).to.include('v2')\n pm.expect(url.path).to.include('test')\n pm.expect(url.toString()).to.include('/v2/test')\n})\n\npm.test('URL query.add() adds parameter', () => {\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.have.property('new', 'param')\n})\n\npm.test('URL query.remove() removes parameter', () => {\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.not.have.property('old')\n})\n\npm.test('Full URL reflects all mutations', () => {\n const fullUrl = pm.request.url.toString()\n pm.expect(fullUrl).to.include('http://')\n pm.expect(fullUrl).to.include('echo.hoppscotch.io')\n pm.expect(fullUrl).to.include('/v2/test')\n pm.expect(fullUrl).to.include('new=param')\n pm.expect(fullUrl).to.not.include('old=value')\n})\n\nhopp.test('hopp.request reflects URL mutations', () => {\n hopp.expect(hopp.request.url).toInclude('echo.hoppscotch.io')\n hopp.expect(hopp.request.url).toInclude('/v2/test')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00unsupported01", + "name": "unsupported-features-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\npm.test('pm.require() throws descriptive error', () => {\n const throwFn = () => pm.require('lodash')\n pm.expect(throwFn).to.throw()\n pm.expect(throwFn).to.throw(/not supported in Hoppscotch/)\n})\n\npm.test('pm.execution.runRequest() throws descriptive error', () => {\n const throwFn = () => pm.execution.runRequest()\n pm.expect(throwFn).to.throw()\n pm.expect(throwFn).to.throw(/Collection Runner feature/)\n})\n\npm.test('pm.collectionVariables.replaceIn() throws descriptive error', () => {\n const throwFn = () => pm.collectionVariables.replaceIn('{{test}}')\n pm.expect(throwFn).to.throw()\n pm.expect(throwFn).to.throw(/Workspace feature/)\n})\n\npm.test('pm.iterationData.toJSON() throws descriptive error', () => {\n const throwFn = () => pm.iterationData.toJSON()\n pm.expect(throwFn).to.throw()\n pm.expect(throwFn).to.throw(/Collection Runner feature/)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "cmfhzf0op00urlpropertylist01", + "name": "url-propertylist-helpers-test", + "method": "GET", + "endpoint": "https://api.example.com:8080/v1/users?filter=active&sort=name&tag=js&tag=ts#section1", + "params": [ + { + "key": "filter", + "value": "active", + "active": true, + "description": "" + }, + { + "key": "sort", + "value": "name", + "active": true, + "description": "" + }, + { + "key": "tag", + "value": "js", + "active": true, + "description": "" + }, + { + "key": "tag", + "value": "ts", + "active": true, + "description": "" + } + ], + "headers": [ + { + "key": "Content-Type", + "value": "application/json", + "active": true, + "description": "" + }, + { + "key": "Authorization", + "value": "Bearer test-token", + "active": true, + "description": "" + } + ], + "preRequestScript": "export {};\n// Test URL helper methods\npm.request.url.update('https://echo.hoppscotch.io/updated?test=value')\npm.request.url.addQueryParams([{ key: 'page', value: '1' }, { key: 'limit', value: '20' }])\npm.request.url.removeQueryParams('test')\n\n// Test hostname and hash properties\npm.request.url.hostname = 'echo.hoppscotch.io'\npm.request.url.hash = 'results'\n\n// Test query PropertyList methods\npm.request.url.query.upsert({ key: 'status', value: 'published' })\npm.request.url.query.add({ key: 'include', value: 'metadata' })\n", + "testScript": "export {};\n\npm.test('URL helper methods - getHost() returns hostname as string', () => {\n const host = pm.request.url.getHost()\n pm.expect(host).to.be.a('string')\n pm.expect(host).to.equal('echo.hoppscotch.io')\n})\n\npm.test('URL helper methods - getPath() returns path with leading slash', () => {\n const path = pm.request.url.getPath()\n pm.expect(path).to.be.a('string')\n pm.expect(path).to.include('/')\n pm.expect(path).to.equal('/updated')\n})\n\npm.test('URL helper methods - getPathWithQuery() includes query string', () => {\n const pathWithQuery = pm.request.url.getPathWithQuery()\n pm.expect(pathWithQuery).to.include('?')\n pm.expect(pathWithQuery).to.include('page=1')\n pm.expect(pathWithQuery).to.include('limit=20')\n})\n\npm.test('URL helper methods - getQueryString() returns query without ?', () => {\n const queryString = pm.request.url.getQueryString()\n pm.expect(queryString).to.be.a('string')\n pm.expect(queryString).to.not.include('?')\n pm.expect(queryString).to.include('page=1')\n})\n\npm.test('URL helper methods - getRemote() returns host with port', () => {\n const remote = pm.request.url.getRemote()\n pm.expect(remote).to.be.a('string')\n pm.expect(remote).to.equal('echo.hoppscotch.io')\n})\n\npm.test('URL helper methods - update() changes entire URL', () => {\n const url = pm.request.url.toString()\n pm.expect(url).to.include('echo.hoppscotch.io')\n pm.expect(url).to.include('/updated')\n})\n\npm.test('URL helper methods - addQueryParams() adds multiple params', () => {\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.have.property('page', '1')\n pm.expect(allParams).to.have.property('limit', '20')\n})\n\npm.test('URL helper methods - removeQueryParams() removes params', () => {\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.not.have.property('test')\n})\n\npm.test('URL properties - hostname getter returns string', () => {\n const hostname = pm.request.url.hostname\n pm.expect(hostname).to.be.a('string')\n pm.expect(hostname).to.equal('echo.hoppscotch.io')\n})\n\npm.test('URL properties - hostname matches host array', () => {\n const hostname = pm.request.url.hostname\n const hostString = pm.request.url.host.join('.')\n pm.expect(hostname).to.equal(hostString)\n})\n\npm.test('URL properties - hash getter returns string', () => {\n const hash = pm.request.url.hash\n pm.expect(hash).to.be.a('string')\n // Hash might not persist through URL mutations in E2E context\n})\n\npm.test('Query PropertyList - get() retrieves parameter value', () => {\n const pageValue = pm.request.url.query.get('page')\n pm.expect(pageValue).to.equal('1')\n})\n\npm.test('Query PropertyList - has() checks parameter existence', () => {\n pm.expect(pm.request.url.query.has('page')).to.be.true\n pm.expect(pm.request.url.query.has('nonexistent')).to.be.false\n})\n\npm.test('Query PropertyList - upsert() adds/updates parameter', () => {\n pm.expect(pm.request.url.query.has('status')).to.be.true\n pm.expect(pm.request.url.query.get('status')).to.equal('published')\n})\n\npm.test('Query PropertyList - count() returns parameter count', () => {\n const count = pm.request.url.query.count()\n pm.expect(count).to.be.a('number')\n pm.expect(count).to.be.above(0)\n})\n\npm.test('Query PropertyList - each() iterates over parameters', () => {\n let iterationCount = 0\n pm.request.url.query.each((param) => {\n pm.expect(param).to.have.property('key')\n pm.expect(param).to.have.property('value')\n iterationCount++\n })\n pm.expect(iterationCount).to.be.above(0)\n})\n\npm.test('Query PropertyList - map() transforms parameters', () => {\n const keys = pm.request.url.query.map((param) => param.key)\n pm.expect(keys).to.be.an('array')\n pm.expect(keys).to.include('page')\n pm.expect(keys).to.include('limit')\n})\n\npm.test('Query PropertyList - filter() filters parameters', () => {\n const filtered = pm.request.url.query.filter((param) => param.key === 'page')\n pm.expect(filtered).to.be.an('array')\n pm.expect(filtered.length).to.be.above(0)\n pm.expect(filtered[0].key).to.equal('page')\n})\n\npm.test('Query PropertyList - idx() accesses by index', () => {\n const firstParam = pm.request.url.query.idx(0)\n pm.expect(firstParam).to.be.an('object')\n pm.expect(firstParam).to.have.property('key')\n pm.expect(firstParam).to.have.property('value')\n})\n\npm.test('Query PropertyList - idx() returns null for out of bounds', () => {\n const param = pm.request.url.query.idx(999)\n pm.expect(param).to.be.null\n})\n\npm.test('Query PropertyList - toObject() returns object', () => {\n const obj = pm.request.url.query.toObject()\n pm.expect(obj).to.be.an('object')\n pm.expect(obj).to.have.property('page')\n})\n\npm.test('Headers PropertyList - each() iterates over headers', () => {\n let count = 0\n pm.request.headers.each((header) => {\n pm.expect(header).to.have.property('key')\n pm.expect(header).to.have.property('value')\n count++\n })\n pm.expect(count).to.be.above(0)\n})\n\npm.test('Headers PropertyList - map() transforms headers', () => {\n const keys = pm.request.headers.map((h) => h.key)\n pm.expect(keys).to.be.an('array')\n pm.expect(keys).to.include('Content-Type')\n})\n\npm.test('Headers PropertyList - filter() filters headers', () => {\n const filtered = pm.request.headers.filter((h) => h.key === 'Content-Type')\n pm.expect(filtered).to.be.an('array')\n pm.expect(filtered.length).to.be.above(0)\n})\n\npm.test('Headers PropertyList - count() returns header count', () => {\n const count = pm.request.headers.count()\n pm.expect(count).to.be.a('number')\n pm.expect(count).to.be.above(0)\n})\n\npm.test('Headers PropertyList - idx() accesses by index', () => {\n const firstHeader = pm.request.headers.idx(0)\n pm.expect(firstHeader).to.be.an('object')\n pm.expect(firstHeader).to.have.property('key')\n})\n\npm.test('Headers PropertyList - toObject() returns object', () => {\n const obj = pm.request.headers.toObject()\n pm.expect(obj).to.be.an('object')\n pm.expect(obj).to.have.property('Content-Type')\n})\n\nhopp.test('hopp namespace URL methods work identically', () => {\n const url = hopp.request.url\n hopp.expect(url).toInclude('echo.hoppscotch.io')\n hopp.expect(url).toInclude('/updated')\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "name": "propertylist-advanced-methods-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io/propertylist", + "params": [ + { + "key": "filter", + "value": "active", + "active": true, + "description": "" + }, + { + "key": "sort", + "value": "name", + "active": true, + "description": "" + }, + { + "key": "page", + "value": "1", + "active": true, + "description": "" + } + ], + "headers": [ + { + "key": "Content-Type", + "value": "application/json", + "active": true, + "description": "" + }, + { + "key": "Authorization", + "value": "Bearer token123", + "active": true, + "description": "" + } + ], + "preRequestScript": "export {};\n// Test query.insert() - insert limit before page\npm.request.url.query.insert({ key: 'limit', value: '10' }, 'page')\n\n// Test query.append() - add new param at end\npm.request.url.query.append({ key: 'offset', value: '0' })\n\n// Test query.assimilate() - merge params\npm.request.url.query.assimilate({ include: 'metadata', status: 'active' })\n\n// Test headers.insert() - insert before Authorization\npm.request.headers.insert({ key: 'X-API-Key', value: 'secret123' }, 'Authorization')\n\n// Test headers.append() - add at end\npm.request.headers.append({ key: 'X-Request-ID', value: 'req-456' })\n\n// Test headers.assimilate() - merge headers\npm.request.headers.assimilate({ 'X-Custom-Header': 'custom-value' })\n", + "testScript": "export {};\n\npm.test('query.find() - finds param by string key', () => {\n const limitParam = pm.request.url.query.find('limit')\n if (limitParam) {\n pm.expect(limitParam).to.be.an('object')\n pm.expect(limitParam.key).to.equal('limit')\n } else {\n pm.expect(pm.request.url.query.has('limit')).to.be.true\n }\n})\n\npm.test('query.find() - finds param by predicate function', () => {\n const limitParam = pm.request.url.query.find((p) => p && p.key === 'limit')\n if (limitParam) {\n pm.expect(limitParam).to.be.an('object')\n pm.expect(limitParam.value).to.equal('10')\n } else {\n pm.expect(pm.request.url.query.get('limit')).to.equal('10')\n }\n})\n\npm.test('query.find() - returns null when not found', () => {\n const result = pm.request.url.query.find('nonexistent')\n pm.expect(result).to.be.null\n})\n\npm.test('query.indexOf() - returns index for existing params', () => {\n // Verify indexOf works - check params that exist in actual URL\n const allParams = pm.request.url.query.all()\n const keys = Object.keys(allParams)\n if (keys.length > 0) {\n const firstKey = keys[0]\n const idx = pm.request.url.query.indexOf(firstKey)\n pm.expect(idx).to.be.a('number')\n pm.expect(idx).to.be.at.least(0)\n }\n})\n\npm.test('query.indexOf() - returns index by object', () => {\n const allParams = pm.request.url.query.all()\n const keys = Object.keys(allParams)\n if (keys.length > 0) {\n const idx = pm.request.url.query.indexOf({ key: keys[0] })\n pm.expect(idx).to.be.a('number')\n pm.expect(idx).to.be.at.least(0)\n }\n})\n\npm.test('query.indexOf() - returns -1 when not found', () => {\n const idx = pm.request.url.query.indexOf('notfound')\n pm.expect(idx).to.equal(-1)\n})\n\npm.test('query.insert/append/assimilate - methods executed successfully', () => {\n // Verify the methods executed without errors in pre-request\n // Post-request sees actual sent URL, so we just verify params exist\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.be.an('object')\n pm.expect(pm.request.url.query.has('limit')).to.be.true\n pm.expect(pm.request.url.query.has('offset')).to.be.true\n})\n\npm.test('query.append() - adds param at end', () => {\n const offsetIdx = pm.request.url.query.indexOf('offset')\n pm.expect(offsetIdx).to.be.at.least(0)\n pm.expect(pm.request.url.query.get('offset')).to.equal('0')\n})\n\npm.test('query.assimilate() - adds/updates params', () => {\n pm.expect(pm.request.url.query.has('include')).to.be.true\n pm.expect(pm.request.url.query.get('include')).to.equal('metadata')\n pm.expect(pm.request.url.query.has('status')).to.be.true\n pm.expect(pm.request.url.query.get('status')).to.equal('active')\n})\n\npm.test('headers.find() - finds header by string (case-insensitive)', () => {\n const ct = pm.request.headers.find('content-type')\n pm.expect(ct).to.be.an('object')\n pm.expect(ct.key).to.equal('Content-Type')\n})\n\npm.test('headers.find() - finds header by predicate function', () => {\n const auth = pm.request.headers.find((h) => h.key === 'Authorization')\n pm.expect(auth).to.be.an('object')\n pm.expect(auth.value).to.include('Bearer')\n})\n\npm.test('headers.find() - returns null when not found', () => {\n const result = pm.request.headers.find('nonexistent')\n pm.expect(result).to.be.null\n})\n\npm.test('headers.indexOf() - returns correct index (case-insensitive)', () => {\n const authIdx = pm.request.headers.indexOf('authorization')\n pm.expect(authIdx).to.be.a('number')\n pm.expect(authIdx).to.be.at.least(0)\n})\n\npm.test('headers.indexOf() - returns correct index by object', () => {\n const ctIdx = pm.request.headers.indexOf({ key: 'Content-Type' })\n pm.expect(ctIdx).to.be.a('number')\n pm.expect(ctIdx).to.be.at.least(0)\n})\n\npm.test('headers.indexOf() - returns -1 when not found', () => {\n const idx = pm.request.headers.indexOf('NotFound')\n pm.expect(idx).to.equal(-1)\n})\n\npm.test('headers.insert() - inserts header before specified header', () => {\n const apiKeyIdx = pm.request.headers.indexOf('X-API-Key')\n const authIdx = pm.request.headers.indexOf('Authorization')\n pm.expect(apiKeyIdx).to.be.below(authIdx)\n})\n\npm.test('headers.append() - adds header at end', () => {\n pm.expect(pm.request.headers.has('X-Request-ID')).to.be.true\n pm.expect(pm.request.headers.get('X-Request-ID')).to.equal('req-456')\n})\n\npm.test('headers.assimilate() - adds/updates headers', () => {\n pm.expect(pm.request.headers.has('X-Custom-Header')).to.be.true\n pm.expect(pm.request.headers.get('X-Custom-Header')).to.equal('custom-value')\n})\n\npm.test('query PropertyList - all methods work together', () => {\n const allParams = pm.request.url.query.all()\n pm.expect(allParams).to.be.an('object')\n // At minimum we should have the params added in pre-request\n pm.expect(Object.keys(allParams).length).to.be.at.least(4)\n})\n\npm.test('headers PropertyList - all methods work together', () => {\n const allHeaders = pm.request.headers.all()\n pm.expect(allHeaders).to.be.an('object')\n pm.expect(Object.keys(allHeaders).length).to.be.at.least(5)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "5", + "id": "advanced-response-methods-test", + "name": "advanced-response-methods-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [ + { + "key": "Content-Type", + "value": "application/json", + "active": true + } + ], + "preRequestScript": "export {};\n", + "testScript": "export {};\n\n// Test pm.response.reason()\npm.test('pm.response.reason() returns HTTP reason phrase', () => {\n const reason = pm.response.reason()\n pm.expect(reason).to.be.a('string')\n pm.expect(reason).to.equal('OK')\n})\n\n// Test hopp.response.reason() for parity\npm.test('hopp.response.reason() returns HTTP reason phrase', () => {\n const reason = hopp.response.reason()\n hopp.expect(reason).toBeType('string')\n hopp.expect(reason).toBe('OK')\n})\n\n// Test pm.response.dataURI()\npm.test('pm.response.dataURI() converts response to data URI', () => {\n const dataURI = pm.response.dataURI()\n pm.expect(dataURI).to.be.a('string')\n pm.expect(dataURI).to.include('data:')\n pm.expect(dataURI).to.include('base64')\n})\n\n// Test hopp.response.dataURI() for parity\npm.test('hopp.response.dataURI() converts response to data URI', () => {\n const dataURI = hopp.response.dataURI()\n hopp.expect(dataURI).toBeType('string')\n hopp.expect(dataURI.startsWith('data:')).toBe(true)\n})\n\n// Test .nested property assertions\npm.test('pm.expect().to.have.nested.property() accesses nested properties', () => {\n const obj = { a: { b: { c: 'deep value' } } }\n pm.expect(obj).to.have.nested.property('a.b.c', 'deep value')\n pm.expect(obj).to.have.nested.property('a.b')\n})\n\n// Test hopp namespace nested property for parity\npm.test('hopp.expect().to.have.nested.property() accesses nested properties', () => {\n const obj = { x: { y: { z: 'nested' } } }\n hopp.expect(obj).to.have.nested.property('x.y.z', 'nested')\n hopp.expect(obj).to.have.nested.property('x.y')\n})\n\npm.test('pm.expect().to.have.nested.property() handles arrays', () => {\n const obj = { items: [{ name: 'first' }, { name: 'second' }] }\n pm.expect(obj).to.have.nested.property('items[0].name', 'first')\n pm.expect(obj).to.have.nested.property('items[1].name', 'second')\n})\n\npm.test('pm.expect().to.not.have.nested.property() negation works', () => {\n const obj = { a: { b: 'value' } }\n pm.expect(obj).to.not.have.nested.property('a.c')\n pm.expect(obj).to.not.have.nested.property('x.y.z')\n})\n\n// Test .by() chaining for change assertions\npm.test('pm.expect().to.change().by() validates exact delta', () => {\n const obj = { value: 10 }\n pm.expect(() => { obj.value = 25 }).to.change(obj, 'value').by(15)\n})\n\n// Test hopp namespace .by() chaining for parity\npm.test('hopp.expect().to.change().by() validates exact delta', () => {\n const obj = { val: 100 }\n hopp.expect(() => { obj.val = 150 }).to.change(obj, 'val').by(50)\n})\n\npm.test('pm.expect().to.increase().by() validates exact increase', () => {\n const obj = { count: 5 }\n pm.expect(() => { obj.count += 7 }).to.increase(obj, 'count').by(7)\n})\n\npm.test('pm.expect().to.decrease().by() validates exact decrease', () => {\n const obj = { score: 100 }\n pm.expect(() => { obj.score -= 30 }).to.decrease(obj, 'score').by(30)\n})\n\npm.test('pm.expect().to.change().by() with negative delta', () => {\n const obj = { value: 50 }\n pm.expect(() => { obj.value = 20 }).to.change(obj, 'value').by(-30)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\"test\": \"data\"}" + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "advanced-chai-map-set-test", + "name": "advanced-chai-map-set-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};", + "testScript": "export {};\n\n// Map & Set Assertions\npm.test('Map assertions - size property', () => {\n const map = new Map([['key1', 'value1'], ['key2', 'value2']])\n pm.expect(map).to.have.property('size', 2)\n pm.expect(map.size).to.equal(2)\n})\n\npm.test('Set assertions - size property', () => {\n const set = new Set([1, 2, 3, 4])\n pm.expect(set).to.have.property('size', 4)\n pm.expect(set.size).to.equal(4)\n})\n\npm.test('Map instanceOf assertion', () => {\n const map = new Map()\n pm.expect(map).to.be.instanceOf(Map)\n pm.expect(map).to.be.an.instanceOf(Map)\n})\n\npm.test('Set instanceOf assertion', () => {\n const set = new Set()\n pm.expect(set).to.be.instanceOf(Set)\n pm.expect(set).to.be.an.instanceOf(Set)\n})\n\n// Advanced Chai - closeTo\npm.test('closeTo - validates numbers within delta', () => {\n pm.expect(3.14159).to.be.closeTo(3.14, 0.01)\n pm.expect(10.5).to.be.closeTo(11, 1)\n})\n\npm.test('closeTo - negation works', () => {\n pm.expect(100).to.not.be.closeTo(50, 10)\n pm.expect(3.14).to.not.be.closeTo(10, 0.1)\n})\n\npm.test('approximately - alias for closeTo', () => {\n pm.expect(2.5).to.approximately(2.4, 0.2)\n pm.expect(99.99).to.approximately(100, 0.1)\n})\n\n// Advanced Chai - finite\npm.test('finite - validates finite numbers', () => {\n pm.expect(123).to.be.finite\n pm.expect(0).to.be.finite\n pm.expect(-456).to.be.finite\n})\n\npm.test('finite - negation for Infinity', () => {\n pm.expect(Infinity).to.not.be.finite\n pm.expect(-Infinity).to.not.be.finite\n pm.expect(NaN).to.not.be.finite\n})\n\n// Advanced Chai - satisfy\npm.test('satisfy - custom predicate function', () => {\n pm.expect(10).to.satisfy((num) => num > 5)\n pm.expect('hello').to.satisfy((str) => str.length === 5)\n})\n\npm.test('satisfy - complex validation', () => {\n const obj = { name: 'test', value: 100 }\n pm.expect(obj).to.satisfy((o) => o.value > 50 && o.name.length > 0)\n})\n\npm.test('satisfy - negation works', () => {\n pm.expect(5).to.not.satisfy((num) => num > 10)\n pm.expect('abc').to.not.satisfy((str) => str.length > 5)\n})\n\n// Advanced Chai - respondTo\npm.test('respondTo - validates method existence', () => {\n class TestClass {\n testMethod() { return 'test' }\n anotherMethod() { return 'another' }\n }\n pm.expect(TestClass).to.respondTo('testMethod')\n pm.expect(TestClass).to.respondTo('anotherMethod')\n})\n\npm.test('respondTo - with itself for static methods', () => {\n class MyClass {\n static staticMethod() { return 'static' }\n instanceMethod() { return 'instance' }\n }\n pm.expect(MyClass).itself.to.respondTo('staticMethod')\n pm.expect(MyClass).to.not.itself.respondTo('instanceMethod')\n pm.expect(MyClass).to.respondTo('instanceMethod')\n})\n\n// Property Ownership - own.property\npm.test('own.property - distinguishes own vs inherited', () => {\n const parent = { inherited: true }\n const obj = Object.create(parent)\n obj.own = true\n pm.expect(obj).to.have.own.property('own')\n pm.expect(obj).to.not.have.own.property('inherited')\n pm.expect(obj).to.have.property('inherited')\n})\n\npm.test('deep.own.property - deep check with ownership', () => {\n const proto = { shared: 'inherited' }\n const obj = Object.create(proto)\n obj.data = { nested: 'value' }\n pm.expect(obj).to.have.deep.own.property('data', { nested: 'value' })\n pm.expect(obj).to.not.have.deep.own.property('shared')\n})\n\npm.test('ownProperty - alias for own.property', () => {\n const obj = { prop: 'value' }\n pm.expect(obj).to.have.ownProperty('prop')\n pm.expect(obj).to.have.ownProperty('prop', 'value')\n})\n\n// Hopp namespace parity tests\npm.test('hopp.expect Map/Set support', () => {\n const map = new Map([['x', 1]])\n const set = new Set([1, 2])\n hopp.expect(map.size).toBe(1)\n hopp.expect(set.size).toBe(2)\n})\n\npm.test('hopp.expect closeTo support', () => {\n hopp.expect(3.14).to.be.closeTo(3.1, 0.1)\n hopp.expect(10).to.be.closeTo(10.5, 1)\n})\n\npm.test('hopp.expect finite support', () => {\n hopp.expect(42).to.be.finite\n hopp.expect(Infinity).to.not.be.finite\n})\n\npm.test('hopp.expect satisfy support', () => {\n hopp.expect(100).to.satisfy((n) => n > 50)\n hopp.expect('test').to.satisfy((s) => s.length === 4)\n})\n\npm.test('hopp.expect respondTo support', () => {\n class TestClass { method() {} }\n hopp.expect(TestClass).to.respondTo('method')\n})\n\npm.test('hopp.expect own.property support', () => {\n const obj = Object.create({ inherited: 1 })\n obj.own = 2\n hopp.expect(obj).to.have.own.property('own')\n hopp.expect(obj).to.not.have.own.property('inherited')\n})\n\npm.test('hopp.expect ordered.members support', () => {\n const arr = ['a', 'b', 'c']\n hopp.expect(arr).to.have.ordered.members(['a', 'b', 'c'])\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "16", + "id": "cmfhzf0op00typecoer01", + "name": "type-preservation-test", + "method": "GET", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n// For CLI E2E testing: We only set simple string values in pre-request\n// Complex types will be tested within the test script itself\n\npm.environment.set('string_value', 'hello')\n", + "testScript": "export {};\n\n// ========================================\n// TYPE PRESERVATION TESTS (CLI Compatible)\n// ========================================\n\n// IMPORTANT NOTE: Type preservation works perfectly WITHIN script execution scope\n// Values persisted across request boundaries (pre-request \u2192 test) may be serialized\n// This is expected CLI behavior for environment persistence/display\n\n// Test values set from pre-request\npm.test('string values work across scripts', () => {\n pm.expect(pm.environment.get('string_value')).to.equal('hello')\n})\n\n// ========================================\n// TYPE PRESERVATION WITHIN SINGLE SCRIPT\n// (This is where type preservation really shines!)\n// ========================================\n\npm.test('numbers are preserved as numbers (same script)', () => {\n pm.environment.set('num', 42)\n const value = pm.environment.get('num')\n pm.expect(value).to.equal(42)\n pm.expect(typeof value).to.equal('number')\n})\n\npm.test('booleans are preserved as booleans (same script)', () => {\n pm.environment.set('bool_true', true)\n pm.environment.set('bool_false', false)\n pm.expect(pm.environment.get('bool_true')).to.equal(true)\n pm.expect(pm.environment.get('bool_false')).to.equal(false)\n pm.expect(typeof pm.environment.get('bool_true')).to.equal('boolean')\n})\n\npm.test('null is preserved as actual null (same script)', () => {\n pm.environment.set('null_val', null)\n const value = pm.environment.get('null_val')\n pm.expect(value).to.equal(null)\n pm.expect(value === null).to.be.true\n pm.expect(typeof value).to.equal('object')\n})\n\npm.test('undefined is preserved as actual undefined (same script)', () => {\n pm.environment.set('undef_val', undefined)\n const value = pm.environment.get('undef_val')\n pm.expect(value).to.equal(undefined)\n pm.expect(typeof value).to.equal('undefined')\n pm.expect(pm.environment.has('undef_val')).to.be.true\n})\n\npm.test('arrays are preserved with direct access', () => {\n pm.environment.set('arr', [1, 2, 3])\n const value = pm.environment.get('arr')\n\n pm.expect(Array.isArray(value)).to.be.true\n pm.expect(value.length).to.equal(3)\n pm.expect(value[0]).to.equal(1)\n pm.expect(value[2]).to.equal(3)\n})\n\npm.test('single-element arrays remain arrays', () => {\n pm.environment.set('single', [42])\n const value = pm.environment.get('single')\n\n pm.expect(Array.isArray(value)).to.be.true\n pm.expect(value.length).to.equal(1)\n pm.expect(value[0]).to.equal(42)\n})\n\npm.test('empty arrays are preserved', () => {\n pm.environment.set('empty_arr', [])\n const value = pm.environment.get('empty_arr')\n\n pm.expect(Array.isArray(value)).to.be.true\n pm.expect(value.length).to.equal(0)\n})\n\npm.test('string arrays preserve all elements', () => {\n pm.environment.set('str_arr', ['a', 'b', 'c'])\n const value = pm.environment.get('str_arr')\n\n pm.expect(Array.isArray(value)).to.be.true\n pm.expect(value).to.deep.equal(['a', 'b', 'c'])\n})\n\npm.test('objects are preserved with accessible properties', () => {\n pm.environment.set('obj', { key: 'value', num: 123 })\n const value = pm.environment.get('obj')\n\n pm.expect(typeof value).to.equal('object')\n pm.expect(value.key).to.equal('value')\n pm.expect(value.num).to.equal(123)\n})\n\npm.test('empty objects are preserved', () => {\n pm.environment.set('empty_obj', {})\n const value = pm.environment.get('empty_obj')\n\n pm.expect(typeof value).to.equal('object')\n pm.expect(Object.keys(value).length).to.equal(0)\n})\n\npm.test('nested objects preserve structure', () => {\n pm.environment.set('nested', { user: { name: 'John', id: 1 }, meta: { active: true } })\n const value = pm.environment.get('nested')\n\n pm.expect(value.user.name).to.equal('John')\n pm.expect(value.user.id).to.equal(1)\n pm.expect(value.meta.active).to.equal(true)\n})\n\npm.test('complex nested structures work', () => {\n const data = {\n users: [\n { id: 1, name: 'Alice', scores: [90, 85, 88] },\n { id: 2, name: 'Bob', scores: [75, 80, 82] }\n ],\n metadata: { count: 2, page: 1, filters: ['active', 'verified'] }\n }\n\n pm.environment.set('complex', data)\n const retrieved = pm.environment.get('complex')\n\n pm.expect(retrieved.users).to.be.an('array')\n pm.expect(retrieved.users.length).to.equal(2)\n pm.expect(retrieved.users[0].name).to.equal('Alice')\n pm.expect(retrieved.users[0].scores[0]).to.equal(90)\n pm.expect(retrieved.metadata.filters).to.deep.equal(['active', 'verified'])\n})\n\n// ========================================\n// NAMESPACE SEPARATION\n// ========================================\n\npm.test('hopp.env.set rejects non-string values', () => {\n let errorCount = 0\n\n try { hopp.env.set('test', undefined) } catch (e) { errorCount++ }\n try { hopp.env.set('test', null) } catch (e) { errorCount++ }\n try { hopp.env.set('test', 42) } catch (e) { errorCount++ }\n try { hopp.env.set('test', true) } catch (e) { errorCount++ }\n try { hopp.env.set('test', [1, 2]) } catch (e) { errorCount++ }\n try { hopp.env.set('test', {}) } catch (e) { errorCount++ }\n\n pm.expect(errorCount).to.equal(6)\n})\n\npm.test('hopp.env.set only accepts strings', () => {\n hopp.env.set('hopp_str', 'valid')\n pm.expect(hopp.env.get('hopp_str')).to.equal('valid')\n})\n\npm.test('pm/hopp cross-namespace reading works', () => {\n pm.environment.set('cross_test', [1, 2, 3])\n\n // hopp can read PM-set values\n const fromHopp = hopp.env.get('cross_test')\n pm.expect(Array.isArray(fromHopp)).to.be.true\n pm.expect(fromHopp.length).to.equal(3)\n})\n\n// ========================================\n// PRACTICAL USE CASES\n// ========================================\n\npm.test('no JSON.parse needed for response data storage', () => {\n // Simulate storing parsed response data\n const responseData = {\n id: 123,\n name: 'Test User',\n permissions: ['read', 'write'],\n settings: { theme: 'dark', notifications: true }\n }\n\n pm.environment.set('user_data', responseData)\n const stored = pm.environment.get('user_data')\n\n // Direct access - no JSON.parse needed!\n pm.expect(stored.id).to.equal(123)\n pm.expect(stored.permissions).to.include('write')\n pm.expect(stored.settings.theme).to.equal('dark')\n})\n\npm.test('array iteration works directly', () => {\n pm.environment.set('items', ['apple', 'banana', 'cherry'])\n const items = pm.environment.get('items')\n\n let concatenated = ''\n items.forEach(item => {\n concatenated += item\n })\n\n pm.expect(concatenated).to.equal('applebananacherry')\n pm.expect(items.map(i => i.toUpperCase())).to.deep.equal(['APPLE', 'BANANA', 'CHERRY'])\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": null, + "body": null + }, + "requestVariables": [], + "responses": {} + }, + { + "v": "15", + "id": "type_preservation_ui_compat", + "name": "type-preservation-ui-compatibility-test", + "method": "POST", + "endpoint": "https://echo.hoppscotch.io", + "params": [], + "headers": [], + "preRequestScript": "export {};\n// Type preservation tests run in test script scope", + "testScript": "export {};\n\n// ====== Type Preservation & UI Compatibility Tests ======\n// NOTE: Testing in same script scope (CLI limitation: complex types\n// may not persist across pre-request \u2192 test boundary)\n\npm.test('PM namespace preserves array types (not String coercion)', () => {\n pm.environment.set('simpleArray', [1, 2, 3])\n const arr = pm.environment.get('simpleArray')\n\n // CRITICAL: Should be actual array, not string \"1,2,3\"\n pm.expect(Array.isArray(arr)).to.equal(true)\n pm.expect(arr).to.have.lengthOf(3)\n pm.expect(arr[0]).to.equal(1)\n pm.expect(arr[1]).to.equal(2)\n pm.expect(arr[2]).to.equal(3)\n})\n\npm.test('PM namespace preserves object types (not \"[object Object]\")', () => {\n pm.environment.set('simpleObject', { foo: 'bar', num: 42 })\n const obj = pm.environment.get('simpleObject')\n\n // CRITICAL: Should be actual object, not string \"[object Object]\"\n pm.expect(typeof obj).to.equal('object')\n pm.expect(obj).to.not.be.null\n pm.expect(obj.foo).to.equal('bar')\n pm.expect(obj.num).to.equal(42)\n})\n\npm.test('PM namespace preserves null correctly', () => {\n pm.environment.set('nullValue', null)\n const val = pm.environment.get('nullValue')\n\n pm.expect(val).to.be.null\n})\n\npm.test('PM namespace preserves undefined correctly', () => {\n pm.environment.set('undefinedValue', undefined)\n const val = pm.environment.get('undefinedValue')\n\n pm.expect(val).to.be.undefined\n})\n\npm.test('PM namespace preserves primitives correctly', () => {\n pm.environment.set('stringValue', 'hello')\n pm.environment.set('numberValue', 123)\n pm.environment.set('booleanValue', true)\n\n pm.expect(pm.environment.get('stringValue')).to.equal('hello')\n pm.expect(pm.environment.get('numberValue')).to.equal(123)\n pm.expect(pm.environment.get('booleanValue')).to.equal(true)\n})\n\npm.test('PM namespace preserves nested structures', () => {\n pm.environment.set('nestedStructure', {\n users: [\n { id: 1, name: 'Alice' },\n { id: 2, name: 'Bob' }\n ],\n meta: { count: 2, tags: ['active', 'verified'] }\n })\n const nested = pm.environment.get('nestedStructure')\n\n pm.expect(nested).to.be.an('object')\n pm.expect(nested.users).to.be.an('array')\n pm.expect(nested.users).to.have.lengthOf(2)\n pm.expect(nested.users[0].name).to.equal('Alice')\n pm.expect(nested.users[1].name).to.equal('Bob')\n pm.expect(nested.meta.count).to.equal(2)\n pm.expect(nested.meta.tags).to.have.members(['active', 'verified'])\n})\n\npm.test('PM namespace handles mixed arrays (regression test for UI crash)', () => {\n pm.environment.set('mixedArray', [\n 'string',\n 42,\n true,\n null,\n undefined,\n [1, 2],\n { key: 'value' }\n ])\n const mixed = pm.environment.get('mixedArray')\n\n // This is the exact case that caused the UI crash\n pm.expect(Array.isArray(mixed)).to.equal(true)\n pm.expect(mixed).to.have.lengthOf(7)\n pm.expect(mixed[0]).to.equal('string')\n pm.expect(mixed[1]).to.equal(42)\n pm.expect(mixed[2]).to.equal(true)\n pm.expect(mixed[3]).to.be.null\n // mixed[4] is undefined in array, becomes null during JSON serialization\n pm.expect(Array.isArray(mixed[5])).to.equal(true)\n pm.expect(mixed[5]).to.have.lengthOf(2)\n pm.expect(typeof mixed[6]).to.equal('object')\n pm.expect(mixed[6].key).to.equal('value')\n})\n\npm.test('PM globals preserve arrays and objects', () => {\n pm.globals.set('globalArray', [10, 20, 30])\n pm.globals.set('globalObject', { env: 'prod', port: 8080 })\n\n const globalArr = pm.globals.get('globalArray')\n const globalObj = pm.globals.get('globalObject')\n\n pm.expect(Array.isArray(globalArr)).to.equal(true)\n pm.expect(globalArr).to.deep.equal([10, 20, 30])\n\n pm.expect(typeof globalObj).to.equal('object')\n pm.expect(globalObj.env).to.equal('prod')\n pm.expect(globalObj.port).to.equal(8080)\n})\n\npm.test('PM variables preserve arrays and objects', () => {\n pm.variables.set('varArray', [5, 10, 15])\n pm.variables.set('varObject', { status: 'active', count: 100 })\n\n const varArr = pm.variables.get('varArray')\n const varObj = pm.variables.get('varObject')\n\n pm.expect(Array.isArray(varArr)).to.equal(true)\n pm.expect(varArr).to.deep.equal([5, 10, 15])\n\n pm.expect(typeof varObj).to.equal('object')\n pm.expect(varObj.status).to.equal('active')\n pm.expect(varObj.count).to.equal(100)\n})\n\npm.test('Type preservation works with Postman compatibility', () => {\n pm.environment.set('testArr', [1, 2, 3])\n pm.environment.set('testObj', { foo: 'bar', num: 42 })\n\n const arr = pm.environment.get('testArr')\n const obj = pm.environment.get('testObj')\n\n // Should work like Postman: runtime types preserved\n pm.expect(arr.length).to.equal(3)\n pm.expect(obj.foo).to.equal('bar')\n\n // Verify no String() coercion happened\n pm.expect(arr).to.not.equal('1,2,3')\n pm.expect(obj).to.not.equal('[object Object]')\n})\n\npm.test('Type preservation: UI compatibility regression test', () => {\n // This test validates the fix for the reported bug:\n // \"TypeError: a.match is not a function at details.vue:387:10\"\n\n pm.environment.set('mixedTest', [\n 'string', 42, true, null, undefined, [1, 2], { key: 'value' }\n ])\n\n const mixed = pm.environment.get('mixedTest')\n\n // Should NOT throw any errors\n let errorCount = 0\n try {\n // Access all elements\n mixed.forEach(item => {\n // Should work with all types\n const type = typeof item\n const validTypes = ['string', 'number', 'boolean', 'object']\n if (!validTypes.includes(type)) {\n errorCount++\n }\n })\n } catch (e) {\n errorCount++\n }\n\n pm.expect(errorCount).to.equal(0)\n})\n", + "auth": { + "authType": "inherit", + "authActive": true + }, + "body": { + "contentType": "application/json", + "body": "{\n \"test\": \"type preservation validation\"\n}" + }, + "requestVariables": [], + "responses": {} } ], "auth": { @@ -252,4 +796,4 @@ }, "headers": [], "variables": [] -} +} \ No newline at end of file diff --git a/packages/hoppscotch-cli/src/utils/pre-request.ts b/packages/hoppscotch-cli/src/utils/pre-request.ts index 40cbeb54123..fee73f469ab 100644 --- a/packages/hoppscotch-cli/src/utils/pre-request.ts +++ b/packages/hoppscotch-cli/src/utils/pre-request.ts @@ -8,6 +8,7 @@ import { parseTemplateStringE, generateJWTToken, HoppCollectionVariable, + calculateHawkHeader } from "@hoppscotch/data"; import { runPreRequestScript } from "@hoppscotch/js-sandbox/node"; import * as A from "fp-ts/Array"; @@ -34,8 +35,6 @@ import { generateDigestAuthHeader, } from "./auth/digest"; -import { calculateHawkHeader } from "@hoppscotch/data"; - /** * Runs pre-request-script runner over given request which extracts set ENVs and * applies them on current request to generate updated request. @@ -69,23 +68,36 @@ export const preRequestScriptRunner = ( const { selected, global } = updatedEnvs; return { - updatedEnvs: { + // Keep the original updatedEnvs with separate global and selected arrays + preRequestUpdatedEnvs: updatedEnvs, + // Create Environment format for getEffectiveRESTRequest + envForEffectiveRequest: { name: "Env", variables: [...(selected ?? []), ...(global ?? [])], }, updatedRequest: updatedRequest ?? {}, }; }), - TE.chainW(({ updatedEnvs, updatedRequest }) => { + TE.chainW(({ preRequestUpdatedEnvs, envForEffectiveRequest, updatedRequest }) => { const finalRequest = { ...request, ...updatedRequest }; return TE.tryCatch( - () => - getEffectiveRESTRequest( + async () => { + const result = await getEffectiveRESTRequest( finalRequest, - updatedEnvs, + envForEffectiveRequest, collectionVariables - ), + ); + // Replace the updatedEnvs from getEffectiveRESTRequest with the one from pre-request script + // This preserves the global/selected separation + if (E.isRight(result)) { + return E.right({ + ...result.right, + updatedEnvs: preRequestUpdatedEnvs, + }); + } + return result; + }, (reason) => error({ code: "PRE_REQUEST_SCRIPT_ERROR", data: reason }) ); }), diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index a2e2323b629..bc8be5f83fb 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -367,7 +367,8 @@ "request_change": "Are you sure you want to discard current request, unsaved changes will be lost.", "save_unsaved_tab": "Do you want to save changes made in this tab?", "sync": "Would you like to restore your workspace from cloud? This will discard your local progress.", - "delete_access_token": "Are you sure you want to delete the access token {tokenLabel}?" + "delete_access_token": "Are you sure you want to delete the access token {tokenLabel}?", + "delete_mock_server": "Are you sure you want to delete this mock server?" }, "context_menu": { "add_parameters": "Add to parameters", @@ -439,7 +440,8 @@ "teams": "You don't belong to any workspaces", "tests": "There are no tests for this request", "access_tokens": "Access tokens are empty", - "response": "No response received" + "response": "No response received", + "mock_servers": "No mock servers found" }, "environment": { "heading": "Environment", @@ -686,6 +688,8 @@ "from_postman": "Import from Postman", "from_postman_description": "Import from Postman collection", "from_postman_import_summary": "Collections, Requests and response examples will be imported.", + "import_scripts": "Import scripts", + "import_scripts_description": "Supports Postman Collection v2.0/v2.1.", "from_url": "Import from URL", "gist_url": "Enter Gist URL", "from_har": "Import from HAR", @@ -712,6 +716,9 @@ "import_summary_pre_request_scripts_title": "Pre-request scripts", "import_summary_post_request_scripts_title": "Post request scripts", "import_summary_not_supported_by_hoppscotch_import": "We do not support importing {featureLabel} from this source right now.", + "import_summary_script_found": "script found but not imported", + "import_summary_scripts_found": "scripts found but not imported", + "import_summary_enable_experimental_sandbox": "To import Postman scripts, enable 'Experimental scripting sandbox' in settings. Note: This feature is experimental.", "cors_error_modal": { "title": "CORS Error Detected", "description": "The import failed due to CORS (Cross-Origin Resource Sharing) restrictions imposed by the server.", @@ -842,10 +849,59 @@ "profile": "Profile", "realtime": "Realtime", "rest": "REST", + "mock_servers": "Mock Servers", "settings": "Settings", "goto_app": "Goto App", "authentication": "Authentication" }, + "mock_server": { + "confirm_delete_log": "Are you sure you want to delete this log?", + "create_mock_server": "Configure Mock Server", + "mock_server_configuration": "Mock Server Configuration", + "mock_server_name": "Mock Server Name", + "mock_server_name_placeholder": "Enter mock server name", + "base_url": "Base URL", + "start_server": "Start Server", + "stop_server": "Stop Server", + "mock_server_created": "Mock server created successfully", + "mock_server_started": "Mock server started successfully", + "mock_server_stopped": "Mock server stopped successfully", + "active": "Mock server is active", + "inactive": "Mock server is inactive", + "edit_mock_server": "Edit Mock Server", + "path_based_url": "Path based URL", + "subdomain_based_url": "Subdomain based URL", + "mock_server_updated": "Mock server updated successfully", + "no_collection": "No collection", + "collection_deleted": "associated collection deleted.", + "private_access_hint": "For private mock servers, include the header 'x-api-key' with your Personal Access Token (create one from your profile).", + "status": "Status", + "server_running": "Server is running", + "server_stopped": "Server is stopped", + "delay_ms": "Response Delay (ms)", + "delay_placeholder": "Enter delay in milliseconds", + "delay_description": "Add artificial delay to mock responses", + "public_access": "Public Access", + "public": "Public", + "private": "Private", + "public_description": "Anyone with the URL can access this mock server", + "private_description": "Only authenticated users can access this mock server", + "select_collection": "Select a collection", + "select_collection_error": "Please select a collection", + "invalid_collection_error": "Failed to create a mock server for the collection.", + "url_copied": "URL copied to clipboard", + "make_public": "Make Public", + "view_logs": "View logs", + "logs_title": "Mock Server Logs", + "no_logs": "No logs available", + "request_headers": "Request Headers", + "request_body": "Request Body", + "response_status": "Response Status", + "response_headers": "Response Headers", + "response_body": "Response Body", + "log_deleted": "Log deleted successfully", + "description": "Mock servers allow you to simulate API responses based on your collection's example responses." + }, "preRequest": { "javascript_code": "JavaScript Code", "learn": "Read documentation", @@ -1027,6 +1083,7 @@ "ai_request_naming_style_custom": "Custom", "ai_request_naming_style_custom_placeholder": "Enter your custom naming style template...", "experimental_scripting_sandbox": "Experimental scripting sandbox", + "enable_experimental_mock_servers": "Enable Mock Servers", "sync": "Synchronise", "sync_collections": "Collections", "sync_description": "These settings are synced to cloud.", @@ -1045,6 +1102,7 @@ "validate_certificates": "Validate SSL/TLS Certificates", "verify_host": "Verify Host", "verify_peer": "Verify Peer", + "follow_redirects": "Follow Redirects", "client_certificates": "Client Certificates", "certificate_settings": "Certificate Settings", "certificate": "Certificate", @@ -1313,6 +1371,7 @@ "download_failed": "Download failed", "download_started": "Download started", "enabled": "Enabled", + "experimental": "Experimental", "file_imported": "File imported", "finished_in": "Finished in {duration} ms", "hide": "Hide", @@ -1321,6 +1380,7 @@ "loading": "Loading...", "message_received": "Message: {message} arrived on topic: {topic}", "mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}", + "no_content_found": "No content found", "none": "None", "nothing_found": "Nothing found for", "published_error": "Something went wrong while publishing msg: {topic} to topic: {message}", @@ -1474,6 +1534,7 @@ "shared_requests": "Shared Requests", "codegen": "Generate Code", "code_snippet": "Code snippet", + "mock_servers": "Mock Servers", "share_tab_request": "Share tab request", "socketio": "Socket.IO", "sse": "SSE", @@ -1940,5 +2001,63 @@ "app_console": { "entries": "Console entries", "no_entries": "No entries" + }, + "mockServer": { + "create_modal": { + "title": "Create Mock Server", + "name_label": "Mock Server Name", + "name_placeholder": "Enter mock server name", + "name_required": "Mock server name is required", + "collection_source_label": "Collection Source", + "existing_collection": "Existing Collection", + "new_collection": "New Collection", + "select_collection_label": "Select Collection", + "select_collection_placeholder": "Choose a collection", + "collection_required": "Please select a collection", + "collection_name_label": "Collection Name", + "collection_name_placeholder": "Enter collection name", + "collection_name_required": "Collection name is required", + "request_config_label": "Request Configuration", + "add_request": "Add Request", + "create_button": "Create Mock Server", + "success": "Mock server created successfully", + "error": "Failed to create mock server", + "no_collections": "No collections available" + }, + "edit_modal": { + "title": "Edit Mock Server", + "name_label": "Mock Server Name", + "name_placeholder": "Enter mock server name", + "name_required": "Mock server name is required", + "active_label": "Active", + "url_label": "Mock Server URL", + "collection_label": "Collection", + "update_button": "Update Mock Server", + "success": "Mock server updated successfully", + "error": "Failed to update mock server", + "url_copied": "URL copied to clipboard" + }, + "dashboard": { + "title": "Mock Servers", + "subtitle": "Create and manage your API mock servers", + "create_button": "Create Mock Server", + "create_first": "Create your first mock server", + "empty_title": "No mock servers found", + "empty_description": "Create mock servers based on your API collections to enable frontend and mobile development without backend dependencies.", + "collection": "Collection", + "active": "Active", + "inactive": "Inactive", + "mock_url": "Mock URL", + "endpoints": "Endpoints", + "created": "Created", + "view_collection": "View Collection", + "documentation": "Documentation", + "doc_description": "Use this URL as your API base URL in your applications:", + "url_copied": "Mock server URL copied to clipboard", + "delete_title": "Delete Mock Server", + "delete_description": "Are you sure you want to delete this mock server?", + "delete_success": "Mock server deleted successfully", + "delete_error": "Failed to delete mock server" + } } } diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index 789557c8664..e448fd886b8 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/common", "private": true, - "version": "2025.9.2", + "version": "2025.10.0", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", "test": "vitest --run", @@ -21,7 +21,7 @@ "do-lintfix": "pnpm run lintfix" }, "dependencies": { - "@apidevtools/swagger-parser": "12.0.0", + "@apidevtools/swagger-parser": "12.1.0", "@codemirror/autocomplete": "6.18.6", "@codemirror/commands": "6.8.1", "@codemirror/lang-javascript": "6.2.4", @@ -34,7 +34,7 @@ "@codemirror/search": "6.5.11", "@codemirror/state": "6.5.2", "@codemirror/view": "6.38.1", - "@guolao/vue-monaco-editor": "1.5.5", + "@guolao/vue-monaco-editor": "1.6.0", "@hoppscotch/codemirror-lang-graphql": "workspace:^", "@hoppscotch/data": "workspace:^", "@hoppscotch/httpsnippet": "3.0.9", @@ -51,7 +51,7 @@ "@tauri-apps/plugin-store": "2.2.0", "@types/hawk": "9.0.6", "@types/markdown-it": "14.1.2", - "@unhead/vue": "2.0.17", + "@unhead/vue": "2.0.19", "@urql/core": "6.0.1", "@urql/devtools": "2.0.3", "@urql/exchange-auth": "3.0.0", @@ -77,7 +77,7 @@ "jsonc-parser": "3.3.1", "jsonpath-plus": "10.3.0", "lodash-es": "4.17.21", - "lossless-json": "4.2.0", + "lossless-json": "4.3.0", "markdown-it": "14.1.0", "minisearch": "7.2.0", "monaco-editor": "0.52.2", @@ -98,7 +98,7 @@ "splitpanes": "3.1.5", "stream-browserify": "3.0.0", "subscriptions-transport-ws": "0.11.0", - "superjson": "2.2.2", + "superjson": "2.2.3", "tern": "0.24.3", "timers": "0.1.1", "tippy.js": "6.3.7", @@ -110,7 +110,7 @@ "vue-i18n": "11.1.12", "vue-json-pretty": "2.5.0", "vue-pdf-embed": "2.1.3", - "vue-router": "4.5.1", + "vue-router": "4.6.3", "vue-tippy": "6.7.1", "vuedraggable-es": "4.1.1", "wonka": "6.3.5", @@ -133,7 +133,7 @@ "@iconify-json/lucide": "1.2.68", "@intlify/unplugin-vue-i18n": "6.0.8", "@relmify/jest-fp-ts": "2.1.1", - "@rushstack/eslint-patch": "1.12.0", + "@rushstack/eslint-patch": "1.14.0", "@types/har-format": "1.2.16", "@types/js-yaml": "4.0.9", "@types/lodash-es": "4.17.12", @@ -144,18 +144,18 @@ "@types/splitpanes": "2.2.6", "@types/uuid": "10.0.0", "@types/yargs-parser": "21.0.3", - "@typescript-eslint/eslint-plugin": "8.44.1", - "@typescript-eslint/parser": "8.44.1", + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", "@vitejs/plugin-vue": "5.1.4", "@vue/compiler-sfc": "3.5.22", "@vue/eslint-config-typescript": "13.0.0", "@vue/runtime-core": "3.5.22", "autoprefixer": "10.4.21", - "cross-env": "10.0.0", - "dotenv": "17.2.2", + "cross-env": "10.1.0", + "dotenv": "17.2.3", "eslint": "8.57.0", "eslint-plugin-prettier": "5.5.4", - "eslint-plugin-vue": "10.5.0", + "eslint-plugin-vue": "10.5.1", "glob": "11.0.3", "jsdom": "26.1.0", "npm-run-all": "4.1.5", @@ -166,7 +166,7 @@ "rollup-plugin-polyfill-node": "0.13.0", "sass": "1.93.2", "tailwindcss": "3.4.16", - "typescript": "5.9.2", + "typescript": "5.9.3", "unplugin-fonts": "1.4.0", "unplugin-icons": "22.2.0", "unplugin-vue-components": "29.0.0", @@ -176,7 +176,7 @@ "vite-plugin-html-config": "2.0.2", "vite-plugin-pages": "0.33.1", "vite-plugin-pages-sitemap": "1.7.1", - "vite-plugin-pwa": "1.0.3", + "vite-plugin-pwa": "1.1.0", "vite-plugin-vue-layouts": "0.11.0", "vitest": "3.2.4", "vue-tsc": "1.8.8" diff --git a/packages/hoppscotch-common/src/components.d.ts b/packages/hoppscotch-common/src/components.d.ts index 7aa8594167a..5e2b21ea693 100644 --- a/packages/hoppscotch-common/src/components.d.ts +++ b/packages/hoppscotch-common/src/components.d.ts @@ -143,6 +143,8 @@ declare module 'vue' { HoppSmartProgressRing: typeof import('@hoppscotch/ui')['HoppSmartProgressRing'] HoppSmartRadio: typeof import('@hoppscotch/ui')['HoppSmartRadio'] HoppSmartRadioGroup: typeof import('@hoppscotch/ui')['HoppSmartRadioGroup'] + HoppSmartSelect: typeof import('@hoppscotch/ui')['HoppSmartSelect'] + HoppSmartSelectOption: typeof import('@hoppscotch/ui')['HoppSmartSelectOption'] HoppSmartSelectWrapper: typeof import('@hoppscotch/ui')['HoppSmartSelectWrapper'] HoppSmartSlideOver: typeof import('@hoppscotch/ui')['HoppSmartSlideOver'] HoppSmartSpinner: typeof import('@hoppscotch/ui')['HoppSmartSpinner'] @@ -212,9 +214,11 @@ declare module 'vue' { IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default'] IconLucideArrowUpRight: typeof import('~icons/lucide/arrow-up-right')['default'] IconLucideBrush: typeof import('~icons/lucide/brush')['default'] + IconLucideCheck: typeof import('~icons/lucide/check')['default'] IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default'] IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default'] IconLucideCircleCheck: typeof import('~icons/lucide/circle-check')['default'] + IconLucideCopy: typeof import('~icons/lucide/copy')['default'] IconLucideGlobe: typeof import('~icons/lucide/globe')['default'] IconLucideHelpCircle: typeof import('~icons/lucide/help-circle')['default'] IconLucideInbox: typeof import('~icons/lucide/inbox')['default'] @@ -256,6 +260,11 @@ declare module 'vue' { LensesRenderersVideoLensRenderer: typeof import('./components/lenses/renderers/VideoLensRenderer.vue')['default'] LensesRenderersXMLLensRenderer: typeof import('./components/lenses/renderers/XMLLensRenderer.vue')['default'] LensesResponseBodyRenderer: typeof import('./components/lenses/ResponseBodyRenderer.vue')['default'] + MockServerCreateMockServer: typeof import('./components/mockServer/CreateMockServer.vue')['default'] + MockServerEditMockServer: typeof import('./components/mockServer/EditMockServer.vue')['default'] + MockServerLogSection: typeof import('./components/mockServer/LogSection.vue')['default'] + MockServerMockServerDashboard: typeof import('./components/mockServer/MockServerDashboard.vue')['default'] + MockServerMockServerLogs: typeof import('./components/mockServer/MockServerLogs.vue')['default'] MonacoScriptEditor: typeof import('./components/MonacoScriptEditor.vue')['default'] ProfileUserDelete: typeof import('./components/profile/UserDelete.vue')['default'] RealtimeCommunication: typeof import('./components/realtime/Communication.vue')['default'] diff --git a/packages/hoppscotch-common/src/components/app/Header.vue b/packages/hoppscotch-common/src/components/app/Header.vue index 7c7668293fc..11ac0b699ae 100644 --- a/packages/hoppscotch-common/src/components/app/Header.vue +++ b/packages/hoppscotch-common/src/components/app/Header.vue @@ -203,7 +203,7 @@ class="!focus-visible:text-blue-600 !hover:text-blue-600 h-8 rounded border border-blue-600/25 bg-blue-500/10 pr-8 !text-blue-500 hover:border-blue-600/20 hover:bg-blue-600/20 focus-visible:border-blue-600/20 focus-visible:bg-blue-600/20" /> - @@ -1073,6 +1077,46 @@ const updateEditingCollection = async (newName: string) => { } } +const createMockServer = (payload: { + collectionIndex: string + collection: HoppCollection +}) => { + // Import the mock server store dynamically to avoid circular dependencies + import("~/newstore/mockServers").then(({ showCreateMockServerModal$ }) => { + let collectionID = payload.collection.id ?? payload.collection._ref_id + + // If this is a child collection (folder), we need to get the root collection ID + if (payload.collectionIndex.includes("/")) { + // Extract the root collection index from the path (e.g., "0/1/2" -> "0") + const rootIndex = payload.collectionIndex.split("/")[0] + const rootCollection = myCollections.value[parseInt(rootIndex)] + if (rootCollection) { + collectionID = rootCollection.id ?? rootCollection._ref_id + } + } + + showCreateMockServerModal$.next({ + show: true, + collectionID: collectionID, + collectionName: payload.collection.name, + }) + }) +} + +const createTeamMockServer = (payload: { + collectionID: string + collection: TeamCollection +}) => { + // Import the mock server store dynamically to avoid circular dependencies + import("~/newstore/mockServers").then(({ showCreateMockServerModal$ }) => { + showCreateMockServerModal$.next({ + show: true, + collectionID: payload.collectionID, + collectionName: payload.collection.title, + }) + }) +} + const editFolder = (payload: { folderPath: string | undefined folder: HoppCollection | TeamCollection @@ -2787,9 +2831,12 @@ const exportData = async (collection: HoppCollection | TeamCollection) => { if (collectionsType.value.type === "my-collections") { const collectionJSON = JSON.stringify(collection, null, 2) + // Strip `export {};\n` from `testScript` and `preRequestScript` fields + const cleanedCollectionJSON = collectionJSON.replace(/export \{\};\\n/g, "") + const name = (collection as HoppCollection).name - initializeDownloadCollection(collectionJSON, name) + initializeDownloadCollection(cleanedCollectionJSON, name) } else { if (!collection.id) return exportLoading.value = true @@ -2806,8 +2853,14 @@ const exportData = async (collection: HoppCollection | TeamCollection) => { const hoppColl = teamCollToHoppRESTColl(coll) const collectionJSONString = JSON.stringify(hoppColl, null, 2) + // Strip `export {};\n` from `testScript` and `preRequestScript` fields + const cleanedCollectionJSON = collectionJSONString.replace( + /export \{\};\\n/g, + "" + ) + await initializeDownloadCollection( - collectionJSONString, + cleanedCollectionJSON, hoppColl.name ) exportLoading.value = false diff --git a/packages/hoppscotch-common/src/components/http/Request.vue b/packages/hoppscotch-common/src/components/http/Request.vue index 6afce1bf93e..585bfdec84a 100644 --- a/packages/hoppscotch-common/src/components/http/Request.vue +++ b/packages/hoppscotch-common/src/components/http/Request.vue @@ -270,6 +270,7 @@ import { RESTTabService } from "~/services/tab/rest" import { getMethodLabelColor } from "~/helpers/rest/labelColoring" import { WorkspaceService } from "~/services/workspace.service" import { KernelInterceptorService } from "~/services/kernel-interceptor.service" +import { handleTokenValidation } from "~/helpers/handleTokenValidation" const t = useI18n() const interceptorService = useService(KernelInterceptorService) @@ -514,7 +515,10 @@ const cycleDownMethod = () => { } } -const saveRequest = () => { +const saveRequest = async () => { + const isValidToken = await handleTokenValidation() + if (!isValidToken) return + const saveCtx = tab.value.document.saveContext if (!saveCtx) { diff --git a/packages/hoppscotch-common/src/components/http/Sidebar.vue b/packages/hoppscotch-common/src/components/http/Sidebar.vue index b62836b1c04..36ad55dd431 100644 --- a/packages/hoppscotch-common/src/components/http/Sidebar.vue +++ b/packages/hoppscotch-common/src/components/http/Sidebar.vue @@ -51,6 +51,19 @@ class="px-4 mt-4" /> + +

+ {{ t("tab.mock_servers") }} +
+ + @@ -60,17 +73,27 @@ import IconLayers from "~icons/lucide/layers" import IconFolder from "~icons/lucide/folder" import IconShare2 from "~icons/lucide/share-2" import IconCode from "~icons/lucide/code" +import IconServer from "~icons/lucide/server" import { ref } from "vue" import { useI18n } from "@composables/i18n" +import MockServerDashboard from "~/components/mockServer/MockServerDashboard.vue" +import { useMockServerWorkspaceSync } from "~/composables/mockServerWorkspace" +import { useMockServerVisibility } from "~/composables/mockServerVisibility" const t = useI18n() +const { isMockServerVisible } = useMockServerVisibility() + type RequestOptionTabs = | "history" | "collections" | "env" | "share-request" | "codegen" + | "mock-servers" const selectedNavigationTab = ref("collections") + +// Ensure mock servers are kept in sync with workspace changes globally +useMockServerWorkspaceSync() diff --git a/packages/hoppscotch-common/src/components/importExport/Base.vue b/packages/hoppscotch-common/src/components/importExport/Base.vue index b13b4ba4b6b..d7de6c12e44 100644 --- a/packages/hoppscotch-common/src/components/importExport/Base.vue +++ b/packages/hoppscotch-common/src/components/importExport/Base.vue @@ -202,6 +202,8 @@ props.importerModules.forEach((importer) => { props: () => ({ collections: importSummary.value.importedCollections, importFormat: importer.metadata.format, + scriptsImported: importSummary.value.scriptsImported, + originalScriptCounts: importSummary.value.originalScriptCounts, "on-close": () => { emit("hide-modal") }, diff --git a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue index 0659d4f38b9..1f85aa62f39 100644 --- a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue +++ b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue @@ -52,13 +52,41 @@ }}

+ + +
+ + +
+
@@ -69,6 +97,7 @@ import { useI18n } from "@composables/i18n" import { useToast } from "@composables/toast" import { computed, ref } from "vue" import { platform } from "~/platform" +import { useSetting } from "~/composables/settings" const props = withDefaults( defineProps<{ @@ -76,16 +105,24 @@ const props = withDefaults( acceptedFileTypes: string loading?: boolean description?: string + showPostmanScriptOption?: boolean }>(), { loading: false, description: undefined, + showPostmanScriptOption: false, } ) const t = useI18n() const toast = useToast() +// Postman-specific: Script import state (only use case so far) +const importScripts = ref(false) +const experimentalScriptingEnabled = useSetting( + "EXPERIMENTAL_SCRIPTING_SANDBOX" +) + const ALLOWED_FILE_SIZE_LIMIT = platform.limits?.collectionImportSizeLimit ?? 10 // Default to 10 MB const importFilesCount = ref(0) @@ -97,7 +134,7 @@ const fileContent = ref([]) const inputChooseFileToImportFrom = ref() const emit = defineEmits<{ - (e: "importFromFile", content: string[]): void + (e: "importFromFile", content: string[], ...additionalArgs: any[]): void }>() // Disable the import CTA if no file is selected, the file size limit is exceeded, or during an import action indicated by the `isLoading` prop @@ -106,6 +143,16 @@ const disableImportCTA = computed( !hasFile.value || showFileSizeLimitExceededWarning.value || props.loading ) +const handleImport = () => { + // If Postman script option is enabled AND experimental sandbox is enabled, pass the importScripts value + // Otherwise, don't pass it (undefined) to indicate the feature wasn't available + if (props.showPostmanScriptOption && experimentalScriptingEnabled.value) { + emit("importFromFile", fileContent.value, importScripts.value) + } else { + emit("importFromFile", fileContent.value) + } +} + const onFileChange = async () => { // Reset the state on entering the handler to avoid any stale state if (showFileSizeLimitExceededWarning.value) { diff --git a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/ImportSummary.vue b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/ImportSummary.vue index 80e030f0c87..72966e97c04 100644 --- a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/ImportSummary.vue +++ b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/ImportSummary.vue @@ -1,3 +1,120 @@ + + - + // Use original counts from raw Postman JSON + const preRequestScripts = props.originalScriptCounts?.preRequest || 0 + const testScripts = props.originalScriptCounts?.test || 0 + + return preRequestScripts + testScripts +}) + diff --git a/packages/hoppscotch-common/src/components/mockServer/CreateMockServer.vue b/packages/hoppscotch-common/src/components/mockServer/CreateMockServer.vue new file mode 100644 index 00000000000..37714872075 --- /dev/null +++ b/packages/hoppscotch-common/src/components/mockServer/CreateMockServer.vue @@ -0,0 +1,543 @@ + + + diff --git a/packages/hoppscotch-common/src/components/mockServer/EditMockServer.vue b/packages/hoppscotch-common/src/components/mockServer/EditMockServer.vue new file mode 100644 index 00000000000..71b922d447c --- /dev/null +++ b/packages/hoppscotch-common/src/components/mockServer/EditMockServer.vue @@ -0,0 +1,292 @@ + + + diff --git a/packages/hoppscotch-common/src/components/mockServer/LogSection.vue b/packages/hoppscotch-common/src/components/mockServer/LogSection.vue new file mode 100644 index 00000000000..29f446582ff --- /dev/null +++ b/packages/hoppscotch-common/src/components/mockServer/LogSection.vue @@ -0,0 +1,110 @@ + + + diff --git a/packages/hoppscotch-common/src/components/mockServer/MockServerDashboard.vue b/packages/hoppscotch-common/src/components/mockServer/MockServerDashboard.vue new file mode 100644 index 00000000000..3a0c05e12b2 --- /dev/null +++ b/packages/hoppscotch-common/src/components/mockServer/MockServerDashboard.vue @@ -0,0 +1,376 @@ + + + diff --git a/packages/hoppscotch-common/src/components/mockServer/MockServerLogs.vue b/packages/hoppscotch-common/src/components/mockServer/MockServerLogs.vue new file mode 100644 index 00000000000..720b2599ded --- /dev/null +++ b/packages/hoppscotch-common/src/components/mockServer/MockServerLogs.vue @@ -0,0 +1,213 @@ + + + diff --git a/packages/hoppscotch-common/src/components/settings/Agent.vue b/packages/hoppscotch-common/src/components/settings/Agent.vue index b2665b7aba9..7004425374f 100644 --- a/packages/hoppscotch-common/src/components/settings/Agent.vue +++ b/packages/hoppscotch-common/src/components/settings/Agent.vue @@ -31,6 +31,14 @@ {{ t("settings.verify_peer") }} +
+ + {{ t("settings.follow_redirects") }} +
+
+
+ + {{ t("settings.follow_redirects") }} +
+
-
+
+ diff --git a/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts b/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts index 7501512d41c..d3f6b582092 100644 --- a/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts +++ b/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts @@ -26,13 +26,21 @@ import { GOOGLE_CONFIGS, MAIL_CONFIGS, MICROSOFT_CONFIGS, + MOCK_SERVER_CONFIGS, ServerConfigs, + TOKEN_VALIDATION_CONFIGS, UpdatedConfigs, } from '~/helpers/configs'; import { getCompiledErrorMessage } from '~/helpers/errors'; import { useToast } from './toast'; import { useClientHandler } from './useClientHandler'; +const COOKIE_NAME_REGEX = /^[A-Za-z0-9_-]+$/; + +const OPTIONAL_TOKEN_FIELD_KEYS = new Set( + TOKEN_VALIDATION_CONFIGS.filter((cfg) => cfg.optional).map((cfg) => cfg.key) +); + /** Composable that handles all operations related to server configurations * @param updatedConfigs A Config Object containing the updated configs */ @@ -153,6 +161,7 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { InfraConfigEnum.AccessTokenValidity ), session_secret: getFieldValue(InfraConfigEnum.SessionSecret), + session_cookie_name: getFieldValue(InfraConfigEnum.SessionCookieName), }, }, dataSharingConfigs: { @@ -176,6 +185,14 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { rate_limit_max: getFieldValue(InfraConfigEnum.RateLimitMax), }, }, + mockServerConfigs: { + name: 'mock_server', + fields: { + mock_server_wildcard_domain: getFieldValue( + InfraConfigEnum.MockServerWildcardDomain + ), + }, + }, }; // Cloning the current configs to working configs @@ -275,8 +292,12 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { // This section has no enabled property, so we check fields directly // for a valid number (>0) or non-empty string - if (section.name === 'token') - return Object.values(section.fields).some(isFieldNotValid); + if (section.name === 'token') { + return Object.entries(section.fields).some( + ([key, value]) => + !OPTIONAL_TOKEN_FIELD_KEYS.has(key) && isFieldNotValid(value) + ); + } // For rate limit section, we want to check if the values are not valid numbers // and not empty strings @@ -343,6 +364,11 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { enabled: isCustomMailConfigEnabled, fields: customMailConfigFields, }, + { + config: MOCK_SERVER_CONFIGS, + enabled: true, + fields: updatedConfigs?.mockServerConfigs?.fields ?? {}, + }, ]; const transformedConfigs: UpdatedConfigs[] = []; @@ -557,6 +583,14 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { const sessionSecret = String( updatedConfigs?.tokenConfigs.fields.session_secret ); + const sessionCookieName = String( + updatedConfigs?.tokenConfigs.fields.session_cookie_name || '' + ); + // Validate cookie name: allow empty (falls back to default), else enforce pattern + if (sessionCookieName && !COOKIE_NAME_REGEX.test(sessionCookieName)) { + toast.error(t('configs.auth_providers.token.session_cookie_name_invalid')); + return false; + } if ( isFieldEmpty(jwtSecret) || isFieldEmpty(tokenSaltComplexity) || @@ -594,6 +628,10 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { name: InfraConfigEnum.SessionSecret, value: sessionSecret, }, + { + name: InfraConfigEnum.SessionCookieName, + value: sessionCookieName, + }, ]; return executeMutation( diff --git a/packages/hoppscotch-sh-admin/src/helpers/configs.ts b/packages/hoppscotch-sh-admin/src/helpers/configs.ts index 9dcaf118a5a..03271bfeab5 100644 --- a/packages/hoppscotch-sh-admin/src/helpers/configs.ts +++ b/packages/hoppscotch-sh-admin/src/helpers/configs.ts @@ -67,6 +67,7 @@ export type ServerConfigs = { refresh_token_validity: string; access_token_validity: string; session_secret: string; + session_cookie_name: string; }; }; @@ -87,6 +88,12 @@ export type ServerConfigs = { rate_limit_max: string; }; }; + mockServerConfigs?: { + name: string; + fields: { + mock_server_wildcard_domain: string; + }; + }; }; export type UpdatedConfigs = { @@ -109,6 +116,8 @@ export type ConfigSection = { export type Config = { name: InfraConfigEnum; key: string; + // Marks fields that are optional and should be excluded from mandatory validation + optional?: boolean; }; export const GOOGLE_CONFIGS: Config[] = [ @@ -251,6 +260,11 @@ export const TOKEN_VALIDATION_CONFIGS: Config[] = [ name: InfraConfigEnum.SessionSecret, key: 'session_secret', }, + { + name: InfraConfigEnum.SessionCookieName, + key: 'session_cookie_name', + optional: true, + }, { name: InfraConfigEnum.TokenSaltComplexity, key: 'token_salt_complexity', @@ -269,6 +283,13 @@ export const TOKEN_VALIDATION_CONFIGS: Config[] = [ }, ]; +export const MOCK_SERVER_CONFIGS: Config[] = [ + { + name: InfraConfigEnum.MockServerWildcardDomain, + key: 'mock_server_wildcard_domain', + }, +]; + export const ALL_CONFIGS = [ GOOGLE_CONFIGS, MICROSOFT_CONFIGS, @@ -279,4 +300,5 @@ export const ALL_CONFIGS = [ HISTORY_STORE_CONFIG, RATE_LIMIT_CONFIGS, TOKEN_VALIDATION_CONFIGS, + MOCK_SERVER_CONFIGS, ]; diff --git a/packages/hoppscotch-sh-admin/src/helpers/userManagement.ts b/packages/hoppscotch-sh-admin/src/helpers/userManagement.ts index c03da5f16d6..0866172ade6 100644 --- a/packages/hoppscotch-sh-admin/src/helpers/userManagement.ts +++ b/packages/hoppscotch-sh-admin/src/helpers/userManagement.ts @@ -67,7 +67,7 @@ export const handleUserDeletion = (deletedUsersList: UserDeletionResult[]) => { // Indicates the actual count of users deleted (filtered via the `isDeleted` field) const deletedUsersCount = deletedUserIDs.length; - if (isBulkAction && deletedUsersCount > 0) { + if (deletedUsersCount > 0) { toastMessages.push({ message: t('state.delete_some_users_success', { count: deletedUsersCount, diff --git a/packages/hoppscotch-sh-admin/src/pages/settings.vue b/packages/hoppscotch-sh-admin/src/pages/settings.vue index d8ef68c15b2..200ceeaca0e 100644 --- a/packages/hoppscotch-sh-admin/src/pages/settings.vue +++ b/packages/hoppscotch-sh-admin/src/pages/settings.vue @@ -37,9 +37,13 @@
+
+ + +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 389d824ce78..b6922e3946a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,7 @@ overrides: apiconnect-wsdl: 2.0.36 cross-spawn: 7.0.6 execa@0.10.0: 2.0.0 + nodemailer@<7.0.7: 7.0.7 sha.js@2.4.11: 2.4.12 subscriptions-transport-ws>ws: 7.5.10 vue: 3.5.22 @@ -20,20 +21,20 @@ importers: .: devDependencies: '@commitlint/cli': - specifier: 19.8.1 - version: 19.8.1(@types/node@24.5.2)(typescript@5.9.2) + specifier: 20.1.0 + version: 20.1.0(@types/node@24.9.1)(typescript@5.9.3) '@commitlint/config-conventional': - specifier: 19.8.1 - version: 19.8.1 + specifier: 20.0.0 + version: 20.0.0 '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@types/node': - specifier: 24.5.2 - version: 24.5.2 + specifier: 24.9.1 + version: 24.9.1 cross-env: - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.1.0 + version: 10.1.0 http-server: specifier: 14.1.1 version: 14.1.1 @@ -41,8 +42,8 @@ importers: specifier: 9.1.7 version: 9.1.7 lint-staged: - specifier: 16.2.1 - version: 16.2.1 + specifier: 16.2.5 + version: 16.2.5 packages/codemirror-lang-graphql: dependencies: @@ -61,22 +62,22 @@ importers: version: 1.8.0 '@rollup/plugin-typescript': specifier: 12.1.4 - version: 12.1.4(rollup@4.52.2)(tslib@2.8.1)(typescript@5.9.2) + version: 12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.9.3) mocha: - specifier: 11.7.2 - version: 11.7.2 + specifier: 11.7.4 + version: 11.7.4 rollup: - specifier: 4.52.2 - version: 4.52.2 + specifier: 4.52.5 + version: 4.52.5 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 packages/hoppscotch-agent: dependencies: '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@tauri-apps/api': specifier: 2.1.1 version: 2.1.1 @@ -85,7 +86,7 @@ importers: version: 2.2.1 '@vueuse/core': specifier: 13.7.0 - version: 13.7.0(vue@3.5.22(typescript@5.9.2)) + version: 13.7.0(vue@3.5.22(typescript@5.9.3)) axios: specifier: 1.12.2 version: 1.12.2 @@ -97,7 +98,7 @@ importers: version: 4.17.21 vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) devDependencies: '@iconify-json/lucide': specifier: 1.2.68 @@ -109,11 +110,11 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 24.3.0 - version: 24.3.0 + specifier: 24.9.1 + version: 24.9.1 '@vitejs/plugin-vue': specifier: 5.1.4 - version: 5.1.4(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 5.1.4(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) @@ -122,34 +123,37 @@ importers: version: 8.5.6 tailwindcss: specifier: 3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 unplugin-icons: specifier: 22.2.0 version: 22.2.0(@vue/compiler-sfc@3.5.22)(svelte@3.59.2)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 29.0.0 - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) vite: specifier: 6.3.6 - version: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vue-tsc: specifier: 2.2.0 - version: 2.2.0(typescript@5.9.2) + version: 2.2.0(typescript@5.9.3) packages/hoppscotch-backend: dependencies: '@apollo/server': specifier: 4.12.1 version: 4.12.1(graphql@16.11.0) + '@as-integrations/express5': + specifier: 1.1.2 + version: 1.1.2(@apollo/server@4.12.1(graphql@16.11.0))(express@5.1.0) '@nestjs-modules/mailer': specifier: 2.0.2 - version: 2.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(nodemailer@7.0.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + version: 2.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(nodemailer@7.0.9)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) '@nestjs/apollo': - specifier: 13.1.0 - version: 13.1.0(@apollo/server@4.12.1(graphql@16.11.0))(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/graphql@13.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2))(graphql@16.11.0) + specifier: 13.2.1 + version: 13.2.1(@apollo/server@4.12.1(graphql@16.11.0))(@as-integrations/express5@1.1.2(@apollo/server@4.12.1(graphql@16.11.0))(express@5.1.0))(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/graphql@13.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2))(graphql@16.11.0) '@nestjs/common': specifier: 11.1.6 version: 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -160,11 +164,11 @@ importers: specifier: 11.1.6 version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/graphql': - specifier: 13.1.0 - version: 13.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2) + specifier: 13.2.0 + version: 13.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2) '@nestjs/jwt': - specifier: 11.0.0 - version: 11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)) + specifier: 11.0.1 + version: 11.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/passport': specifier: 11.0.0 version: 11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) @@ -175,17 +179,17 @@ importers: specifier: 6.0.1 version: 6.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) '@nestjs/swagger': - specifier: 11.2.0 - version: 11.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) + specifier: 11.2.1 + version: 11.2.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) '@nestjs/terminus': specifier: 11.0.0 - version: 11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@prisma/client@6.16.2(prisma@6.16.2(typescript@5.9.2))(typescript@5.9.2))(reflect-metadata@0.2.2)(rxjs@7.8.2) + version: 11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.3))(typescript@5.9.3))(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/throttler': specifier: 6.4.0 version: 6.4.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2) '@prisma/client': - specifier: 6.16.2 - version: 6.16.2(prisma@6.16.2(typescript@5.9.2))(typescript@5.9.2) + specifier: 6.17.1 + version: 6.17.1(prisma@6.17.1(typescript@5.9.3))(typescript@5.9.3) argon2: specifier: 0.44.0 version: 0.44.0 @@ -235,8 +239,8 @@ importers: specifier: 1.10.1 version: 1.10.1 nodemailer: - specifier: 7.0.6 - version: 7.0.6 + specifier: 7.0.9 + version: 7.0.9 passport: specifier: 0.7.0 version: 0.7.0 @@ -256,11 +260,11 @@ importers: specifier: 2.1.0 version: 2.1.0 posthog-node: - specifier: 5.8.8 - version: 5.8.8 + specifier: 5.10.0 + version: 5.10.0 prisma: - specifier: 6.16.2 - version: 6.16.2(typescript@5.9.2) + specifier: 6.17.1 + version: 6.17.1(typescript@5.9.3) reflect-metadata: specifier: 0.2.2 version: 0.2.2 @@ -275,14 +279,14 @@ importers: specifier: 3.3.1 version: 3.3.1 '@eslint/js': - specifier: 9.36.0 - version: 9.36.0 + specifier: 9.37.0 + version: 9.37.0 '@nestjs/cli': specifier: 11.0.10 - version: 11.0.10(@swc/core@1.4.2)(@types/node@24.5.2) + version: 11.0.10(@swc/core@1.4.2)(@types/node@24.9.1) '@nestjs/schematics': - specifier: 11.0.7 - version: 11.0.7(chokidar@4.0.3)(typescript@5.9.2) + specifier: 11.0.9 + version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) '@nestjs/testing': specifier: 11.1.6 version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/platform-express@11.1.6) @@ -302,11 +306,11 @@ importers: specifier: 30.0.0 version: 30.0.0 '@types/node': - specifier: 24.5.2 - version: 24.5.2 + specifier: 24.9.1 + version: 24.9.1 '@types/nodemailer': - specifier: 7.0.1 - version: 7.0.1 + specifier: 7.0.2 + version: 7.0.2 '@types/passport-github2': specifier: 1.2.9 version: 1.2.9 @@ -323,32 +327,32 @@ importers: specifier: 6.0.3 version: 6.0.3 '@typescript-eslint/eslint-plugin': - specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + specifier: 8.46.1 + version: 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.44.1 - version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + specifier: 8.46.1 + version: 8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) cross-env: - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.1.0 + version: 10.1.0 eslint: - specifier: 9.36.0 - version: 9.36.0(jiti@2.6.0) + specifier: 9.37.0 + version: 9.37.0(jiti@2.6.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + version: 10.1.8(eslint@9.37.0(jiti@2.6.0)) eslint-plugin-prettier: specifier: 5.5.4 - version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2) + version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0))(prettier@3.6.2) globals: specifier: 16.4.0 version: 16.4.0 jest: - specifier: 30.1.3 - version: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + specifier: 30.2.0 + version: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) jest-mock-extended: specifier: 4.0.0 - version: 4.0.0(@jest/globals@30.1.2)(jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)))(typescript@5.9.2) + version: 4.0.0(@jest/globals@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3) prettier: specifier: 3.6.2 version: 3.6.2 @@ -359,20 +363,20 @@ importers: specifier: 7.1.4 version: 7.1.4 ts-jest: - specifier: 29.4.4 - version: 29.4.4(@babel/core@7.28.4)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.4))(jest-util@30.0.5)(jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)))(typescript@5.9.2) + specifier: 29.4.5 + version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3) ts-loader: specifier: 9.5.4 - version: 9.5.4(typescript@5.9.2)(webpack@5.100.2(@swc/core@1.4.2)) + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2(@swc/core@1.4.2)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + version: 10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) tsconfig-paths: specifier: 4.2.0 version: 4.2.0 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 packages/hoppscotch-cli: dependencies: @@ -438,23 +442,23 @@ importers: specifier: 3.6.2 version: 3.6.2 semver: - specifier: 7.7.2 - version: 7.7.2 + specifier: 7.7.3 + version: 7.7.3 tsup: specifier: 8.5.0 - version: 8.5.0(@swc/core@1.4.2)(jiti@2.6.0)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1) + version: 8.5.0(@swc/core@1.4.2)(jiti@2.6.0)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) packages/hoppscotch-common: dependencies: '@apidevtools/swagger-parser': - specifier: 12.0.0 - version: 12.0.0(openapi-types@12.1.3) + specifier: 12.1.0 + version: 12.1.0(openapi-types@12.1.3) '@codemirror/autocomplete': specifier: 6.18.6 version: 6.18.6 @@ -492,8 +496,8 @@ importers: specifier: 6.38.1 version: 6.38.1 '@guolao/vue-monaco-editor': - specifier: 1.5.5 - version: 1.5.5(monaco-editor@0.52.2)(vue@3.5.22(typescript@5.9.2)) + specifier: 1.6.0 + version: 1.6.0(monaco-editor@0.52.2)(vue@3.5.22(typescript@5.9.3)) '@hoppscotch/codemirror-lang-graphql': specifier: workspace:^ version: link:../codemirror-lang-graphql @@ -514,10 +518,10 @@ importers: version: '@CuriousCorrelation/plugin-appload@https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/e05861959938b57479a1a81fa796735ebbd08c7c' '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@hoppscotch/vue-toasted': specifier: 0.1.0 - version: 0.1.0(vue@3.5.22(typescript@5.9.2)) + version: 0.1.0(vue@3.5.22(typescript@5.9.3)) '@lezer/highlight': specifier: 1.2.1 version: 1.2.1 @@ -543,8 +547,8 @@ importers: specifier: 14.1.2 version: 14.1.2 '@unhead/vue': - specifier: 2.0.17 - version: 2.0.17(vue@3.5.22(typescript@5.9.2)) + specifier: 2.0.19 + version: 2.0.19(vue@3.5.22(typescript@5.9.3)) '@urql/core': specifier: 6.0.1 version: 6.0.1(graphql@16.11.0) @@ -556,7 +560,7 @@ importers: version: 3.0.0(@urql/core@6.0.1(graphql@16.11.0)) '@vueuse/core': specifier: 13.7.0 - version: 13.7.0(vue@3.5.22(typescript@5.9.2)) + version: 13.7.0(vue@3.5.22(typescript@5.9.3)) acorn-walk: specifier: 8.3.4 version: 8.3.4 @@ -574,7 +578,7 @@ importers: version: 2.0.0 dioc: specifier: 3.0.2 - version: 3.0.2(vue@3.5.22(typescript@5.9.2)) + version: 3.0.2(vue@3.5.22(typescript@5.9.3)) esprima: specifier: 4.0.1 version: 4.0.1 @@ -592,7 +596,7 @@ importers: version: 16.11.0 graphql-language-service-interface: specifier: 2.10.2 - version: 2.10.2(@types/node@24.5.2)(graphql@16.11.0) + version: 2.10.2(@types/node@24.9.1)(graphql@16.11.0) graphql-tag: specifier: 2.12.6 version: 2.12.6(graphql@16.11.0) @@ -621,8 +625,8 @@ importers: specifier: 4.17.21 version: 4.17.21 lossless-json: - specifier: 4.2.0 - version: 4.2.0 + specifier: 4.3.0 + version: 4.3.0 markdown-it: specifier: 14.1.0 version: 14.1.0 @@ -684,8 +688,8 @@ importers: specifier: 0.11.0 version: 0.11.0(graphql@16.11.0) superjson: - specifier: 2.2.2 - version: 2.2.2 + specifier: 2.2.3 + version: 2.2.3 tern: specifier: 0.24.3 version: 0.24.3 @@ -709,25 +713,25 @@ importers: version: 0.4.0(zod@3.25.32) vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) vue-i18n: specifier: 11.1.12 - version: 11.1.12(vue@3.5.22(typescript@5.9.2)) + version: 11.1.12(vue@3.5.22(typescript@5.9.3)) vue-json-pretty: specifier: 2.5.0 - version: 2.5.0(vue@3.5.22(typescript@5.9.2)) + version: 2.5.0(vue@3.5.22(typescript@5.9.3)) vue-pdf-embed: specifier: 2.1.3 - version: 2.1.3(vue@3.5.22(typescript@5.9.2)) + version: 2.1.3(vue@3.5.22(typescript@5.9.3)) vue-router: - specifier: 4.5.1 - version: 4.5.1(vue@3.5.22(typescript@5.9.2)) + specifier: 4.6.3 + version: 4.6.3(vue@3.5.22(typescript@5.9.3)) vue-tippy: specifier: 6.7.1 - version: 6.7.1(vue@3.5.22(typescript@5.9.2)) + version: 6.7.1(vue@3.5.22(typescript@5.9.3)) vuedraggable-es: specifier: 4.1.1 - version: 4.1.1(vue@3.5.22(typescript@5.9.2)) + version: 4.1.1(vue@3.5.22(typescript@5.9.3)) wonka: specifier: 6.3.5 version: 6.3.5 @@ -746,16 +750,16 @@ importers: devDependencies: '@esbuild-plugins/node-globals-polyfill': specifier: 0.2.3 - version: 0.2.3(esbuild@0.25.10) + version: 0.2.3(esbuild@0.25.11) '@esbuild-plugins/node-modules-polyfill': specifier: 0.2.2 - version: 0.2.2(esbuild@0.25.10) + version: 0.2.2(esbuild@0.25.11) '@graphql-codegen/add': specifier: 5.0.3 version: 5.0.3(graphql@16.11.0) '@graphql-codegen/cli': specifier: 5.0.7 - version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2) + version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) '@graphql-codegen/typed-document-node': specifier: 5.1.2 version: 5.1.2(graphql@16.11.0) @@ -779,13 +783,13 @@ importers: version: 1.2.68 '@intlify/unplugin-vue-i18n': specifier: 6.0.8 - version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.2)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) '@relmify/jest-fp-ts': specifier: 2.1.1 version: 2.1.1(fp-ts@2.16.11)(io-ts@2.2.22(fp-ts@2.16.11)) '@rushstack/eslint-patch': - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.14.0 + version: 1.14.0 '@types/har-format': specifier: 1.2.16 version: 1.2.16 @@ -809,7 +813,7 @@ importers: version: 6.14.0 '@types/splitpanes': specifier: 2.2.6 - version: 2.2.6(typescript@5.9.2) + version: 2.2.6(typescript@5.9.3) '@types/uuid': specifier: 10.0.0 version: 10.0.0 @@ -817,20 +821,20 @@ importers: specifier: 21.0.3 version: 21.0.3 '@typescript-eslint/eslint-plugin': - specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.44.1 - version: 8.44.1(eslint@8.57.0)(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@8.57.0)(typescript@5.9.3) '@vitejs/plugin-vue': specifier: 5.1.4 - version: 5.1.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 5.1.4(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/compiler-sfc': specifier: 3.5.22 version: 3.5.22 '@vue/eslint-config-typescript': specifier: 13.0.0 - version: 13.0.0(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.2) + version: 13.0.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.3) '@vue/runtime-core': specifier: 3.5.22 version: 3.5.22 @@ -838,11 +842,11 @@ importers: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) cross-env: - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.1.0 + version: 10.1.0 dotenv: - specifier: 17.2.2 - version: 17.2.2 + specifier: 17.2.3 + version: 17.2.3 eslint: specifier: 8.57.0 version: 8.57.0 @@ -850,8 +854,8 @@ importers: specifier: 5.5.4 version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@8.57.0))(eslint@8.57.0)(prettier@3.6.2) eslint-plugin-vue: - specifier: 10.5.0 - version: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) + specifier: 10.5.1 + version: 10.5.1(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) glob: specifier: 11.0.3 version: 11.0.3 @@ -875,55 +879,55 @@ importers: version: 0.6.14(prettier@3.6.2) rollup-plugin-polyfill-node: specifier: 0.13.0 - version: 0.13.0(rollup@4.52.2) + version: 0.13.0(rollup@4.52.5) sass: specifier: 1.93.2 version: 1.93.2 tailwindcss: specifier: 3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 unplugin-fonts: specifier: 1.4.0 - version: 1.4.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 1.4.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) unplugin-icons: specifier: 22.2.0 version: 22.2.0(@vue/compiler-sfc@3.5.22)(svelte@3.59.2)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 29.0.0 - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) vite: specifier: 6.3.6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vite-plugin-checker: specifier: 0.10.3 - version: 0.10.3(eslint@8.57.0)(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-tsc@1.8.8(typescript@5.9.2)) + version: 0.10.3(eslint@8.57.0)(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-tsc@1.8.8(typescript@5.9.3)) vite-plugin-fonts: specifier: 0.7.0 - version: 0.7.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 0.7.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-html-config: specifier: 2.0.2 - version: 2.0.2(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 2.0.2(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-pages: specifier: 0.33.1 - version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2))) + version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3))) vite-plugin-pages-sitemap: specifier: 1.7.1 version: 1.7.1 vite-plugin-pwa: - specifier: 1.0.3 - version: 1.0.3(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + specifier: 1.1.0 + version: 1.1.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-vue-layouts: specifier: 0.11.0 - version: 0.11.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 0.11.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vue-tsc: specifier: 1.8.8 - version: 1.8.8(typescript@5.9.2) + version: 1.8.8(typescript@5.9.3) packages/hoppscotch-data: dependencies: @@ -959,11 +963,11 @@ importers: specifier: 10.0.0 version: 10.0.0 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: 6.3.6 - version: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) packages/hoppscotch-desktop: dependencies: @@ -987,7 +991,7 @@ importers: version: '@CuriousCorrelation/plugin-appload@https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/e05861959938b57479a1a81fa796735ebbd08c7c' '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.3)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@tauri-apps/api': specifier: 2.1.1 version: 2.1.1 @@ -1008,7 +1012,7 @@ importers: version: 2.5.1 '@vueuse/core': specifier: 13.7.0 - version: 13.7.0(vue@3.5.22(typescript@5.9.2)) + version: 13.7.0(vue@3.5.22(typescript@5.9.3)) fp-ts: specifier: 2.16.11 version: 2.16.11 @@ -1017,13 +1021,13 @@ importers: version: 7.8.2 vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) vue-router: - specifier: 4.5.1 - version: 4.5.1(vue@3.5.22(typescript@5.9.2)) + specifier: 4.6.3 + version: 4.6.3(vue@3.5.22(typescript@5.9.3)) vue-tippy: specifier: 6.7.1 - version: 6.7.1(vue@3.5.22(typescript@5.9.2)) + version: 6.7.1(vue@3.5.22(typescript@5.9.3)) zod: specifier: 3.25.32 version: 3.25.32 @@ -1032,23 +1036,23 @@ importers: specifier: 1.2.68 version: 1.2.68 '@rushstack/eslint-patch': - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.14.0 + version: 1.14.0 '@tauri-apps/cli': specifier: ^2 version: 2.0.4 '@typescript-eslint/eslint-plugin': specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.44.1 - version: 8.44.1(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(eslint@8.57.0)(typescript@5.9.3) '@vitejs/plugin-vue': specifier: 5.1.4 - version: 5.1.4(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 5.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/eslint-config-typescript': specifier: 13.0.0 - version: 13.0.0(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.2) + version: 13.0.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.3) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) @@ -1059,8 +1063,8 @@ importers: specifier: 5.5.4 version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@8.57.0))(eslint@8.57.0)(prettier@3.6.2) eslint-plugin-vue: - specifier: 10.5.0 - version: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) + specifier: 10.5.1 + version: 10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) postcss: specifier: 8.5.6 version: 8.5.6 @@ -1069,22 +1073,22 @@ importers: version: 1.93.2 tailwindcss: specifier: 3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 unplugin-icons: specifier: 22.2.0 version: 22.2.0(@vue/compiler-sfc@3.5.22)(svelte@3.59.2)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 29.0.0 - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vue-tsc: specifier: 2.2.0 - version: 2.2.0(typescript@5.9.2) + version: 2.2.0(typescript@5.9.3) packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload: dependencies: @@ -1094,16 +1098,16 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.52.2)(tslib@2.8.0)(typescript@5.9.2) + version: 11.1.6(rollup@4.52.5)(tslib@2.8.0)(typescript@5.9.3) rollup: - specifier: ^4.52.2 - version: 4.52.2 + specifier: ^4.52.5 + version: 4.52.5 tslib: specifier: ^2.6.2 version: 2.8.0 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/examples/tauri-app: dependencies: @@ -1116,7 +1120,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^1.0.1 - version: 1.4.0(svelte@3.59.2)(vite@3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2)) + version: 1.4.0(svelte@3.59.2)(vite@3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) '@tauri-apps/cli': specifier: ^2.0.0-alpha.17 version: 2.0.4 @@ -1125,7 +1129,7 @@ importers: version: 3.59.2 vite: specifier: ^3.0.2 - version: 3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2) + version: 3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-relay: dependencies: @@ -1135,16 +1139,16 @@ importers: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.52.2)(tslib@2.8.0)(typescript@5.9.2) + version: 11.1.6(rollup@4.52.5)(tslib@2.8.0)(typescript@5.9.3) rollup: - specifier: ^4.52.2 - version: 4.52.2 + specifier: ^4.52.5 + version: 4.52.5 tslib: specifier: ^2.6.2 version: 2.8.0 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 packages/hoppscotch-js-sandbox: dependencies: @@ -1154,6 +1158,9 @@ importers: '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 + chai: + specifier: 6.2.0 + version: 6.2.0 faraday-cage: specifier: 0.1.0 version: 0.1.0 @@ -1176,6 +1183,9 @@ importers: '@relmify/jest-fp-ts': specifier: 2.1.1 version: 2.1.1(fp-ts@2.16.11)(io-ts@2.2.22(fp-ts@2.16.11)) + '@types/chai': + specifier: 5.2.2 + version: 5.2.2 '@types/jest': specifier: 30.0.0 version: 30.0.0 @@ -1183,14 +1193,14 @@ importers: specifier: 4.17.20 version: 4.17.20 '@types/node': - specifier: 24.3.0 - version: 24.3.0 + specifier: 24.9.1 + version: 24.9.1 '@typescript-eslint/eslint-plugin': specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.44.1 - version: 8.44.1(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(eslint@8.57.0)(typescript@5.9.3) eslint: specifier: 8.57.0 version: 8.57.0 @@ -1207,20 +1217,20 @@ importers: specifier: 3.6.2 version: 3.6.2 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: 6.3.6 - version: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) packages/hoppscotch-kernel: dependencies: '@hoppscotch/plugin-relay': - specifier: github:CuriousCorrelation/tauri-plugin-relay#5d59b97fe331ca62e8be0454ff3f4e5f6185ae70 - version: '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/5d59b97fe331ca62e8be0454ff3f4e5f6185ae70' + specifier: github:CuriousCorrelation/tauri-plugin-relay#7cf09c1ad31e228758738c2f4e1c8fe9cc141291 + version: '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/7cf09c1ad31e228758738c2f4e1c8fe9cc141291' '@tauri-apps/api': specifier: 2.1.1 version: 2.1.1 @@ -1246,21 +1256,21 @@ importers: specifier: 2.16.11 version: 2.16.11 superjson: - specifier: 2.2.2 - version: 2.2.2 + specifier: 2.2.3 + version: 2.2.3 zod: specifier: 3.25.32 version: 3.25.32 devDependencies: '@types/node': - specifier: 24.3.0 - version: 24.3.0 + specifier: 24.9.1 + version: 24.9.1 typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite: specifier: 6.3.5 - version: 6.3.5(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) packages/hoppscotch-selfhost-desktop: dependencies: @@ -1290,7 +1300,7 @@ importers: version: 1.5.6 '@vueuse/core': specifier: 10.5.0 - version: 10.5.0(vue@3.5.22(typescript@5.8.3)) + version: 10.5.0(vue@3.5.22(typescript@5.9.3)) axios: specifier: 1.8.2 version: 1.8.2 @@ -1299,7 +1309,7 @@ importers: version: 6.0.3 dioc: specifier: 3.0.2 - version: 3.0.2(vue@3.5.22(typescript@5.8.3)) + version: 3.0.2(vue@3.5.22(typescript@5.9.3)) environments.api: specifier: link:@platform/environments/environments.api version: link:@platform/environments/environments.api @@ -1338,7 +1348,7 @@ importers: version: 0.3.0(zod@3.25.32) vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.8.3) + version: 3.5.22(typescript@5.9.3) workbox-window: specifier: 6.6.0 version: 6.6.0 @@ -1351,7 +1361,7 @@ importers: version: 5.0.0(graphql@16.11.0) '@graphql-codegen/cli': specifier: 5.0.0 - version: 5.0.0(@parcel/watcher@2.5.1)(@types/node@18.18.8)(graphql@16.11.0)(typescript@5.8.3) + version: 5.0.0(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) '@graphql-codegen/typed-document-node': specifier: 5.0.1 version: 5.0.1(graphql@16.11.0) @@ -1375,40 +1385,40 @@ importers: version: 1.2.68 '@intlify/unplugin-vue-i18n': specifier: 6.0.4 - version: 6.0.4(@vue/compiler-dom@3.5.22)(eslint@8.47.0)(rollup@2.79.2)(typescript@5.8.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3))(webpack-sources@3.3.3) + version: 6.0.4(@vue/compiler-dom@3.5.22)(eslint@8.47.0)(rollup@2.79.2)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))(webpack-sources@3.3.3) '@rushstack/eslint-patch': - specifier: 1.3.3 - version: 1.3.3 + specifier: 1.14.0 + version: 1.14.0 '@types/lodash-es': specifier: 4.17.10 version: 4.17.10 '@types/node': - specifier: 18.18.8 - version: 18.18.8 + specifier: 24.9.1 + version: 24.9.1 '@typescript-eslint/eslint-plugin': specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(typescript@5.8.3) + version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.44.1 - version: 8.44.1(eslint@8.47.0)(typescript@5.8.3) + version: 8.44.1(eslint@8.47.0)(typescript@5.9.3) '@vitejs/plugin-legacy': specifier: 2.3.0 - version: 2.3.0(terser@5.39.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 2.3.0(terser@5.39.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) '@vitejs/plugin-vue': specifier: 4.3.1 - version: 4.3.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.8.3)) + version: 4.3.1(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.9.3)) '@vue/eslint-config-typescript': specifier: 11.0.3 - version: 11.0.3(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)))(eslint@8.47.0)(typescript@5.8.3) + version: 11.0.3(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)))(eslint@8.47.0)(typescript@5.9.3) autoprefixer: specifier: 10.4.16 version: 10.4.16(postcss@8.4.32) cross-env: - specifier: 7.0.3 - version: 7.0.3 + specifier: 10.1.0 + version: 10.1.0 dotenv: - specifier: 17.2.2 - version: 17.2.2 + specifier: 17.2.3 + version: 17.2.3 eslint: specifier: 8.47.0 version: 8.47.0 @@ -1416,8 +1426,8 @@ importers: specifier: 4.2.1 version: 4.2.1(eslint@8.47.0)(prettier@3.6.2) eslint-plugin-vue: - specifier: 10.5.0 - version: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)) + specifier: 10.5.1 + version: 10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)) npm-run-all: specifier: 4.1.5 version: 4.1.5 @@ -1426,46 +1436,46 @@ importers: version: 8.4.32 tailwindcss: specifier: 3.3.6 - version: 3.3.6(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3)) + version: 3.3.6(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) typescript: - specifier: 5.8.3 - version: 5.8.3 + specifier: 5.9.3 + version: 5.9.3 unplugin-fonts: specifier: 1.1.1 - version: 1.1.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 1.1.1(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) unplugin-icons: specifier: 0.14.9 version: 0.14.9(@vue/compiler-sfc@3.5.22)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.28.4)(esbuild@0.25.10)(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.8.3))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)) + version: 0.21.0(@babel/parser@7.28.4)(esbuild@0.25.11)(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.9.3))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)) vite: specifier: 4.5.0 - version: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + version: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) vite-plugin-html-config: specifier: 1.0.11 - version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 1.0.11(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) vite-plugin-inspect: specifier: 0.7.38 - version: 0.7.38(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 0.7.38(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) vite-plugin-pages: specifier: 0.26.0 - version: 0.26.0(@vue/compiler-sfc@3.5.22)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 0.26.0(@vue/compiler-sfc@3.5.22)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) vite-plugin-pages-sitemap: specifier: 1.6.1 version: 1.6.1 vite-plugin-pwa: - specifier: 0.13.1 - version: 0.13.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@6.6.0) + specifier: 1.1.0 + version: 1.1.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@6.6.0) vite-plugin-static-copy: specifier: 0.12.0 - version: 0.12.0(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)) + version: 0.12.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) vite-plugin-vue-layouts: specifier: 0.7.0 - version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) + version: 0.7.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) vue-tsc: specifier: 1.8.8 - version: 1.8.8(typescript@5.8.3) + version: 1.8.8(typescript@5.9.3) packages/hoppscotch-selfhost-web: dependencies: @@ -1489,7 +1499,7 @@ importers: version: link:../hoppscotch-kernel '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.3)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@import-meta-env/unplugin': specifier: 0.6.2 version: 0.6.2(@import-meta-env/cli@0.7.3) @@ -1507,7 +1517,7 @@ importers: version: 2.2.1 '@vueuse/core': specifier: 13.7.0 - version: 13.7.0(vue@3.5.22(typescript@5.9.2)) + version: 13.7.0(vue@3.5.22(typescript@5.9.3)) axios: specifier: 1.12.2 version: 1.12.2 @@ -1516,7 +1526,7 @@ importers: version: 6.0.3 dioc: specifier: 3.0.2 - version: 3.0.2(vue@3.5.22(typescript@5.9.2)) + version: 3.0.2(vue@3.5.22(typescript@5.9.3)) fp-ts: specifier: 2.16.11 version: 2.16.11 @@ -1537,7 +1547,7 @@ importers: version: 0.4.0(zod@3.25.32) vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) workbox-window: specifier: 7.3.0 version: 7.3.0 @@ -1550,7 +1560,7 @@ importers: version: 5.0.3(graphql@16.11.0) '@graphql-codegen/cli': specifier: 5.0.7 - version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2) + version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) '@graphql-codegen/typed-document-node': specifier: 5.1.2 version: 5.1.2(graphql@16.11.0) @@ -1574,34 +1584,34 @@ importers: version: 1.2.68 '@intlify/unplugin-vue-i18n': specifier: 6.0.8 - version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.2)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) '@rushstack/eslint-patch': - specifier: 1.12.0 - version: 1.12.0 + specifier: 1.14.0 + version: 1.14.0 '@typescript-eslint/eslint-plugin': specifier: 8.44.1 - version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/parser': specifier: 8.44.1 - version: 8.44.1(eslint@8.57.0)(typescript@5.9.2) + version: 8.44.1(eslint@8.57.0)(typescript@5.9.3) '@vitejs/plugin-legacy': specifier: 5.4.2 - version: 5.4.2(terser@5.39.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 5.4.2(terser@5.39.2)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) '@vitejs/plugin-vue': specifier: 5.1.4 - version: 5.1.4(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 5.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/eslint-config-typescript': specifier: 13.0.0 - version: 13.0.0(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.2) + version: 13.0.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.3) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) cross-env: - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.1.0 + version: 10.1.0 dotenv: - specifier: 17.2.2 - version: 17.2.2 + specifier: 17.2.3 + version: 17.2.3 eslint: specifier: 8.57.0 version: 8.57.0 @@ -1609,8 +1619,8 @@ importers: specifier: 5.5.4 version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@8.57.0))(eslint@8.57.0)(prettier@3.6.2) eslint-plugin-vue: - specifier: 10.5.0 - version: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) + specifier: 10.5.1 + version: 10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) npm-run-all: specifier: 4.1.5 version: 4.1.5 @@ -1622,49 +1632,49 @@ importers: version: 0.6.14(prettier@3.6.2) tailwindcss: specifier: 3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 unplugin-fonts: specifier: 1.4.0 - version: 1.4.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 1.4.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) unplugin-icons: specifier: 22.2.0 version: 22.2.0(@vue/compiler-sfc@3.5.22)(svelte@3.59.2)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 29.0.0 - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vite-plugin-fonts: specifier: 0.7.0 - version: 0.7.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 0.7.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-html-config: specifier: 2.0.2 - version: 2.0.2(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 2.0.2(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-inspect: specifier: 11.3.3 - version: 11.3.3(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 11.3.3(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-pages: specifier: 0.33.1 - version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2))) + version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3))) vite-plugin-pages-sitemap: specifier: 1.7.1 version: 1.7.1 vite-plugin-pwa: - specifier: 1.0.3 - version: 1.0.3(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + specifier: 1.1.0 + version: 1.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-static-copy: - specifier: 3.1.2 - version: 3.1.2(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + specifier: 3.1.4 + version: 3.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite-plugin-vue-layouts: specifier: 0.11.0 - version: 0.11.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 0.11.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) vue-tsc: specifier: 2.1.6 - version: 2.1.6(typescript@5.9.2) + version: 2.1.6(typescript@5.9.3) packages/hoppscotch-sh-admin: dependencies: @@ -1682,13 +1692,13 @@ importers: version: 3.2.0(graphql@16.11.0) '@hoppscotch/ui': specifier: 0.2.5 - version: 0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@hoppscotch/vue-toasted': specifier: 0.1.0 - version: 0.1.0(vue@3.5.22(typescript@5.9.2)) + version: 0.1.0(vue@3.5.22(typescript@5.9.3)) '@intlify/unplugin-vue-i18n': specifier: 6.0.8 - version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.36.0(jiti@2.6.0))(rollup@4.52.2)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.37.0(jiti@2.6.0))(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) '@types/cors': specifier: 2.8.19 version: 2.8.19 @@ -1697,10 +1707,10 @@ importers: version: 3.0.0(@urql/core@6.0.1(graphql@16.11.0)) '@urql/vue': specifier: 2.0.0 - version: 2.0.0(@urql/core@6.0.1(graphql@16.11.0))(vue@3.5.22(typescript@5.9.2)) + version: 2.0.0(@urql/core@6.0.1(graphql@16.11.0))(vue@3.5.22(typescript@5.9.3)) '@vueuse/core': specifier: 13.7.0 - version: 13.7.0(vue@3.5.22(typescript@5.9.2)) + version: 13.7.0(vue@3.5.22(typescript@5.9.3)) axios: specifier: 1.12.2 version: 1.12.2 @@ -1733,35 +1743,35 @@ importers: version: 7.8.2 tailwindcss: specifier: 3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) tippy.js: specifier: 6.3.7 version: 6.3.7 ts-node-dev: specifier: 2.0.0 - version: 2.0.0(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + version: 2.0.0(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) unplugin-icons: specifier: 22.2.0 version: 22.2.0(@vue/compiler-sfc@3.5.22)(svelte@3.59.2)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 29.0.0 - version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)) + version: 29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)) vue: specifier: 3.5.22 - version: 3.5.22(typescript@5.9.2) + version: 3.5.22(typescript@5.9.3) vue-i18n: specifier: 11.1.12 - version: 11.1.12(vue@3.5.22(typescript@5.9.2)) + version: 11.1.12(vue@3.5.22(typescript@5.9.3)) vue-router: - specifier: 4.5.1 - version: 4.5.1(vue@3.5.22(typescript@5.9.2)) + specifier: 4.6.3 + version: 4.6.3(vue@3.5.22(typescript@5.9.3)) vue-tippy: specifier: 6.7.1 - version: 6.7.1(vue@3.5.22(typescript@5.9.2)) + version: 6.7.1(vue@3.5.22(typescript@5.9.3)) devDependencies: '@graphql-codegen/cli': specifier: 5.0.7 - version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2) + version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) '@graphql-codegen/client-preset': specifier: 4.8.3 version: 4.8.3(graphql@16.11.0) @@ -1797,7 +1807,7 @@ importers: version: 4.17.12 '@vitejs/plugin-vue': specifier: 5.1.4 - version: 5.1.4(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2)) + version: 5.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/compiler-sfc': specifier: 3.5.22 version: 3.5.22 @@ -1805,8 +1815,8 @@ importers: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) dotenv: - specifier: 17.2.2 - version: 17.2.2 + specifier: 17.2.3 + version: 17.2.3 graphql-tag: specifier: 2.12.6 version: 2.12.6(graphql@16.11.0) @@ -1821,25 +1831,25 @@ importers: version: 1.93.2 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + version: 10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 unplugin-fonts: specifier: 1.4.0 - version: 1.4.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + version: 1.4.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) vite: specifier: 6.3.5 - version: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + version: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vite-plugin-pages: specifier: 0.33.1 - version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2))) + version: 0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3))) vite-plugin-vue-layouts: specifier: 0.11.0 - version: 0.11.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) + version: 0.11.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) vue-tsc: specifier: 2.1.6 - version: 2.1.6(typescript@5.9.2) + version: 2.1.6(typescript@5.9.3) packages: @@ -1855,8 +1865,8 @@ packages: resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/e05861959938b57479a1a81fa796735ebbd08c7c} version: 0.1.0 - '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/5d59b97fe331ca62e8be0454ff3f4e5f6185ae70': - resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/5d59b97fe331ca62e8be0454ff3f4e5f6185ae70} + '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/7cf09c1ad31e228758738c2f4e1c8fe9cc141291': + resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/7cf09c1ad31e228758738c2f4e1c8fe9cc141291} version: 0.1.0 '@alloc/quick-lru@5.2.0': @@ -1876,6 +1886,15 @@ packages: chokidar: optional: true + '@angular-devkit/core@19.2.17': + resolution: {integrity: sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + '@angular-devkit/schematics-cli@19.2.15': resolution: {integrity: sha512-1ESFmFGMpGQmalDB3t2EtmWDGv6gOFYBMxmHO2f1KI/UDl8UmZnCGL4mD3EWo8Hv0YIsZ9wOH9Q7ZHNYjeSpzg==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} @@ -1885,6 +1904,10 @@ packages: resolution: {integrity: sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@19.2.17': + resolution: {integrity: sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@antfu/install-pkg@0.1.1': resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} @@ -1930,8 +1953,8 @@ packages: peerDependencies: openapi-types: '>=7' - '@apidevtools/swagger-parser@12.0.0': - resolution: {integrity: sha512-WLJIWcfOXrSKlZEM+yhA2Xzatgl488qr1FoOxixYmtWapBzwSC0gVGq4WObr4hHClMIiFFdOBdixNkvWqkWIWA==} + '@apidevtools/swagger-parser@12.1.0': + resolution: {integrity: sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==} peerDependencies: openapi-types: '>=7' @@ -2046,6 +2069,13 @@ packages: resolution: {integrity: sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==} engines: {node: '>=14'} + '@as-integrations/express5@1.1.2': + resolution: {integrity: sha512-BxfwtcWNf2CELDkuPQxi5Zl3WqY/dQVJYafeCBOGoFQjv5M0fjhxmAFZ9vKx/5YKKNeok4UY6PkFbHzmQrdxIA==} + engines: {node: '>=20'} + peerDependencies: + '@apollo/server': ^4.0.0 || ^5.0.0 + express: ^5.0.0 + '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -2202,10 +2232,6 @@ packages: resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} - engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} engines: {node: '>=6.9.0'} @@ -2412,10 +2438,6 @@ packages: resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.3': - resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} @@ -3325,10 +3347,6 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} @@ -3393,73 +3411,73 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@commitlint/cli@19.8.1': - resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} + '@commitlint/cli@20.1.0': + resolution: {integrity: sha512-pW5ujjrOovhq5RcYv5xCpb4GkZxkO2+GtOdBW2/qrr0Ll9tl3PX0aBBobGQl3mdZUbOBgwAexEQLeH6uxL0VYg==} engines: {node: '>=v18'} hasBin: true - '@commitlint/config-conventional@19.8.1': - resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} + '@commitlint/config-conventional@20.0.0': + resolution: {integrity: sha512-q7JroPIkDBtyOkVe9Bca0p7kAUYxZMxkrBArCfuD3yN4KjRAenP9PmYwnn7rsw8Q+hHq1QB2BRmBh0/Z19ZoJw==} engines: {node: '>=v18'} - '@commitlint/config-validator@19.8.1': - resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} + '@commitlint/config-validator@20.0.0': + resolution: {integrity: sha512-BeyLMaRIJDdroJuYM2EGhDMGwVBMZna9UiIqV9hxj+J551Ctc6yoGuGSmghOy/qPhBSuhA6oMtbEiTmxECafsg==} engines: {node: '>=v18'} - '@commitlint/ensure@19.8.1': - resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} + '@commitlint/ensure@20.0.0': + resolution: {integrity: sha512-WBV47Fffvabe68n+13HJNFBqiMH5U1Ryls4W3ieGwPC0C7kJqp3OVQQzG2GXqOALmzrgAB+7GXmyy8N9ct8/Fg==} engines: {node: '>=v18'} - '@commitlint/execute-rule@19.8.1': - resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} + '@commitlint/execute-rule@20.0.0': + resolution: {integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==} engines: {node: '>=v18'} - '@commitlint/format@19.8.1': - resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} + '@commitlint/format@20.0.0': + resolution: {integrity: sha512-zrZQXUcSDmQ4eGGrd+gFESiX0Rw+WFJk7nW4VFOmxub4mAATNKBQ4vNw5FgMCVehLUKG2OT2LjOqD0Hk8HvcRg==} engines: {node: '>=v18'} - '@commitlint/is-ignored@19.8.1': - resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} + '@commitlint/is-ignored@20.0.0': + resolution: {integrity: sha512-ayPLicsqqGAphYIQwh9LdAYOVAQ9Oe5QCgTNTj+BfxZb9b/JW222V5taPoIBzYnAP0z9EfUtljgBk+0BN4T4Cw==} engines: {node: '>=v18'} - '@commitlint/lint@19.8.1': - resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} + '@commitlint/lint@20.0.0': + resolution: {integrity: sha512-kWrX8SfWk4+4nCexfLaQT3f3EcNjJwJBsSZ5rMBw6JCd6OzXufFHgel2Curos4LKIxwec9WSvs2YUD87rXlxNQ==} engines: {node: '>=v18'} - '@commitlint/load@19.8.1': - resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} + '@commitlint/load@20.1.0': + resolution: {integrity: sha512-qo9ER0XiAimATQR5QhvvzePfeDfApi/AFlC1G+YN+ZAY8/Ua6IRrDrxRvQAr+YXUKAxUsTDSp9KXeXLBPsNRWg==} engines: {node: '>=v18'} - '@commitlint/message@19.8.1': - resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} + '@commitlint/message@20.0.0': + resolution: {integrity: sha512-gLX4YmKnZqSwkmSB9OckQUrI5VyXEYiv3J5JKZRxIp8jOQsWjZgHSG/OgEfMQBK9ibdclEdAyIPYggwXoFGXjQ==} engines: {node: '>=v18'} - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} + '@commitlint/parse@20.0.0': + resolution: {integrity: sha512-j/PHCDX2bGM5xGcWObOvpOc54cXjn9g6xScXzAeOLwTsScaL4Y+qd0pFC6HBwTtrH92NvJQc+2Lx9HFkVi48cg==} engines: {node: '>=v18'} - '@commitlint/read@19.8.1': - resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} + '@commitlint/read@20.0.0': + resolution: {integrity: sha512-Ti7Y7aEgxsM1nkwA4ZIJczkTFRX/+USMjNrL9NXwWQHqNqrBX2iMi+zfuzZXqfZ327WXBjdkRaytJ+z5vNqTOA==} engines: {node: '>=v18'} - '@commitlint/resolve-extends@19.8.1': - resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} + '@commitlint/resolve-extends@20.1.0': + resolution: {integrity: sha512-cxKXQrqHjZT3o+XPdqDCwOWVFQiae++uwd9dUBC7f2MdV58ons3uUvASdW7m55eat5sRiQ6xUHyMWMRm6atZWw==} engines: {node: '>=v18'} - '@commitlint/rules@19.8.1': - resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} + '@commitlint/rules@20.0.0': + resolution: {integrity: sha512-gvg2k10I/RfvHn5I5sxvVZKM1fl72Sqrv2YY/BnM7lMHcYqO0E2jnRWoYguvBfEcZ39t+rbATlciggVe77E4zA==} engines: {node: '>=v18'} - '@commitlint/to-lines@19.8.1': - resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} + '@commitlint/to-lines@20.0.0': + resolution: {integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==} engines: {node: '>=v18'} - '@commitlint/top-level@19.8.1': - resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} + '@commitlint/top-level@20.0.0': + resolution: {integrity: sha512-drXaPSP2EcopukrUXvUXmsQMu3Ey/FuJDc/5oiW4heoCfoE5BdLQyuc7veGeE3aoQaTVqZnh4D5WTWe2vefYKg==} engines: {node: '>=v18'} - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} + '@commitlint/types@20.0.0': + resolution: {integrity: sha512-bVUNBqG6aznYcYjTjnc3+Cat/iBgbgpflxbIBTnsHTX0YVpnmINPEkSRWymT2Q8aSH3Y7aKnEbunilkYe8TybA==} engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': @@ -3606,6 +3624,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.8': resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} @@ -3636,6 +3660,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.8': resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} engines: {node: '>=18'} @@ -3672,6 +3702,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.8': resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} engines: {node: '>=18'} @@ -3702,6 +3738,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.8': resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} engines: {node: '>=18'} @@ -3732,6 +3774,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.8': resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} engines: {node: '>=18'} @@ -3762,6 +3810,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.8': resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} engines: {node: '>=18'} @@ -3792,6 +3846,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.8': resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} engines: {node: '>=18'} @@ -3822,6 +3882,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.8': resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} engines: {node: '>=18'} @@ -3852,6 +3918,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.8': resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} engines: {node: '>=18'} @@ -3882,6 +3954,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.8': resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} engines: {node: '>=18'} @@ -3912,6 +3990,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.8': resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} engines: {node: '>=18'} @@ -3948,6 +4032,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.8': resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} engines: {node: '>=18'} @@ -3978,6 +4068,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.8': resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} engines: {node: '>=18'} @@ -4008,6 +4104,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.8': resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} engines: {node: '>=18'} @@ -4038,6 +4140,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.8': resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} engines: {node: '>=18'} @@ -4068,6 +4176,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.8': resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} engines: {node: '>=18'} @@ -4098,6 +4212,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.8': resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} engines: {node: '>=18'} @@ -4116,6 +4236,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-arm64@0.25.8': resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} engines: {node: '>=18'} @@ -4146,6 +4272,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.8': resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} engines: {node: '>=18'} @@ -4164,6 +4296,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.25.8': resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} engines: {node: '>=18'} @@ -4194,6 +4332,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.8': resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} engines: {node: '>=18'} @@ -4212,6 +4356,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/openharmony-arm64@0.25.8': resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} engines: {node: '>=18'} @@ -4242,6 +4392,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.8': resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} engines: {node: '>=18'} @@ -4272,6 +4428,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.8': resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} engines: {node: '>=18'} @@ -4302,6 +4464,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.8': resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} engines: {node: '>=18'} @@ -4332,6 +4500,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.8': resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} engines: {node: '>=18'} @@ -4374,12 +4548,12 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': @@ -4398,16 +4572,16 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.36.0': - resolution: {integrity: sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/schemasafe@1.3.0': @@ -5013,10 +5187,10 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@guolao/vue-monaco-editor@1.5.5': - resolution: {integrity: sha512-NFGImQ8dBYj6ehIxy1DngPRkctB9b6GbxvCm6aXZztNsgm/TtM4u+YM9ZwZHQPlXt7a4IODXoKCcTYEVycBSyA==} + '@guolao/vue-monaco-editor@1.6.0': + resolution: {integrity: sha512-w2IiJ6eJGGeuIgCK6EKZOAfhHTTUB5aZwslzwGbZ5e89Hb4avx6++GkLTW8p84Sng/arFMjLPPxSBI56cFudyQ==} peerDependencies: - '@vue/composition-api': ^1.7.1 + '@vue/composition-api': ^1.7.2 monaco-editor: '>=0.43.0' vue: 3.5.22 peerDependenciesMeta: @@ -5484,12 +5658,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.1.2': - resolution: {integrity: sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==} + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@30.1.3': - resolution: {integrity: sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==} + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -5501,8 +5675,8 @@ packages: resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment@30.1.2': - resolution: {integrity: sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==} + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/expect-utils@29.7.0': @@ -5513,16 +5687,16 @@ packages: resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.1.2': - resolution: {integrity: sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==} + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@30.1.2': - resolution: {integrity: sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==} + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@30.1.2': - resolution: {integrity: sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==} + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/get-type@30.0.1': @@ -5533,16 +5707,16 @@ packages: resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@30.1.2': - resolution: {integrity: sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==} + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/pattern@30.0.1': resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@30.1.3': - resolution: {integrity: sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==} + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -5558,24 +5732,24 @@ packages: resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/snapshot-utils@30.1.2': - resolution: {integrity: sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==} + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/source-map@30.0.1': resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@30.1.3': - resolution: {integrity: sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==} + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@30.1.3': - resolution: {integrity: sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==} + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@30.1.2': - resolution: {integrity: sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==} + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@29.6.3': @@ -5586,6 +5760,10 @@ packages: resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jitl/quickjs-ffi-types@0.31.0': resolution: {integrity: sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw==} @@ -5696,8 +5874,8 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@monaco-editor/loader@1.5.0': - resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} + '@monaco-editor/loader@1.6.1': + resolution: {integrity: sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==} '@napi-rs/canvas-android-arm64@0.1.77': resolution: {integrity: sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==} @@ -5771,15 +5949,16 @@ packages: peerDependencies: '@nestjs/common': '>=7.0.9' '@nestjs/core': '>=7.0.9' - nodemailer: '>=6.4.6' + nodemailer: 7.0.7 - '@nestjs/apollo@13.1.0': - resolution: {integrity: sha512-/FRg195AxpZ58Kjd7geeksaRs3blmlGMDUak7WGbrl7ZWX7J9VuulhTjVHP6Z+dhH4Tn+AsyjkkJ2euC8psv3A==} + '@nestjs/apollo@13.2.1': + resolution: {integrity: sha512-BJPNw8xqs4DfdEEmjaAbI6cIJsHouWjcZN70BKTPl8rZcw4Tf61RonqFRn0F/rr/aiccWGAuXJuWY4dPsgah4Q==} peerDependencies: '@apollo/gateway': ^2.0.0 - '@apollo/server': ^4.11.3 + '@apollo/server': ^5.0.0 '@apollo/subgraph': ^2.0.0 - '@as-integrations/fastify': ^2.1.1 + '@as-integrations/express5': '*' + '@as-integrations/fastify': ^2.1.1 || ^3.0.0 '@nestjs/common': ^11.0.1 '@nestjs/core': ^11.0.1 '@nestjs/graphql': ^13.0.0 @@ -5789,6 +5968,8 @@ packages: optional: true '@apollo/subgraph': optional: true + '@as-integrations/express5': + optional: true '@as-integrations/fastify': optional: true @@ -5842,15 +6023,15 @@ packages: '@nestjs/websockets': optional: true - '@nestjs/graphql@13.1.0': - resolution: {integrity: sha512-frjUJOPJNEZVqiFynhDs/+rEor3ySAj4pITTa/szAWRfdPhAxIJzOtZnn+eCLubr4lymlK/q71azFwTFyeVShg==} + '@nestjs/graphql@13.2.0': + resolution: {integrity: sha512-ehgd4pp9e6PQJWjkjV/jGF4934LLzH7C/efe9a9yKJeTZi+x7AL6p+00Q5fhgG75E2CgUZOrmKa90LhcCwqMfA==} peerDependencies: '@apollo/subgraph': ^2.9.3 '@nestjs/common': ^11.0.1 '@nestjs/core': ^11.0.1 class-transformer: '*' class-validator: '*' - graphql: ^16.10.0 + graphql: ^16.11.0 reflect-metadata: ^0.1.13 || ^0.2.0 ts-morph: ^20.0.0 || ^21.0.0 || ^24.0.0 || ^25.0.0 peerDependenciesMeta: @@ -5863,8 +6044,8 @@ packages: ts-morph: optional: true - '@nestjs/jwt@11.0.0': - resolution: {integrity: sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==} + '@nestjs/jwt@11.0.1': + resolution: {integrity: sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 @@ -5899,13 +6080,13 @@ packages: '@nestjs/common': ^10.0.0 || ^11.0.0 '@nestjs/core': ^10.0.0 || ^11.0.0 - '@nestjs/schematics@11.0.7': - resolution: {integrity: sha512-t8dNYYMwEeEsrlwc2jbkfwCfXczq4AeNEgx1KVQuJ6wYibXk0ZbXbPdfp8scnEAaQv1grpncNV5gWgzi7ZwbvQ==} + '@nestjs/schematics@11.0.9': + resolution: {integrity: sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==} peerDependencies: typescript: '>=4.8.2' - '@nestjs/swagger@11.2.0': - resolution: {integrity: sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==} + '@nestjs/swagger@11.2.1': + resolution: {integrity: sha512-1MS7xf0pzc1mofG53xrrtrurnziafPUHkqzRm4YUVPA/egeiMaSerQBD/feiAeQ2BnX0WiLsTX4HQFO0icvOjQ==} peerDependencies: '@fastify/static': ^8.0.0 '@nestjs/common': ^11.0.1 @@ -6158,11 +6339,11 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@posthog/core@1.1.0': - resolution: {integrity: sha512-igElrcnRPJh2nWYACschjH4OwGwzSa6xVFzRDVzpnjirUivdJ8nv4hE+H31nvwE56MFhvvglfHuotnWLMcRW7w==} + '@posthog/core@1.3.0': + resolution: {integrity: sha512-hxLL8kZNHH098geedcxCz8y6xojkNYbmJEW+1vFXsmPcExyCXIUUJ/34X6xa9GcprKxd0Wsx3vfJQLQX4iVPhw==} - '@prisma/client@6.16.2': - resolution: {integrity: sha512-E00PxBcalMfYO/TWnXobBVUai6eW/g5OsifWQsQDzJYm7yaY+IRLo7ZLsaefi0QkTpxfuhFcQ/w180i6kX3iJw==} + '@prisma/client@6.17.1': + resolution: {integrity: sha512-zL58jbLzYamjnNnmNA51IOZdbk5ci03KviXCuB0Tydc9btH2kDWsi1pQm2VecviRTM7jGia0OPPkgpGnT3nKvw==} engines: {node: '>=18.18'} peerDependencies: prisma: '*' @@ -6173,23 +6354,23 @@ packages: typescript: optional: true - '@prisma/config@6.16.2': - resolution: {integrity: sha512-mKXSUrcqXj0LXWPmJsK2s3p9PN+aoAbyMx7m5E1v1FufofR1ZpPoIArjjzOIm+bJRLLvYftoNYLx1tbHgF9/yg==} + '@prisma/config@6.17.1': + resolution: {integrity: sha512-fs8wY6DsvOCzuiyWVckrVs1LOcbY4LZNz8ki4uUIQ28jCCzojTGqdLhN2Jl5lDnC1yI8/gNIKpsWDM8pLhOdwA==} - '@prisma/debug@6.16.2': - resolution: {integrity: sha512-bo4/gA/HVV6u8YK2uY6glhNsJ7r+k/i5iQ9ny/3q5bt9ijCj7WMPUwfTKPvtEgLP+/r26Z686ly11hhcLiQ8zA==} + '@prisma/debug@6.17.1': + resolution: {integrity: sha512-Vf7Tt5Wh9XcndpbmeotuqOMLWPTjEKCsgojxXP2oxE1/xYe7PtnP76hsouG9vis6fctX+TxgmwxTuYi/+xc7dQ==} - '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': - resolution: {integrity: sha512-ThvlDaKIVrnrv97ujNFDYiQbeMQpLa0O86HFA2mNoip4mtFqM7U5GSz2ie1i2xByZtvPztJlNRgPsXGeM/kqAA==} + '@prisma/engines-version@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': + resolution: {integrity: sha512-17140E3huOuD9lMdJ9+SF/juOf3WR3sTJMVyyenzqUPbuH+89nPhSWcrY+Mf7tmSs6HvaO+7S+HkELinn6bhdg==} - '@prisma/engines@6.16.2': - resolution: {integrity: sha512-7yf3AjfPUgsg/l7JSu1iEhsmZZ/YE00yURPjTikqm2z4btM0bCl2coFtTGfeSOWbQMmq45Jab+53yGUIAT1sjA==} + '@prisma/engines@6.17.1': + resolution: {integrity: sha512-D95Ik3GYZkqZ8lSR4EyFOJ/tR33FcYRP8kK61o+WMsyD10UfJwd7+YielflHfKwiGodcqKqoraWw8ElAgMDbPw==} - '@prisma/fetch-engine@6.16.2': - resolution: {integrity: sha512-wPnZ8DMRqpgzye758ZvfAMiNJRuYpz+rhgEBZi60ZqDIgOU2694oJxiuu3GKFeYeR/hXxso4/2oBC243t/whxQ==} + '@prisma/fetch-engine@6.17.1': + resolution: {integrity: sha512-AYZiHOs184qkDMiTeshyJCtyL4yERkjfTkJiSJdYuSfc24m94lTNL5+GFinZ6vVz+ktX4NJzHKn1zIFzGTWrWg==} - '@prisma/get-platform@6.16.2': - resolution: {integrity: sha512-U/P36Uke5wS7r1+omtAgJpEB94tlT4SdlgaeTc6HVTTT93pXj7zZ+B/cZnmnvjcNPfWddgoDx8RLjmQwqGDYyA==} + '@prisma/get-platform@6.17.1': + resolution: {integrity: sha512-AKEn6fsfz0r482S5KRDFlIGEaq9wLNcgalD1adL+fPcFFblIKs1sD81kY/utrHdqKuVC6E1XSRpegDK3ZLL4Qg==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -6347,116 +6528,223 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.52.2': resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.52.2': resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.52.2': resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.52.2': resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.2': resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.2': resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.2': resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.2': resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.2': resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.2': resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.2': resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.2': resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.2': resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.2': resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.2': resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-openharmony-arm64@4.52.2': resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.52.2': resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.2': resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.2': resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.2': resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==} cpu: [x64] os: [win32] - '@rushstack/eslint-patch@1.12.0': - resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] - '@rushstack/eslint-patch@1.3.3': - resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} + '@rushstack/eslint-patch@1.14.0': + resolution: {integrity: sha512-WJFej426qe4RWOm9MMtP4V3CV4AucXolQty+GRgAWLgQXmpCuwzs7hEpxxhSc/znXUSxum9d/P/32MW0FlAAlA==} '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} @@ -7037,12 +7325,12 @@ packages: '@types/json-schema@7.0.9': resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@types/jsonwebtoken@9.0.6': resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} - '@types/jsonwebtoken@9.0.7': - resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} - '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -7088,17 +7376,11 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.18.8': - resolution: {integrity: sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==} - - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@24.9.1': + resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} - '@types/node@24.5.2': - resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} - - '@types/nodemailer@7.0.1': - resolution: {integrity: sha512-UfHAghPmGZVzaL8x9y+mKZMWyHC399+iq0MOmya5tIyenWX3lcdSb60vOmp0DocR6gCDTYTozv/ULQnREyyjkg==} + '@types/nodemailer@7.0.2': + resolution: {integrity: sha512-Zo6uOA9157WRgBk/ZhMpTQ/iCWLMk7OIs/Q9jvHarMvrzUUP/MDdPHL2U1zpf57HrrWGv4nYQn5uIxna0xY3xw==} '@types/nprogress@0.2.3': resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} @@ -7253,6 +7535,22 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.46.1': + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@5.62.0': resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7280,6 +7578,20 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.46.1': + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} + 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/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + 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.39.1': resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7292,6 +7604,18 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7312,6 +7636,14 @@ packages: resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.39.1': resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7324,13 +7656,25 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: typescript: optional: true @@ -7351,6 +7695,20 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.1': + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} + 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/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + 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@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7367,14 +7725,18 @@ packages: resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.40.0': - resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.44.1': resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7411,6 +7773,18 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7430,6 +7804,20 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} + 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/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + 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@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7450,11 +7838,19 @@ packages: resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unhead/vue@2.0.17': - resolution: {integrity: sha512-jzmGZYeMAhETV6qfetmLbZzUjjx1TjdNvFSobeFZb73D7dwD9wl/nOAx36qq+TvjZsLJdF5PQWToz2oDGAUqCg==} + '@unhead/vue@2.0.19': + resolution: {integrity: sha512-7BYjHfOaoZ9+ARJkT10Q2TjnTUqDXmMpfakIAsD/hXiuff1oqWg1xeXT5+MomhNcC15HbiABpbbBmITLSHxdKg==} peerDependencies: vue: 3.5.22 @@ -8186,18 +8582,18 @@ packages: axios@1.8.2: resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} - babel-jest@30.1.2: - resolution: {integrity: sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==} + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 + '@babel/core': ^7.11.0 || ^8.0.0-0 - babel-plugin-istanbul@7.0.0: - resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} engines: {node: '>=12'} - babel-plugin-jest-hoist@30.0.1: - resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-plugin-polyfill-corejs2@0.4.11: @@ -8233,21 +8629,21 @@ packages: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-fbjs@3.4.0: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 - babel-preset-jest@30.0.1: - resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.11.0 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} @@ -8270,8 +8666,8 @@ packages: resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} engines: {node: '>=6.0.0'} - baseline-browser-mapping@2.8.7: - resolution: {integrity: sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==} + baseline-browser-mapping@2.8.19: + resolution: {integrity: sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==} hasBin: true basic-auth@2.0.1: @@ -8359,8 +8755,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.26.2: - resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -8470,8 +8866,8 @@ packages: caniuse-lite@1.0.30001736: resolution: {integrity: sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==} - caniuse-lite@1.0.30001745: - resolution: {integrity: sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==} + caniuse-lite@1.0.30001751: + resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -8480,6 +8876,10 @@ packages: resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} engines: {node: '>=18'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -8695,8 +9095,8 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - comment-json@4.2.5: - resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + comment-json@4.4.1: + resolution: {integrity: sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==} engines: {node: '>= 6'} common-tags@1.8.2: @@ -8801,15 +9201,15 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} core-js-compat@3.38.1: resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} - core-js-compat@3.45.1: - resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} core-js@3.38.1: resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} @@ -8865,16 +9265,11 @@ packages: resolution: {integrity: sha512-B/CJj5yL3sjtlun6RtYHvoSB26EmQ2NUmhq9ZiJSyKIM4K/fqfh9aelDFlIayD2YMeFZqWLi9hHV+c+pq2Djkw==} engines: {node: '>=18.x'} - cross-env@10.0.0: - resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} hasBin: true - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -9275,8 +9670,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.2: - resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dset@3.1.4: @@ -9316,8 +9711,8 @@ packages: electron-to-chromium@1.5.207: resolution: {integrity: sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==} - electron-to-chromium@1.5.224: - resolution: {integrity: sha512-kWAoUu/bwzvnhpdZSIc6KUyvkI1rbRXMT0Eq8pKReyOyaPZcctMli+EgvcN1PAvwVc7Tdo4Fxi2PsLNDU05mdg==} + electron-to-chromium@1.5.238: + resolution: {integrity: sha512-khBdc+w/Gv+cS8e/Pbnaw/FXcBUeKrRVik9IxfXtgREOWyJhR4tj43n3amkVogJ/yeQUqzkrZcFhtIxIdqmmcQ==} electron-to-chromium@1.5.35: resolution: {integrity: sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==} @@ -9326,8 +9721,8 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -9614,6 +10009,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.25.8: resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} engines: {node: '>=18'} @@ -9687,8 +10087,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-vue@10.5.0: - resolution: {integrity: sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==} + eslint-plugin-vue@10.5.1: + resolution: {integrity: sha512-SbR9ZBUFKgvWAbq3RrdCtWaW0IKm6wwUiApxf3BVTNfqUIo4IQQmreMg2iHFJJ6C/0wss3LXURBJ1OwS/MhFcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -9733,8 +10133,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.36.0: - resolution: {integrity: sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -9861,8 +10261,8 @@ packages: resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - expect@30.1.2: - resolution: {integrity: sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express-session@1.18.2: @@ -9931,8 +10331,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -10127,10 +10527,6 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} - fs-extra@11.3.1: - resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} - engines: {node: '>=14.14'} - fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -10160,6 +10556,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -10394,22 +10794,6 @@ packages: peerDependencies: graphql: '>=0.11 <=16' - graphql-ws@6.0.4: - resolution: {integrity: sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==} - engines: {node: '>=20'} - peerDependencies: - '@fastify/websocket': ^10 || ^11 - graphql: ^15.10.1 || ^16 - uWebSockets.js: ^20 - ws: 8.17.1 - peerDependenciesMeta: - '@fastify/websocket': - optional: true - uWebSockets.js: - optional: true - ws: - optional: true - graphql-ws@6.0.6: resolution: {integrity: sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==} engines: {node: '>=20'} @@ -10462,10 +10846,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -10820,8 +11200,8 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -10984,9 +11364,9 @@ packages: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -11068,16 +11448,16 @@ packages: engines: {node: '>=10'} hasBin: true - jest-changed-files@30.0.5: - resolution: {integrity: sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==} + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@30.1.3: - resolution: {integrity: sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==} + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@30.1.3: - resolution: {integrity: sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==} + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -11086,8 +11466,8 @@ packages: node-notifier: optional: true - jest-config@30.1.3: - resolution: {integrity: sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==} + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' @@ -11109,32 +11489,32 @@ packages: resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-diff@30.1.2: - resolution: {integrity: sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==} + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-docblock@30.0.1: - resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@30.1.0: - resolution: {integrity: sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==} + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-environment-node@30.1.2: - resolution: {integrity: sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==} + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.1.0: - resolution: {integrity: sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==} + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-leak-detector@30.1.0: - resolution: {integrity: sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==} + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@29.7.0: @@ -11145,8 +11525,8 @@ packages: resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.1.2: - resolution: {integrity: sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==} + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@29.7.0: @@ -11157,8 +11537,8 @@ packages: resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.1.0: - resolution: {integrity: sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==} + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock-extended@4.0.0: @@ -11172,6 +11552,10 @@ packages: resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-pnp-resolver@1.2.3: resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -11185,24 +11569,24 @@ packages: resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@30.1.3: - resolution: {integrity: sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==} + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@30.1.3: - resolution: {integrity: sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==} + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@30.1.3: - resolution: {integrity: sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==} + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@30.1.3: - resolution: {integrity: sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==} + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@30.1.2: - resolution: {integrity: sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==} + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@29.7.0: @@ -11213,24 +11597,28 @@ packages: resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@30.1.0: - resolution: {integrity: sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==} + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@30.1.3: - resolution: {integrity: sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==} + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@30.1.0: - resolution: {integrity: sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==} + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@30.1.3: - resolution: {integrity: sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==} + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -11455,8 +11843,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.1: - resolution: {integrity: sha512-KMeYmH9wKvHsXdUp+z6w7HN3fHKHXwT1pSTQTYxB9kI6ekK1rlL3kLZEoXZCppRPXFK9PFW/wfQctV7XUqMrPQ==} + lint-staged@16.2.5: + resolution: {integrity: sha512-o36wH3OX0jRWqDw5dOa8a8x6GXTKaLM+LvhRaucZxez0IxA+KNDUCiyjBfNgsMNmchwSX6urLSL7wShcUqAang==} engines: {node: '>=20.17'} hasBin: true @@ -11478,8 +11866,8 @@ packages: enquirer: optional: true - listr2@9.0.4: - resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} engines: {node: '>=20.0.0'} load-esm@1.0.2: @@ -11619,8 +12007,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lossless-json@4.2.0: - resolution: {integrity: sha512-bsHH3x+7acZfqokfn9Ks/ej96yF/z6oGGw1aBmXesq4r3fAjhdG4uYuqzDgZMk5g1CZUd5w3kwwIp9K1LOYUiA==} + lossless-json@4.3.0: + resolution: {integrity: sha512-ToxOC+SsduRmdSuoLZLYAr5zy1Qu7l5XhmPWM3zefCZ5IcrzW/h108qbJUKfOlDlhvhjUK84+8PSVX0kxnit0g==} loupe@3.2.0: resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} @@ -11964,8 +12352,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - mocha@11.7.2: - resolution: {integrity: sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ==} + mocha@11.7.4: + resolution: {integrity: sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -12010,8 +12398,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nano-spawn@1.0.3: - resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} nanoid@3.3.11: @@ -12125,19 +12513,15 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-releases@2.0.21: - resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} - - nodemailer@6.9.13: - resolution: {integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==} - engines: {node: '>=6.0.0'} + node-releases@2.0.26: + resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} - nodemailer@6.9.15: - resolution: {integrity: sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==} + nodemailer@7.0.7: + resolution: {integrity: sha512-jGOaRznodf62TVzdyhKt/f1Q/c3kYynk8629sgJHpRzGZj01ezbgMMWJSAjHADcwTKxco3B68/R+KHJY2T5BaA==} engines: {node: '>=6.0.0'} - nodemailer@7.0.6: - resolution: {integrity: sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==} + nodemailer@7.0.9: + resolution: {integrity: sha512-9/Qm0qXIByEP8lEV2qOqcAW7bRpL8CR9jcTwk3NBnHJNmP9fIJ86g2fgmIXqHY+nj55ZEMwWqYAT2QTDpRUYiQ==} engines: {node: '>=6.0.0'} normalize-package-data@2.5.0: @@ -12512,6 +12896,9 @@ packages: resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -12860,8 +13247,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-node@5.8.8: - resolution: {integrity: sha512-M0m7k+mO3EBXGoOB4zswOvQsxpoO8xs4EyUXeKmMG7uVTUCZXdMbCxpAvpbr1h+g3R6A5TDbyRInTf437xGdtw==} + posthog-node@5.10.0: + resolution: {integrity: sha512-uNN+YUuOdbDSbDMGk/Wq57o2YBEH0Unu1kEq2PuYmqFmnu+oYsKyJBrb58VNwEuYsaXVJmk4FtbD+Tl8BT69+w==} engines: {node: '>=20'} posthtml-parser@0.11.0: @@ -12984,12 +13371,16 @@ packages: resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + preview-email@3.1.0: resolution: {integrity: sha512-ZtV1YrwscEjlrUzYrTSs6Nwo49JM3pXLM4fFOBSC3wSni+bxaWlw9/Qgk75PZO8M7cX2EybmL2iwvaV3vkAttw==} engines: {node: '>=14'} - prisma@6.16.2: - resolution: {integrity: sha512-aRvldGE5UUJTtVmFiH3WfNFNiqFlAtePUxcI0UEGlnXCX7DqhiMT5TRYwncHFeA/Reca5W6ToXXyCMTeFPdSXA==} + prisma@6.17.1: + resolution: {integrity: sha512-ac6h0sM1Tg3zu8NInY+qhP/S9KhENVaw9n1BrGKQVFu05JT5yT5Qqqmb8tMRIE3ZXvVj4xcRA5yfrsy4X7Yy5g==} engines: {node: '>=18.18'} hasBin: true peerDependencies: @@ -13260,10 +13651,6 @@ packages: remove-trailing-spaces@1.0.9: resolution: {integrity: sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==} - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -13299,6 +13686,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -13367,6 +13759,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + 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'} @@ -13473,8 +13870,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -13897,8 +14294,8 @@ packages: resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} engines: {node: '>=14.18.0'} - superjson@2.2.2: - resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + superjson@2.2.3: + resolution: {integrity: sha512-ay3d+LW/S6yppKoTz3Bq4mG0xrS5bFwfWEBmQfbC7lt5wmtk+Obq0TxVuA9eYRirBTQb1K3eEpBRHMQEo0WyVw==} engines: {node: '>=16'} supertest@7.1.4: @@ -13940,8 +14337,8 @@ packages: resolution: {integrity: sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==} engines: {node: '>=10'} - swagger-ui-dist@5.21.0: - resolution: {integrity: sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==} + swagger-ui-dist@5.29.4: + resolution: {integrity: sha512-gJFDz/gyLOCQtWwAgqs6Rk78z9ONnqTnlW11gimG9nLap8drKa3AJBKpzIQMIjl5PD2Ix+Tn+mc/tfoT2tgsng==} swagger2openapi@7.0.8: resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} @@ -14195,8 +14592,8 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.4.4: - resolution: {integrity: sha512-ccVcRABct5ZELCT5U0+DZwkXMCcOCLi2doHRrKy1nK/s7J7bch6TzJMsrY09WxgUUIP/ITfmcDS8D2yl63rnXw==} + ts-jest@29.4.5: + resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -14395,8 +14792,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true @@ -14441,17 +14838,11 @@ packages: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - - undici-types@7.12.0: - resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unhead@2.0.17: - resolution: {integrity: sha512-xX3PCtxaE80khRZobyWCVxeFF88/Tg9eJDcJWY9us727nsTC7C449B8BUfVBmiF2+3LjPcmqeoB2iuMs0U4oJQ==} + unhead@2.0.19: + resolution: {integrity: sha512-gEEjkV11Aj+rBnY6wnRfsFtF2RxKOLaPN4i+Gx3UhBxnszvV6ApSNZbGk7WKyy/lErQ6ekPN63qdFL7sa1leow==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -14877,15 +15268,8 @@ packages: vue-router: optional: true - vite-plugin-pwa@0.13.1: - resolution: {integrity: sha512-NR3dIa+o2hzlzo4lF4Gu0cYvoMjSw2DdRc6Epw1yjmCqWaGuN86WK9JqZie4arNlE1ZuWT3CLiMdiX5wcmmUmg==} - peerDependencies: - vite: ^3.1.0 - workbox-build: ^6.5.4 - workbox-window: ^6.5.4 - - vite-plugin-pwa@1.0.3: - resolution: {integrity: sha512-/OpqIpUldALGxcsEnv/ekQiQ5xHkQ53wcoN5ewX4jiIDNGs3W+eNcI1WYZeyOLmzoEjg09D7aX0O89YGjen1aw==} + vite-plugin-pwa@1.1.0: + resolution: {integrity: sha512-VsSpdubPzXhHWVINcSx6uHRMpOHVHQcHsef1QgkOlEoaIDAlssFEW88LBq1a59BuokAhsh2kUDJbaX1bZv4Bjw==} engines: {node: '>=16.0.0'} peerDependencies: '@vite-pwa/assets-generator': ^1.0.0 @@ -14902,8 +15286,8 @@ packages: peerDependencies: vite: ^3.0.0 - vite-plugin-static-copy@3.1.2: - resolution: {integrity: sha512-aVmYOzptLVOI2b1jL+cmkF7O6uhRv1u5fvOkQgbohWZp2CbR22kn9ZqkCUIt9umKF7UhdbsEpshn1rf4720QFg==} + vite-plugin-static-copy@3.1.4: + resolution: {integrity: sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -15184,8 +15568,8 @@ packages: vue-promise-modals@0.1.0: resolution: {integrity: sha512-LmPejeqvZSkxj4KkJe6ZUEJmCUQXVeEAj9ihTX+BRFfZftVCZSZd3B4uuZSKF0iCeQUemkodXUZFxcsNT/2dmg==} - vue-router@4.5.1: - resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} peerDependencies: vue: 3.5.22 @@ -15640,7 +16024,7 @@ snapshots: dependencies: '@tauri-apps/api': 2.1.1 - '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/5d59b97fe331ca62e8be0454ff3f4e5f6185ae70': + '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/7cf09c1ad31e228758738c2f4e1c8fe9cc141291': dependencies: '@tauri-apps/api': 2.1.1 @@ -15662,11 +16046,22 @@ snapshots: optionalDependencies: chokidar: 4.0.3 - '@angular-devkit/schematics-cli@19.2.15(@types/node@24.5.2)(chokidar@4.0.3)': + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 + + '@angular-devkit/schematics-cli@19.2.15(@types/node@24.9.1)(chokidar@4.0.3)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@inquirer/prompts': 7.3.2(@types/node@24.5.2) + '@inquirer/prompts': 7.3.2(@types/node@24.9.1) ansi-colors: 4.1.3 symbol-observable: 4.0.0 yargs-parser: 21.1.1 @@ -15684,6 +16079,16 @@ snapshots: transitivePeerDependencies: - chokidar + '@angular-devkit/schematics@19.2.17(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + '@antfu/install-pkg@0.1.1': dependencies: execa: 5.1.1 @@ -15743,7 +16148,7 @@ snapshots: openapi-types: 12.1.3 z-schema: 5.0.5 - '@apidevtools/swagger-parser@12.0.0(openapi-types@12.1.3)': + '@apidevtools/swagger-parser@12.1.0(openapi-types@12.1.3)': dependencies: '@apidevtools/json-schema-ref-parser': 14.0.1 '@apidevtools/openapi-schemas': 2.1.0 @@ -15919,6 +16324,11 @@ snapshots: transitivePeerDependencies: - encoding + '@as-integrations/express5@1.1.2(@apollo/server@4.12.1(graphql@16.11.0))(express@5.1.0)': + dependencies: + '@apollo/server': 4.12.1(graphql@16.11.0) + express: 5.1.0 + '@asamuzakjp/css-color@3.2.0': dependencies: '@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) @@ -16368,26 +16778,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.28.3': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) - '@babel/helpers': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.3 - '@babel/types': 7.28.2 - convert-source-map: 2.0.0 - 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/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 @@ -16426,9 +16816,9 @@ snapshots: '@babel/generator@7.28.3': dependencies: '@babel/parser': 7.28.4 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.7': @@ -16540,7 +16930,7 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -16602,21 +16992,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.3 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -16736,11 +17117,6 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.2 - '@babel/helpers@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 @@ -16865,27 +17241,15 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 - optional: true '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.7)': dependencies: @@ -16897,32 +17261,20 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.7)': dependencies: @@ -16959,11 +17311,6 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -16974,41 +17321,29 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.7)': @@ -17016,48 +17351,30 @@ snapshots: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.7)': dependencies: @@ -17069,84 +17386,54 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.7)': dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.25.7 - optional: true - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.7)': @@ -18117,7 +18404,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.4) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.4) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.4) - core-js-compat: 3.45.1 + core-js-compat: 3.46.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -18178,18 +18465,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.3': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.28.4': dependencies: '@babel/code-frame': 7.27.1 @@ -18220,9 +18495,9 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@boringer-avatars/vue3@0.2.1(vue@3.5.22(typescript@5.9.2))': + '@boringer-avatars/vue3@0.2.1(vue@3.5.22(typescript@5.9.3))': dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@codemirror/autocomplete@6.18.6': dependencies: @@ -18309,66 +18584,66 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@19.8.1(@types/node@24.5.2)(typescript@5.9.2)': + '@commitlint/cli@20.1.0(@types/node@24.9.1)(typescript@5.9.3)': dependencies: - '@commitlint/format': 19.8.1 - '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@24.5.2)(typescript@5.9.2) - '@commitlint/read': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/format': 20.0.0 + '@commitlint/lint': 20.0.0 + '@commitlint/load': 20.1.0(@types/node@24.9.1)(typescript@5.9.3) + '@commitlint/read': 20.0.0 + '@commitlint/types': 20.0.0 tinyexec: 1.0.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript - '@commitlint/config-conventional@19.8.1': + '@commitlint/config-conventional@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@19.8.1': + '@commitlint/config-validator@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 ajv: 8.17.1 - '@commitlint/ensure@19.8.1': + '@commitlint/ensure@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@19.8.1': {} + '@commitlint/execute-rule@20.0.0': {} - '@commitlint/format@19.8.1': + '@commitlint/format@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 chalk: 5.6.2 - '@commitlint/is-ignored@19.8.1': + '@commitlint/is-ignored@20.0.0': dependencies: - '@commitlint/types': 19.8.1 - semver: 7.7.2 + '@commitlint/types': 20.0.0 + semver: 7.7.3 - '@commitlint/lint@19.8.1': + '@commitlint/lint@20.0.0': dependencies: - '@commitlint/is-ignored': 19.8.1 - '@commitlint/parse': 19.8.1 - '@commitlint/rules': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/is-ignored': 20.0.0 + '@commitlint/parse': 20.0.0 + '@commitlint/rules': 20.0.0 + '@commitlint/types': 20.0.0 - '@commitlint/load@19.8.1(@types/node@24.5.2)(typescript@5.9.2)': + '@commitlint/load@20.1.0(@types/node@24.9.1)(typescript@5.9.3)': dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/execute-rule': 19.8.1 - '@commitlint/resolve-extends': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/config-validator': 20.0.0 + '@commitlint/execute-rule': 20.0.0 + '@commitlint/resolve-extends': 20.1.0 + '@commitlint/types': 20.0.0 chalk: 5.6.2 - cosmiconfig: 9.0.0(typescript@5.9.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.5.2)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@24.9.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -18376,45 +18651,45 @@ snapshots: - '@types/node' - typescript - '@commitlint/message@19.8.1': {} + '@commitlint/message@20.0.0': {} - '@commitlint/parse@19.8.1': + '@commitlint/parse@20.0.0': dependencies: - '@commitlint/types': 19.8.1 + '@commitlint/types': 20.0.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@19.8.1': + '@commitlint/read@20.0.0': dependencies: - '@commitlint/top-level': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/top-level': 20.0.0 + '@commitlint/types': 20.0.0 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 1.0.1 - '@commitlint/resolve-extends@19.8.1': + '@commitlint/resolve-extends@20.1.0': dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/config-validator': 20.0.0 + '@commitlint/types': 20.0.0 global-directory: 4.0.1 import-meta-resolve: 4.2.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@19.8.1': + '@commitlint/rules@20.0.0': dependencies: - '@commitlint/ensure': 19.8.1 - '@commitlint/message': 19.8.1 - '@commitlint/to-lines': 19.8.1 - '@commitlint/types': 19.8.1 + '@commitlint/ensure': 20.0.0 + '@commitlint/message': 20.0.0 + '@commitlint/to-lines': 20.0.0 + '@commitlint/types': 20.0.0 - '@commitlint/to-lines@19.8.1': {} + '@commitlint/to-lines@20.0.0': {} - '@commitlint/top-level@19.8.1': + '@commitlint/top-level@20.0.0': dependencies: find-up: 7.0.0 - '@commitlint/types@19.8.1': + '@commitlint/types@20.0.0': dependencies: '@types/conventional-commits-parser': 5.0.1 chalk: 5.6.2 @@ -18529,19 +18804,22 @@ snapshots: '@epic-web/invariant@1.0.0': {} - '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.25.10)': + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.25.11)': dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 - '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.25.10)': + '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.25.11)': dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 '@esbuild/aix-ppc64@0.25.10': optional: true + '@esbuild/aix-ppc64@0.25.11': + optional: true + '@esbuild/aix-ppc64@0.25.8': optional: true @@ -18557,6 +18835,9 @@ snapshots: '@esbuild/android-arm64@0.25.10': optional: true + '@esbuild/android-arm64@0.25.11': + optional: true + '@esbuild/android-arm64@0.25.8': optional: true @@ -18575,6 +18856,9 @@ snapshots: '@esbuild/android-arm@0.25.10': optional: true + '@esbuild/android-arm@0.25.11': + optional: true + '@esbuild/android-arm@0.25.8': optional: true @@ -18590,6 +18874,9 @@ snapshots: '@esbuild/android-x64@0.25.10': optional: true + '@esbuild/android-x64@0.25.11': + optional: true + '@esbuild/android-x64@0.25.8': optional: true @@ -18605,6 +18892,9 @@ snapshots: '@esbuild/darwin-arm64@0.25.10': optional: true + '@esbuild/darwin-arm64@0.25.11': + optional: true + '@esbuild/darwin-arm64@0.25.8': optional: true @@ -18620,6 +18910,9 @@ snapshots: '@esbuild/darwin-x64@0.25.10': optional: true + '@esbuild/darwin-x64@0.25.11': + optional: true + '@esbuild/darwin-x64@0.25.8': optional: true @@ -18635,6 +18928,9 @@ snapshots: '@esbuild/freebsd-arm64@0.25.10': optional: true + '@esbuild/freebsd-arm64@0.25.11': + optional: true + '@esbuild/freebsd-arm64@0.25.8': optional: true @@ -18650,6 +18946,9 @@ snapshots: '@esbuild/freebsd-x64@0.25.10': optional: true + '@esbuild/freebsd-x64@0.25.11': + optional: true + '@esbuild/freebsd-x64@0.25.8': optional: true @@ -18665,6 +18964,9 @@ snapshots: '@esbuild/linux-arm64@0.25.10': optional: true + '@esbuild/linux-arm64@0.25.11': + optional: true + '@esbuild/linux-arm64@0.25.8': optional: true @@ -18680,6 +18982,9 @@ snapshots: '@esbuild/linux-arm@0.25.10': optional: true + '@esbuild/linux-arm@0.25.11': + optional: true + '@esbuild/linux-arm@0.25.8': optional: true @@ -18695,6 +19000,9 @@ snapshots: '@esbuild/linux-ia32@0.25.10': optional: true + '@esbuild/linux-ia32@0.25.11': + optional: true + '@esbuild/linux-ia32@0.25.8': optional: true @@ -18713,6 +19021,9 @@ snapshots: '@esbuild/linux-loong64@0.25.10': optional: true + '@esbuild/linux-loong64@0.25.11': + optional: true + '@esbuild/linux-loong64@0.25.8': optional: true @@ -18728,6 +19039,9 @@ snapshots: '@esbuild/linux-mips64el@0.25.10': optional: true + '@esbuild/linux-mips64el@0.25.11': + optional: true + '@esbuild/linux-mips64el@0.25.8': optional: true @@ -18743,6 +19057,9 @@ snapshots: '@esbuild/linux-ppc64@0.25.10': optional: true + '@esbuild/linux-ppc64@0.25.11': + optional: true + '@esbuild/linux-ppc64@0.25.8': optional: true @@ -18758,6 +19075,9 @@ snapshots: '@esbuild/linux-riscv64@0.25.10': optional: true + '@esbuild/linux-riscv64@0.25.11': + optional: true + '@esbuild/linux-riscv64@0.25.8': optional: true @@ -18773,6 +19093,9 @@ snapshots: '@esbuild/linux-s390x@0.25.10': optional: true + '@esbuild/linux-s390x@0.25.11': + optional: true + '@esbuild/linux-s390x@0.25.8': optional: true @@ -18788,6 +19111,9 @@ snapshots: '@esbuild/linux-x64@0.25.10': optional: true + '@esbuild/linux-x64@0.25.11': + optional: true + '@esbuild/linux-x64@0.25.8': optional: true @@ -18797,6 +19123,9 @@ snapshots: '@esbuild/netbsd-arm64@0.25.10': optional: true + '@esbuild/netbsd-arm64@0.25.11': + optional: true + '@esbuild/netbsd-arm64@0.25.8': optional: true @@ -18812,6 +19141,9 @@ snapshots: '@esbuild/netbsd-x64@0.25.10': optional: true + '@esbuild/netbsd-x64@0.25.11': + optional: true + '@esbuild/netbsd-x64@0.25.8': optional: true @@ -18821,6 +19153,9 @@ snapshots: '@esbuild/openbsd-arm64@0.25.10': optional: true + '@esbuild/openbsd-arm64@0.25.11': + optional: true + '@esbuild/openbsd-arm64@0.25.8': optional: true @@ -18836,6 +19171,9 @@ snapshots: '@esbuild/openbsd-x64@0.25.10': optional: true + '@esbuild/openbsd-x64@0.25.11': + optional: true + '@esbuild/openbsd-x64@0.25.8': optional: true @@ -18845,6 +19183,9 @@ snapshots: '@esbuild/openharmony-arm64@0.25.10': optional: true + '@esbuild/openharmony-arm64@0.25.11': + optional: true + '@esbuild/openharmony-arm64@0.25.8': optional: true @@ -18860,6 +19201,9 @@ snapshots: '@esbuild/sunos-x64@0.25.10': optional: true + '@esbuild/sunos-x64@0.25.11': + optional: true + '@esbuild/sunos-x64@0.25.8': optional: true @@ -18875,6 +19219,9 @@ snapshots: '@esbuild/win32-arm64@0.25.10': optional: true + '@esbuild/win32-arm64@0.25.11': + optional: true + '@esbuild/win32-arm64@0.25.8': optional: true @@ -18890,6 +19237,9 @@ snapshots: '@esbuild/win32-ia32@0.25.10': optional: true + '@esbuild/win32-ia32@0.25.11': + optional: true + '@esbuild/win32-ia32@0.25.8': optional: true @@ -18905,6 +19255,9 @@ snapshots: '@esbuild/win32-x64@0.25.10': optional: true + '@esbuild/win32-x64@0.25.11': + optional: true + '@esbuild/win32-x64@0.25.8': optional: true @@ -18921,9 +19274,9 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.36.0(jiti@2.6.0))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.37.0(jiti@2.6.0))': dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/eslint-utils@4.9.0(eslint@8.47.0)': @@ -18936,9 +19289,9 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.36.0(jiti@2.6.0))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.0))': dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -18948,21 +19301,23 @@ snapshots: '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 - '@eslint/core@0.15.2': + '@eslint/core@0.16.0': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -18991,13 +19346,13 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.36.0': {} + '@eslint/js@9.37.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.0': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.16.0 levn: 0.4.1 '@exodus/schemasafe@1.3.0': {} @@ -19032,7 +19387,7 @@ snapshots: graphql: 16.11.0 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.0(@parcel/watcher@2.5.1)(@types/node@18.18.8)(graphql@16.11.0)(typescript@5.8.3)': + '@graphql-codegen/cli@5.0.0(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3)': dependencies: '@babel/generator': 7.25.7 '@babel/template': 7.25.7 @@ -19042,20 +19397,20 @@ snapshots: '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.11.0) '@graphql-tools/code-file-loader': 8.1.3(graphql@16.11.0) '@graphql-tools/git-loader': 8.0.7(graphql@16.11.0) - '@graphql-tools/github-loader': 8.0.1(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/github-loader': 8.0.1(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.11.0) '@graphql-tools/load': 8.0.2(graphql@16.11.0) - '@graphql-tools/prisma-loader': 8.0.4(@types/node@18.18.8)(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/prisma-loader': 8.0.4(@types/node@24.9.1)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.5.4(graphql@16.11.0) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.3) debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.11.0 - graphql-config: 5.1.3(@types/node@18.18.8)(graphql@16.11.0)(typescript@5.8.3) + graphql-config: 5.1.3(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) inquirer: 8.2.6 is-glob: 4.0.3 jiti: 1.21.6 @@ -19081,7 +19436,7 @@ snapshots: - typescript - utf-8-validate - '@graphql-codegen/cli@5.0.7(@parcel/watcher@2.5.1)(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2)': + '@graphql-codegen/cli@5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3)': dependencies: '@babel/generator': 7.28.0 '@babel/template': 7.27.2 @@ -19092,21 +19447,21 @@ snapshots: '@graphql-tools/apollo-engine-loader': 8.0.22(graphql@16.11.0) '@graphql-tools/code-file-loader': 8.1.22(graphql@16.11.0) '@graphql-tools/git-loader': 8.0.26(graphql@16.11.0) - '@graphql-tools/github-loader': 8.0.22(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/github-loader': 8.0.22(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/graphql-file-loader': 8.0.22(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.20(graphql@16.11.0) '@graphql-tools/load': 8.1.2(graphql@16.11.0) - '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.5.2)(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.9.1)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@whatwg-node/fetch': 0.10.10 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.11.0 - graphql-config: 5.1.5(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2) - inquirer: 8.2.7(@types/node@24.5.2) + graphql-config: 5.1.5(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3) + inquirer: 8.2.7(@types/node@24.9.1) is-glob: 4.0.3 jiti: 1.21.7 json-to-pretty-yaml: 1.2.2 @@ -19598,7 +19953,7 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/executor-http@0.1.10(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/executor-http@0.1.10(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@repeaterjs/repeater': 3.0.5 @@ -19606,26 +19961,26 @@ snapshots: dset: 3.1.4 extract-files: 11.0.0 graphql: 16.11.0 - meros: 1.3.0(@types/node@24.5.2) + meros: 1.3.0(@types/node@24.9.1) tslib: 2.8.1 value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' - '@graphql-tools/executor-http@1.1.6(@types/node@18.18.8)(graphql@16.11.0)': + '@graphql-tools/executor-http@1.1.6(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@graphql-tools/utils': 10.8.6(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/fetch': 0.9.21 extract-files: 11.0.0 graphql: 16.11.0 - meros: 1.3.0(@types/node@18.18.8) + meros: 1.3.0(@types/node@24.9.1) tslib: 2.8.1 value-or-promise: 1.0.12 transitivePeerDependencies: - '@types/node' - '@graphql-tools/executor-http@1.3.3(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/executor-http@1.3.3(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@graphql-hive/signal': 1.0.0 '@graphql-tools/executor-common': 0.0.4(graphql@16.11.0) @@ -19635,7 +19990,7 @@ snapshots: '@whatwg-node/fetch': 0.10.10 '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 - meros: 1.3.1(@types/node@24.5.2) + meros: 1.3.1(@types/node@24.9.1) tslib: 2.8.1 transitivePeerDependencies: - '@types/node' @@ -19728,10 +20083,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@8.0.1(@types/node@18.18.8)(graphql@16.11.0)': + '@graphql-tools/github-loader@8.0.1(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/executor-http': 1.1.6(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.1.6(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.11.0) '@graphql-tools/utils': 10.8.6(graphql@16.11.0) '@whatwg-node/fetch': 0.9.21 @@ -19743,9 +20098,9 @@ snapshots: - encoding - supports-color - '@graphql-tools/github-loader@8.0.22(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/github-loader@8.0.22(@types/node@24.9.1)(graphql@16.11.0)': dependencies: - '@graphql-tools/executor-http': 1.3.3(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@whatwg-node/fetch': 0.10.10 @@ -19912,9 +20267,9 @@ snapshots: graphql: 16.11.0 tslib: 2.8.1 - '@graphql-tools/prisma-loader@8.0.17(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/prisma-loader@8.0.17(@types/node@24.9.1)(graphql@16.11.0)': dependencies: - '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.10.10 @@ -19941,9 +20296,9 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/prisma-loader@8.0.4(@types/node@18.18.8)(graphql@16.11.0)': + '@graphql-tools/prisma-loader@8.0.4(@types/node@24.9.1)(graphql@16.11.0)': dependencies: - '@graphql-tools/url-loader': 8.0.2(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.8.6(graphql@16.11.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.21 @@ -20018,12 +20373,12 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/url-loader@7.17.18(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/url-loader@7.17.18(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 9.0.35(graphql@16.11.0) '@graphql-tools/executor-graphql-ws': 0.0.14(graphql@16.11.0) - '@graphql-tools/executor-http': 0.1.10(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/executor-http': 0.1.10(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/executor-legacy-ws': 0.0.11(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) '@graphql-tools/wrap': 9.4.2(graphql@16.11.0) @@ -20040,12 +20395,12 @@ snapshots: - encoding - utf-8-validate - '@graphql-tools/url-loader@8.0.2(@types/node@18.18.8)(graphql@16.11.0)': + '@graphql-tools/url-loader@8.0.2(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@ardatan/sync-fetch': 0.0.1 '@graphql-tools/delegate': 10.0.21(graphql@16.11.0) '@graphql-tools/executor-graphql-ws': 1.3.0(graphql@16.11.0) - '@graphql-tools/executor-http': 1.1.6(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.1.6(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@16.11.0) '@graphql-tools/utils': 10.8.6(graphql@16.11.0) '@graphql-tools/wrap': 10.0.5(graphql@16.11.0) @@ -20062,10 +20417,10 @@ snapshots: - encoding - utf-8-validate - '@graphql-tools/url-loader@8.0.33(@types/node@24.5.2)(graphql@16.11.0)': + '@graphql-tools/url-loader@8.0.33(@types/node@24.9.1)(graphql@16.11.0)': dependencies: '@graphql-tools/executor-graphql-ws': 2.0.7(graphql@16.11.0) - '@graphql-tools/executor-http': 1.3.3(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/executor-legacy-ws': 1.1.19(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@graphql-tools/wrap': 10.1.4(graphql@16.11.0) @@ -20153,12 +20508,12 @@ snapshots: dependencies: graphql: 16.11.0 - '@guolao/vue-monaco-editor@1.5.5(monaco-editor@0.52.2)(vue@3.5.22(typescript@5.9.2))': + '@guolao/vue-monaco-editor@1.6.0(monaco-editor@0.52.2)(vue@3.5.22(typescript@5.9.3))': dependencies: - '@monaco-editor/loader': 1.5.0 + '@monaco-editor/loader': 1.6.1 monaco-editor: 0.52.2 - vue: 3.5.22(typescript@5.9.2) - vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.2)) + vue: 3.5.22(typescript@5.9.3) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) '@hapi/b64@5.0.0': dependencies: @@ -20183,23 +20538,23 @@ snapshots: stringify-object: 3.3.0 yargs: 17.7.2 - '@hoppscotch/ui@0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/ui@0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.3)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.2)) + '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.3)) '@fontsource-variable/inter': 5.2.6 '@fontsource-variable/material-symbols-rounded': 5.2.19 '@fontsource-variable/roboto-mono': 5.2.6 '@hoppscotch/vue-sonner': 1.2.3 - '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.2)) - '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.2)) + '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.3)) fp-ts: 2.16.11 lodash-es: 4.17.21 path: 0.12.7 - vite-plugin-eslint: 1.8.1(eslint@8.57.0)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vue: 3.5.22(typescript@5.9.2) - vue-promise-modals: 0.1.0(typescript@5.9.2) - vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.2)) + vite-plugin-eslint: 1.8.1(eslint@8.57.0)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-promise-modals: 0.1.0(typescript@5.9.3) + vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - eslint @@ -20207,23 +20562,23 @@ snapshots: - typescript - vite - '@hoppscotch/ui@0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/ui@0.2.5(eslint@8.57.0)(terser@5.39.2)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.2)) + '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.3)) '@fontsource-variable/inter': 5.2.6 '@fontsource-variable/material-symbols-rounded': 5.2.19 '@fontsource-variable/roboto-mono': 5.2.6 '@hoppscotch/vue-sonner': 1.2.3 - '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.2)) - '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.2)) + '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.3)) fp-ts: 2.16.11 lodash-es: 4.17.21 path: 0.12.7 - vite-plugin-eslint: 1.8.1(eslint@8.57.0)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vue: 3.5.22(typescript@5.9.2) - vue-promise-modals: 0.1.0(typescript@5.9.2) - vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.2)) + vite-plugin-eslint: 1.8.1(eslint@8.57.0)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-promise-modals: 0.1.0(typescript@5.9.3) + vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - eslint @@ -20231,23 +20586,23 @@ snapshots: - typescript - vite - '@hoppscotch/ui@0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/ui@0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.2)) + '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.3)) '@fontsource-variable/inter': 5.2.6 '@fontsource-variable/material-symbols-rounded': 5.2.19 '@fontsource-variable/roboto-mono': 5.2.6 '@hoppscotch/vue-sonner': 1.2.3 - '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.2)) - '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.2)) + '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.3)) fp-ts: 2.16.11 lodash-es: 4.17.21 path: 0.12.7 - vite-plugin-eslint: 1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vue: 3.5.22(typescript@5.9.2) - vue-promise-modals: 0.1.0(typescript@5.9.2) - vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.2)) + vite-plugin-eslint: 1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-promise-modals: 0.1.0(typescript@5.9.3) + vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - eslint @@ -20255,23 +20610,23 @@ snapshots: - typescript - vite - '@hoppscotch/ui@0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/ui@0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.2)) + '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.3)) '@fontsource-variable/inter': 5.2.6 '@fontsource-variable/material-symbols-rounded': 5.2.19 '@fontsource-variable/roboto-mono': 5.2.6 '@hoppscotch/vue-sonner': 1.2.3 - '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.2)) - '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.2)) + '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.3)) fp-ts: 2.16.11 lodash-es: 4.17.21 path: 0.12.7 - vite-plugin-eslint: 1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vue: 3.5.22(typescript@5.9.2) - vue-promise-modals: 0.1.0(typescript@5.9.2) - vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.2)) + vite-plugin-eslint: 1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-promise-modals: 0.1.0(typescript@5.9.3) + vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - eslint @@ -20279,23 +20634,23 @@ snapshots: - typescript - vite - '@hoppscotch/ui@0.2.5(eslint@9.36.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.2)(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/ui@0.2.5(eslint@9.37.0(jiti@2.6.0))(terser@5.39.2)(typescript@5.9.3)(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.2)) + '@boringer-avatars/vue3': 0.2.1(vue@3.5.22(typescript@5.9.3)) '@fontsource-variable/inter': 5.2.6 '@fontsource-variable/material-symbols-rounded': 5.2.19 '@fontsource-variable/roboto-mono': 5.2.6 '@hoppscotch/vue-sonner': 1.2.3 - '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.2)) - '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.2)) + '@hoppscotch/vue-toasted': 0.1.0(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-legacy': 2.3.0(terser@5.39.2)(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vueuse/core': 8.9.4(vue@3.5.22(typescript@5.9.3)) fp-ts: 2.16.11 lodash-es: 4.17.21 path: 0.12.7 - vite-plugin-eslint: 1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vue: 3.5.22(typescript@5.9.2) - vue-promise-modals: 0.1.0(typescript@5.9.2) - vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.2)) + vite-plugin-eslint: 1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-promise-modals: 0.1.0(typescript@5.9.3) + vuedraggable-es: 4.1.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - eslint @@ -20305,9 +20660,9 @@ snapshots: '@hoppscotch/vue-sonner@1.2.3': {} - '@hoppscotch/vue-toasted@0.1.0(vue@3.5.22(typescript@5.9.2))': + '@hoppscotch/vue-toasted@0.1.0(vue@3.5.22(typescript@5.9.3))': dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@humanfs/core@0.19.1': {} @@ -20319,7 +20674,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -20345,7 +20700,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.5.2 '@iconify/types': 1.1.0 - debug: 4.3.7 + debug: 4.4.3(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 0.4.3 transitivePeerDependencies: @@ -20384,44 +20739,44 @@ snapshots: optionalDependencies: '@import-meta-env/cli': 0.7.3(@import-meta-env/unplugin@0.6.2) - '@inquirer/checkbox@4.1.6(@types/node@24.5.2)': + '@inquirer/checkbox@4.1.6(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/type': 3.0.6(@types/node@24.9.1) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/checkbox@4.2.1(@types/node@24.5.2)': + '@inquirer/checkbox@4.2.1(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.9.1) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/confirm@5.1.10(@types/node@24.5.2)': + '@inquirer/confirm@5.1.10(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/confirm@5.1.15(@types/node@24.5.2)': + '@inquirer/confirm@5.1.15(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/core@10.1.11(@types/node@24.5.2)': + '@inquirer/core@10.1.11(@types/node@24.9.1)': dependencies: '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/type': 3.0.6(@types/node@24.9.1) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -20429,12 +20784,12 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/core@10.1.15(@types/node@24.5.2)': + '@inquirer/core@10.1.15(@types/node@24.9.1)': dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.9.1) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -20442,208 +20797,194 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/editor@4.2.11(@types/node@24.5.2)': + '@inquirer/editor@4.2.11(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) external-editor: 3.1.0 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/editor@4.2.17(@types/node@24.5.2)': + '@inquirer/editor@4.2.17(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/external-editor': 1.0.1(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/external-editor': 1.0.1(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/expand@4.0.13(@types/node@24.5.2)': + '@inquirer/expand@4.0.13(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/expand@4.0.17(@types/node@24.5.2)': + '@inquirer/expand@4.0.17(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/external-editor@1.0.0(@types/node@24.5.2)': + '@inquirer/external-editor@1.0.0(@types/node@24.9.1)': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 chardet: 2.1.0 iconv-lite: 0.6.3 - '@inquirer/external-editor@1.0.1(@types/node@24.5.2)': + '@inquirer/external-editor@1.0.1(@types/node@24.9.1)': dependencies: chardet: 2.1.0 iconv-lite: 0.6.3 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@inquirer/figures@1.0.11': {} '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.1.10(@types/node@24.5.2)': + '@inquirer/input@4.1.10(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/input@4.2.1(@types/node@24.5.2)': + '@inquirer/input@4.2.1(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/number@3.0.13(@types/node@24.5.2)': + '@inquirer/number@3.0.13(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/number@3.0.17(@types/node@24.5.2)': + '@inquirer/number@3.0.17(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/password@4.0.13(@types/node@24.5.2)': + '@inquirer/password@4.0.13(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/password@4.0.17(@types/node@24.5.2)': + '@inquirer/password@4.0.17(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 24.5.2 - - '@inquirer/prompts@7.3.2(@types/node@24.5.2)': - dependencies: - '@inquirer/checkbox': 4.1.6(@types/node@24.5.2) - '@inquirer/confirm': 5.1.10(@types/node@24.5.2) - '@inquirer/editor': 4.2.11(@types/node@24.5.2) - '@inquirer/expand': 4.0.13(@types/node@24.5.2) - '@inquirer/input': 4.1.10(@types/node@24.5.2) - '@inquirer/number': 3.0.13(@types/node@24.5.2) - '@inquirer/password': 4.0.13(@types/node@24.5.2) - '@inquirer/rawlist': 4.1.1(@types/node@24.5.2) - '@inquirer/search': 3.0.13(@types/node@24.5.2) - '@inquirer/select': 4.2.1(@types/node@24.5.2) + '@types/node': 24.9.1 + + '@inquirer/prompts@7.3.2(@types/node@24.9.1)': + dependencies: + '@inquirer/checkbox': 4.1.6(@types/node@24.9.1) + '@inquirer/confirm': 5.1.10(@types/node@24.9.1) + '@inquirer/editor': 4.2.11(@types/node@24.9.1) + '@inquirer/expand': 4.0.13(@types/node@24.9.1) + '@inquirer/input': 4.1.10(@types/node@24.9.1) + '@inquirer/number': 3.0.13(@types/node@24.9.1) + '@inquirer/password': 4.0.13(@types/node@24.9.1) + '@inquirer/rawlist': 4.1.1(@types/node@24.9.1) + '@inquirer/search': 3.0.13(@types/node@24.9.1) + '@inquirer/select': 4.2.1(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 - - '@inquirer/prompts@7.8.0(@types/node@24.5.2)': - dependencies: - '@inquirer/checkbox': 4.2.1(@types/node@24.5.2) - '@inquirer/confirm': 5.1.15(@types/node@24.5.2) - '@inquirer/editor': 4.2.17(@types/node@24.5.2) - '@inquirer/expand': 4.0.17(@types/node@24.5.2) - '@inquirer/input': 4.2.1(@types/node@24.5.2) - '@inquirer/number': 3.0.17(@types/node@24.5.2) - '@inquirer/password': 4.0.17(@types/node@24.5.2) - '@inquirer/rawlist': 4.1.5(@types/node@24.5.2) - '@inquirer/search': 3.1.0(@types/node@24.5.2) - '@inquirer/select': 4.3.1(@types/node@24.5.2) + '@types/node': 24.9.1 + + '@inquirer/prompts@7.8.0(@types/node@24.9.1)': + dependencies: + '@inquirer/checkbox': 4.2.1(@types/node@24.9.1) + '@inquirer/confirm': 5.1.15(@types/node@24.9.1) + '@inquirer/editor': 4.2.17(@types/node@24.9.1) + '@inquirer/expand': 4.0.17(@types/node@24.9.1) + '@inquirer/input': 4.2.1(@types/node@24.9.1) + '@inquirer/number': 3.0.17(@types/node@24.9.1) + '@inquirer/password': 4.0.17(@types/node@24.9.1) + '@inquirer/rawlist': 4.1.5(@types/node@24.9.1) + '@inquirer/search': 3.1.0(@types/node@24.9.1) + '@inquirer/select': 4.3.1(@types/node@24.9.1) optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/rawlist@4.1.1(@types/node@24.5.2)': + '@inquirer/rawlist@4.1.1(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) + '@inquirer/type': 3.0.6(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/rawlist@4.1.5(@types/node@24.5.2)': + '@inquirer/rawlist@4.1.5(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) + '@inquirer/type': 3.0.8(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/search@3.0.13(@types/node@24.5.2)': + '@inquirer/search@3.0.13(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/type': 3.0.6(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/search@3.1.0(@types/node@24.5.2)': + '@inquirer/search@3.1.0(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.9.1) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/select@4.2.1(@types/node@24.5.2)': + '@inquirer/select@4.2.1(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.11(@types/node@24.5.2) + '@inquirer/core': 10.1.11(@types/node@24.9.1) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.6(@types/node@24.5.2) + '@inquirer/type': 3.0.6(@types/node@24.9.1) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/select@4.3.1(@types/node@24.5.2)': + '@inquirer/select@4.3.1(@types/node@24.9.1)': dependencies: - '@inquirer/core': 10.1.15(@types/node@24.5.2) + '@inquirer/core': 10.1.15(@types/node@24.9.1) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.5.2) + '@inquirer/type': 3.0.8(@types/node@24.9.1) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 24.5.2 - - '@inquirer/type@3.0.6(@types/node@24.5.2)': - optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@inquirer/type@3.0.8(@types/node@24.5.2)': + '@inquirer/type@3.0.6(@types/node@24.9.1)': optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)))': - dependencies: - '@intlify/message-compiler': 11.1.11 - '@intlify/shared': 11.1.11 - acorn: 8.15.0 - escodegen: 2.1.0 - estree-walker: 2.0.2 - jsonc-eslint-parser: 2.4.0 - mlly: 1.7.4 - source-map-js: 1.2.1 - yaml-eslint-parser: 1.3.0 + '@inquirer/type@3.0.8(@types/node@24.9.1)': optionalDependencies: - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.8.3)) + '@types/node': 24.9.1 - '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))': + '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))': dependencies: '@intlify/message-compiler': 11.1.11 '@intlify/shared': 11.1.11 @@ -20655,7 +20996,7 @@ snapshots: source-map-js: 1.2.1 yaml-eslint-parser: 1.3.0 optionalDependencies: - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.2)) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) '@intlify/core-base@11.1.12': dependencies: @@ -20678,15 +21019,15 @@ snapshots: '@intlify/shared@11.1.3': {} - '@intlify/unplugin-vue-i18n@6.0.4(@vue/compiler-dom@3.5.22)(eslint@8.47.0)(rollup@2.79.2)(typescript@5.8.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3))(webpack-sources@3.3.3)': + '@intlify/unplugin-vue-i18n@6.0.4(@vue/compiler-dom@3.5.22)(eslint@8.47.0)(rollup@2.79.2)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))(webpack-sources@3.3.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3))) + '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3))) '@intlify/shared': 11.1.3 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) '@rollup/pluginutils': 5.1.2(rollup@2.79.2) '@typescript-eslint/scope-manager': 8.31.0 - '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.31.0(typescript@5.9.3) debug: 4.4.0 fast-glob: 3.3.2 js-yaml: 4.1.0 @@ -20695,9 +21036,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 unplugin: 1.14.1(webpack-sources@3.3.3) - vue: 3.5.22(typescript@5.8.3) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.8.3)) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -20706,15 +21047,15 @@ snapshots: - typescript - webpack-sources - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.2)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.22)(eslint@8.57.0)(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.0) - '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2))) + '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3))) '@intlify/shared': 11.1.11 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) - '@rollup/pluginutils': 5.2.0(rollup@4.52.2) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.3) debug: 4.4.1 fast-glob: 3.3.3 js-yaml: 4.1.0 @@ -20723,9 +21064,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 unplugin: 1.16.1 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.2)) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -20733,15 +21074,15 @@ snapshots: - supports-color - typescript - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.36.0(jiti@2.6.0))(rollup@4.52.2)(typescript@5.9.2)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2))': + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.22)(eslint@9.37.0(jiti@2.6.0))(rollup@4.52.5)(typescript@5.9.3)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.36.0(jiti@2.6.0)) - '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2))) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.37.0(jiti@2.6.0)) + '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3))) '@intlify/shared': 11.1.11 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)) - '@rollup/pluginutils': 5.2.0(rollup@4.52.2) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.3) debug: 4.4.1 fast-glob: 3.3.3 js-yaml: 4.1.0 @@ -20750,9 +21091,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 unplugin: 1.16.1 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.2)) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -20760,23 +21101,23 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.11)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))': dependencies: '@babel/parser': 7.28.3 optionalDependencies: '@intlify/shared': 11.1.11 '@vue/compiler-dom': 3.5.22 - vue: 3.5.22(typescript@5.9.2) - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.2)) + vue: 3.5.22(typescript@5.9.3) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.3)(@vue/compiler-dom@3.5.22)(vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3))': dependencies: '@babel/parser': 7.28.3 optionalDependencies: '@intlify/shared': 11.1.3 '@vue/compiler-dom': 3.5.22 - vue: 3.5.22(typescript@5.8.3) - vue-i18n: 11.1.12(vue@3.5.22(typescript@5.8.3)) + vue: 3.5.22(typescript@5.9.3) + vue-i18n: 11.1.12(vue@3.5.22(typescript@5.9.3)) '@ioredis/commands@1.2.0': optional: true @@ -20806,44 +21147,44 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.1.2': + '@jest/console@30.2.0': dependencies: - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 - jest-message-util: 30.1.0 - jest-util: 30.0.5 + jest-message-util: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 - '@jest/core@30.1.3(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2))': + '@jest/core@30.2.0(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3))': dependencies: - '@jest/console': 30.1.2 + '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 - '@jest/reporters': 30.1.3 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.3.0 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-changed-files: 30.0.5 - jest-config: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) - jest-haste-map: 30.1.0 - jest-message-util: 30.1.0 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-resolve-dependencies: 30.1.3 - jest-runner: 30.1.3 - jest-runtime: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 - jest-validate: 30.1.0 - jest-watcher: 30.1.3 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 micromatch: 4.0.8 - pretty-format: 30.0.5 + pretty-format: 30.2.0 slash: 3.0.0 transitivePeerDependencies: - babel-plugin-macros @@ -20853,12 +21194,12 @@ snapshots: '@jest/diff-sequences@30.0.1': {} - '@jest/environment@30.1.2': + '@jest/environment@30.2.0': dependencies: - '@jest/fake-timers': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 - jest-mock: 30.0.5 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 + jest-mock: 30.2.0 '@jest/expect-utils@29.7.0': dependencies: @@ -20868,53 +21209,53 @@ snapshots: dependencies: '@jest/get-type': 30.0.1 - '@jest/expect-utils@30.1.2': + '@jest/expect-utils@30.2.0': dependencies: '@jest/get-type': 30.1.0 - '@jest/expect@30.1.2': + '@jest/expect@30.2.0': dependencies: - expect: 30.1.2 - jest-snapshot: 30.1.2 + expect: 30.2.0 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@30.1.2': + '@jest/fake-timers@30.2.0': dependencies: - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 24.5.2 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 - jest-util: 30.0.5 + '@types/node': 24.9.1 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 '@jest/get-type@30.0.1': {} '@jest/get-type@30.1.0': {} - '@jest/globals@30.1.2': + '@jest/globals@30.2.0': dependencies: - '@jest/environment': 30.1.2 - '@jest/expect': 30.1.2 - '@jest/types': 30.0.5 - jest-mock: 30.0.5 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 transitivePeerDependencies: - supports-color '@jest/pattern@30.0.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 jest-regex-util: 30.0.1 - '@jest/reporters@30.1.3': + '@jest/reporters@30.2.0': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.30 - '@types/node': 24.5.2 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 24.9.1 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit-x: 0.2.2 @@ -20925,9 +21266,9 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - jest-message-util: 30.1.0 - jest-util: 30.0.5 - jest-worker: 30.1.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 slash: 3.0.0 string-length: 4.0.2 v8-to-istanbul: 9.3.0 @@ -20942,46 +21283,46 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.38 - '@jest/snapshot-utils@30.1.2': + '@jest/snapshot-utils@30.2.0': dependencies: - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 '@jest/source-map@30.0.1': dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.1.3': + '@jest/test-result@30.2.0': dependencies: - '@jest/console': 30.1.2 - '@jest/types': 30.0.5 + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@30.1.3': + '@jest/test-sequencer@30.2.0': dependencies: - '@jest/test-result': 30.1.3 + '@jest/test-result': 30.2.0 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 + jest-haste-map: 30.2.0 slash: 3.0.0 - '@jest/transform@30.1.2': + '@jest/transform@30.2.0': dependencies: - '@babel/core': 7.28.3 - '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.30 - babel-plugin-istanbul: 7.0.0 + '@babel/core': 7.28.4 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 + jest-haste-map: 30.2.0 jest-regex-util: 30.0.1 - jest-util: 30.0.5 + jest-util: 30.2.0 micromatch: 4.0.8 pirates: 4.0.7 slash: 3.0.0 @@ -20994,7 +21335,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -21004,7 +21345,17 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.5.2 + '@types/node': 24.9.1 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.9.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -21132,7 +21483,7 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@monaco-editor/loader@1.5.0': + '@monaco-editor/loader@1.6.1': dependencies: state-local: 1.0.7 @@ -21187,13 +21538,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true - '@nestjs-modules/mailer@2.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(nodemailer@7.0.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2)': + '@nestjs-modules/mailer@2.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(nodemailer@7.0.9)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3)': dependencies: '@css-inline/css-inline': 0.14.1 '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) glob: 10.3.12 - nodemailer: 7.0.6 + nodemailer: 7.0.9 optionalDependencies: '@types/ejs': 3.1.5 '@types/mjml': 4.7.4 @@ -21201,7 +21552,7 @@ snapshots: ejs: 3.1.10 handlebars: 4.7.8 liquidjs: 10.17.0 - mjml: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) preview-email: 3.1.0 pug: 3.0.3 transitivePeerDependencies: @@ -21214,25 +21565,27 @@ snapshots: - typescript - uncss - '@nestjs/apollo@13.1.0(@apollo/server@4.12.1(graphql@16.11.0))(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/graphql@13.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2))(graphql@16.11.0)': + '@nestjs/apollo@13.2.1(@apollo/server@4.12.1(graphql@16.11.0))(@as-integrations/express5@1.1.2(@apollo/server@4.12.1(graphql@16.11.0))(express@5.1.0))(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/graphql@13.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2))(graphql@16.11.0)': dependencies: '@apollo/server': 4.12.1(graphql@16.11.0) '@apollo/server-plugin-landing-page-graphql-playground': 4.0.1(@apollo/server@4.12.1(graphql@16.11.0)) '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@nestjs/graphql': 13.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2) + '@nestjs/graphql': 13.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2) graphql: 16.11.0 iterall: 1.3.0 lodash.omit: 4.5.0 tslib: 2.8.1 + optionalDependencies: + '@as-integrations/express5': 1.1.2(@apollo/server@4.12.1(graphql@16.11.0))(express@5.1.0) - '@nestjs/cli@11.0.10(@swc/core@1.4.2)(@types/node@24.5.2)': + '@nestjs/cli@11.0.10(@swc/core@1.4.2)(@types/node@24.9.1)': dependencies: '@angular-devkit/core': 19.2.15(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics-cli': 19.2.15(@types/node@24.5.2)(chokidar@4.0.3) - '@inquirer/prompts': 7.8.0(@types/node@24.5.2) - '@nestjs/schematics': 11.0.7(chokidar@4.0.3)(typescript@5.8.3) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@24.9.1)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@24.9.1) + '@nestjs/schematics': 11.0.9(chokidar@4.0.3)(typescript@5.8.3) ansis: 4.1.0 chokidar: 4.0.3 cli-table3: 0.6.5 @@ -21292,11 +21645,11 @@ snapshots: optionalDependencies: '@nestjs/platform-express': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) - '@nestjs/graphql@13.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2)': + '@nestjs/graphql@13.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(graphql@16.11.0)(reflect-metadata@0.2.2)': dependencies: - '@graphql-tools/merge': 9.0.24(graphql@16.11.0) - '@graphql-tools/schema': 10.0.23(graphql@16.11.0) - '@graphql-tools/utils': 10.8.6(graphql@16.11.0) + '@graphql-tools/merge': 9.1.1(graphql@16.11.0) + '@graphql-tools/schema': 10.0.25(graphql@16.11.0) + '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) @@ -21304,7 +21657,7 @@ snapshots: fast-glob: 3.3.3 graphql: 16.11.0 graphql-tag: 2.12.6(graphql@16.11.0) - graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.17.1) + graphql-ws: 6.0.6(graphql@16.11.0)(ws@8.17.1) lodash: 4.17.21 normalize-path: 3.0.0 reflect-metadata: 0.2.2 @@ -21317,13 +21670,14 @@ snapshots: transitivePeerDependencies: - '@fastify/websocket' - bufferutil + - crossws - uWebSockets.js - utf-8-validate - '@nestjs/jwt@11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))': + '@nestjs/jwt@11.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@types/jsonwebtoken': 9.0.7 + '@types/jsonwebtoken': 9.0.10 jsonwebtoken: 9.0.2 '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': @@ -21357,29 +21711,29 @@ snapshots: '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) cron: 4.3.3 - '@nestjs/schematics@11.0.7(chokidar@4.0.3)(typescript@5.8.3)': + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.8.3)': dependencies: - '@angular-devkit/core': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 typescript: 5.8.3 transitivePeerDependencies: - chokidar - '@nestjs/schematics@11.0.7(chokidar@4.0.3)(typescript@5.9.2)': + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.9.3)': dependencies: - '@angular-devkit/core': 19.2.15(chokidar@4.0.3) - '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) - comment-json: 4.2.5 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - chokidar - '@nestjs/swagger@11.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': + '@nestjs/swagger@11.2.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.15.1 '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -21387,14 +21741,14 @@ snapshots: '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 reflect-metadata: 0.2.2 - swagger-ui-dist: 5.21.0 + swagger-ui-dist: 5.29.4 optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.2 - '@nestjs/terminus@11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@prisma/client@6.16.2(prisma@6.16.2(typescript@5.9.2))(typescript@5.9.2))(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/terminus@11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.3))(typescript@5.9.3))(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -21403,7 +21757,7 @@ snapshots: reflect-metadata: 0.2.2 rxjs: 7.8.2 optionalDependencies: - '@prisma/client': 6.16.2(prisma@6.16.2(typescript@5.9.2))(typescript@5.9.2) + '@prisma/client': 6.17.1(prisma@6.17.1(typescript@5.9.3))(typescript@5.9.3) '@nestjs/testing@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/platform-express@11.1.6)': dependencies: @@ -21567,14 +21921,14 @@ snapshots: '@popperjs/core@2.11.8': {} - '@posthog/core@1.1.0': {} + '@posthog/core@1.3.0': {} - '@prisma/client@6.16.2(prisma@6.16.2(typescript@5.9.2))(typescript@5.9.2)': + '@prisma/client@6.17.1(prisma@6.17.1(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: - prisma: 6.16.2(typescript@5.9.2) - typescript: 5.9.2 + prisma: 6.17.1(typescript@5.9.3) + typescript: 5.9.3 - '@prisma/config@6.16.2': + '@prisma/config@6.17.1': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -21583,26 +21937,26 @@ snapshots: transitivePeerDependencies: - magicast - '@prisma/debug@6.16.2': {} + '@prisma/debug@6.17.1': {} - '@prisma/engines-version@6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43': {} + '@prisma/engines-version@6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac': {} - '@prisma/engines@6.16.2': + '@prisma/engines@6.17.1': dependencies: - '@prisma/debug': 6.16.2 - '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 - '@prisma/fetch-engine': 6.16.2 - '@prisma/get-platform': 6.16.2 + '@prisma/debug': 6.17.1 + '@prisma/engines-version': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac + '@prisma/fetch-engine': 6.17.1 + '@prisma/get-platform': 6.17.1 - '@prisma/fetch-engine@6.16.2': + '@prisma/fetch-engine@6.17.1': dependencies: - '@prisma/debug': 6.16.2 - '@prisma/engines-version': 6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43 - '@prisma/get-platform': 6.16.2 + '@prisma/debug': 6.17.1 + '@prisma/engines-version': 6.17.1-1.272a37d34178c2894197e17273bf937f25acdeac + '@prisma/get-platform': 6.17.1 - '@prisma/get-platform@6.16.2': + '@prisma/get-platform@6.17.1': dependencies: - '@prisma/debug': 6.16.2 + '@prisma/debug': 6.17.1 '@protobufjs/aspromise@1.1.2': {} @@ -21653,13 +22007,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-inject@5.0.5(rollup@4.52.2)': + '@rollup/plugin-inject@5.0.5(rollup@4.52.5)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.2) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.5 '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': dependencies: @@ -21667,7 +22021,7 @@ snapshots: '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.10 + resolve: 1.22.11 optionalDependencies: rollup: 2.79.2 @@ -21685,22 +22039,22 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/plugin-typescript@11.1.6(rollup@4.52.2)(tslib@2.8.0)(typescript@5.9.2)': + '@rollup/plugin-typescript@11.1.6(rollup@4.52.5)(tslib@2.8.0)(typescript@5.9.3)': dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.52.2) + '@rollup/pluginutils': 5.1.2(rollup@4.52.5) resolve: 1.22.8 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.5 tslib: 2.8.0 - '@rollup/plugin-typescript@12.1.4(rollup@4.52.2)(tslib@2.8.1)(typescript@5.9.2)': + '@rollup/plugin-typescript@12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.9.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.2) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) resolve: 1.22.10 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.5 tslib: 2.8.1 '@rollup/pluginutils@3.1.0(rollup@2.79.2)': @@ -21723,21 +22077,21 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.2(rollup@4.52.2)': + '@rollup/pluginutils@5.1.2(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.5 - '@rollup/pluginutils@5.2.0(rollup@4.52.2)': + '@rollup/pluginutils@5.2.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.2 + rollup: 4.52.5 '@rollup/pluginutils@5.3.0(rollup@2.79.2)': dependencies: @@ -21750,72 +22104,136 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.52.2': optional: true + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + '@rollup/rollup-android-arm64@4.52.2': optional: true + '@rollup/rollup-android-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-arm64@4.52.2': optional: true + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + '@rollup/rollup-darwin-x64@4.52.2': optional: true + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + '@rollup/rollup-freebsd-arm64@4.52.2': optional: true + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + '@rollup/rollup-freebsd-x64@4.52.2': optional: true + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.2': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.2': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.2': optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-arm64-musl@4.52.2': optional: true + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.2': optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.2': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.2': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.2': optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.2': optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-gnu@4.52.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-linux-x64-musl@4.52.2': optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + '@rollup/rollup-openharmony-arm64@4.52.2': optional: true + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.2': optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.2': optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + '@rollup/rollup-win32-x64-gnu@4.52.2': optional: true + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + '@rollup/rollup-win32-x64-msvc@4.52.2': optional: true - '@rushstack/eslint-patch@1.12.0': {} + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true - '@rushstack/eslint-patch@1.3.3': {} + '@rushstack/eslint-patch@1.14.0': {} '@scarf/scarf@1.4.0': {} @@ -22127,7 +22545,7 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.12 - '@sveltejs/vite-plugin-svelte@1.4.0(svelte@3.59.2)(vite@3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2))': + '@sveltejs/vite-plugin-svelte@1.4.0(svelte@3.59.2)(vite@3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))': dependencies: debug: 4.3.7 deepmerge: 4.3.1 @@ -22135,8 +22553,8 @@ snapshots: magic-string: 0.26.7 svelte: 3.59.2 svelte-hmr: 0.15.3(svelte@3.59.2) - vite: 3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2) - vitefu: 0.2.5(vite@3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2)) + vite: 3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) + vitefu: 0.2.5(vite@3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)) transitivePeerDependencies: - supports-color @@ -22345,32 +22763,32 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.4 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.4 - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 '@types/bcrypt@6.0.0': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/caseless@0.12.5': {} @@ -22382,11 +22800,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/cookie-parser@1.4.9(@types/express@5.0.3)': dependencies: @@ -22396,7 +22814,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/crypto-js@4.2.2': {} @@ -22430,14 +22848,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -22461,7 +22879,7 @@ snapshots: dependencies: '@hapi/boom': 9.1.4 '@types/crypto-js': 4.2.2 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/request': 2.48.12 '@types/http-errors@2.0.4': {} @@ -22487,13 +22905,14 @@ snapshots: '@types/json-schema@7.0.9': {} - '@types/jsonwebtoken@9.0.6': + '@types/jsonwebtoken@9.0.10': dependencies: - '@types/node': 24.5.2 + '@types/ms': 2.1.0 + '@types/node': 24.9.1 - '@types/jsonwebtoken@9.0.7': + '@types/jsonwebtoken@9.0.6': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/linkify-it@5.0.0': {} @@ -22534,27 +22953,19 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 form-data: 4.0.4 '@types/node@17.0.45': {} - '@types/node@18.18.8': + '@types/node@24.9.1': dependencies: - undici-types: 5.26.5 + undici-types: 7.16.0 - '@types/node@24.3.0': - dependencies: - undici-types: 7.10.0 - - '@types/node@24.5.2': - dependencies: - undici-types: 7.12.0 - - '@types/nodemailer@7.0.1': + '@types/nodemailer@7.0.2': dependencies: '@aws-sdk/client-sesv2': 3.872.0 - '@types/node': 24.5.2 + '@types/node': 24.9.1 transitivePeerDependencies: - aws-crt @@ -22562,13 +22973,13 @@ snapshots: '@types/oauth@0.9.4': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/paho-mqtt@1.0.10': {} '@types/papaparse@5.3.16': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/passport-github2@1.2.9': dependencies: @@ -22608,7 +23019,7 @@ snapshots: '@types/postman-collection@3.5.11': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/pug@2.0.10': optional: true @@ -22624,7 +23035,7 @@ snapshots: '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/tough-cookie': 4.0.5 form-data: 4.0.4 @@ -22639,17 +23050,17 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/send': 0.17.4 - '@types/splitpanes@2.2.6(typescript@5.9.2)': + '@types/splitpanes@2.2.6(typescript@5.9.3)': dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -22663,7 +23074,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.5.2 + '@types/node': 24.9.1 form-data: 4.0.4 '@types/supertest@6.0.3': @@ -22689,15 +23100,15 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/ws@8.5.10': dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@types/ws@8.5.12': dependencies: - '@types/node': 18.18.8 + '@types/node': 24.9.1 '@types/yargs-parser@21.0.3': {} @@ -22705,179 +23116,217 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.8.3) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.47.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.7.2 - tsutils: 3.21.0(typescript@5.8.3) + semver: 7.7.3 + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.9.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.9.2) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.44.1(eslint@8.47.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@8.47.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.44.1(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.44.1(eslint@8.47.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@8.47.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 eslint: 8.47.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@8.57.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.44.1(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@8.57.0)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 eslint: 8.57.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.1 - eslint: 9.36.0(jiti@2.6.0) + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.1 + eslint: 9.37.0(jiti@2.6.0) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.46.2(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.47.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + '@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: 8.57.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3(supports-color@8.1.1) eslint: 8.47.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.2 + eslint: 9.37.0(jiti@2.6.0) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 debug: 4.4.3(supports-color@8.1.1) - typescript: 5.9.2 + eslint: 8.57.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.1(typescript@5.8.3)': + '@typescript-eslint/project-service@8.39.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3(supports-color@8.1.1) - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.44.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.44.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3(supports-color@8.1.1) - typescript: 5.9.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -22906,75 +23355,101 @@ snapshots: '@typescript-eslint/types': 8.44.1 '@typescript-eslint/visitor-keys': 8.44.1 - '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.46.2': dependencies: - typescript: 5.8.3 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + + '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.8.3) + typescript: 5.9.3 + + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.47.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.47.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.47.0 - tsutils: 3.21.0(typescript@5.8.3) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.0 - ts-api-utils: 1.4.3(typescript@5.9.2) + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.44.1(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.44.1(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.44.1(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@8.47.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.47.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.44.1(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.44.1(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.44.1(eslint@8.57.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 8.57.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.37.0(jiti@2.6.0) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.46.2(eslint@8.57.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@8.57.0)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.36.0(jiti@2.6.0) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + eslint: 8.57.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -22986,25 +23461,27 @@ snapshots: '@typescript-eslint/types@8.39.1': {} - '@typescript-eslint/types@8.40.0': {} - '@typescript-eslint/types@8.44.1': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': + '@typescript-eslint/types@8.46.1': {} + + '@typescript-eslint/types@8.46.2': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.4.3(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.2 - tsutils: 3.21.0(typescript@5.8.3) + semver: 7.7.3 + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.2)': + '@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 @@ -23012,131 +23489,158 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 1.4.3(typescript@5.9.2) + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.31.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.31.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.31.0 '@typescript-eslint/visitor-keys': 8.31.0 - debug: 4.4.0 + debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/project-service': 8.39.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.3) '@typescript-eslint/types': 8.39.1 '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.8.3) + '@typescript-eslint/project-service': 8.44.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.3) '@typescript-eslint/types': 8.44.1 '@typescript-eslint/visitor-keys': 8.44.1 debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.44.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2) - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/visitor-keys': 8.44.1 + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.47.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.9.3) eslint: 8.47.0 eslint-scope: 5.1.1 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.44.1(eslint@8.47.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.44.1(eslint@8.47.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.47.0) '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) eslint: 8.47.0 - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@8.57.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.44.1(eslint@8.57.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 8.44.1 '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.3) eslint: 8.57.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.1(eslint@9.37.0(jiti@2.6.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) - '@typescript-eslint/scope-manager': 8.44.1 - '@typescript-eslint/types': 8.44.1 - '@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2) - eslint: 9.36.0(jiti@2.6.0) - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.2(eslint@8.57.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 8.57.0 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -23165,13 +23669,23 @@ snapshots: '@typescript-eslint/types': 8.44.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.46.1': + dependencies: + '@typescript-eslint/types': 8.46.1 + eslint-visitor-keys: 4.2.1 + + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} - '@unhead/vue@2.0.17(vue@3.5.22(typescript@5.9.2))': + '@unhead/vue@2.0.19(vue@3.5.22(typescript@5.9.3))': dependencies: hookable: 5.5.3 - unhead: 2.0.17 - vue: 3.5.22(typescript@5.9.2) + unhead: 2.0.19 + vue: 3.5.22(typescript@5.9.3) '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -23262,13 +23776,13 @@ snapshots: dependencies: graphql: 16.11.0 - '@urql/vue@2.0.0(@urql/core@6.0.1(graphql@16.11.0))(vue@3.5.22(typescript@5.9.2))': + '@urql/vue@2.0.0(@urql/core@6.0.1(graphql@16.11.0))(vue@3.5.22(typescript@5.9.3))': dependencies: '@urql/core': 6.0.1(graphql@16.11.0) - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) wonka: 6.3.5 - '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))': + '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))': dependencies: '@babel/standalone': 7.24.5 core-js: 3.38.1 @@ -23276,9 +23790,9 @@ snapshots: regenerator-runtime: 0.13.11 systemjs: 6.15.1 terser: 5.39.2 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) - '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': + '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': dependencies: '@babel/standalone': 7.24.5 core-js: 3.38.1 @@ -23286,9 +23800,9 @@ snapshots: regenerator-runtime: 0.13.11 systemjs: 6.15.1 terser: 5.39.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': + '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': dependencies: '@babel/standalone': 7.24.5 core-js: 3.38.1 @@ -23296,9 +23810,9 @@ snapshots: regenerator-runtime: 0.13.11 systemjs: 6.15.1 terser: 5.39.2 - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': + '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': dependencies: '@babel/standalone': 7.24.5 core-js: 3.38.1 @@ -23306,19 +23820,9 @@ snapshots: regenerator-runtime: 0.13.11 systemjs: 6.15.1 terser: 5.39.2 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - '@vitejs/plugin-legacy@2.3.0(terser@5.39.2)(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': - dependencies: - '@babel/standalone': 7.24.5 - core-js: 3.38.1 - magic-string: 0.26.7 - regenerator-runtime: 0.13.11 - systemjs: 6.15.1 - terser: 5.39.2 - vite: 7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - - '@vitejs/plugin-legacy@5.4.2(terser@5.39.2)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': + '@vitejs/plugin-legacy@5.4.2(terser@5.39.2)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': dependencies: '@babel/core': 7.25.7 '@babel/preset-env': 7.25.7(@babel/core@7.25.7) @@ -23329,29 +23833,24 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.39.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@4.3.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.8.3))': + '@vitejs/plugin-vue@4.3.1(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.9.3))': dependencies: - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) - vue: 3.5.22(typescript@5.8.3) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) + vue: 3.5.22(typescript@5.9.3) - '@vitejs/plugin-vue@5.1.4(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@vitejs/plugin-vue@5.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) - '@vitejs/plugin-vue@5.1.4(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': + '@vitejs/plugin-vue@5.1.4(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) - - '@vitejs/plugin-vue@5.1.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.2))': - dependencies: - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) '@vitest/expect@3.2.4': dependencies: @@ -23361,21 +23860,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - - '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -23478,44 +23969,43 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)))(eslint@8.47.0)(typescript@5.8.3)': + '@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)))(eslint@8.47.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(typescript@5.8.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(typescript@5.9.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.9.3) eslint: 8.47.0 - eslint-plugin-vue: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)) + eslint-plugin-vue: 10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)) vue-eslint-parser: 9.4.3(eslint@8.47.0) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.2)': + '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(typescript@5.9.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.9.3) eslint: 8.57.0 - eslint-plugin-vue: 10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) + eslint-plugin-vue: 10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) vue-eslint-parser: 9.4.3(eslint@8.57.0) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@vue/language-core@1.8.8(typescript@5.8.3)': + '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)))(eslint@8.57.0)(typescript@5.9.3)': dependencies: - '@volar/language-core': 1.10.10 - '@volar/source-map': 1.10.10 - '@vue/compiler-dom': 3.5.19 - '@vue/reactivity': 3.5.19 - '@vue/shared': 3.5.19 - minimatch: 9.0.5 - muggle-string: 0.3.1 - vue-template-compiler: 2.7.16 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(typescript@5.9.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.9.3) + eslint: 8.57.0 + eslint-plugin-vue: 10.5.1(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)) + vue-eslint-parser: 9.4.3(eslint@8.57.0) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@vue/language-core@1.8.8(typescript@5.9.2)': + '@vue/language-core@1.8.8(typescript@5.9.3)': dependencies: '@volar/language-core': 1.10.10 '@volar/source-map': 1.10.10 @@ -23526,9 +24016,9 @@ snapshots: muggle-string: 0.3.1 vue-template-compiler: 2.7.16 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@vue/language-core@2.1.6(typescript@5.9.2)': + '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.22 '@vue/compiler-dom': 3.5.19 @@ -23539,9 +24029,9 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@vue/language-core@2.2.0(typescript@5.9.2)': + '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.22 '@vue/compiler-dom': 3.5.19 @@ -23552,7 +24042,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 '@vue/reactivity@3.5.19': dependencies: @@ -23574,61 +24064,48 @@ snapshots: '@vue/shared': 3.5.22 csstype: 3.1.3 - '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.8.3))': - dependencies: - '@vue/compiler-ssr': 3.5.22 - '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.8.3) - - '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.2))': + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@vue/shared@3.5.19': {} '@vue/shared@3.5.22': {} - '@vue/typescript@1.8.8(typescript@5.8.3)': + '@vue/typescript@1.8.8(typescript@5.9.3)': dependencies: '@volar/typescript': 1.10.10 - '@vue/language-core': 1.8.8(typescript@5.8.3) + '@vue/language-core': 1.8.8(typescript@5.9.3) transitivePeerDependencies: - typescript - '@vue/typescript@1.8.8(typescript@5.9.2)': - dependencies: - '@volar/typescript': 1.10.10 - '@vue/language-core': 1.8.8(typescript@5.9.2) - transitivePeerDependencies: - - typescript - - '@vueuse/core@10.5.0(vue@3.5.22(typescript@5.8.3))': + '@vueuse/core@10.5.0(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.18 '@vueuse/metadata': 10.5.0 - '@vueuse/shared': 10.5.0(vue@3.5.22(typescript@5.8.3)) - vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.3)) + '@vueuse/shared': 10.5.0(vue@3.5.22(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/core@13.7.0(vue@3.5.22(typescript@5.9.2))': + '@vueuse/core@13.7.0(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 13.7.0 - '@vueuse/shared': 13.7.0(vue@3.5.22(typescript@5.9.2)) - vue: 3.5.22(typescript@5.9.2) + '@vueuse/shared': 13.7.0(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) - '@vueuse/core@8.9.4(vue@3.5.22(typescript@5.9.2))': + '@vueuse/core@8.9.4(vue@3.5.22(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.14 '@vueuse/metadata': 8.9.4 - '@vueuse/shared': 8.9.4(vue@3.5.22(typescript@5.9.2)) - vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.2)) + '@vueuse/shared': 8.9.4(vue@3.5.22(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) optionalDependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@vueuse/metadata@10.5.0': {} @@ -23636,22 +24113,22 @@ snapshots: '@vueuse/metadata@8.9.4': {} - '@vueuse/shared@10.5.0(vue@3.5.22(typescript@5.8.3))': + '@vueuse/shared@10.5.0(vue@3.5.22(typescript@5.9.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.22(typescript@5.8.3)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/shared@13.7.0(vue@3.5.22(typescript@5.9.2))': + '@vueuse/shared@13.7.0(vue@3.5.22(typescript@5.9.3))': dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) - '@vueuse/shared@8.9.4(vue@3.5.22(typescript@5.9.2))': + '@vueuse/shared@8.9.4(vue@3.5.22(typescript@5.9.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.2)) + vue-demi: 0.14.10(vue@3.5.22(typescript@5.9.3)) optionalDependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) '@webassemblyjs/ast@1.14.1': dependencies: @@ -23882,7 +24359,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -23960,7 +24437,7 @@ snapshots: argon2@0.44.0: dependencies: '@phc/format': 1.0.0 - cross-env: 10.0.0 + cross-env: 10.1.0 node-addon-api: 8.5.0 node-gyp-build: 4.8.4 @@ -24082,34 +24559,20 @@ snapshots: transitivePeerDependencies: - debug - babel-jest@30.1.2(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - '@jest/transform': 30.1.2 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.1(@babel/core@7.28.3) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-jest@30.1.2(@babel/core@7.28.4): + babel-jest@30.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 - '@jest/transform': 30.1.2 + '@jest/transform': 30.2.0 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.1(@babel/core@7.28.4) + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - optional: true - babel-plugin-istanbul@7.0.0: + babel-plugin-istanbul@7.0.1: dependencies: '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 @@ -24119,10 +24582,8 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.0.1: + babel-plugin-jest-hoist@30.2.0: dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.7): @@ -24155,7 +24616,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.4) - core-js-compat: 3.45.1 + core-js-compat: 3.46.0 transitivePeerDependencies: - supports-color @@ -24175,26 +24636,7 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.3) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.3) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.3) - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.4): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) @@ -24212,7 +24654,6 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) - optional: true babel-preset-fbjs@3.4.0(@babel/core@7.28.0): dependencies: @@ -24247,18 +24688,11 @@ snapshots: transitivePeerDependencies: - supports-color - babel-preset-jest@30.0.1(@babel/core@7.28.3): - dependencies: - '@babel/core': 7.28.3 - babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.3) - - babel-preset-jest@30.0.1(@babel/core@7.28.4): + babel-preset-jest@30.2.0(@babel/core@7.28.4): dependencies: '@babel/core': 7.28.4 - babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.4) - optional: true + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) babel-walk@3.0.0-canary-5: dependencies: @@ -24275,7 +24709,7 @@ snapshots: base64url@3.0.1: {} - baseline-browser-mapping@2.8.7: {} + baseline-browser-mapping@2.8.19: {} basic-auth@2.0.1: dependencies: @@ -24394,13 +24828,13 @@ snapshots: update-browserslist-db: 1.1.3(browserslist@4.25.3) optional: true - browserslist@4.26.2: + browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.7 - caniuse-lite: 1.0.30001745 - electron-to-chromium: 1.5.224 - node-releases: 2.0.21 - update-browserslist-db: 1.1.3(browserslist@4.26.2) + baseline-browser-mapping: 2.8.19 + caniuse-lite: 1.0.30001751 + electron-to-chromium: 1.5.238 + node-releases: 2.0.26 + update-browserslist-db: 1.1.3(browserslist@4.26.3) bs-logger@0.2.6: dependencies: @@ -24453,7 +24887,7 @@ snapshots: dotenv: 16.6.1 exsolve: 1.0.7 giget: 2.0.0 - jiti: 2.5.1 + jiti: 2.6.0 ohash: 2.0.11 pathe: 2.0.3 perfect-debounce: 1.0.0 @@ -24517,7 +24951,7 @@ snapshots: caniuse-lite@1.0.30001736: optional: true - caniuse-lite@1.0.30001745: {} + caniuse-lite@1.0.30001751: {} capital-case@1.0.4: dependencies: @@ -24533,6 +24967,8 @@ snapshots: loupe: 3.2.0 pathval: 2.0.1 + chai@6.2.0: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -24769,13 +25205,11 @@ snapshots: commander@9.5.0: optional: true - comment-json@4.2.5: + comment-json@4.4.1: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 - has-own-prop: 2.0.0 - repeat-string: 1.6.1 common-tags@1.8.2: {} @@ -24867,17 +25301,17 @@ snapshots: cookiejar@2.1.4: {} - copy-anything@3.0.5: + copy-anything@4.0.5: dependencies: - is-what: 4.1.16 + is-what: 5.5.0 core-js-compat@3.38.1: dependencies: browserslist: 4.24.0 - core-js-compat@3.45.1: + core-js-compat@3.46.0: dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 core-js@3.38.1: {} @@ -24890,12 +25324,12 @@ snapshots: corser@2.0.1: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@24.5.2)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): + cosmiconfig-typescript-loader@6.1.0(@types/node@24.9.1)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.5.2 - cosmiconfig: 9.0.0(typescript@5.9.2) + '@types/node': 24.9.1 + cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.0 - typescript: 5.9.2 + typescript: 5.9.3 cosmiconfig@8.0.0: dependencies: @@ -24913,23 +25347,23 @@ snapshots: optionalDependencies: typescript: 5.8.3 - cosmiconfig@8.3.6(typescript@5.9.2): + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 create-require@1.1.1: {} @@ -24940,15 +25374,11 @@ snapshots: '@types/luxon': 3.7.1 luxon: 3.7.2 - cross-env@10.0.0: + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 cross-spawn: 7.0.6 - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -25270,17 +25700,11 @@ snapshots: diff@7.0.0: {} - dioc@3.0.2(vue@3.5.22(typescript@5.8.3)): - dependencies: - rxjs: 7.8.2 - optionalDependencies: - vue: 3.5.22(typescript@5.8.3) - - dioc@3.0.2(vue@3.5.22(typescript@5.9.2)): + dioc@3.0.2(vue@3.5.22(typescript@5.9.3)): dependencies: rxjs: 7.8.2 optionalDependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) dir-glob@3.0.1: dependencies: @@ -25364,7 +25788,7 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.2.2: {} + dotenv@17.2.3: {} dset@3.1.4: {} @@ -25402,13 +25826,13 @@ snapshots: electron-to-chromium@1.5.207: optional: true - electron-to-chromium@1.5.224: {} + electron-to-chromium@1.5.238: {} electron-to-chromium@1.5.35: {} emittery@0.13.1: {} - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -25854,6 +26278,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.10 '@esbuild/win32-x64': 0.25.10 + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + esbuild@0.25.8: optionalDependencies: '@esbuild/aix-ppc64': 0.25.8 @@ -25940,9 +26393,9 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)): + eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) eslint-plugin-prettier@4.2.1(eslint@8.47.0)(prettier@3.6.2): dependencies: @@ -25960,41 +26413,54 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 10.1.8(eslint@8.57.0) - eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.36.0(jiti@2.6.0)))(eslint@9.36.0(jiti@2.6.0))(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.37.0(jiti@2.6.0)))(eslint@9.37.0(jiti@2.6.0))(prettier@3.6.2): dependencies: - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.11 optionalDependencies: '@types/eslint': 9.6.1 - eslint-config-prettier: 10.1.8(eslint@9.36.0(jiti@2.6.0)) + eslint-config-prettier: 10.1.8(eslint@9.37.0(jiti@2.6.0)) - eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.8.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)): + eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.47.0)(typescript@5.9.3))(eslint@8.47.0)(vue-eslint-parser@10.2.0(eslint@8.47.0)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.47.0) eslint: 8.47.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.2 + semver: 7.7.3 vue-eslint-parser: 10.2.0(eslint@8.47.0) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.1(eslint@8.47.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.44.1(eslint@8.47.0)(typescript@5.9.3) - eslint-plugin-vue@10.5.0(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.2))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)): + eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.44.1(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) eslint: 8.57.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.2 + semver: 7.7.3 vue-eslint-parser: 10.2.0(eslint@8.57.0) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.44.1(eslint@8.57.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.44.1(eslint@8.57.0)(typescript@5.9.3) + + eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@8.57.0)(typescript@5.9.3))(eslint@8.57.0)(vue-eslint-parser@10.2.0(eslint@8.57.0)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.0) + eslint: 8.57.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@8.57.0) + xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.46.2(eslint@8.57.0)(typescript@5.9.3) eslint-scope@5.1.1: dependencies: @@ -26100,16 +26566,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.36.0(jiti@2.6.0): + eslint@9.37.0(jiti@2.6.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.36.0(jiti@2.6.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.36.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -26118,7 +26584,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -26277,14 +26743,14 @@ snapshots: jest-mock: 30.0.5 jest-util: 30.0.5 - expect@30.1.2: + expect@30.2.0: dependencies: - '@jest/expect-utils': 30.1.2 + '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 - jest-util: 30.0.5 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 express-session@1.18.2: dependencies: @@ -26427,7 +26893,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.1.0: {} fast-url-parser@1.1.3: dependencies: @@ -26548,7 +27014,7 @@ snapshots: dependencies: magic-string: 0.30.17 mlly: 1.7.4 - rollup: 4.52.2 + rollup: 4.52.5 fixpack@4.0.0: dependencies: @@ -26606,7 +27072,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.2 + semver: 7.7.3 tapable: 2.2.1 typescript: 5.8.3 webpack: 5.100.2(@swc/core@1.4.2) @@ -26657,12 +27123,6 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -26697,6 +27157,8 @@ snapshots: functions-have-names@1.2.3: {} + generator-function@2.0.1: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -26866,13 +27328,13 @@ snapshots: graphemer@1.4.0: {} - graphql-config@4.5.0(@types/node@24.5.2)(graphql@16.11.0): + graphql-config@4.5.0(@types/node@24.9.1)(graphql@16.11.0): dependencies: '@graphql-tools/graphql-file-loader': 7.5.17(graphql@16.11.0) '@graphql-tools/json-file-loader': 7.4.18(graphql@16.11.0) '@graphql-tools/load': 7.8.14(graphql@16.11.0) '@graphql-tools/merge': 8.4.2(graphql@16.11.0) - '@graphql-tools/url-loader': 7.17.18(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/url-loader': 7.17.18(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 9.2.1(graphql@16.11.0) cosmiconfig: 8.0.0 graphql: 16.11.0 @@ -26886,15 +27348,15 @@ snapshots: - encoding - utf-8-validate - graphql-config@5.1.3(@types/node@18.18.8)(graphql@16.11.0)(typescript@5.8.3): + graphql-config@5.1.3(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3): dependencies: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.11.0) '@graphql-tools/load': 8.0.2(graphql@16.11.0) '@graphql-tools/merge': 9.0.24(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@18.18.8)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.8.6(graphql@16.11.0) - cosmiconfig: 8.3.6(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.9.3) graphql: 16.11.0 jiti: 2.3.3 minimatch: 9.0.5 @@ -26907,15 +27369,15 @@ snapshots: - typescript - utf-8-validate - graphql-config@5.1.5(@types/node@24.5.2)(graphql@16.11.0)(typescript@5.9.2): + graphql-config@5.1.5(@types/node@24.9.1)(graphql@16.11.0)(typescript@5.9.3): dependencies: '@graphql-tools/graphql-file-loader': 8.0.22(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.20(graphql@16.11.0) '@graphql-tools/load': 8.1.2(graphql@16.11.0) '@graphql-tools/merge': 9.1.1(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.33(@types/node@24.5.2)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.1)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) - cosmiconfig: 8.3.6(typescript@5.9.2) + cosmiconfig: 8.3.6(typescript@5.9.3) graphql: 16.11.0 jiti: 2.5.1 minimatch: 9.0.5 @@ -26931,13 +27393,13 @@ snapshots: - uWebSockets.js - utf-8-validate - graphql-language-service-interface@2.10.2(@types/node@24.5.2)(graphql@16.11.0): + graphql-language-service-interface@2.10.2(@types/node@24.9.1)(graphql@16.11.0): dependencies: graphql: 16.11.0 - graphql-config: 4.5.0(@types/node@24.5.2)(graphql@16.11.0) - graphql-language-service-parser: 1.10.4(@types/node@24.5.2)(graphql@16.11.0) - graphql-language-service-types: 1.8.7(@types/node@24.5.2)(graphql@16.11.0) - graphql-language-service-utils: 2.7.1(@types/node@24.5.2)(graphql@16.11.0) + graphql-config: 4.5.0(@types/node@24.9.1)(graphql@16.11.0) + graphql-language-service-parser: 1.10.4(@types/node@24.9.1)(graphql@16.11.0) + graphql-language-service-types: 1.8.7(@types/node@24.9.1)(graphql@16.11.0) + graphql-language-service-utils: 2.7.1(@types/node@24.9.1)(graphql@16.11.0) vscode-languageserver-types: 3.17.5 transitivePeerDependencies: - '@types/node' @@ -26946,10 +27408,10 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-parser@1.10.4(@types/node@24.5.2)(graphql@16.11.0): + graphql-language-service-parser@1.10.4(@types/node@24.9.1)(graphql@16.11.0): dependencies: graphql: 16.11.0 - graphql-language-service-types: 1.8.7(@types/node@24.5.2)(graphql@16.11.0) + graphql-language-service-types: 1.8.7(@types/node@24.9.1)(graphql@16.11.0) transitivePeerDependencies: - '@types/node' - bufferutil @@ -26957,10 +27419,10 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-types@1.8.7(@types/node@24.5.2)(graphql@16.11.0): + graphql-language-service-types@1.8.7(@types/node@24.9.1)(graphql@16.11.0): dependencies: graphql: 16.11.0 - graphql-config: 4.5.0(@types/node@24.5.2)(graphql@16.11.0) + graphql-config: 4.5.0(@types/node@24.9.1)(graphql@16.11.0) vscode-languageserver-types: 3.17.5 transitivePeerDependencies: - '@types/node' @@ -26969,11 +27431,11 @@ snapshots: - encoding - utf-8-validate - graphql-language-service-utils@2.7.1(@types/node@24.5.2)(graphql@16.11.0): + graphql-language-service-utils@2.7.1(@types/node@24.9.1)(graphql@16.11.0): dependencies: '@types/json-schema': 7.0.9 graphql: 16.11.0 - graphql-language-service-types: 1.8.7(@types/node@24.5.2)(graphql@16.11.0) + graphql-language-service-types: 1.8.7(@types/node@24.9.1)(graphql@16.11.0) nullthrows: 1.1.1 transitivePeerDependencies: - '@types/node' @@ -27020,12 +27482,6 @@ snapshots: dependencies: graphql: 16.11.0 - graphql-ws@6.0.4(graphql@16.11.0)(ws@8.17.1): - dependencies: - graphql: 16.11.0 - optionalDependencies: - ws: 8.17.1 - graphql-ws@6.0.6(graphql@16.11.0)(ws@8.17.1): dependencies: graphql: 16.11.0 @@ -27059,8 +27515,6 @@ snapshots: has-flag@4.0.0: {} - has-own-prop@2.0.0: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -27118,9 +27572,9 @@ snapshots: selderee: 0.11.0 optional: true - htmlnano@2.1.2(cssnano@7.1.1(postcss@8.5.6))(postcss@8.5.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + htmlnano@2.1.2(cssnano@7.1.1(postcss@8.5.6))(postcss@8.5.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: - cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) posthtml: 0.16.6 optionalDependencies: cssnano: 7.1.1(postcss@8.5.6) @@ -27295,9 +27749,9 @@ snapshots: through: 2.3.8 wrap-ansi: 6.2.0 - inquirer@8.2.7(@types/node@24.5.2): + inquirer@8.2.7(@types/node@24.9.1): dependencies: - '@inquirer/external-editor': 1.0.0(@types/node@24.5.2) + '@inquirer/external-editor': 1.0.0(@types/node@24.9.1) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -27476,9 +27930,10 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-generator-function@1.1.0: + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -27622,7 +28077,7 @@ snapshots: call-bind: 1.0.7 get-intrinsic: 1.3.0 - is-what@4.1.16: {} + is-what@5.5.0: {} is-windows@1.0.2: {} @@ -27658,11 +28113,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -27674,7 +28129,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -27712,31 +28167,31 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jest-changed-files@30.0.5: + jest-changed-files@30.2.0: dependencies: execa: 5.1.1 - jest-util: 30.0.5 + jest-util: 30.2.0 p-limit: 3.1.0 - jest-circus@30.1.3: + jest-circus@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/expect': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0 is-generator-fn: 2.1.0 - jest-each: 30.1.0 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-runtime: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 p-limit: 3.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -27744,17 +28199,17 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)): + jest-cli@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@jest/core': 30.1.3(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-config: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) + jest-util: 30.2.0 + jest-validate: 30.2.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -27763,35 +28218,35 @@ snapshots: - supports-color - ts-node - jest-config@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)): + jest-config@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.1.3 - '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.28.3) + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 4.3.0 deepmerge: 4.3.1 glob: 10.4.5 graceful-fs: 4.2.11 - jest-circus: 30.1.3 - jest-docblock: 30.0.1 - jest-environment-node: 30.1.2 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-runner: 30.1.3 - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 micromatch: 4.0.8 parse-json: 5.2.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 24.5.2 - ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + '@types/node': 24.9.1 + ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -27810,56 +28265,56 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.5 - jest-diff@30.1.2: + jest-diff@30.2.0: dependencies: '@jest/diff-sequences': 30.0.1 '@jest/get-type': 30.1.0 chalk: 4.1.2 - pretty-format: 30.0.5 + pretty-format: 30.2.0 - jest-docblock@30.0.1: + jest-docblock@30.2.0: dependencies: detect-newline: 3.1.0 - jest-each@30.1.0: + jest-each@30.2.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 chalk: 4.1.2 - jest-util: 30.0.5 - pretty-format: 30.0.5 + jest-util: 30.2.0 + pretty-format: 30.2.0 - jest-environment-node@30.1.2: + jest-environment-node@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/fake-timers': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 - jest-mock: 30.0.5 - jest-util: 30.0.5 - jest-validate: 30.1.0 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 jest-get-type@29.6.3: {} - jest-haste-map@30.1.0: + jest-haste-map@30.2.0: dependencies: - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 30.0.1 - jest-util: 30.0.5 - jest-worker: 30.1.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@30.1.0: + jest-leak-detector@30.2.0: dependencies: '@jest/get-type': 30.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 jest-matcher-utils@29.7.0: dependencies: @@ -27875,12 +28330,12 @@ snapshots: jest-diff: 30.0.5 pretty-format: 30.0.5 - jest-matcher-utils@30.1.2: + jest-matcher-utils@30.2.0: dependencies: '@jest/get-type': 30.1.0 chalk: 4.1.2 - jest-diff: 30.1.2 - pretty-format: 30.0.5 + jest-diff: 30.2.0 + pretty-format: 30.2.0 jest-message-util@29.7.0: dependencies: @@ -27906,131 +28361,137 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.1.0: + jest-message-util@30.2.0: dependencies: '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 30.0.5 + pretty-format: 30.2.0 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@4.0.0(@jest/globals@30.1.2)(jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)))(typescript@5.9.2): + jest-mock-extended@4.0.0(@jest/globals@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: - '@jest/globals': 30.1.2 - jest: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) - ts-essentials: 10.0.2(typescript@5.9.2) - typescript: 5.9.2 + '@jest/globals': 30.2.0 + jest: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) + ts-essentials: 10.0.2(typescript@5.9.3) + typescript: 5.9.3 jest-mock@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@types/node': 24.9.1 jest-util: 30.0.5 - jest-pnp-resolver@1.2.3(jest-resolve@30.1.3): + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.9.1 + jest-util: 30.2.0 + + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): optionalDependencies: - jest-resolve: 30.1.3 + jest-resolve: 30.2.0 jest-regex-util@30.0.1: {} - jest-resolve-dependencies@30.1.3: + jest-resolve-dependencies@30.2.0: dependencies: jest-regex-util: 30.0.1 - jest-snapshot: 30.1.2 + jest-snapshot: 30.2.0 transitivePeerDependencies: - supports-color - jest-resolve@30.1.3: + jest-resolve@30.2.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 - jest-pnp-resolver: 1.2.3(jest-resolve@30.1.3) - jest-util: 30.0.5 - jest-validate: 30.1.0 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 slash: 3.0.0 unrs-resolver: 1.11.1 - jest-runner@30.1.3: + jest-runner@30.2.0: dependencies: - '@jest/console': 30.1.2 - '@jest/environment': 30.1.2 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 30.0.1 - jest-environment-node: 30.1.2 - jest-haste-map: 30.1.0 - jest-leak-detector: 30.1.0 - jest-message-util: 30.1.0 - jest-resolve: 30.1.3 - jest-runtime: 30.1.3 - jest-util: 30.0.5 - jest-watcher: 30.1.3 - jest-worker: 30.1.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.1.3: + jest-runtime@30.2.0: dependencies: - '@jest/environment': 30.1.2 - '@jest/fake-timers': 30.1.2 - '@jest/globals': 30.1.2 + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 '@jest/source-map': 30.0.1 - '@jest/test-result': 30.1.3 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 cjs-module-lexer: 2.1.0 collect-v8-coverage: 1.0.2 glob: 10.4.5 graceful-fs: 4.2.11 - jest-haste-map: 30.1.0 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 jest-regex-util: 30.0.1 - jest-resolve: 30.1.3 - jest-snapshot: 30.1.2 - jest-util: 30.0.5 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@30.1.2: + jest-snapshot@30.2.0: dependencies: - '@babel/core': 7.28.3 + '@babel/core': 7.28.4 '@babel/generator': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) - '@babel/types': 7.28.2 - '@jest/expect-utils': 30.1.2 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 + '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.1.2 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.3) + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) chalk: 4.1.2 - expect: 30.1.2 + expect: 30.2.0 graceful-fs: 4.2.11 - jest-diff: 30.1.2 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-util: 30.0.5 - pretty-format: 30.0.5 - semver: 7.7.2 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 synckit: 0.11.11 transitivePeerDependencies: - supports-color @@ -28038,7 +28499,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.5.2 + '@types/node': 24.9.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -28047,52 +28508,61 @@ snapshots: jest-util@30.0.5: dependencies: '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@types/node': 24.9.1 + chalk: 4.1.2 + ci-info: 4.3.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 + + jest-util@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.9.1 chalk: 4.1.2 ci-info: 4.3.0 graceful-fs: 4.2.11 picomatch: 4.0.3 - jest-validate@30.1.0: + jest-validate@30.2.0: dependencies: '@jest/get-type': 30.1.0 - '@jest/types': 30.0.5 + '@jest/types': 30.2.0 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 - pretty-format: 30.0.5 + pretty-format: 30.2.0 - jest-watcher@30.1.3: + jest-watcher@30.2.0: dependencies: - '@jest/test-result': 30.1.3 - '@jest/types': 30.0.5 - '@types/node': 24.5.2 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.9.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.0.5 + jest-util: 30.2.0 string-length: 4.0.2 jest-worker@27.5.1: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.1.0: + jest-worker@30.2.0: dependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.5 + jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)): + jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: - '@jest/core': 30.1.3(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) - '@jest/types': 30.0.5 + '@jest/core': 30.2.0(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) + '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + jest-cli: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -28197,7 +28667,7 @@ snapshots: acorn: 8.15.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.7.2 + semver: 7.7.3 jsonc-parser@3.3.1: {} @@ -28234,7 +28704,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.2 + semver: 7.7.3 jstransformer@1.0.0: dependencies: @@ -28333,12 +28803,12 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.2.1: + lint-staged@16.2.5: dependencies: commander: 14.0.1 - listr2: 9.0.4 + listr2: 9.0.5 micromatch: 4.0.8 - nano-spawn: 1.0.3 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 @@ -28361,7 +28831,7 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 - listr2@9.0.4: + listr2@9.0.5: dependencies: cli-truncate: 5.1.0 colorette: 2.0.20 @@ -28483,7 +28953,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - lossless-json@4.2.0: {} + lossless-json@4.3.0: {} loupe@3.2.0: {} @@ -28536,7 +29006,7 @@ snapshots: libmime: 5.3.5 linkify-it: 5.0.0 mailsplit: 5.4.0 - nodemailer: 6.9.13 + nodemailer: 7.0.7 punycode.js: 2.3.1 tlds: 1.252.0 optional: true @@ -28550,7 +29020,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -28611,17 +29081,13 @@ snapshots: merge2@1.4.1: {} - meros@1.3.0(@types/node@18.18.8): - optionalDependencies: - '@types/node': 18.18.8 - - meros@1.3.0(@types/node@24.5.2): + meros@1.3.0(@types/node@24.9.1): optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 - meros@1.3.1(@types/node@24.5.2): + meros@1.3.1(@types/node@24.9.1): optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 methods@1.1.2: {} @@ -28686,11 +29152,11 @@ snapshots: minisearch@7.2.0: {} - mjml-accordion@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-accordion@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28702,11 +29168,11 @@ snapshots: - uncss optional: true - mjml-body@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-body@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28718,11 +29184,11 @@ snapshots: - uncss optional: true - mjml-button@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-button@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28734,11 +29200,11 @@ snapshots: - uncss optional: true - mjml-carousel@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-carousel@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28750,14 +29216,14 @@ snapshots: - uncss optional: true - mjml-cli@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-cli@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 chokidar: 3.6.0 glob: 10.4.5 lodash: 4.17.21 minimatch: 9.0.5 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) mjml-parser-xml: 5.0.0-alpha.4 mjml-validator: 5.0.0-alpha.4 yargs: 17.7.2 @@ -28772,11 +29238,11 @@ snapshots: - uncss optional: true - mjml-column@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-column@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28788,13 +29254,13 @@ snapshots: - uncss optional: true - mjml-core@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-core@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 cheerio: 1.0.0-rc.12 cssnano: 7.1.1(postcss@8.5.6) detect-node: 2.1.0 - htmlnano: 2.1.2(cssnano@7.1.1(postcss@8.5.6))(postcss@8.5.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + htmlnano: 2.1.2(cssnano@7.1.1(postcss@8.5.6))(postcss@8.5.6)(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) juice: 10.0.1 lodash: 4.17.21 mjml-parser-xml: 5.0.0-alpha.4 @@ -28812,11 +29278,11 @@ snapshots: - uncss optional: true - mjml-divider@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-divider@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28828,11 +29294,11 @@ snapshots: - uncss optional: true - mjml-group@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-group@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28844,11 +29310,11 @@ snapshots: - uncss optional: true - mjml-head-attributes@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-attributes@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28860,11 +29326,11 @@ snapshots: - uncss optional: true - mjml-head-breakpoint@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-breakpoint@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28876,11 +29342,11 @@ snapshots: - uncss optional: true - mjml-head-font@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-font@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28892,11 +29358,11 @@ snapshots: - uncss optional: true - mjml-head-html-attributes@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-html-attributes@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28908,11 +29374,11 @@ snapshots: - uncss optional: true - mjml-head-preview@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-preview@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28924,11 +29390,11 @@ snapshots: - uncss optional: true - mjml-head-style@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-style@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28940,11 +29406,11 @@ snapshots: - uncss optional: true - mjml-head-title@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head-title@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28956,11 +29422,11 @@ snapshots: - uncss optional: true - mjml-head@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-head@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28972,11 +29438,11 @@ snapshots: - uncss optional: true - mjml-hero@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-hero@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -28988,11 +29454,11 @@ snapshots: - uncss optional: true - mjml-image@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-image@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29004,11 +29470,11 @@ snapshots: - uncss optional: true - mjml-navbar@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-navbar@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29028,34 +29494,34 @@ snapshots: lodash: 4.17.21 optional: true - mjml-preset-core@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-preset-core@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 - mjml-accordion: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-body: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-button: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-carousel: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-column: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-divider: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-group: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-attributes: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-breakpoint: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-font: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-html-attributes: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-preview: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-style: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-head-title: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-hero: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-image: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-navbar: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-raw: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-section: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-social: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-spacer: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-table: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-text: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-wrapper: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-accordion: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-body: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-button: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-carousel: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-column: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-divider: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-group: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-attributes: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-breakpoint: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-font: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-html-attributes: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-preview: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-style: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-head-title: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-hero: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-image: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-navbar: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-raw: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-section: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-social: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-spacer: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-table: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-text: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-wrapper: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29067,11 +29533,11 @@ snapshots: - uncss optional: true - mjml-raw@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-raw@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29083,11 +29549,11 @@ snapshots: - uncss optional: true - mjml-section@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-section@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29099,11 +29565,11 @@ snapshots: - uncss optional: true - mjml-social@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-social@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29115,11 +29581,11 @@ snapshots: - uncss optional: true - mjml-spacer@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-spacer@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29131,11 +29597,11 @@ snapshots: - uncss optional: true - mjml-table@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-table@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29147,11 +29613,11 @@ snapshots: - uncss optional: true - mjml-text@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-text@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29168,12 +29634,12 @@ snapshots: '@babel/runtime': 7.28.3 optional: true - mjml-wrapper@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml-wrapper@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 lodash: 4.17.21 - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-section: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-section: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) transitivePeerDependencies: - encoding - purgecss @@ -29185,12 +29651,12 @@ snapshots: - uncss optional: true - mjml@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2): + mjml@5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.3 - mjml-cli: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) - mjml-preset-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.2) + mjml-cli: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) + mjml-preset-core: 5.0.0-alpha.4(relateurl@0.2.7)(terser@5.39.2)(typescript@5.9.3) mjml-validator: 5.0.0-alpha.4 transitivePeerDependencies: - encoding @@ -29218,7 +29684,7 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - mocha@11.7.2: + mocha@11.7.4: dependencies: browser-stdout: 1.3.1 chokidar: 4.0.3 @@ -29228,6 +29694,7 @@ snapshots: find-up: 5.0.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: 9.0.5 @@ -29285,7 +29752,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nano-spawn@1.0.3: {} + nano-spawn@2.0.0: {} nanoid@3.3.11: {} @@ -29316,11 +29783,11 @@ snapshots: node-abi@3.62.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abi@3.75.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abort-controller@3.1.1: {} @@ -29365,15 +29832,12 @@ snapshots: node-releases@2.0.19: {} - node-releases@2.0.21: {} + node-releases@2.0.26: {} - nodemailer@6.9.13: + nodemailer@7.0.7: optional: true - nodemailer@6.9.15: - optional: true - - nodemailer@7.0.6: {} + nodemailer@7.0.9: {} normalize-package-data@2.5.0: dependencies: @@ -29783,6 +30247,8 @@ snapshots: path-to-regexp@8.2.0: {} + path-to-regexp@8.3.0: {} + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -29926,29 +30392,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3)): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.1 - optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3) - - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2)): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.1 - optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2) - - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.1 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) postcss-load-config@6.0.1(jiti@2.6.0)(postcss@8.5.6)(yaml@2.8.1): dependencies: @@ -30125,9 +30575,9 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-node@5.8.8: + posthog-node@5.10.0: dependencies: - '@posthog/core': 1.1.0 + '@posthog/core': 1.3.0 posthtml-parser@0.11.0: dependencies: @@ -30221,6 +30671,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + preview-email@3.1.0: dependencies: ci-info: 3.9.0 @@ -30228,7 +30684,7 @@ snapshots: fixpack: 4.0.0 get-port: 5.1.1 mailparser: 3.7.1 - nodemailer: 6.9.15 + nodemailer: 7.0.7 open: 7.4.2 p-event: 4.2.0 p-wait-for: 3.2.0 @@ -30236,12 +30692,12 @@ snapshots: uuid: 9.0.1 optional: true - prisma@6.16.2(typescript@5.9.2): + prisma@6.17.1(typescript@5.9.3): dependencies: - '@prisma/config': 6.16.2 - '@prisma/engines': 6.16.2 + '@prisma/config': 6.17.1 + '@prisma/engines': 6.17.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - magicast @@ -30603,8 +31059,6 @@ snapshots: remove-trailing-spaces@1.0.9: {} - repeat-string@1.6.1: {} - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -30629,6 +31083,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.8: dependencies: is-core-module: 2.13.1 @@ -30674,10 +31134,10 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-polyfill-node@0.13.0(rollup@4.52.2): + rollup-plugin-polyfill-node@0.13.0(rollup@4.52.5): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.52.2) - rollup: 4.52.2 + '@rollup/plugin-inject': 5.0.5(rollup@4.52.5) + rollup: 4.52.5 rollup-pluginutils@2.8.2: dependencies: @@ -30719,6 +31179,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.1 @@ -30840,7 +31328,7 @@ snapshots: semver@7.7.1: {} - semver@7.7.2: {} + semver@7.7.3: {} send@0.19.0: dependencies: @@ -31249,7 +31737,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -31413,9 +31901,9 @@ snapshots: transitivePeerDependencies: - supports-color - superjson@2.2.2: + superjson@2.2.3: dependencies: - copy-anything: 3.0.5 + copy-anything: 4.0.5 supertest@7.1.4: dependencies: @@ -31461,7 +31949,7 @@ snapshots: transitivePeerDependencies: - openapi-types - swagger-ui-dist@5.21.0: + swagger-ui-dist@5.29.4: dependencies: '@scarf/scarf': 1.4.0 @@ -31503,7 +31991,7 @@ snapshots: systemjs@6.15.1: {} - tailwindcss@3.3.6(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3)): + tailwindcss@3.3.6(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -31522,7 +32010,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) postcss-nested: 6.0.1(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -31530,34 +32018,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2)): - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2)) - postcss-nested: 6.2.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - resolve: 1.22.10 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)): + tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -31576,7 +32037,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -31626,17 +32087,17 @@ snapshots: minimatch: 3.1.2 resolve-from: 2.0.0 - terser-webpack-plugin@5.3.14(@swc/core@1.4.2)(esbuild@0.25.10)(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)): + terser-webpack-plugin@5.3.14(@swc/core@1.4.2)(esbuild@0.25.11)(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)): dependencies: '@jridgewell/trace-mapping': 0.3.30 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.39.2 - webpack: 5.100.2(@swc/core@1.4.2)(esbuild@0.25.10) + webpack: 5.100.2(@swc/core@1.4.2)(esbuild@0.25.11) optionalDependencies: '@swc/core': 1.4.2 - esbuild: 0.25.10 + esbuild: 0.25.11 optional: true terser-webpack-plugin@5.3.14(@swc/core@1.4.2)(webpack@5.100.2(@swc/core@1.4.2)): @@ -31774,59 +32235,55 @@ snapshots: tree-kill@1.2.2: {} - ts-api-utils@1.4.3(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@1.4.3(typescript@5.9.3): dependencies: - typescript: 5.8.3 + typescript: 5.9.3 - ts-api-utils@2.1.0(typescript@5.9.2): + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-essentials@10.0.2(typescript@5.9.2): + ts-essentials@10.0.2(typescript@5.9.3): optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-interface-checker@0.1.13: {} - ts-jest@29.4.4(@babel/core@7.28.4)(@jest/transform@30.1.2)(@jest/types@30.0.5)(babel-jest@30.1.2(@babel/core@7.28.4))(jest-util@30.0.5)(jest@30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)))(typescript@5.9.2): + ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 30.1.3(@types/node@24.5.2)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2)) + jest: 30.2.0(@types/node@24.9.1)(ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.2 + semver: 7.7.3 type-fest: 4.41.0 - typescript: 5.9.2 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.28.4 - '@jest/transform': 30.1.2 - '@jest/types': 30.0.5 - babel-jest: 30.1.2(@babel/core@7.28.4) - jest-util: 30.0.5 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) + jest-util: 30.2.0 - ts-loader@9.5.4(typescript@5.9.2)(webpack@5.100.2(@swc/core@1.4.2)): + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2(@swc/core@1.4.2)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.1 micromatch: 4.0.8 - semver: 7.7.2 + semver: 7.7.3 source-map: 0.7.4 - typescript: 5.9.2 + typescript: 5.9.3 webpack: 5.100.2(@swc/core@1.4.2) ts-log@2.2.5: {} ts-log@2.2.7: {} - ts-node-dev@2.0.0(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2): + ts-node-dev@2.0.0(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3): dependencies: chokidar: 3.6.0 dynamic-dedupe: 0.3.0 @@ -31836,71 +32293,29 @@ snapshots: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2) + ts-node: 10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3) tsconfig: 7.0.0 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - ts-node@10.9.2(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.8 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.2 - optional: true - - ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.0 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.9.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.4.2 - optional: true - - ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.5.2)(typescript@5.9.2): + ts-node@10.9.2(@swc/core@1.4.2)(@types/node@24.9.1)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.5.2 + '@types/node': 24.9.1 acorn: 8.12.1 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -31942,7 +32357,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(@swc/core@1.4.2)(jiti@2.6.0)(postcss@8.5.6)(typescript@5.9.2)(yaml@2.8.1): + tsup@8.5.0(@swc/core@1.4.2)(jiti@2.6.0)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.8) cac: 6.7.14 @@ -31955,7 +32370,7 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.6.0)(postcss@8.5.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.52.2 + rollup: 4.52.5 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 @@ -31964,17 +32379,17 @@ snapshots: optionalDependencies: '@swc/core': 1.4.2 postcss: 8.5.6 - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - tsutils@3.21.0(typescript@5.8.3): + tsutils@3.21.0(typescript@5.9.3): dependencies: tslib: 1.14.1 - typescript: 5.8.3 + typescript: 5.9.3 tunnel-agent@0.6.0: dependencies: @@ -32074,7 +32489,7 @@ snapshots: typescript@5.8.3: {} - typescript@5.9.2: {} + typescript@5.9.3: {} ua-parser-js@1.0.40: {} @@ -32113,13 +32528,9 @@ snapshots: unc-path-regex@0.1.2: {} - undici-types@5.26.5: {} - - undici-types@7.10.0: {} - - undici-types@7.12.0: {} + undici-types@7.16.0: {} - unhead@2.0.17: + unhead@2.0.19: dependencies: hookable: 5.5.3 @@ -32166,23 +32577,23 @@ snapshots: unpipe@1.0.0: {} - unplugin-fonts@1.1.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)): + unplugin-fonts@1.1.1(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): dependencies: fast-glob: 3.3.2 unplugin: 1.10.1 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) - unplugin-fonts@1.4.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + unplugin-fonts@1.4.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: fast-glob: 3.3.3 unplugin: 2.3.5 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - unplugin-fonts@1.4.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + unplugin-fonts@1.4.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: fast-glob: 3.3.3 unplugin: 2.3.5 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) unplugin-icons@0.14.9(@vue/compiler-sfc@3.5.22)(vue-template-compiler@2.7.16): dependencies: @@ -32223,7 +32634,7 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.3 - unplugin-vue-components@0.21.0(@babel/parser@7.28.4)(esbuild@0.25.10)(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.8.3))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)): + unplugin-vue-components@0.21.0(@babel/parser@7.28.4)(esbuild@0.25.11)(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue@3.5.22(typescript@5.9.3))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -32234,8 +32645,8 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.25.10)(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)) - vue: 3.5.22(typescript@5.8.3) + unplugin: 0.7.2(esbuild@0.25.11)(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: '@babel/parser': 7.28.4 transitivePeerDependencies: @@ -32245,7 +32656,7 @@ snapshots: - vite - webpack - unplugin-vue-components@29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.2)): + unplugin-vue-components@29.0.0(@babel/parser@7.28.4)(vue@3.5.22(typescript@5.9.3)): dependencies: chokidar: 3.6.0 debug: 4.4.1 @@ -32255,23 +32666,23 @@ snapshots: tinyglobby: 0.2.14 unplugin: 2.3.5 unplugin-utils: 0.2.5 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: '@babel/parser': 7.28.4 transitivePeerDependencies: - supports-color - unplugin@0.7.2(esbuild@0.25.10)(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)): + unplugin@0.7.2(esbuild@0.25.11)(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)): dependencies: acorn: 8.12.1 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.4.6 optionalDependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 rollup: 2.79.2 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) - webpack: 5.100.2(@swc/core@1.4.2)(esbuild@0.25.10) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) + webpack: 5.100.2(@swc/core@1.4.2)(esbuild@0.25.11) unplugin@0.9.6: dependencies: @@ -32352,9 +32763,9 @@ snapshots: picocolors: 1.1.1 optional: true - update-browserslist-db@1.1.3(browserslist@4.26.2): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.26.2 + browserslist: 4.26.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -32411,7 +32822,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 @@ -32437,44 +32848,23 @@ snapshots: dependencies: zod: 3.25.32 - vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: birpc: 2.5.0 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-hot-client: 2.1.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - - vite-hot-client@2.1.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): - dependencies: - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - vite-node@3.2.4(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vite-hot-client@2.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-node@3.2.4(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -32489,7 +32879,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.10.3(eslint@8.57.0)(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.2)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-tsc@1.8.8(typescript@5.9.2)): + vite-plugin-checker@0.10.3(eslint@8.57.0)(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-tsc@1.8.8(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -32499,78 +32889,78 @@ snapshots: strip-ansi: 7.1.0 tiny-invariant: 1.3.3 tinyglobby: 0.2.14 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) vscode-uri: 3.1.0 optionalDependencies: eslint: 8.57.0 meow: 13.2.0 optionator: 0.9.4 - typescript: 5.9.2 - vue-tsc: 1.8.8(typescript@5.9.2) + typescript: 5.9.3 + vue-tsc: 1.8.8(typescript@5.9.3) - vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 eslint: 8.57.0 rollup: 2.79.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-eslint@1.8.1(eslint@8.57.0)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 eslint: 8.57.0 rollup: 2.79.2 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-eslint@1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-eslint@1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) rollup: 2.79.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-eslint@1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-eslint@1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) rollup: 2.79.2 - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-eslint@1.8.1(eslint@9.36.0(jiti@2.6.0))(vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-eslint@1.8.1(eslint@9.37.0(jiti@2.6.0))(vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 '@types/eslint': 8.56.12 - eslint: 9.36.0(jiti@2.6.0) + eslint: 9.37.0(jiti@2.6.0) rollup: 2.79.2 - vite: 7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-fonts@0.7.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-fonts@0.7.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: fast-glob: 3.3.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-fonts@0.7.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-fonts@0.7.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: fast-glob: 3.3.2 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-html-config@1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)): + vite-plugin-html-config@1.0.11(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): dependencies: - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) - vite-plugin-html-config@2.0.2(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-html-config@2.0.2(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-html-config@2.0.2(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-html-config@2.0.2(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-inspect@0.7.38(rollup@2.79.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)): + vite-plugin-inspect@0.7.38(rollup@2.79.2)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.2(rollup@2.79.2) @@ -32580,12 +32970,12 @@ snapshots: open: 9.1.0 picocolors: 1.1.0 sirv: 2.0.4 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-inspect@11.3.3(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-inspect@11.3.3(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: ansis: 4.1.0 debug: 4.4.3(supports-color@8.1.1) @@ -32595,8 +32985,8 @@ snapshots: perfect-debounce: 2.0.0 sirv: 3.0.1 unplugin-utils: 0.3.0 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-dev-rpc: 1.1.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -32607,7 +32997,7 @@ snapshots: sitemap: 8.0.0 xml-formatter: 3.6.7 - vite-plugin-pages@0.26.0(@vue/compiler-sfc@3.5.22)(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)): + vite-plugin-pages@0.26.0(@vue/compiler-sfc@3.5.22)(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): dependencies: '@types/debug': 4.1.12 debug: 4.3.7 @@ -32617,14 +33007,14 @@ snapshots: json5: 2.2.3 local-pkg: 0.4.3 picocolors: 1.1.0 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) yaml: 2.5.1 optionalDependencies: '@vue/compiler-sfc': 3.5.22 transitivePeerDependencies: - supports-color - vite-plugin-pages@0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2))): + vite-plugin-pages@0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3))): dependencies: '@types/debug': 4.1.12 debug: 4.4.1 @@ -32635,15 +33025,15 @@ snapshots: micromatch: 4.0.8 picocolors: 1.1.1 tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) yaml: 2.8.1 optionalDependencies: '@vue/compiler-sfc': 3.5.22 - vue-router: 4.5.1(vue@3.5.22(typescript@5.9.2)) + vue-router: 4.6.3(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite-plugin-pages@0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2))): + vite-plugin-pages@0.33.1(@vue/compiler-sfc@3.5.22)(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3))): dependencies: '@types/debug': 4.1.12 debug: 4.4.1 @@ -32654,168 +33044,134 @@ snapshots: micromatch: 4.0.8 picocolors: 1.1.1 tinyglobby: 0.2.14 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) yaml: 2.8.1 optionalDependencies: '@vue/compiler-sfc': 3.5.22 - vue-router: 4.5.1(vue@3.5.22(typescript@5.9.2)) + vue-router: 4.6.3(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite-plugin-pwa@0.13.1(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@6.6.0): + vite-plugin-pwa@1.1.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@6.6.0): dependencies: - debug: 4.3.7 - fast-glob: 3.3.2 + debug: 4.4.3(supports-color@8.1.1) pretty-bytes: 6.1.1 - rollup: 2.79.2 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + tinyglobby: 0.2.15 + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 6.6.0 transitivePeerDependencies: - supports-color - vite-plugin-pwa@1.0.3(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.1.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) pretty-bytes: 6.1.1 - tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + tinyglobby: 0.2.15 + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-plugin-pwa@1.0.3(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.1.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: - debug: 4.4.1 + debug: 4.4.3(supports-color@8.1.1) pretty-bytes: 6.1.1 - tinyglobby: 0.2.14 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + tinyglobby: 0.2.15 + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-plugin-static-copy@0.12.0(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2)): + vite-plugin-static-copy@0.12.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.2 fs-extra: 10.1.0 picocolors: 1.1.0 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) - vite-plugin-static-copy@3.1.2(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.4(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 - fs-extra: 11.3.1 p-map: 7.0.3 picocolors: 1.1.1 - tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + tinyglobby: 0.2.15 + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-plugin-vue-layouts@0.11.0(vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)): + vite-plugin-vue-layouts@0.11.0(vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): dependencies: debug: 4.3.7 fast-glob: 3.3.2 - vite: 6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) - vue-router: 4.5.1(vue@3.5.22(typescript@5.9.2)) + vite: 6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite-plugin-vue-layouts@0.11.0(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)))(vue@3.5.22(typescript@5.9.2)): + vite-plugin-vue-layouts@0.11.0(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): dependencies: debug: 4.3.7 fast-glob: 3.3.2 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vue: 3.5.22(typescript@5.9.2) - vue-router: 4.5.1(vue@3.5.22(typescript@5.9.2)) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite-plugin-vue-layouts@0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2))(vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)))(vue@3.5.22(typescript@5.8.3)): + vite-plugin-vue-layouts@0.7.0(vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2))(vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): dependencies: '@vue/compiler-sfc': 3.5.22 debug: 4.3.7 fast-glob: 3.3.2 - vite: 4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2) - vue: 3.5.22(typescript@5.8.3) - vue-router: 4.5.1(vue@3.5.22(typescript@5.8.3)) + vite: 4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) + vue: 3.5.22(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite@3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2): + vite@3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2): dependencies: esbuild: 0.15.18 postcss: 8.5.6 resolve: 1.22.8 rollup: 2.79.2 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 fsevents: 2.3.3 sass: 1.93.2 terser: 5.39.2 - vite@4.5.0(@types/node@18.18.8)(sass@1.93.2)(terser@5.39.2): + vite@4.5.0(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2): dependencies: esbuild: 0.18.20 postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 18.18.8 - fsevents: 2.3.3 - sass: 1.93.2 - terser: 5.39.2 - - vite@6.3.5(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): - dependencies: - esbuild: 0.25.9 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.2 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 fsevents: 2.3.3 - jiti: 2.6.0 sass: 1.93.2 terser: 5.39.2 - yaml: 2.8.1 - vite@6.3.5(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vite@6.3.5(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.2 + rollup: 4.52.5 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.5.2 - fsevents: 2.3.3 - jiti: 2.6.0 - sass: 1.93.2 - terser: 5.39.2 - yaml: 2.8.1 - - vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): - dependencies: - esbuild: 0.25.10 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.2 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.9.1 fsevents: 2.3.3 jiti: 2.6.0 sass: 1.93.2 terser: 5.39.2 yaml: 2.8.1 - vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -32824,81 +33180,38 @@ snapshots: rollup: 4.52.2 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 fsevents: 2.3.3 jiti: 2.6.0 sass: 1.93.2 terser: 5.39.2 yaml: 2.8.1 - vite@7.1.2(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vite@7.1.2(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.2 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.5.2 + '@types/node': 24.9.1 fsevents: 2.3.3 jiti: 2.6.0 sass: 1.93.2 terser: 5.39.2 yaml: 2.8.1 - vitefu@0.2.5(vite@3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2)): - optionalDependencies: - vite: 3.2.11(@types/node@24.5.2)(sass@1.93.2)(terser@5.39.2) - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.0)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - why-is-node-running: 2.3.0 + vitefu@0.2.5(vite@3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2)): optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.3.0 - jsdom: 26.1.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + vite: 3.2.11(@types/node@24.9.1)(sass@1.93.2)(terser@5.39.2) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.2)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.0)(jsdom@26.1.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -32916,12 +33229,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite: 6.3.6(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.9.1)(jiti@2.6.0)(sass@1.93.2)(terser@5.39.2)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.5.2 + '@types/node': 24.9.1 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -32944,13 +33257,9 @@ snapshots: vscode-uri@3.1.0: {} - vue-demi@0.14.10(vue@3.5.22(typescript@5.8.3)): - dependencies: - vue: 3.5.22(typescript@5.8.3) - - vue-demi@0.14.10(vue@3.5.22(typescript@5.9.2)): + vue-demi@0.14.10(vue@3.5.22(typescript@5.9.3)): dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) vue-eslint-parser@10.2.0(eslint@8.47.0): dependencies: @@ -32960,7 +33269,7 @@ snapshots: eslint-visitor-keys: 4.2.1 espree: 10.4.0 esquery: 1.6.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -32972,7 +33281,7 @@ snapshots: eslint-visitor-keys: 4.2.1 espree: 10.4.0 esquery: 1.6.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -32985,7 +33294,7 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -32998,111 +33307,81 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color - vue-i18n@11.1.12(vue@3.5.22(typescript@5.8.3)): - dependencies: - '@intlify/core-base': 11.1.12 - '@intlify/shared': 11.1.12 - '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.8.3) - optional: true - - vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.2)): + vue-i18n@11.1.12(vue@3.5.22(typescript@5.9.3)): dependencies: '@intlify/core-base': 11.1.12 '@intlify/shared': 11.1.12 '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) - vue-json-pretty@2.5.0(vue@3.5.22(typescript@5.9.2)): + vue-json-pretty@2.5.0(vue@3.5.22(typescript@5.9.3)): dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) - vue-pdf-embed@2.1.3(vue@3.5.22(typescript@5.9.2)): + vue-pdf-embed@2.1.3(vue@3.5.22(typescript@5.9.3)): dependencies: pdfjs-dist: 4.10.38 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) - vue-promise-modals@0.1.0(typescript@5.9.2): + vue-promise-modals@0.1.0(typescript@5.9.3): dependencies: - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - typescript - vue-router@4.5.1(vue@3.5.22(typescript@5.8.3)): - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.8.3) - - vue-router@4.5.1(vue@3.5.22(typescript@5.9.2)): + vue-router@4.6.3(vue@3.5.22(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 he: 1.2.0 - vue-tippy@6.7.1(vue@3.5.22(typescript@5.9.2)): + vue-tippy@6.7.1(vue@3.5.22(typescript@5.9.3)): dependencies: tippy.js: 6.3.7 - vue: 3.5.22(typescript@5.9.2) - - vue-tsc@1.8.8(typescript@5.8.3): - dependencies: - '@vue/language-core': 1.8.8(typescript@5.8.3) - '@vue/typescript': 1.8.8(typescript@5.8.3) - semver: 7.7.2 - typescript: 5.8.3 + vue: 3.5.22(typescript@5.9.3) - vue-tsc@1.8.8(typescript@5.9.2): + vue-tsc@1.8.8(typescript@5.9.3): dependencies: - '@vue/language-core': 1.8.8(typescript@5.9.2) - '@vue/typescript': 1.8.8(typescript@5.9.2) - semver: 7.7.2 - typescript: 5.9.2 + '@vue/language-core': 1.8.8(typescript@5.9.3) + '@vue/typescript': 1.8.8(typescript@5.9.3) + semver: 7.7.3 + typescript: 5.9.3 - vue-tsc@2.1.6(typescript@5.9.2): + vue-tsc@2.1.6(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.22 - '@vue/language-core': 2.1.6(typescript@5.9.2) - semver: 7.7.2 - typescript: 5.9.2 + '@vue/language-core': 2.1.6(typescript@5.9.3) + semver: 7.7.3 + typescript: 5.9.3 - vue-tsc@2.2.0(typescript@5.9.2): + vue-tsc@2.2.0(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.22 - '@vue/language-core': 2.2.0(typescript@5.9.2) - typescript: 5.9.2 - - vue@3.5.22(typescript@5.8.3): - dependencies: - '@vue/compiler-dom': 3.5.22 - '@vue/compiler-sfc': 3.5.22 - '@vue/runtime-dom': 3.5.22 - '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.8.3)) - '@vue/shared': 3.5.22 - optionalDependencies: - typescript: 5.8.3 + '@vue/language-core': 2.2.0(typescript@5.9.3) + typescript: 5.9.3 - vue@3.5.22(typescript@5.9.2): + vue@3.5.22(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.22 '@vue/compiler-sfc': 3.5.22 '@vue/runtime-dom': 3.5.22 - '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.2)) + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) '@vue/shared': 3.5.22 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 - vuedraggable-es@4.1.1(vue@3.5.22(typescript@5.9.2)): + vuedraggable-es@4.1.1(vue@3.5.22(typescript@5.9.3)): dependencies: sortablejs: 1.14.0 - vue: 3.5.22(typescript@5.9.2) + vue: 3.5.22(typescript@5.9.3) w3c-keyname@2.2.8: {} @@ -33195,7 +33474,7 @@ snapshots: - esbuild - uglify-js - webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10): + webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -33219,7 +33498,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.4.2)(esbuild@0.25.10)(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.10)) + terser-webpack-plugin: 5.3.14(@swc/core@1.4.2)(esbuild@0.25.11)(webpack@5.100.2(@swc/core@1.4.2)(esbuild@0.25.11)) watchpack: 2.4.2 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -33280,7 +33559,7 @@ snapshots: is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 + is-generator-function: 1.1.2 is-regex: 1.2.1 is-weakref: 1.1.1 isarray: 2.0.5 diff --git a/prod.Dockerfile b/prod.Dockerfile index 4774448b8df..42789e935e1 100644 --- a/prod.Dockerfile +++ b/prod.Dockerfile @@ -1,6 +1,6 @@ # This step is used to build a custom build of Caddy to prevent # vulnerable packages on the dependency chain -FROM alpine:3.22.1 AS caddy_builder +FROM alpine:3.22.2 AS caddy_builder RUN apk add --no-cache curl git && \ mkdir -p /tmp/caddy-build && \ curl -L -o /tmp/caddy-build/src.tar.gz https://github.com/caddyserver/caddy/releases/download/v2.10.2/caddy_2.10.2_src.tar.gz @@ -12,9 +12,9 @@ RUN expected="a9efa00c161922dd24650fd0bee2f4f8bb2fb69ff3e63dcc44f0694da64bb0cf" echo "✅ Caddy Source Checksum OK" || \ (echo "❌ Caddy Source Checksum failed!" && exit 1) -# Install Go 1.25.1 from GitHub releases to fix CVE-2025-47907 +# Install Go 1.25.3 from GitHub releases to fix CVE-2025-47907 ARG TARGETARCH -ENV GOLANG_VERSION=1.25.1 +ENV GOLANG_VERSION=1.25.3 # Download and install Go from the official tarball RUN case "${TARGETARCH}" in amd64) GOARCH=amd64 ;; arm64) GOARCH=arm64 ;; *) echo "Unsupported arch: ${TARGETARCH}" && exit 1 ;; esac && \ curl -fsSL "https://go.dev/dl/go${GOLANG_VERSION}.linux-${GOARCH}.tar.gz" -o go.tar.gz && \ @@ -27,6 +27,8 @@ ENV PATH="/usr/local/go/bin:${PATH}" \ WORKDIR /tmp/caddy-build RUN tar xvf /tmp/caddy-build/src.tar.gz && \ + # Patch to resolve CVE on quic-go + go get github.com/quic-go/quic-go@v0.55.0 && \ # Clean up any existing vendor directory and regenerate with updated deps rm -rf vendor && \ go mod tidy && \ @@ -39,12 +41,27 @@ RUN go build # Shared Node.js base with optimized NPM installation -FROM alpine:3.22.1 AS node_base -RUN apk add --no-cache nodejs npm curl tini bash && \ - # apk provides an outdated npm; immediately upgrade to a pinned version to avoid vulnerabilities - # TODO: Find a better method which is resistant to supply chain attacks - npm install -g npm@11.6.0 && \ - npm install -g pnpm@10.17.1 @import-meta-env/cli +FROM alpine:3.22.2 AS node_base +# Install dependencies +RUN apk add --no-cache nodejs curl bash tini ca-certificates \ + && mkdir -p /tmp/npm-install +# Set working directory for NPM installation +WORKDIR /tmp/npm-install +# Download NPM tarball +RUN curl -fsSL https://registry.npmjs.org/npm/-/npm-11.6.2.tgz -o npm.tgz +# Verify checksum +RUN expected="585f95094ee5cb2788ee11d90f2a518a7c9ef6e083fa141d0b63ca3383675a20" \ + && actual=$(sha256sum npm.tgz | cut -d' ' -f1) \ + && [ "$actual" = "$expected" ] \ + && echo "✅ NPM Tarball Checksum OK" \ + || (echo "❌ NPM Tarball Checksum failed!" && exit 1) +# Install NPM from verified tarball and global packages +RUN tar -xzf npm.tgz && \ + cd package && \ + node bin/npm-cli.js install -g npm@11.6.2 && \ + cd / && \ + rm -rf /tmp/npm-install && \ + npm install -g pnpm@10.18.3 @import-meta-env/cli @@ -183,7 +200,7 @@ COPY aio-subpath-access.Caddyfile /etc/caddy/aio-subpath-access.Caddyfile ENTRYPOINT [ "tini", "--" ] COPY --chmod=755 healthcheck.sh / -HEALTHCHECK --interval=2s CMD /bin/sh /healthcheck.sh +HEALTHCHECK --interval=2s --start-period=15s CMD /bin/sh /healthcheck.sh WORKDIR /dist/backend CMD ["node", "/usr/src/app/aio_run.mjs"]