diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b4142030..ff0c18778 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ name: CI workflow_dispatch: push: branches: - - "ci-*" + - 'ci-*' pull_request: types: - opened @@ -21,37 +21,35 @@ concurrency: permissions: {} jobs: - clippy: - name: clippy - runs-on: [ ubuntu-latest ] + cargo-checks: + name: cargo checks (fmt, clippy, check) + runs-on: ubuntu-latest steps: - - name: checkout - uses: actions/checkout@v4 - - - name: created empty dist dir + - uses: actions/checkout@v4 + - name: create empty dist dir run: | mkdir dist - - name: install dependencies (linux) - if: startsWith(runner.os,'Linux') run: | sudo apt-get update sudo apt-get install --no-install-recommends --assume-yes \ - libwebkit2gtk-4.0-dev \ + libwebkit2gtk-4.1-dev \ libappindicator3-dev \ librsvg2-dev \ patchelf \ libprotobuf-dev \ protobuf-compiler - - name: toolchain - uses: dtolnay/rust-toolchain@stable + - name: install dependencies (linux/OpenCL) + run: | + sudo apt-get install --no-install-recommends --assume-yes \ + opencl-headers \ + ocl-icd-opencl-dev + + - uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - - - name: cache cargo files and outputs - if: ${{ ( startsWith(runner.environment,'github-hosted') ) && ( ! startsWith(github.ref, 'refs/tags/v') ) }} - uses: swatinem/rust-cache@v2 + - uses: swatinem/rust-cache@v2.7.5 with: workspaces: './src-tauri -> target' @@ -60,7 +58,7 @@ jobs: run: | cargo fmt --all -- --check - - name: clippy check (with lints) + - name: clippy lint working-directory: ./src-tauri env: AIRDROP_BASE_URL: http://localhost:4000 @@ -69,22 +67,18 @@ jobs: run: | cargo install cargo-lints cargo lints clippy --all-targets --all-features + - name: cargo check + working-directory: ./src-tauri + run: | + cargo check --release --all-targets --workspace machete: name: machete - runs-on: [ ubuntu-latest ] + runs-on: ubuntu-latest steps: - - name: checkout - uses: actions/checkout@v4 - - - name: toolchain - uses: dtolnay/rust-toolchain@stable - with: - components: clippy, rustfmt - - - name: cache cargo files and outputs - if: ${{ ( startsWith(runner.environment,'github-hosted') ) && ( ! startsWith(github.ref, 'refs/tags/v') ) }} - uses: swatinem/rust-cache@v2 + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2.7.5 with: workspaces: './src-tauri -> target' @@ -94,46 +88,48 @@ jobs: cargo install cargo-machete cargo machete - cargo-check: - name: cargo-check - runs-on: [ ubuntu-latest ] + tauri-test-build: + name: tauri-build + runs-on: ubuntu-latest steps: - - name: checkout - uses: actions/checkout@v4 - + - uses: actions/checkout@v4 - name: install dependencies (linux) - if: startsWith(runner.os,'Linux') run: | sudo apt-get update sudo apt-get install --no-install-recommends --assume-yes \ - libwebkit2gtk-4.0-dev \ + libwebkit2gtk-4.1-dev \ libappindicator3-dev \ librsvg2-dev \ patchelf \ libprotobuf-dev \ protobuf-compiler - - name: toolchain - uses: dtolnay/rust-toolchain@stable - with: - components: clippy, rustfmt + - name: install dependencies (linux/OpenCL) + run: | + sudo apt-get install --no-install-recommends --assume-yes \ + opencl-headers \ + ocl-icd-opencl-dev - - name: cache cargo files and outputs - if: ${{ ( startsWith(runner.environment,'github-hosted') ) && ( ! startsWith(github.ref, 'refs/tags/v') ) }} - uses: swatinem/rust-cache@v2 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: 'npm' + - name: Install dependencies (node) + run: npm ci + - uses: dtolnay/rust-toolchain@stable + - uses: swatinem/rust-cache@v2.7.5 with: workspaces: './src-tauri -> target' - - - name: cargo check + - name: cargo tauri build working-directory: ./src-tauri run: | - cargo check --release --all-targets --workspace --locked + cargo install tauri-cli --version "^2" --locked + cargo tauri --version + cargo tauri build --ci --bundles deb file-licenses: - # disable for now - if: ${{ false }} name: file-licenses - runs-on: [ ubuntu-latest ] + runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v4 @@ -145,102 +141,3 @@ jobs: rg --version || exit 1 - name: run the license check run: ./scripts/file_license_check.sh - - i18n-checks: - name: i18n-checks - runs-on: [ ubuntu-latest ] - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: install jsonlint - run: | - sudo apt-get update - sudo apt-get install --no-install-recommends --assume-yes \ - python3-demjson - - - name: basic jsonlint - run: | - find public -iname '*.json' -print0 | \ - xargs -0 -n1 jsonlint -v - - - name: setup folder for logs - run: | - mkdir -p ${{ runner.temp }}/i18n_logs - - - name: i18n compare - continue-on-error: true - working-directory: ./public/locales - run: | - python3 ../../scripts/i18n_checker.py \ - compare --en-locale-path en \ - --base-path . \ - --search-path .. \ - --output-dir ${{ runner.temp }}/i18n_logs - - - name: i18n unused - continue-on-error: true - working-directory: ./public/locales - run: | - python3 ../../scripts/i18n_checker.py \ - unused --en-locale-path en \ - --base-path . \ - --search-path .. \ - --output-dir ${{ runner.temp }}/i18n_logs - - - name: Artifact upload for i18n checks - uses: actions/upload-artifact@v4 - with: - name: i18n-logs - path: ${{ runner.temp }}/i18n_logs - - tauri-build: - name: tauri-build - runs-on: [ ubuntu-latest ] - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: install dependencies (linux) - run: | - sudo apt-get update - sudo apt-get install --no-install-recommends --assume-yes \ - libwebkit2gtk-4.0-dev \ - libappindicator3-dev \ - librsvg2-dev \ - patchelf \ - libprotobuf-dev \ - protobuf-compiler - - - name: install dependencies (linux/OpenCL) - run: | - sudo apt-get install --no-install-recommends --assume-yes \ - opencl-headers \ - ocl-icd-opencl-dev - - - name: Node.js setup - uses: actions/setup-node@v4 - with: - node-version: lts/* - cache: 'npm' - - - name: Install dependencies (node) - run: | - npm --version - npm install - - - name: toolchain - uses: dtolnay/rust-toolchain@stable - - - name: cache cargo files and outputs - if: ${{ ( startsWith(runner.environment,'github-hosted') ) && ( ! startsWith(github.ref, 'refs/tags/v') ) }} - uses: swatinem/rust-cache@v2 - with: - workspaces: './src-tauri -> target' - - - name: cargo tauri build - working-directory: ./src-tauri - run: | - cargo install tauri-cli --version "1.6.4" - cargo tauri --version - cargo tauri build --ci --bundles deb diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ece92cf77..0bdff66c1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,20 +2,18 @@ name: Lint on: pull_request jobs: - run-linters: - name: Run linters - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: lts/* - - name: Install Node.js dependencies - run: npm ci - - name: check lint/prettier errors - run: npm run lint - - name: check taplo - run: npm run lint:taplo \ No newline at end of file + run-linters: + name: Run linters + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + cache: 'npm' + node-version: lts/* + - name: Install Node.js dependencies + run: npm ci + - name: check lint/prettier errors + run: npm run lint + - name: check taplo + run: npm run lint:taplo diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 000000000..c55755291 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,83 @@ +--- +name: PR +on: + pull_request: + types: + - opened + - reopened + - edited + - synchronize + +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/v') || github.ref != 'refs/heads/development' || github.ref != 'refs/heads/nextnet' || github.ref != 'refs/heads/stagenet' }} + +permissions: {} + +jobs: + check-signed-commits: + name: Check signed commits + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - uses: 1Password/check-signed-commits-action@v1 + check-title: + name: Check title + runs-on: ubuntu-latest + steps: + - name: Install Dependencies + run: | + npm install -g @commitlint/cli @commitlint/config-conventional + echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js + - name: Lint Title + env: + PR_TITLE: ${{github.event.pull_request.title}} + run: | + echo "$PR_TITLE" | commitlint + check-i18n: + name: Check i18n + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install jsonlint + run: | + sudo apt-get update + sudo apt-get install --no-install-recommends --assume-yes \ + python3-demjson + + - name: Basic jsonlint + run: | + find public -iname '*.json' -print0 | \ + xargs -0 -n1 jsonlint -v + + - name: setup folder for logs + run: | + mkdir -p ${{ runner.temp }}/i18n_logs + + - name: i18n compare + continue-on-error: true + working-directory: ./public/locales + run: | + python3 ../../scripts/i18n_checker.py \ + compare --en-locale-path en \ + --base-path . \ + --search-path .. \ + --output-dir ${{ runner.temp }}/i18n_logs + + - name: i18n unused + continue-on-error: true + working-directory: ./public/locales + run: | + python3 ../../scripts/i18n_checker.py \ + unused --en-locale-path en \ + --base-path . \ + --search-path .. \ + --output-dir ${{ runner.temp }}/i18n_logs + + - name: Artifact upload for i18n checks + uses: actions/upload-artifact@v4 + with: + name: i18n-logs + path: ${{ runner.temp }}/i18n_logs diff --git a/.github/workflows/pr_signed_commits_check.yml b/.github/workflows/pr_signed_commits_check.yml deleted file mode 100644 index 2024a9fb3..000000000 --- a/.github/workflows/pr_signed_commits_check.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -# Checks if the comments are signed or not -name: PR - Signed commits check - -'on': - pull_request_target - -permissions: {} - -jobs: - check-signed-commits: - name: Check signed commits in PR - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - name: Check signed commits in PR - uses: 1Password/check-signed-commits-action@v1 diff --git a/.github/workflows/pr_title.yml b/.github/workflows/pr_title.yml deleted file mode 100644 index 23c0688ed..000000000 --- a/.github/workflows/pr_title.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -# Checks that PR titles conform to Conventional Commits -# See https://www.conventionalcommits.org/en/v1.0.0/ for more information -name: PR - -'on': - pull_request: - types: - - opened - - reopened - - edited - - synchronize - -permissions: {} - -jobs: - check-title: - runs-on: ubuntu-latest - steps: - - name: install - run: | - npm install -g @commitlint/cli @commitlint/config-conventional - echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js - - name: lint - env: - PR_TITLE: ${{github.event.pull_request.title}} - run: | - echo "$PR_TITLE" | commitlint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ec5a27ae..3e0f8818a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,25 +1,22 @@ --- name: Release -'on': +on: push: paths-ignore: - '**/*.md' - # tags: - # - 'v[0-9]+.[0-9]+.[0-9]+' branches: - 'release' - 'beta' - 'build-*' schedule: - - cron: "05 00 * * *" + - cron: '05 00 * * *' workflow_dispatch: concurrency: # https://docs.github.com/en/actions/examples/using-concurrency-expressions-and-a-test-matrix group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/v') || github.ref != 'refs/heads/main' || github.ref != 'refs/heads/release' }} - permissions: {} env: @@ -34,33 +31,29 @@ jobs: fail-fast: false matrix: include: - - platform: 'ubuntu-20.04' + - platform: 'ubuntu-22.04' + args: '' + - platform: 'windows-latest' args: '' - - platform: 'windows-2019' - args: '--bundles msi,updater' - platform: 'macos-latest' args: '--target universal-apple-darwin' - runs-on: ${{ matrix.platform }} steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: beta builds - Install dependencies (windows) [yq] + - uses: actions/checkout@v4 + - name: BETA Builds - Install dependencies (windows) [yq] if: ${{ startsWith(runner.os,'Windows') }} run: | choco upgrade yq -y - - - name: beta builds - Install dependencies (linux) [yq] + - name: BETA Builds - Install dependencies (linux) [yq] if: ${{ startsWith(runner.os,'Linux') }} shell: bash run: | sudo bash ./scripts/check-get-yq.sh - - name: Set environment variables for beta builds + - name: BETA Builds - Set environment variables if: ${{ ( github.event_name == 'schedule' ) || ( ! startsWith(github.ref, 'refs/heads/release') ) }} env: - BETA_STRING: "(Beta)" + BETA_STRING: '(Beta)' AIRDROP_BASE_URL: ${{ secrets.BETA_AIRDROP_BASE_URL }} AIRDROP_API_BASE_URL: ${{ secrets.BETA_AIRDROP_API_BASE_URL }} AIRDROP_TWITTER_AUTH_URL: ${{ secrets.BETA_AIRDROP_TWITTER_AUTH_URL }} @@ -73,25 +66,21 @@ jobs: echo "AIRDROP_API_BASE_URL=${{ env.AIRDROP_API_BASE_URL }}" >> $GITHUB_ENV echo "AIRDROP_TWITTER_AUTH_URL=${{ env.AIRDROP_TWITTER_AUTH_URL }}" >> $GITHUB_ENV echo "TS_FEATURES=release-ci-beta, airdrop-env" >> $GITHUB_ENV - #export BETA_DATE=$(date +%Y-%m-%d) # numeric-only and cannot be greater than 65535 for msi target - export BETA_DATE=4$(date +%m%d) + export BETA_DATE=$(date +%m%d) cd "${GITHUB_WORKSPACE}/src-tauri" echo "releaseName=Tari Universe ${{ env.BETA_STRING }} v__VERSION__-${BETA_DATE}" >> $GITHUB_ENV # Don't mess with the double quotes and inner escaped quotes - yq eval ".package.productName = \"Tari Universe ${{ env.BETA_STRING }}\"" -i tauri.conf.json - yq eval ".package.version += \"-${BETA_DATE}\"" -i tauri.conf.json - yq eval ".tauri.windows[0].title = \"Tari Universe ${{ env.BETA_STRING }} | Testnet\"" -i tauri.conf.json - yq eval ".tauri.bundle.identifier = \"com.tari.universe.beta\"" -i tauri.conf.json - yq eval ".tauri.updater.endpoints = [\"https://raw.githubusercontent.com/tari-project/universe/main/.updater/beta-latest.json\"]" \ + yq eval ".productName = \"Tari Universe ${{ env.BETA_STRING }} - ${BETA_DATE} \"" -i tauri.conf.json + yq eval ".mainBinaryName = \"Tari Universe ${{ env.BETA_STRING }} - ${BETA_DATE} \"" -i tauri.conf.json + yq eval ".app.windows[0].title = \"Tari Universe ${{ env.BETA_STRING }} - ${BETA_DATE} | Testnet\"" -i tauri.conf.json + yq eval ".app.windows[1].title = \"Tari Universe ${{ env.BETA_STRING }} - ${BETA_DATE} | Testnet\"" -i tauri.conf.json + yq eval ".identifier = \"com.tari.universe.beta\"" -i tauri.conf.json + yq eval ".plugins.updater.endpoints = [\"https://raw.githubusercontent.com/tari-project/universe/main/.updater/beta-latest.json\"]" \ -i tauri.conf.json cat tauri.conf.json - sed -i.bak -E "s/^version\s*=\s*\"([0-9]+\.[0-9]+\.[0-9]+)\"/version = \"\1-${BETA_DATE}\"/" \ - Cargo.toml - cat Cargo.toml sed -i.bak -e "s/\"icons\//\"beta-icons\//g" tauri.conf.json - - - name: Set environment variables for RELEASE builds + - name: RELEASE Builds - Set environment variables if: ${{ startsWith(github.ref, 'refs/heads/release') }} shell: bash run: | @@ -104,59 +93,49 @@ jobs: echo "TARI_TARGET_NETWORK=nextnet" >> $GITHUB_ENV cd "${GITHUB_WORKSPACE}/src-tauri" # Don't mess with the double quotes and inner escaped quotes - yq eval ".package.productName = \"Tari Universe\"" -i tauri.conf.json - yq eval ".tauri.windows[0].title = \"Tari Universe | Testnet\"" -i tauri.conf.json - yq eval ".tauri.bundle.identifier = \"com.tari.universe\"" -i tauri.conf.json - yq eval ".tauri.updater.endpoints = [\"https://raw.githubusercontent.com/tari-project/universe/main/.updater/latest.json\"]" \ + yq eval ".productName = \"Tari Universe\"" -i tauri.conf.json + yq eval ".mainBinaryName = \"Tari Universe\"" -i tauri.conf.json + yq eval ".app.windows[0].title = \"Tari Universe | Testnet\"" -i tauri.conf.json + yq eval ".identifier = \"com.tari.universe\"" -i tauri.conf.json + yq eval ".plugins.updater.endpoints = [\"https://raw.githubusercontent.com/tari-project/universe/main/.updater/latest.json\", \"https://cdn-universe.tari.com/tari-project/universe/updater/latest.json\"]" \ -i tauri.conf.json - - name: Node.js setup - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: node-version: lts/* cache: 'npm' - - name: Rust setup (linux) - if: startsWith(runner.os,'Linux') - uses: dtolnay/rust-toolchain@stable - env: - RUSTUP_PERMIT_COPY_RENAME: true - with: - toolchain: stable - target: aarch64-unknown-linux-gnu - - - name: Rust setup (macOS) - if: startsWith(runner.os,'macOS') + - name: Rust Setup uses: dtolnay/rust-toolchain@stable with: - target: aarch64-apple-darwin,x86_64-apple-darwin + targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }} - - name: Cache cargo files and outputs + - name: Cache Cargo files and outputs if: ${{ ( ! startsWith(github.ref, 'refs/heads/release') ) && ( ! startsWith(github.ref, 'refs/tags/v') ) }} uses: swatinem/rust-cache@v2 with: workspaces: './src-tauri -> target' - - name: Install dependencies (linux) + - name: Install Dependencies - Linux if: startsWith(runner.os,'Linux') run: | sudo apt-get update sudo apt-get install --no-install-recommends --assume-yes \ - libwebkit2gtk-4.0-dev \ + libwebkit2gtk-4.1-dev \ libappindicator3-dev \ librsvg2-dev \ patchelf \ libprotobuf-dev \ protobuf-compiler - - name: Install dependencies (linux/OpenCL) + - name: Install Dependencies - Linux/OpenCL if: startsWith(runner.os,'Linux') run: | sudo apt-get install --no-install-recommends --assume-yes \ opencl-headers \ ocl-icd-opencl-dev - - name: Install dependencies (macOS) + - name: Install Dependencies - macOS if: startsWith(runner.os,'macOS') run: | # openssl, cmake and autoconf already installed @@ -168,25 +147,25 @@ jobs: rustup toolchain install stable-x86_64-apple-darwin --force-non-host rustup toolchain install stable-aarch64-apple-darwin --force-non-host - - name: Install dependencies (windows) + - name: Install Dependencies - Windows if: startsWith(runner.os,'Windows') run: | vcpkg.exe install sqlite3:x64-windows zlib:x64-windows choco upgrade protoc -y - - name: Install dependencies (windows/OpenCL) + - name: Install Dependencies - Windows/OpenCL if: startsWith(runner.os,'Windows') run: | vcpkg.exe --triplet=x64-windows install opencl - - name: Set environment variables (windows) + - name: Set environment variables - Windows if: startsWith(runner.os,'Windows') shell: bash run: | echo "SQLITE3_LIB_DIR=C:\vcpkg\installed\x64-windows\lib" >> $GITHUB_ENV echo "LIB=C:\vcpkg\installed\x64-windows\lib" >> $GITHUB_ENV - - name: Azure code-signing setup (windows only) + - name: Azure Code-signing Setup - Windows Only if: ${{ ( startsWith(runner.os,'Windows') ) && ( env.AZURE_TENANT_ID != '' ) }} shell: bash env: @@ -195,19 +174,19 @@ jobs: run: | cd "${GITHUB_WORKSPACE}/src-tauri" echo "{}" | \ - jq '.tauri .bundle .windows += {"signCommand": "${{ env.WINDOWS_SIGN_COMMAND }}"}' > \ + jq '.bundle .windows += {"signCommand": "${{ env.WINDOWS_SIGN_COMMAND }}"}' > \ ./tauri.windows.conf.json cat ./tauri.windows.conf.json cargo install trusted-signing-cli@0.3.0 --locked - - name: Install dependencies (node) + - name: Install Dependencies - Node run: | npm --version npm install - - name: Build Tauri apps + - name: Build Tauri Apps id: build - uses: tauri-apps/tauri-action@v0.5.15 + uses: tauri-apps/tauri-action@v0.5.17 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE || secrets.AZURE_TENANT_ID }} @@ -220,30 +199,30 @@ jobs: AZURE_TENANT_ID: ${{ startsWith(runner.os,'Windows') && secrets.AZURE_TENANT_ID }} AZURE_CLIENT_ID: ${{ startsWith(runner.os,'Windows') && secrets.AZURE_CLIENT_ID }} AZURE_CLIENT_SECRET: ${{ startsWith(runner.os,'Windows') && secrets.AZURE_CLIENT_SECRET }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} NODE_OPTIONS: '--max_old_space_size=4096' with: tagName: ${{ env.tagName }} releaseName: ${{ env.releaseName }} releaseBody: 'Tari Universe - See the assets to download this version and install' - # releaseId: ${{ env.releaseId }} releaseDraft: true prerelease: true includeDebug: false includeRelease: true args: ${{ matrix.args }} --features "${{ env.TS_FEATURES }}" - - name: Debug step {artifactPaths} - if: ${{ false }} + - name: Debug Step - artifactPaths + if: ${{ ( github.event_name == 'schedule' ) || ( ! startsWith(github.ref, 'refs/heads/release') ) }} continue-on-error: true env: artifactPaths: ${{ steps.build.outputs.artifactPaths }} shell: bash - run: echo "Artifact ID from previous job is $artifactPaths" + run: | + echo "Artifact paths:\n ${{ join(fromJSON(steps.build.outputs.artifactPaths), '\n') }}" - - name: Upload none releases + - name: BETA Builds - Upload assets if: ${{ ( github.event_name == 'schedule' ) || ( ! startsWith(github.ref, 'refs/heads/release') ) }} uses: actions/upload-artifact@v4 with: diff --git a/.license.ignore b/.license.ignore index e69de29bb..8eaf95ff8 100644 --- a/.license.ignore +++ b/.license.ignore @@ -0,0 +1,2 @@ +./public/assets/glApp.js +./dist-isolation/index.js \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 8934690e3..1564a3fb2 100644 --- a/.prettierrc +++ b/.prettierrc @@ -5,5 +5,13 @@ "singleQuote": true, "bracketSpacing": true, "printWidth": 120, - "endOfLine": "auto" -} \ No newline at end of file + "endOfLine": "auto", + "overrides": [ + { + "files": "*.yml", + "options": { + "tabWidth": 2 + } + } + ] +} diff --git a/.updater/alpha-latest.json b/.updater/alpha-latest.json index 9fe1ee5cf..985988009 100644 --- a/.updater/alpha-latest.json +++ b/.updater/alpha-latest.json @@ -1,23 +1,23 @@ { - "version": "0.1.0", - "notes": "Tari Universe - See the assets to download this version and install", - "pub_date": "2024-10-01T10:21:09.614Z", - "platforms": { - "linux-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGJtelJoWTkrQVpxS3NkRHZpaTgwaGc0K0ZleTEwb2RwQWlyNmRhRnNDaVBFMDI0OUhmUFEwNmtvV2dyRGRlOUlINmlERXlJNTduY2NpdU9XQytqWHdJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3MzY5CWZpbGU6dGFyaS11bml2ZXJzZV8wLjUuNl9hbWQ2NC5BcHBJbWFnZS50YXIuZ3oKZEN5ODMrREZycHlEaTZqN2pQM090Uk5lWHZkMnlEWXhYUFgwSDV2bjRuaVlGWHBzMW53WHFvYXY5b2ptSUUvUkUzU0IydXp2aHVGRWtKVUpscW9PQmc9PQo=", - "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/tari-universe_0.5.6_amd64.AppImage.tar.gz" - }, - "darwin-aarch64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFZkV2ZmdG1ZSFE1WGFPWVVSUm5SOG1Nb0hpU2ZvckZzaStEZEtsWlQ4RVQwMWRCc1l0QTFjNVNpb2x4MnJVWmtZVVJqbDlaZHVCNTE1M2t3Wkg4MkFrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3NTI3CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnRLU3NOT202VU5xQUNvUWgxVzRqNlNwZ3lKbUIxZ3I2Ukd2R3hianlRazcvU3docWllNmUxa01JUUNkcnUzeWxIK0xIN3RlQmJkdllCM05yTGswWUNnPT0K", - "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_universal.app.tar.gz" - }, - "darwin-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFZkV2ZmdG1ZSFE1WGFPWVVSUm5SOG1Nb0hpU2ZvckZzaStEZEtsWlQ4RVQwMWRCc1l0QTFjNVNpb2x4MnJVWmtZVVJqbDlaZHVCNTE1M2t3Wkg4MkFrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3NTI3CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnRLU3NOT202VU5xQUNvUWgxVzRqNlNwZ3lKbUIxZ3I2Ukd2R3hianlRazcvU3docWllNmUxa01JUUNkcnUzeWxIK0xIN3RlQmJkdllCM05yTGswWUNnPT0K", - "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_universal.app.tar.gz" - }, - "windows-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGY5RHBGU0lPVC9vL092TzF2Z1hPNEkwUnltVEJabW1JWGpwUi9EaFN6WkJydW9HMXFQQlVGYit5dmhMemQzOXA1V3BPQlNsaEpvNEl5bnhqangwS2dFPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc4MDY2CWZpbGU6VGFyaSBVbml2ZXJzZV8wLjUuNl94NjRfZW4tVVMubXNpLnppcApobm4yNGM2VDhlUjRibnl0THpZTEl1ajhzQm54dllwLzcxbzNVeU5UU2FmSXVpTVlCUmNrWWdZUDN6QjhVWVhDZGcrVDB2ekZPemFLdGFVOXNYMW5Cdz09Cg==", - "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_0.5.6_x64_en-US.msi.zip" + "version": "0.1.0", + "notes": "Tari Universe - See the assets to download this version and install", + "pub_date": "2024-10-01T10:21:09.614Z", + "platforms": { + "linux-x86_64": { + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGJtelJoWTkrQVpxS3NkRHZpaTgwaGc0K0ZleTEwb2RwQWlyNmRhRnNDaVBFMDI0OUhmUFEwNmtvV2dyRGRlOUlINmlERXlJNTduY2NpdU9XQytqWHdJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3MzY5CWZpbGU6dGFyaS11bml2ZXJzZV8wLjUuNl9hbWQ2NC5BcHBJbWFnZS50YXIuZ3oKZEN5ODMrREZycHlEaTZqN2pQM090Uk5lWHZkMnlEWXhYUFgwSDV2bjRuaVlGWHBzMW53WHFvYXY5b2ptSUUvUkUzU0IydXp2aHVGRWtKVUpscW9PQmc9PQo=", + "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/tari-universe_0.5.6_amd64.AppImage.tar.gz" + }, + "darwin-aarch64": { + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFZkV2ZmdG1ZSFE1WGFPWVVSUm5SOG1Nb0hpU2ZvckZzaStEZEtsWlQ4RVQwMWRCc1l0QTFjNVNpb2x4MnJVWmtZVVJqbDlaZHVCNTE1M2t3Wkg4MkFrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3NTI3CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnRLU3NOT202VU5xQUNvUWgxVzRqNlNwZ3lKbUIxZ3I2Ukd2R3hianlRazcvU3docWllNmUxa01JUUNkcnUzeWxIK0xIN3RlQmJkdllCM05yTGswWUNnPT0K", + "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_universal.app.tar.gz" + }, + "darwin-x86_64": { + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFZkV2ZmdG1ZSFE1WGFPWVVSUm5SOG1Nb0hpU2ZvckZzaStEZEtsWlQ4RVQwMWRCc1l0QTFjNVNpb2x4MnJVWmtZVVJqbDlaZHVCNTE1M2t3Wkg4MkFrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc3NTI3CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnRLU3NOT202VU5xQUNvUWgxVzRqNlNwZ3lKbUIxZ3I2Ukd2R3hianlRazcvU3docWllNmUxa01JUUNkcnUzeWxIK0xIN3RlQmJkdllCM05yTGswWUNnPT0K", + "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_universal.app.tar.gz" + }, + "windows-x86_64": { + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGY5RHBGU0lPVC9vL092TzF2Z1hPNEkwUnltVEJabW1JWGpwUi9EaFN6WkJydW9HMXFQQlVGYit5dmhMemQzOXA1V3BPQlNsaEpvNEl5bnhqangwS2dFPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzI3Nzc4MDY2CWZpbGU6VGFyaSBVbml2ZXJzZV8wLjUuNl94NjRfZW4tVVMubXNpLnppcApobm4yNGM2VDhlUjRibnl0THpZTEl1ajhzQm54dllwLzcxbzNVeU5UU2FmSXVpTVlCUmNrWWdZUDN6QjhVWVhDZGcrVDB2ekZPemFLdGFVOXNYMW5Cdz09Cg==", + "url": "https://github.com/tari-project/universe/releases/download/v0.5.6/Tari.Universe_0.5.6_x64_en-US.msi.zip" + } } - } -} \ No newline at end of file +} diff --git a/.updater/latest.json b/.updater/latest.json index f4ef9fc02..7c008d86e 100644 --- a/.updater/latest.json +++ b/.updater/latest.json @@ -1,23 +1,23 @@ { - "version": "0.8.2", + "version": "0.8.13", "notes": "Tari Universe - See the assets to download this version and install", - "pub_date": "2024-11-28T18:18:00.212Z", + "pub_date": "2024-12-11T17:25:53.662Z", "platforms": { "linux-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGJ0LzAra0hwQ1NodTlkRjgwb0pKb202MGt3aXFrcTdDUi9WRkc3bEJYcm5RemYycGR1MW5nUHQ1TUdzQVlvY3pKSnQ0Z2pyZmZEbFhONXkvMmEvQVFFPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMyODAwMjg5CWZpbGU6dGFyaS11bml2ZXJzZV8wLjguMl9hbWQ2NC5BcHBJbWFnZS50YXIuZ3oKUm1sVDJUNnBzbjUzbWdkNWhKaXhLTTg2ZDk1MDA1L053UXdZcEZZMGhtOTBnSFN3ejR3NHZtK3hyUDNZaE80VC9SYWlBSlBwcUJMYVY1T0MrWFlrRFE9PQo=", - "url": "https://github.com/tari-project/universe/releases/download/v0.8.2/tari-universe_0.8.2_amd64.AppImage.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFFBMEFhODBHTDN3U01GNnBFblFWRkhSTGQ2SFkrUkZZajE4TGRpQkVNSkhLOWcvZDFFaUFtMllZbHI4dEdnWlZkWG5jZjB2bVdhWG8reU8rcVByVEFJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMzOTM2OTg4CWZpbGU6dGFyaS11bml2ZXJzZV8wLjguMTNfYW1kNjQuQXBwSW1hZ2UudGFyLmd6Ck13RUhsUnNhRjhrcUw3UStSSVdXSVBYS04zZW03MWJyRnIycmZVTUZjS3BuL2c0S2lsZWl6SDBsa3NpSHRqdHZCd1BuM3pHRXFGUUI4RnY5eTVVT0N3PT0K", + "url": "https://github.com/tari-project/universe/releases/download/v0.8.13/tari-universe_0.8.13_amd64.AppImage.tar.gz" }, "darwin-aarch64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFpBdy9sZ1ZoKzYvQnVWS1JUREtZYlF0MFNMY3llek5PRDhidkNjNlFPY0NLakZXRUNKMWd5NGR2MCs0U0F6V3lkM2R3UXRESGMxRC9PbjQwU1hmR2dJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMyODAwOTM1CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnlrWmMxVXRYMWN6MWRBY0x1NGlKYWNxMzhxRTJ4dEtvTnMrQnZDZCtnY0R6ckdhS2tLbm5nRlJ4YXdHaTJzTktiYjk3QlpZZm1EWFIxbXVsR0hzZkJBPT0K", - "url": "https://github.com/tari-project/universe/releases/download/v0.8.2/Tari.Universe_universal.app.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGNjTEd6VjE5ZTN1RlQ2NnFHUU4rUHdxMVExMXE3QjFwL2o0SEVZVjh5Y012dzdNREcvWkIzUVprZEtkdXluRGJTYXJIb202cHVRT3BIMGF3UEF3clFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMzOTM3NTg0CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CmhMTjdHeE1obUd2T2ZUY21Vc3BqeXJ6dnR6T0poSTJaQVI2cFZXV290RnBvU0svSi9oMlZ2S0pHbnEvV002SjZGcERnV2FuZmZUMU1zdTkxU2ZnVERnPT0K", + "url": "https://github.com/tari-project/universe/releases/download/v0.8.13/Tari.Universe_universal.app.tar.gz" }, "darwin-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFpBdy9sZ1ZoKzYvQnVWS1JUREtZYlF0MFNMY3llek5PRDhidkNjNlFPY0NLakZXRUNKMWd5NGR2MCs0U0F6V3lkM2R3UXRESGMxRC9PbjQwU1hmR2dJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMyODAwOTM1CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CnlrWmMxVXRYMWN6MWRBY0x1NGlKYWNxMzhxRTJ4dEtvTnMrQnZDZCtnY0R6ckdhS2tLbm5nRlJ4YXdHaTJzTktiYjk3QlpZZm1EWFIxbXVsR0hzZkJBPT0K", - "url": "https://github.com/tari-project/universe/releases/download/v0.8.2/Tari.Universe_universal.app.tar.gz" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGNjTEd6VjE5ZTN1RlQ2NnFHUU4rUHdxMVExMXE3QjFwL2o0SEVZVjh5Y012dzdNREcvWkIzUVprZEtkdXluRGJTYXJIb202cHVRT3BIMGF3UEF3clFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMzOTM3NTg0CWZpbGU6VGFyaSBVbml2ZXJzZS5hcHAudGFyLmd6CmhMTjdHeE1obUd2T2ZUY21Vc3BqeXJ6dnR6T0poSTJaQVI2cFZXV290RnBvU0svSi9oMlZ2S0pHbnEvV002SjZGcERnV2FuZmZUMU1zdTkxU2ZnVERnPT0K", + "url": "https://github.com/tari-project/universe/releases/download/v0.8.13/Tari.Universe_universal.app.tar.gz" }, "windows-x86_64": { - "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOGIzb3FiQUhiZ3JyRTlndmN4TFU4cEE4RmF0UzM3MVpQaW1DMERnU1NOUzNVbzBwTFFGWXorL3EyOG9BWE8rM3c0RWNXT0hNYll3UXVRVUxMcFN1NlFZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMyODAxNTc0CWZpbGU6VGFyaSBVbml2ZXJzZV8wLjguMl94NjRfZW4tVVMubXNpLnppcAp6NWc5UGFiNjM2ODBpQVhoMXlNRVBWQlphcjNyVjZOcEJqS21DRzJNRUs5S3hFaGhkYU1XeWZFTXNxZGNPT0c1UnN6RWsvcUNCSmF6eDVTaFhDSDRBdz09Cg==", - "url": "https://github.com/tari-project/universe/releases/download/v0.8.2/Tari.Universe_0.8.2_x64_en-US.msi.zip" + "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVRbUtvKzlyYWhiOFlyQlhhSkRGaFM4dzF2YTYzSjhTK1pETHlUeDlQTDhQd051RzF4NDVHcmJuY05lN2cwUFJqMjdvUFRFaXBHc05Cblh6V2NaMEc0Yjd4L1A3bVk4cmc4PQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzMzOTM3OTQ3CWZpbGU6VGFyaSBVbml2ZXJzZV8wLjguMTNfeDY0X2VuLVVTLm1zaS56aXAKaFVpMGZPemh6SXFXbmdKQzdsZUJpcWpwUVdBcGJkMjZVRCtuZ2Z6Njh6Qi9ZazE0cU1IMDg2MlVXbC9ncXU1M2F3RjJNZUVvRlpjZFBta201NnJPRFE9PQo=", + "url": "https://github.com/tari-project/universe/releases/download/v0.8.13/Tari.Universe_0.8.13_x64_en-US.msi.zip" } } } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 983227895..e01b5944b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +# Tari Universe - Testnet v0.8.7: "The Deep Conclave" + +_December 6, 2024_ + +## 🏊 P2Pool Improvements + +- **Major Optimization Updates** + - Share interval increased to 20 seconds (up from 10s). + - Enhanced share handling mechanisms. + - Improved pool coalescence performance. + - More equitable reward distribution system. + +## 📊 Mining Statistics Enhancement + +- **New In-App Features** + - Real-time p2pool tip distance monitoring. + - Comprehensive mining history tracking: + - Copyable mining history identifier. + - Enhanced statistics visibility. + +## 🌐 Network Stability Improvements + +- **Connection Optimization** + - Enhanced TCP connectivity with IPv4/IPv6 DNS seed addresses. + - Improved peer discovery mechanisms. + - Faster network synchronization. + +- **Platform-Specific Fixes** + - **Mac**: Optimized launch performance and shutdown times. + - **Windows**: Resolved install location permissions and window management. + +- **Interface Updates** + - Refined wallet and seed word styling. + - Intelligent analytics permission handling. + - Enhanced settings interface: + - Copyable anonymous ID feature. + - Persistent window position memory. + - Integrated release notes viewer. + +## ⚠️ Known Issues + +- P2pool optimization efforts are ongoing. +- Initial synchronization delays may affect some users. + +--- + # Tari Universe - Testnet v0.8.5 _December 5, 2024_ diff --git a/ci/build-notes.md b/ci/build-notes.md index c3cc4cab2..3e2ef690d 100644 --- a/ci/build-notes.md +++ b/ci/build-notes.md @@ -1,6 +1,7 @@ # Build notes # Cross-OS compile on Apple M(x) for Linux ARM64, using docker + ```bash git clone git@github.com:tari-project/universe.git cd universe @@ -18,6 +19,7 @@ docker run -it --rm \ ``` # Install some basic utils + ```bash apt-get update apt-get install --no-install-recommends --assume-yes \ @@ -29,11 +31,13 @@ apt-get install --no-install-recommends --assume-yes \ ``` # Install compile tools + ```bash apt-get install --assume-yes build-essential ``` # Install tauri dependancies + ```bash apt-get install --no-install-recommends --assume-yes \ libwebkit2gtk-4.0-dev \ @@ -45,6 +49,7 @@ apt-get install --no-install-recommends --assume-yes \ ``` # Needed for randomx-rs build + ```bash apt-get install --assume-yes \ git \ @@ -54,6 +59,7 @@ apt-get install --assume-yes \ ``` # Needed for openssl library + ```bash apt-get install --assume-yes \ openssl \ @@ -62,24 +68,29 @@ apt-get install --assume-yes \ ``` # Install rust + ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y ``` # Get rust to work in current shell + ```bash export PATH="$HOME/.cargo/bin:$PATH" source "$HOME/.cargo/env" ``` # Check rust install + ```bash rustup target list --installed rustup toolchain list ``` # Install nodejs from nodeSource -# more info can be found at https://github.com/nodesource/distributions + +# more info can be found at https://github.com/nodesource/distributions + ```bash mkdir -p ~/temp/ curl -fsSL https://deb.nodesource.com/setup_22.x -o ~/temp/nodesource_setup.sh @@ -91,21 +102,25 @@ npm --version ``` # Install node modules + ```bash npm install ``` # Build node assets + ```bash npm run build ``` # Install tauri-cli + ```bash -cargo install tauri-cli@1.6.4 +cargo install tauri-cli@latest ``` # Build application + ```bash cargo tauri build ``` diff --git a/package-lock.json b/package-lock.json index a43c44b1b..f1651948e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,51 +1,57 @@ { "name": "tari-universe", - "version": "0.8.9", + "version": "0.8.15", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tari-universe", - "version": "0.8.9", + "version": "0.8.15", "dependencies": { "@floating-ui/react": "^0.26.28", "@lottiefiles/dotlottie-react": "^0.10.1", - "@sentry/react": "^8.41.0", - "@tauri-apps/api": "^1", + "@sentry/react": "^8.42.0", + "@tauri-apps/api": "^2.1.1", + "@tauri-apps/plugin-os": "^2.0.0", + "@tauri-apps/plugin-process": "^2.0.0", + "@tauri-apps/plugin-shell": "^2.0.1", + "@tauri-apps/plugin-updater": "^2.0.0", "emoji-regex": "^10.4.0", - "framer-motion": "^11.12.0", - "globals": "^15.12.0", + "framer-motion": "^11.13.1", + "globals": "^15.13.0", "i18next": "^23.16.8", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.7.1", - "linkify-react": "^4.1.4", + "linkify-react": "^4.2.0", "react": "^18.3.1", "react-dom": "^18.2.0", "react-hook-form": "^7.53.2", - "react-i18next": "^15.1.2", - "react-icons": "^5.3.0", + "react-i18next": "^15.1.3", + "react-icons": "^5.4.0", "react-markdown": "^9.0.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.12", + "tauri-plugin-sentry-api": "^0.2.0", + "use-sync-external-store": "^1.4.0", "uuid": "^10.0.0", "vite-tsconfig-paths": "^5.1.3", - "zustand": "^5.0.1" + "zustand": "^5.0.2" }, "devDependencies": { "@eslint/js": "^9.9.0", "@nabla/vite-plugin-eslint": "^2.0.5", - "@sentry/vite-plugin": "^2.22.6", + "@sentry/vite-plugin": "^2.22.7", "@taplo/cli": "^0.7.0", - "@tauri-apps/cli": "^1.6.3", + "@tauri-apps/cli": "^2.1.0", "@types/eslint__js": "^8.42.3", "@types/node": "^22.10.1", - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", + "@types/react": "^18.3.14", + "@types/react-dom": "^18.3.2", "@types/uuid": "^10.0.0", "@typescript-eslint/parser": "^8.3.0", "@vitejs/plugin-react": "^4.3.4", "babel-plugin-styled-components": "^2.1.4", - "eslint": "^9.14.0", + "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-i18next": "^6.1.1", "eslint-plugin-prettier": "^5.2.1", @@ -55,7 +61,7 @@ "prettier-eslint": "^16.3.0", "react-qr-code": "^2.0.15", "typescript": "^5.7.2", - "typescript-eslint": "^8.16.0", + "typescript-eslint": "^8.17.0", "vite": "^5.4.11" } }, @@ -64,6 +70,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -128,15 +135,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", @@ -155,12 +153,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -183,16 +182,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", @@ -296,12 +285,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -343,9 +333,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -392,6 +383,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -414,6 +406,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -421,12 +414,14 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", @@ -436,6 +431,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -452,6 +448,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -468,6 +465,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -484,6 +482,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -500,6 +499,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -516,6 +516,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -532,6 +533,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -548,6 +550,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -564,6 +567,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -580,6 +584,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -596,6 +601,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -612,6 +618,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -628,6 +635,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -644,6 +652,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -660,6 +669,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -676,6 +686,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -692,6 +703,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -708,6 +720,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -724,6 +737,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -740,6 +754,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -756,6 +771,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -772,6 +788,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -788,6 +805,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -797,34 +815,53 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", @@ -839,6 +876,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -849,6 +887,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -857,10 +896,11 @@ } }, "node_modules/@eslint/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", - "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -870,6 +910,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -893,6 +934,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -903,6 +945,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -915,6 +958,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -923,10 +967,11 @@ } }, "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -936,6 +981,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -945,6 +991,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "levn": "^0.4.1" }, @@ -956,14 +1003,16 @@ "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", - "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.8" @@ -973,6 +1022,7 @@ "version": "0.26.28", "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.1.2", "@floating-ui/utils": "^0.2.8", @@ -987,6 +1037,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" }, @@ -998,13 +1049,15 @@ "node_modules/@floating-ui/utils": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -1014,6 +1067,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -1027,6 +1081,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1041,6 +1096,7 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -1055,6 +1111,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1065,6 +1122,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1077,6 +1135,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1090,13 +1149,15 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@humanwhocodes/retry": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1110,6 +1171,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1122,6 +1184,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1136,6 +1199,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1145,6 +1209,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1153,13 +1218,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1205,6 +1272,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1218,6 +1286,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -1227,6 +1296,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1240,6 +1310,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -1248,302 +1319,343 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", + "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", + "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", + "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", + "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", + "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", + "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", + "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", + "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", + "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", + "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", + "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", + "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", + "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", + "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", + "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.41.0.tgz", - "integrity": "sha512-nU7Bn3jEUmf1QXRUT3j2ewUBlFJpe9vnAnjqpeVPDWTsVI52BwVNcJHuE37PrGs66OZ1ZkGMfKnQk43oCAa+oQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.42.0.tgz", + "integrity": "sha512-xzgRI0wglKYsPrna574w1t38aftuvo44gjOKFvPNGPnYfiW9y4m+64kUz3JFbtanvOrKPcaITpdYiB4DeJXEbA==", "license": "MIT", "dependencies": { - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0" + "@sentry/core": "8.42.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.41.0.tgz", - "integrity": "sha512-bw+BrSNw8abOnu/IpD8YSbYubXkkT8jyNS7TM4e4UPZMuXcbtia7/r5d7kAiUfKv/sV5PNMlZLOk+EYJeLTANg==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.42.0.tgz", + "integrity": "sha512-dkIw5Wdukwzngg5gNJ0QcK48LyJaMAnBspqTqZ3ItR01STi6Z+6+/Bt5XgmrvDgRD+FNBinflc5zMmfdFXXhvw==", "license": "MIT", "dependencies": { - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0" + "@sentry/core": "8.42.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.41.0.tgz", - "integrity": "sha512-ByXEY7JI95y4Qr9fS3d28l9uuVU5Qa0HgL+xDmYElNx7CXz3Q9hFN6ibgUeC3h8BO5pDULxWNgAppl7FRY8N5w==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.42.0.tgz", + "integrity": "sha512-oNcJEBlDfXnRFYC5Mxj5fairyZHNqlnU4g8kPuztB9G5zlsyLgWfPxzcn1ixVQunth2/WZRklDi4o1ZfyHww7w==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.41.0", - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0" + "@sentry-internal/browser-utils": "8.42.0", + "@sentry/core": "8.42.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.41.0.tgz", - "integrity": "sha512-lpgOBHWr1ZNxidD72A2pfoUMjIpwonOPYoQZWAHr86Oa3eIVQOyfklZlHW+gKPFl2/IEl9Lbtcke0JiDp3dkIQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.42.0.tgz", + "integrity": "sha512-XrPErqVhPsPh/oFLVKvz7Wb+Fi2J1zCPLeZCxWqFuPWI2agRyLVu0KvqJyzSpSrRAEJC/XFzuSVILlYlXXSfgA==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "8.41.0", - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0" + "@sentry-internal/replay": "8.42.0", + "@sentry/core": "8.42.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "2.22.6", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.6.tgz", - "integrity": "sha512-V2g1Y1I5eSe7dtUVMBvAJr8BaLRr4CLrgNgtPaZyMT4Rnps82SrZ5zqmEkLXPumlXhLUWR6qzoMNN2u+RXVXfQ==", + "version": "2.22.7", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.7.tgz", + "integrity": "sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@sentry/browser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.41.0.tgz", - "integrity": "sha512-FfAU55eYwW2lG4M3dEw2472RvHrD5YWSfHCZvuRf/4skX38kFvKghZQ+epL+CVHTzvIRHOrbj8qQK6YLTGl9ew==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.42.0.tgz", + "integrity": "sha512-lStrEk609KJHwXfDrOgoYVVoFFExixHywxSExk7ZDtwj2YPv6r6Y1gogvgr7dAZj7jWzadHkxZ33l9EOSJBfug==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "8.41.0", - "@sentry-internal/feedback": "8.41.0", - "@sentry-internal/replay": "8.41.0", - "@sentry-internal/replay-canvas": "8.41.0", - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0" + "@sentry-internal/browser-utils": "8.42.0", + "@sentry-internal/feedback": "8.42.0", + "@sentry-internal/replay": "8.42.0", + "@sentry-internal/replay-canvas": "8.42.0", + "@sentry/core": "8.42.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "2.22.6", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.6.tgz", - "integrity": "sha512-1esQdgSUCww9XAntO4pr7uAM5cfGhLsgTK9MEwAKNfvpMYJi9NUTYa3A7AZmdA8V6107Lo4OD7peIPrDRbaDCg==", + "version": "2.22.7", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.7.tgz", + "integrity": "sha512-ouQh5sqcB8vsJ8yTTe0rf+iaUkwmeUlGNFi35IkCFUQlWJ22qS6OfvNjOqFI19e6eGUXks0c/2ieFC4+9wJ+1g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "2.22.6", - "@sentry/cli": "^2.36.1", + "@sentry/babel-plugin-component-annotate": "2.22.7", + "@sentry/cli": "2.39.1", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^9.3.2", @@ -1554,45 +1666,13 @@ "node": ">= 14" } }, - "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@sentry/cli": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.38.0.tgz", - "integrity": "sha512-ld9+1GdPkDaFr6T4SGocxoMcrBB/K6Z37TvBx8IMrDQC+eJDkBFiyqmHnzrj/8xoj5O220pqjPZCfvqzH268sQ==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.39.1.tgz", + "integrity": "sha512-JIb3e9vh0+OmQ0KxmexMXg9oZsR/G7HMwxt5BUIKAXZ9m17Xll4ETXTRnRUBT3sf7EpNGAmlQk1xEmVN9pYZYQ==", "dev": true, "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", @@ -1607,20 +1687,21 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.38.0", - "@sentry/cli-linux-arm": "2.38.0", - "@sentry/cli-linux-arm64": "2.38.0", - "@sentry/cli-linux-i686": "2.38.0", - "@sentry/cli-linux-x64": "2.38.0", - "@sentry/cli-win32-i686": "2.38.0", - "@sentry/cli-win32-x64": "2.38.0" + "@sentry/cli-darwin": "2.39.1", + "@sentry/cli-linux-arm": "2.39.1", + "@sentry/cli-linux-arm64": "2.39.1", + "@sentry/cli-linux-i686": "2.39.1", + "@sentry/cli-linux-x64": "2.39.1", + "@sentry/cli-win32-i686": "2.39.1", + "@sentry/cli-win32-x64": "2.39.1" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.38.0.tgz", - "integrity": "sha512-OvOaV9Vg4+b9ObK2z1oFj3zbRoqOSpD/wSz9t/mtSWwMQi7wlUXj88XGGsL5ZwF7VGBYL+kX59X3Ygl+dHFPlg==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.39.1.tgz", + "integrity": "sha512-kiNGNSAkg46LNGatfNH5tfsmI/kCAaPA62KQuFZloZiemTNzhy9/6NJP8HZ/GxGs8GDMxic6wNrV9CkVEgFLJQ==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "darwin" @@ -1630,13 +1711,14 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.38.0.tgz", - "integrity": "sha512-lXMSEX1Sv9F2wXnnAlsS+kwy09iLQTfK10n08xzeJLIvUCLua/OFInwH6WUxNT3tIBPfBVQZPR7iQMRycH4Ilw==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.39.1.tgz", + "integrity": "sha512-DkENbxyRxUrfLnJLXTA4s5UL/GoctU5Cm4ER1eB7XN7p9WsamFJd/yf2KpltkjEyiTuplv0yAbdjl1KX3vKmEQ==", "cpu": [ "arm" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "linux", @@ -1647,13 +1729,14 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.38.0.tgz", - "integrity": "sha512-oUiRTyek0Ixe30zoqNlEFsLY07B9hK3FRXKv5lw341rim9PiTteh5tk5ewpuD63K+QjbEAJqp4f3zM19DEASlg==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.39.1.tgz", + "integrity": "sha512-5VbVJDatolDrWOgaffsEM7znjs0cR8bHt9Bq0mStM3tBolgAeSDHE89NgHggfZR+DJ2VWOy4vgCwkObrUD6NQw==", "cpu": [ "arm64" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "linux", @@ -1664,14 +1747,15 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.38.0.tgz", - "integrity": "sha512-+luFmbQymDON16O7R/A7bmnkUjtnq1nRSehnnRJjuFCtDABCKatZzBjWvan0KNgzHhCquMSvEqHKzfVSptHeHw==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.39.1.tgz", + "integrity": "sha512-pXWVoKXCRrY7N8vc9H7mETiV9ZCz+zSnX65JQCzZxgYrayQPJTc+NPRnZTdYdk5RlAupXaFicBI2GwOCRqVRkg==", "cpu": [ "x86", "ia32" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "linux", @@ -1682,13 +1766,14 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.38.0.tgz", - "integrity": "sha512-yY593xXbf2W+afyHKDvO4QJwoWQX97/K0NYUAqnpg3TVmIfLV9DNVid+M1w6vKIif6n8UQgAFWtR1Ys4P75mBg==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.39.1.tgz", + "integrity": "sha512-IwayNZy+it7FWG4M9LayyUmG1a/8kT9+/IEm67sT5+7dkMIMcpmHDqL8rWcPojOXuTKaOBBjkVdNMBTXy0mXlA==", "cpu": [ "x64" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "linux", @@ -1699,14 +1784,15 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.38.0.tgz", - "integrity": "sha512-ipDnBvXaMqi0ZbkT/pqB11F4AaicVz5YRoidn5oxi1IJPDUd8qF0mnqabALLH3mAd5TOtKBliY5pllCFG/TvzA==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.39.1.tgz", + "integrity": "sha512-NglnNoqHSmE+Dz/wHeIVRnV2bLMx7tIn3IQ8vXGO5HWA2f8zYJGktbkLq1Lg23PaQmeZLPGlja3gBQfZYSG10Q==", "cpu": [ "x86", "ia32" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "win32" @@ -1716,13 +1802,14 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.38.0.tgz", - "integrity": "sha512-NqlKOqNF8i239mygARkNZK9BPzwWK91j+HPEfCKoHsZKHeBT1JauoipgPykO21qn04erq5pJkA0MsiuNRNQnMA==", + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.39.1.tgz", + "integrity": "sha512-xv0R2CMf/X1Fte3cMWie1NXuHmUyQPDBfCyIt6k6RPFPxAYUgcqgMPznYwVMwWEA1W43PaOkSn3d8ZylsDaETw==", "cpu": [ "x64" ], "dev": true, + "license": "BSD-3-Clause", "optional": true, "os": [ "win32" @@ -1732,26 +1819,22 @@ } }, "node_modules/@sentry/core": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.41.0.tgz", - "integrity": "sha512-3v7u3t4LozCA5SpZY4yqUN2U3jSrkXNoLgz6L2SUUiydyCuSwXZIFEwpLJfgQyidpNDifeQbBI5E1O910XkPsA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.42.0.tgz", + "integrity": "sha512-ac6O3pgoIbU6rpwz6LlwW0wp3/GAHuSI0C5IsTgIY6baN8rOBnlAtG6KrHDDkGmUQ2srxkDJu9n1O6Td3cBCqw==", "license": "MIT", - "dependencies": { - "@sentry/types": "8.41.0" - }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/react": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.41.0.tgz", - "integrity": "sha512-/7LEWDNdICYO5s4ie8ztgpmD/GRJ1+1nHlSKvcwjf83COzT1eGvVeuYTiXFAPmXA29sY+lV1RajziwgySadjIQ==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.42.0.tgz", + "integrity": "sha512-UBi/WM4oMa+kOA99R7t7Ke57zq6uQw6mALYW4fJ+wuhHZJBLDDDHSGpEUhdWuQ1oWQv/laT34DGS44PJOjfeAg==", "license": "MIT", "dependencies": { - "@sentry/browser": "8.41.0", - "@sentry/core": "8.41.0", - "@sentry/types": "8.41.0", + "@sentry/browser": "8.42.0", + "@sentry/core": "8.42.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -1761,22 +1844,14 @@ "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, - "node_modules/@sentry/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.41.0.tgz", - "integrity": "sha512-eqdnGr9k9H++b9CjVUoTNUVahPVWeNnMy0YGkqS5+cjWWC+x43p56202oidGFmWo6702ub/xwUNH6M5PC4kq6A==", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, "node_modules/@sentry/vite-plugin": { - "version": "2.22.6", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.22.6.tgz", - "integrity": "sha512-zIieP1VLWQb3wUjFJlwOAoaaJygJhXeUoGd0e/Ha2RLb2eW2S+4gjf6y6NqyY71tZ74LYVZKg/4prB6FAZSMXQ==", + "version": "2.22.7", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.22.7.tgz", + "integrity": "sha512-sYRNiNm4toQGq2BfZSJPdw36em3eQaLu+3NTFpA7Hl4g3Sp2Rt3CYObnW5bxlFEruRhxzvdyB383N9OefVZ6KA==", "dev": true, + "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "2.22.6", + "@sentry/bundler-plugin-core": "2.22.7", "unplugin": "1.0.1" }, "engines": { @@ -1787,7 +1862,8 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", @@ -1806,27 +1882,21 @@ } }, "node_modules/@tauri-apps/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz", - "integrity": "sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==", - "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" - }, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.1.1.tgz", + "integrity": "sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==", + "license": "Apache-2.0 OR MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/tauri" } }, "node_modules/@tauri-apps/cli": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.3.tgz", - "integrity": "sha512-q46umd6QLRKDd4Gg6WyZBGa2fWvk0pbeUA5vFomm4uOs1/17LIciHv2iQ4UD+2Yv5H7AO8YiE1t50V0POiEGEw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.1.0.tgz", + "integrity": "sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==", "dev": true, - "dependencies": { - "semver": ">=7.5.2" - }, + "license": "Apache-2.0 OR MIT", "bin": { "tauri": "tauri.js" }, @@ -1838,26 +1908,27 @@ "url": "https://opencollective.com/tauri" }, "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.6.3", - "@tauri-apps/cli-darwin-x64": "1.6.3", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.3", - "@tauri-apps/cli-linux-arm64-gnu": "1.6.3", - "@tauri-apps/cli-linux-arm64-musl": "1.6.3", - "@tauri-apps/cli-linux-x64-gnu": "1.6.3", - "@tauri-apps/cli-linux-x64-musl": "1.6.3", - "@tauri-apps/cli-win32-arm64-msvc": "1.6.3", - "@tauri-apps/cli-win32-ia32-msvc": "1.6.3", - "@tauri-apps/cli-win32-x64-msvc": "1.6.3" + "@tauri-apps/cli-darwin-arm64": "2.1.0", + "@tauri-apps/cli-darwin-x64": "2.1.0", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.1.0", + "@tauri-apps/cli-linux-arm64-gnu": "2.1.0", + "@tauri-apps/cli-linux-arm64-musl": "2.1.0", + "@tauri-apps/cli-linux-x64-gnu": "2.1.0", + "@tauri-apps/cli-linux-x64-musl": "2.1.0", + "@tauri-apps/cli-win32-arm64-msvc": "2.1.0", + "@tauri-apps/cli-win32-ia32-msvc": "2.1.0", + "@tauri-apps/cli-win32-x64-msvc": "2.1.0" } }, "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.3.tgz", - "integrity": "sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.1.0.tgz", + "integrity": "sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -1867,13 +1938,14 @@ } }, "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.3.tgz", - "integrity": "sha512-1yTXZzLajKAYINJOJhZfmMhCzweHSgKQ3bEgJSn6t+1vFkOgY8Yx4oFgWcybrrWI5J1ZLZAl47+LPOY81dLcyA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.1.0.tgz", + "integrity": "sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -1883,13 +1955,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.3.tgz", - "integrity": "sha512-CjTEr9r9xgjcvos09AQw8QMRPuH152B1jvlZt4PfAsyJNPFigzuwed5/SF7XAd8bFikA7zArP4UT12RdBxrx7w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.1.0.tgz", + "integrity": "sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1899,13 +1972,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.3.tgz", - "integrity": "sha512-G9EUUS4M8M/Jz1UKZqvJmQQCKOzgTb8/0jZKvfBuGfh5AjFBu8LHvlFpwkKVm1l4951Xg4ulUp6P9Q7WRJ9XSA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.1.0.tgz", + "integrity": "sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1915,13 +1989,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.3.tgz", - "integrity": "sha512-MuBTHJyNpZRbPVG8IZBN8+Zs7aKqwD22tkWVBcL1yOGL4zNNTJlkfL+zs5qxRnHlUsn6YAlbW/5HKocfpxVwBw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.1.0.tgz", + "integrity": "sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1931,13 +2006,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.3.tgz", - "integrity": "sha512-Uvi7M+NK3tAjCZEY1WGel+dFlzJmqcvu3KND+nqa22762NFmOuBIZ4KJR/IQHfpEYqKFNUhJfCGnpUDfiC3Oxg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.1.0.tgz", + "integrity": "sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1947,13 +2023,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.3.tgz", - "integrity": "sha512-rc6B342C0ra8VezB/OJom9j/N+9oW4VRA4qMxS2f4bHY2B/z3J9NPOe6GOILeg4v/CV62ojkLsC3/K/CeF3fqQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.1.0.tgz", + "integrity": "sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -1963,13 +2040,14 @@ } }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.3.tgz", - "integrity": "sha512-cSH2qOBYuYC4UVIFtrc1YsGfc5tfYrotoHrpTvRjUGu0VywvmyNk82+ZsHEnWZ2UHmu3l3lXIGRqSWveLln0xg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.1.0.tgz", + "integrity": "sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -1979,13 +2057,14 @@ } }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.3.tgz", - "integrity": "sha512-T8V6SJQqE4PSWmYBl0ChQVmS6AR2hXFHURH2DwAhgSGSQ6uBXgwlYFcfIeQpBQA727K2Eq8X2hGfvmoySyHMRw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.1.0.tgz", + "integrity": "sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -1995,13 +2074,14 @@ } }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.3.tgz", - "integrity": "sha512-HUkWZ+lYHI/Gjkh2QjHD/OBDpqLVmvjZGpLK9losur1Eg974Jip6k+vsoTUxQBCBDfj30eDBct9E1FvXOspWeg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.1.0.tgz", + "integrity": "sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -2010,11 +2090,48 @@ "node": ">= 10" } }, + "node_modules/@tauri-apps/plugin-os": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-os/-/plugin-os-2.0.0.tgz", + "integrity": "sha512-M7hG/nNyQYTJxVG/UhTKhp9mpXriwWzrs9mqDreB8mIgqA3ek5nHLdwRZJWhkKjZrnDT4v9CpA9BhYeplTlAiA==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-process": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-process/-/plugin-process-2.0.0.tgz", + "integrity": "sha512-OYzi0GnkrF4NAnsHZU7U3tjSoP0PbeAlO7T1Z+vJoBUH9sFQ1NSLqWYWQyf8hcb3gVWe7P1JggjiskO+LST1ug==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-shell": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.0.1.tgz", + "integrity": "sha512-akU1b77sw3qHiynrK0s930y8zKmcdrSD60htjH+mFZqv5WaakZA/XxHR3/sF1nNv9Mgmt/Shls37HwnOr00aSw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@tauri-apps/plugin-updater": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-updater/-/plugin-updater-2.0.0.tgz", + "integrity": "sha512-N0cl71g7RPr7zK2Fe5aoIwzw14NcdLcz7XMGFWZVjprsqgDRWoxbnUkknyCQMZthjhGkppCd/wN2MIsUz+eAhQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2028,6 +2145,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2037,6 +2155,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -2047,6 +2166,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -2065,6 +2185,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2075,14 +2196,16 @@ "resolved": "https://registry.npmjs.org/@types/eslint__js/-/eslint__js-8.42.3.tgz", "integrity": "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -2106,7 +2229,8 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", @@ -2139,27 +2263,30 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "version": "18.3.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.14.tgz", + "integrity": "sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.2.tgz", + "integrity": "sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/react": "*" + "@types/react": "^18" } }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", @@ -2171,20 +2298,21 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", - "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", + "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/type-utils": "8.16.0", - "@typescript-eslint/utils": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/type-utils": "8.17.0", + "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2208,16 +2336,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", - "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", + "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "debug": "^4.3.4" }, "engines": { @@ -2237,14 +2365,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", - "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", + "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0" + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2255,14 +2383,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", - "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", + "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/utils": "8.17.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2283,9 +2411,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", - "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", + "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, "license": "MIT", "engines": { @@ -2297,14 +2425,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", - "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", + "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2325,17 +2453,30 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", - "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", + "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0" + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2354,13 +2495,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", - "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", + "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2371,23 +2512,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" }, "node_modules/@vitejs/plugin-react": { "version": "4.3.4", @@ -2414,6 +2543,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2426,6 +2556,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2435,6 +2566,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -2447,6 +2579,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2459,12 +2592,13 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/ansi-styles": { @@ -2472,6 +2606,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2487,6 +2622,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2499,13 +2635,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -2522,6 +2660,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2542,6 +2681,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2551,6 +2691,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2571,6 +2712,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2589,6 +2731,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2607,6 +2750,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2623,6 +2767,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -2645,6 +2790,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2660,6 +2806,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", @@ -2685,13 +2832,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2704,6 +2853,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2713,6 +2863,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2758,6 +2909,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2777,6 +2929,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2785,6 +2938,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2825,6 +2979,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2881,6 +3036,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2905,6 +3061,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2917,6 +3074,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2928,7 +3086,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/comma-separated-tokens": { "version": "2.0.3", @@ -2945,6 +3104,7 @@ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -2953,27 +3113,31 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2987,6 +3151,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", "engines": { "node": ">=4" } @@ -2995,6 +3160,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -3004,13 +3170,15 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3028,6 +3196,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3045,6 +3214,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3058,11 +3228,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3090,13 +3261,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3114,6 +3287,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3153,6 +3327,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -3164,13 +3339,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3179,10 +3356,11 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -3191,9 +3369,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.66", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz", - "integrity": "sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==", + "version": "1.5.67", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz", + "integrity": "sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==", "dev": true, "license": "ISC" }, @@ -3204,9 +3382,9 @@ "license": "MIT" }, "node_modules/engine.io-client": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", - "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", + "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -3226,10 +3404,11 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -3246,7 +3425,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -3262,10 +3441,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -3290,6 +3469,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -3302,15 +3482,17 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", - "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3320,6 +3502,7 @@ "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.4", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", @@ -3336,6 +3519,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3348,6 +3532,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -3362,19 +3547,21 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3389,6 +3576,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "devOptional": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3436,6 +3624,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3444,26 +3633,27 @@ } }, "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.16.0", + "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", + "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -3482,8 +3672,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -3508,6 +3697,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3534,6 +3724,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -3564,6 +3755,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -3596,6 +3788,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3608,6 +3801,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3618,6 +3812,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3625,20 +3820,12 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3651,59 +3838,35 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", - "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint/node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3716,6 +3879,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -3728,23 +3892,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3757,6 +3910,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3769,6 +3923,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3788,6 +3943,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3802,19 +3958,22 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3831,6 +3990,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3842,19 +4002,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -3864,6 +4027,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -3876,6 +4040,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3888,6 +4053,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3904,6 +4070,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -3913,26 +4080,30 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/framer-motion": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.12.0.tgz", - "integrity": "sha512-gZaZeqFM6pX9kMVti60hYAa75jGpSsGYWAHbBfIkuHN7DkVHVkxSxeNYnrGmHuM0zPkWTzQx10ZT+fDjn7N4SA==", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.13.1.tgz", + "integrity": "sha512-F40tpGTHByhn9h3zdBQPcEro+pSLtzARcocbNqAyfBI+u9S+KZuHH/7O9+z+GEkoF3eqFxfvVw0eBDytohwqmQ==", "license": "MIT", "dependencies": { + "motion-dom": "^11.13.0", + "motion-utils": "^11.13.0", "tslib": "^2.4.0" }, "peerDependencies": { @@ -3956,7 +4127,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -3964,6 +4136,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3977,6 +4150,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3986,6 +4160,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -4004,6 +4179,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4013,6 +4189,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -4022,6 +4199,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -4041,6 +4219,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -4054,21 +4233,19 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4079,6 +4256,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4086,32 +4264,27 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { - "version": "15.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", - "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -4124,6 +4297,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4140,6 +4314,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4158,13 +4333,15 @@ "node_modules/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "license": "MIT" }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4176,13 +4353,15 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -4190,20 +4369,12 @@ "node": ">=0.10.0" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4213,6 +4384,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4222,6 +4394,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4234,6 +4407,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4246,6 +4420,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4258,6 +4433,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4273,6 +4449,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4324,19 +4501,16 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, "node_modules/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", "dependencies": { "void-elements": "3.1.0" } @@ -4356,6 +4530,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -4391,6 +4566,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.0.tgz", "integrity": "sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -4409,6 +4585,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -4418,6 +4595,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4434,6 +4612,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -4443,6 +4622,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4453,6 +4633,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -4462,7 +4643,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.4", @@ -4475,6 +4657,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -4513,6 +4696,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -4529,6 +4713,7 @@ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4544,6 +4729,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -4556,6 +4742,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4568,6 +4755,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4584,6 +4772,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4596,6 +4785,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -4611,6 +4801,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -4626,6 +4817,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4651,17 +4843,22 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4672,6 +4869,7 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4687,6 +4885,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4709,6 +4908,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4721,6 +4921,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4733,6 +4934,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4742,6 +4944,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4757,6 +4960,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4778,6 +4982,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4794,6 +4999,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4806,6 +5012,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -4821,6 +5028,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -4836,6 +5044,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -4851,6 +5060,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -4866,6 +5076,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4878,6 +5089,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -4890,6 +5102,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -4905,19 +5118,22 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -4932,13 +5148,15 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -4963,25 +5181,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4994,6 +5216,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -5009,6 +5232,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5018,6 +5242,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5027,9 +5252,9 @@ } }, "node_modules/linkify-react": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.1.4.tgz", - "integrity": "sha512-UI9nqHtFzHYRUvVRrYeua5GIXkc0Jy3RpLsJBWEht7HwqjAa2qSaIksGmNSLqclNpO/5AkwaxUJv71I/pQsk9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.2.0.tgz", + "integrity": "sha512-dIcDGo+n4FP2FPIHDcqB7cUE+omkcEgQJpc7sNNP4+XZ9FUhFAkKjGnHMzsZM+B4yF93sK166z9K5cKTe/JpzA==", "license": "MIT", "peerDependencies": { "linkifyjs": "^4.0.0", @@ -5037,9 +5262,10 @@ } }, "node_modules/linkifyjs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", - "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.4.tgz", + "integrity": "sha512-0/NxkHNpiJ0k9VrYCkAn9OtU1eu8xEr1tCCpDtSsVRm/SF0xAak2Gzv3QimSfgUgqLBCDlfhMbu73XvaEHUTPQ==", + "license": "MIT", "peer": true }, "node_modules/locate-path": { @@ -5047,6 +5273,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5061,19 +5288,22 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -5087,25 +5317,18 @@ "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^1.1.3", "loglevel": "^1.4.1" } }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5115,6 +5338,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -5131,27 +5355,17 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, - "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -5170,6 +5384,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5192,6 +5407,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -5357,6 +5573,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -5808,6 +6025,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5837,25 +6055,38 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, + "node_modules/motion-dom": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.13.0.tgz", + "integrity": "sha512-Oc1MLGJQ6nrvXccXA89lXtOqFyBmvHtaDcTRGT66o8Czl7nuA8BeHAd9MQV1pQKX0d2RHFBFaw5g3k23hQJt0w==" + }, + "node_modules/motion-utils": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.13.0.tgz", + "integrity": "sha512-lq6TzXkH5c/ysJQBxgLXgM01qwBH1b4goTPh57VvZWJbVJZF/0SB31UWEn4EIqbVPf3au88n2rvK17SpDTja1A==" + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -5867,12 +6098,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -5900,6 +6133,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5909,15 +6143,17 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5930,6 +6166,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -5939,6 +6176,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -5957,6 +6195,7 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5971,6 +6210,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5989,6 +6229,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6006,6 +6247,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -6015,6 +6257,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6032,6 +6275,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6047,6 +6291,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -6062,6 +6307,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6100,6 +6346,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6109,6 +6356,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6118,6 +6366,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6126,13 +6375,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -6148,13 +6399,15 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -6164,20 +6417,23 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6190,6 +6446,7 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6212,6 +6469,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", @@ -6224,13 +6482,15 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -6240,6 +6500,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -6255,6 +6516,7 @@ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz", "integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/parser": "^6.7.5", "common-tags": "^1.4.0", @@ -6290,6 +6552,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -6313,6 +6576,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6323,6 +6587,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6335,6 +6600,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -6344,6 +6610,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -6372,6 +6639,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" @@ -6389,6 +6657,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -6402,6 +6671,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", @@ -6430,6 +6700,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" @@ -6442,11 +6713,22 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/prettier-eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/prettier-eslint/node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6458,7 +6740,9 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6514,6 +6798,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6525,11 +6810,25 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/prettier-eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/prettier-eslint/node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6540,6 +6839,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6552,6 +6852,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -6569,6 +6870,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -6581,6 +6883,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6595,6 +6898,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6610,6 +6914,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6620,11 +6925,38 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/prettier-eslint/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prettier-eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -6637,6 +6969,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -6651,6 +6984,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6658,11 +6992,19 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -6672,18 +7014,13 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "node_modules/property-information": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", @@ -6698,13 +7035,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6713,7 +7052,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", "integrity": "sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -6733,12 +7073,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -6750,6 +7092,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6762,6 +7105,7 @@ "version": "7.53.2", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.2.tgz", "integrity": "sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==", + "license": "MIT", "engines": { "node": ">=18.0.0" }, @@ -6774,9 +7118,9 @@ } }, "node_modules/react-i18next": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.1.2.tgz", - "integrity": "sha512-tl7AfbWyz9a4BefFXnVooc+gvQBVlavUkVTphGUcvhsNmbRf5UixJVdHeSFkE4gUyQkmFPYHVwTuxIdHjfQgiA==", + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.1.3.tgz", + "integrity": "sha512-J11oA30FbM3NZegUZjn8ySK903z6PLBz/ZuBYyT1JMR0QPrW6PFXvl1WoUhortdGi9dM0m48/zJQlPskVZXgVw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -6796,18 +7140,19 @@ } }, "node_modules/react-icons": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz", - "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", + "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", + "license": "MIT", "peerDependencies": { "react": "*" } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/react-markdown": { "version": "9.0.1", @@ -6840,6 +7185,7 @@ "resolved": "https://registry.npmjs.org/react-qr-code/-/react-qr-code-2.0.15.tgz", "integrity": "sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw==", "dev": true, + "license": "MIT", "dependencies": { "prop-types": "^15.8.1", "qr.js": "0.0.0" @@ -6853,6 +7199,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6862,6 +7209,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -6870,18 +7218,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -6893,18 +7242,20 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6950,13 +7301,15 @@ "version": "0.8.7", "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/requireindex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.5" } @@ -6966,6 +7319,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -6983,6 +7337,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6992,6 +7347,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7003,6 +7359,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -7013,13 +7370,60 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", + "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", "devOptional": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -7029,22 +7433,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.27.4", + "@rollup/rollup-android-arm64": "4.27.4", + "@rollup/rollup-darwin-arm64": "4.27.4", + "@rollup/rollup-darwin-x64": "4.27.4", + "@rollup/rollup-freebsd-arm64": "4.27.4", + "@rollup/rollup-freebsd-x64": "4.27.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", + "@rollup/rollup-linux-arm-musleabihf": "4.27.4", + "@rollup/rollup-linux-arm64-gnu": "4.27.4", + "@rollup/rollup-linux-arm64-musl": "4.27.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", + "@rollup/rollup-linux-riscv64-gnu": "4.27.4", + "@rollup/rollup-linux-s390x-gnu": "4.27.4", + "@rollup/rollup-linux-x64-gnu": "4.27.4", + "@rollup/rollup-linux-x64-musl": "4.27.4", + "@rollup/rollup-win32-arm64-msvc": "4.27.4", + "@rollup/rollup-win32-ia32-msvc": "4.27.4", + "@rollup/rollup-win32-x64-msvc": "4.27.4", "fsevents": "~2.3.2" } }, @@ -7067,6 +7473,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -7076,6 +7483,7 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -7094,6 +7502,7 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -7110,20 +7519,19 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/set-function-length": { @@ -7131,6 +7539,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7148,6 +7557,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7161,13 +7571,15 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7180,6 +7592,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7189,6 +7602,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7207,6 +7621,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7215,6 +7630,7 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -7239,9 +7655,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7261,6 +7678,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7287,6 +7705,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -7297,6 +7716,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7315,6 +7735,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7329,6 +7750,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7356,15 +7778,16 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/strip-json-comments": { @@ -7372,6 +7795,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7392,6 +7816,7 @@ "version": "6.1.13", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "license": "MIT", "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -7418,18 +7843,21 @@ "node_modules/styled-components/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" }, "node_modules/stylis": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7442,6 +7870,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7450,10 +7879,11 @@ } }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -7468,19 +7898,47 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/tauri-plugin-sentry-api": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tauri-plugin-sentry-api/-/tauri-plugin-sentry-api-0.2.0.tgz", + "integrity": "sha512-HnIbCVnq7jjrj8aRyzP5hfU8GwfSIkl65BH7MHj0Vbx1X4fqrKNc2lzzP/wjjrJ1hsXJCg5bRKF26HshPmgw8g==", + "license": "Apache-2.0 OR MIT", + "dependencies": { + "@tauri-apps/api": "2.0.0-beta.8", + "tslib": "^2.6.0" + } + }, + "node_modules/tauri-plugin-sentry-api/node_modules/@tauri-apps/api": { + "version": "2.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.0.0-beta.8.tgz", + "integrity": "sha512-fN5u+9HsSfhRaXGOdD2kPGbqDgyX+nkm1XF/4d/LNuM4WiNfvHjjRAqWQYBhQsg1aF9nsTPmSW+tmy+Yn5T5+A==", + "license": "Apache-2.0 OR MIT", + "engines": { + "node": ">= 18", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7491,7 +7949,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -7514,10 +7973,11 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -7526,9 +7986,10 @@ } }, "node_modules/tsconfck": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.3.tgz", - "integrity": "sha512-ulNZP1SVpRDesxeMLON/LtWM8HIgAJEIVpVVhBM6gsmvQ8+Rh+ZG7FWGvHh7Ah3pRABwVJWklWCr/BTZSv0xnQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz", + "integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==", + "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" }, @@ -7545,15 +8006,17 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7566,6 +8029,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7578,6 +8042,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7592,6 +8057,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -7607,17 +8073,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -7627,17 +8095,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -7661,15 +8130,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.16.0.tgz", - "integrity": "sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.17.0.tgz", + "integrity": "sha512-409VXvFd/f1br1DCbuKNFqQpXICoTB+V51afcwG1pn1a3Cp92MqAUges3YjwEdQ0cMUoCIodjVDAYzyD8h3SYA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.16.0", - "@typescript-eslint/parser": "8.16.0", - "@typescript-eslint/utils": "8.16.0" + "@typescript-eslint/eslint-plugin": "8.17.0", + "@typescript-eslint/parser": "8.17.0", + "@typescript-eslint/utils": "8.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7692,6 +8161,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -7801,6 +8271,7 @@ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.8.1", "chokidar": "^3.5.3", @@ -7844,18 +8315,18 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "optional": true, - "peer": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/uuid": { @@ -7866,6 +8337,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -7903,6 +8375,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "devOptional": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -7977,9 +8450,9 @@ } }, "node_modules/vite/node_modules/postcss": { - "version": "8.4.44", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", - "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "devOptional": true, "funding": [ { @@ -7995,10 +8468,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -8008,6 +8482,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8017,6 +8492,7 @@ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", @@ -8041,6 +8517,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -8052,11 +8529,25 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/vue-eslint-parser/node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -8069,16 +8560,31 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -8087,12 +8593,14 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -8103,6 +8611,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8118,6 +8627,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -8130,16 +8640,18 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.1.4", "is-weakref": "^1.0.2", @@ -8160,6 +8672,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -8174,10 +8687,11 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -8197,6 +8711,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8205,7 +8720,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ws": { "version": "8.17.1", @@ -8229,9 +8745,9 @@ } }, "node_modules/xmlhttprequest-ssl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", - "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", "engines": { "node": ">=0.4.0" } @@ -8248,6 +8764,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8256,9 +8773,10 @@ } }, "node_modules/zustand": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.1.tgz", - "integrity": "sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.2.tgz", + "integrity": "sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==", + "license": "MIT", "engines": { "node": ">=12.20.0" }, diff --git a/package.json b/package.json index b7dce2807..54ed0c96c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tari-universe", "private": true, - "version": "0.8.14", + "version": "0.8.15", "type": "module", "scripts": { "dev": "vite dev --mode development", @@ -16,42 +16,48 @@ "dependencies": { "@floating-ui/react": "^0.26.28", "@lottiefiles/dotlottie-react": "^0.10.1", - "@sentry/react": "^8.41.0", - "@tauri-apps/api": "^1", + "@sentry/react": "^8.42.0", + "@tauri-apps/api": "^2.1.1", + "@tauri-apps/plugin-os": "^2.0.0", + "@tauri-apps/plugin-process": "^2.0.0", + "@tauri-apps/plugin-shell": "^2.0.1", + "@tauri-apps/plugin-updater": "^2.0.0", "emoji-regex": "^10.4.0", - "framer-motion": "^11.12.0", - "globals": "^15.12.0", + "framer-motion": "^11.13.1", + "globals": "^15.13.0", "i18next": "^23.16.8", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.7.1", - "linkify-react": "^4.1.4", + "linkify-react": "^4.2.0", "react": "^18.3.1", "react-dom": "^18.2.0", "react-hook-form": "^7.53.2", - "react-i18next": "^15.1.2", - "react-icons": "^5.3.0", + "react-i18next": "^15.1.3", + "react-icons": "^5.4.0", "react-markdown": "^9.0.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.12", + "tauri-plugin-sentry-api": "^0.2.0", + "use-sync-external-store": "^1.4.0", "uuid": "^10.0.0", "vite-tsconfig-paths": "^5.1.3", - "zustand": "^5.0.1" + "zustand": "^5.0.2" }, "devDependencies": { "@eslint/js": "^9.9.0", "@nabla/vite-plugin-eslint": "^2.0.5", - "@sentry/vite-plugin": "^2.22.6", + "@sentry/vite-plugin": "^2.22.7", "@taplo/cli": "^0.7.0", - "@tauri-apps/cli": "^1.6.3", + "@tauri-apps/cli": "^2.1.0", "@types/eslint__js": "^8.42.3", "@types/node": "^22.10.1", - "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", + "@types/react": "^18.3.14", + "@types/react-dom": "^18.3.2", "@types/uuid": "^10.0.0", "@typescript-eslint/parser": "^8.3.0", "@vitejs/plugin-react": "^4.3.4", "babel-plugin-styled-components": "^2.1.4", - "eslint": "^9.14.0", + "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-i18next": "^6.1.1", "eslint-plugin-prettier": "^5.2.1", @@ -61,7 +67,7 @@ "prettier-eslint": "^16.3.0", "react-qr-code": "^2.0.15", "typescript": "^5.7.2", - "typescript-eslint": "^8.16.0", + "typescript-eslint": "^8.17.0", "vite": "^5.4.11" } } \ No newline at end of file diff --git a/public/locales/af/common.json b/public/locales/af/common.json index d9b8c3d26..8c5b3bc82 100644 --- a/public/locales/af/common.json +++ b/public/locales/af/common.json @@ -10,6 +10,7 @@ "hashrate": "Hashtempo", "installation-problem": "Installation problem", "max-temperature": "Maksimum temperatuur", + "minimize": "Minimize", "mode": "Modus", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Probeer asseblief later weer. As die probleem voortduur, kontak ons asseblief.", @@ -22,6 +23,7 @@ "temperature": "Temperatuur", "testnet": "Toetsnetwerk", "unknown": "Onbekend", + "unminimize": "Unminimize", "usage": "Gebruik", "utilization": "Benutting", "version": "Weergawe", diff --git a/public/locales/af/mining-view.json b/public/locales/af/mining-view.json index 2ba4c91f1..32add90ff 100644 --- a/public/locales/af/mining-view.json +++ b/public/locales/af/mining-view.json @@ -1,12 +1,15 @@ { "connection-to-node-lost": "Kontak met mynwerker verloor. Wag asseblief vir mynwerker om kontak te maak of begin weer.", + "cpu-hashrate": "CPU Hashrate", "cpu-power": "CPU Krag", "current-block-time": "Huidige bloktyd", "day": "day", "estimated-day": "Est tXTM/dag", "estimated-earnings": "Geskatte verdienste", "floor": "Vloer", + "gpu-hashrate": "GPU Hashrate", "gpu-power": "GPU Krag", + "gpu-usage": "GPU Usage", "mining-button-text": { "cancel-mining": "Kanselleer myn", "changing-mode": "Verander modus", @@ -17,6 +20,15 @@ "stop-mining": "Stop Mynbou", "waiting-for-idle": "Wag tot onaktief" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Jy verdien belonings vir die myn van CPU en GPU afsonderlik", "you-won-block": "Jy was die wenner van blok #{{ blockHeight }}", "you-won-while-away": "Jy het {{ blocks }} gewen terwyl jy weg was", diff --git a/public/locales/af/settings.json b/public/locales/af/settings.json index 750edc826..79a58462c 100644 --- a/public/locales/af/settings.json +++ b/public/locales/af/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Pas Uitnodigingskode Toe", "cancel": "Cancel", "change-language": "Verander taal", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Gekoppelde Eweknieë", @@ -46,6 +48,7 @@ "title": "Tyd waarna masjien as onaktief beskou word" }, "importing-wallet": "Beursie invoer", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Voer 24 woorde in, geskei deur spasies", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Uitnodigingskode", @@ -82,8 +85,17 @@ }, "pool-mining": "Poel Mynbou", "pool-mining-description": "Wanneer geaktiveer, sal u in \"n poel myn en by \"n groep mynwerkers aansluit.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx netwerk hashrate", "refresh-versions": "Verfris weergawes", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Rapporteer \"n probleem", "reset-permanently": "Is jy seker jy wil alle instellings permanent terugstel?", "reset-settings": "Stel Instellings Terug", @@ -103,6 +115,7 @@ "title": "Outomatiese begin by stelsel opstart" }, "should-use-system-language": "Gebruik stelsel taal", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,6 +124,7 @@ "general": "Algemeen", "mining": "Mynbou", "p2p": "Poel Mynbou", + "releaseNotes": "Release Notes", "very_experimental": "Baie Eksperimenteel", "wallet": "Beursie" }, diff --git a/public/locales/cn/common.json b/public/locales/cn/common.json index 8129ebf12..1d08840b0 100644 --- a/public/locales/cn/common.json +++ b/public/locales/cn/common.json @@ -10,6 +10,7 @@ "hashrate": "哈希率", "installation-problem": "Installation problem", "max-temperature": "最高温度", + "minimize": "Minimize", "mode": "模式", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "请稍后再试。如果问题仍然存在,请联系我们。", @@ -22,6 +23,7 @@ "temperature": "温度", "testnet": "测试网", "unknown": "未知", + "unminimize": "Unminimize", "usage": "使用", "utilization": "利用率", "version": "版本", diff --git a/public/locales/cn/mining-view.json b/public/locales/cn/mining-view.json index 0cbf954ee..5b72b4314 100644 --- a/public/locales/cn/mining-view.json +++ b/public/locales/cn/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "停止挖矿", "waiting-for-idle": "等待空闲" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "您分别为 CPU 和 GPU 挖矿获得奖励", "you-won-block": "您赢得了区块 #{{ blockHeight }}", "you-won-while-away": "您在离开时赢得了 {{ blocks }}", diff --git a/public/locales/cn/settings.json b/public/locales/cn/settings.json index 09659c1b0..a25b19c23 100644 --- a/public/locales/cn/settings.json +++ b/public/locales/cn/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "应用邀请代码", "cancel": "取消", "change-language": "更改语言", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "已连接的节点", @@ -46,6 +48,7 @@ "title": "机器被视为空闲的时间" }, "importing-wallet": "正在导入钱包", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "输入24个用空格分隔的单词", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "邀请代码", @@ -82,8 +85,17 @@ }, "pool-mining": "矿池挖矿", "pool-mining-description": "启用后,您将在矿池中挖矿并加入一组矿工(部落)。", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx 网络算力", "refresh-versions": "刷新版本", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "报告问题", "reset-permanently": "您确定要永久重置所有设置吗?", "reset-settings": "重置设置", @@ -103,6 +115,7 @@ "title": "系统启动时自动启动" }, "should-use-system-language": "使用系统语言", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "空投", @@ -111,6 +124,7 @@ "general": "常规", "mining": "挖矿", "p2p": "矿池挖矿", + "releaseNotes": "Release Notes", "very_experimental": "非常实验性", "wallet": "钱包" }, diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 03c81c724..071a7bb07 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -10,6 +10,7 @@ "hashrate": "Hashrate", "installation-problem": "Installation problem", "max-temperature": "Maximaltemperatur", + "minimize": "Minimize", "mode": "Modus", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Bitte versuche es später erneut. Wenn das Problem weiterhin besteht, kontaktiere uns bitte.", @@ -22,6 +23,7 @@ "temperature": "Temperatur", "testnet": "Testnet", "unknown": "Unbekannt", + "unminimize": "Unminimize", "usage": "Nutzung", "utilization": "Auslastung", "version": "Version", diff --git a/public/locales/de/mining-view.json b/public/locales/de/mining-view.json index 2ae914a6a..cdb4f11fc 100644 --- a/public/locales/de/mining-view.json +++ b/public/locales/de/mining-view.json @@ -16,6 +16,15 @@ "stop-mining": "Mining stoppen", "waiting-for-idle": "Warten auf Leerlauf" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Sie verdienen Belohnungen für das Mining von CPU und GPU separat", "you-won-block": "Sie waren der Gewinner von Block #{{ blockHeight }}", "you-won-while-away": "Sie haben {{ blocks }} gewonnen, während Sie weg waren", diff --git a/public/locales/de/settings.json b/public/locales/de/settings.json index efa55121c..97ce82b9c 100644 --- a/public/locales/de/settings.json +++ b/public/locales/de/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Einladungscode anwenden", "cancel": "Abbrechen", "change-language": "Sprache", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Verbundenen Peers", @@ -46,6 +48,7 @@ "title": "Zeit nach der die Maschine als inaktiv betrachtet wird" }, "importing-wallet": "Wallet wird importiert", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Geben Sie 24 Wörter ein, getrennt durch Leerzeichen", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Einladungscode", @@ -82,8 +85,17 @@ }, "pool-mining": "Pool-Mining", "pool-mining-description": "Wenn aktiviert, wirst du in einem Pool minen und einer Gruppe von Minern beitreten.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx-Netzwerk-Hashrate", "refresh-versions": "Versionen aktualisieren", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Ein Problem melden", "reset-permanently": "Bist du sicher, dass du alle Einstellungen dauerhaft zurücksetzen möchtest?", "reset-settings": "Einstellungen zurücksetzen", @@ -103,6 +115,7 @@ "title": "Automatischer Start beim Systemstart" }, "should-use-system-language": "Systemsprache verwenden", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,6 +124,7 @@ "general": "Allgemein", "mining": "Mining", "p2p": "Pool-Mining", + "releaseNotes": "Release Notes", "very_experimental": "Sehr experimentell", "wallet": "Wallet" }, diff --git a/public/locales/en/common.json b/public/locales/en/common.json index ec35d4b37..ec8890c57 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -10,6 +10,7 @@ "hashrate": "Hashrate", "installation-problem": "Installation problem", "max-temperature": "Max temperature", + "minimize": "Minimize", "mode": "Mode", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Please try again later. If the problem persists, please contact us.", @@ -22,6 +23,7 @@ "temperature": "Temperature", "testnet": "Testnet", "unknown": "Unknown", + "unminimize": "Unminimize", "usage": "Usage", "utilization": "Utilization", "version": "Version", diff --git a/public/locales/en/mining-view.json b/public/locales/en/mining-view.json index 822262fbc..ce2537598 100644 --- a/public/locales/en/mining-view.json +++ b/public/locales/en/mining-view.json @@ -16,6 +16,15 @@ "stop-mining": "Stop Mining", "waiting-for-idle": "Waiting for Idle" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "You earn rewards for mining CPU and GPU separately", "you-won-block": "You were the winner of block #{{ blockHeight }}", "you-won-while-away": "You won {{ blocks }} while you were away", diff --git a/public/locales/en/settings.json b/public/locales/en/settings.json index 74345c1e5..c857a8755 100644 --- a/public/locales/en/settings.json +++ b/public/locales/en/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Apply Invite Code", "cancel": "Cancel", "change-language": "Language", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Import new wallet", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?\nYour current wallet will be abandoned.", "connected-peers": "Connected Peers", @@ -46,6 +48,7 @@ "title": "Time after which mdchine is considered idle" }, "importing-wallet": "Importing wallet", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Enter 24 words separated by spaces", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Invite Code", @@ -82,8 +85,17 @@ }, "pool-mining": "Pool Mining", "pool-mining-description": "When enabled, you will mine in a pool and join a group of miners.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx network hashrate", "refresh-versions": "Refresh versions", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Report an issue", "reset-permanently": "Are you sure you want to reset all settings permanently?", "reset-settings": "Reset Settings", @@ -103,6 +115,7 @@ "title": "Auto-start on system boot" }, "should-use-system-language": "Use system language", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,9 +124,9 @@ "general": "General", "mining": "Mining", "p2p": "Pool Mining", + "releaseNotes": "Release Notes", "very_experimental": "Very Experimental", - "wallet": "Wallet", - "releaseNotes": "Release Notes" + "wallet": "Wallet" }, "tari-wallet-address": "Tari Wallet Address", "terms-and-conditions": "Terms & Conditions", @@ -136,9 +149,5 @@ "visual-mode": "Visual mode", "yes": "Yes", "your-feedback": "Describe your issue, including your Telegram handle if you have one, so that we can contact you with updates.", - "your-reference": "Your reference:
{{logRef}}", - "release-notes": { - "upgrade-available": "⚠️ Upgrade Available", - "loading": "Loading release notes..." - } + "your-reference": "Your reference:
{{logRef}}" } \ No newline at end of file diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 8e23824c6..939002009 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -10,6 +10,7 @@ "hashrate": "Taux de hachage", "installation-problem": "Installation problem", "max-temperature": "Température maximale", + "minimize": "Minimize", "mode": "Mode", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Réessaye plus tard s'il te plaît. Si le problème persiste, contacte-nous s'il te plaît.", @@ -22,6 +23,7 @@ "temperature": "Température", "testnet": "Testnet", "unknown": "Inconnu", + "unminimize": "Unminimize", "usage": "Utilisation", "utilization": "Utilisation", "version": "Version", diff --git a/public/locales/fr/mining-view.json b/public/locales/fr/mining-view.json index e5bd25968..d08321cc1 100644 --- a/public/locales/fr/mining-view.json +++ b/public/locales/fr/mining-view.json @@ -16,6 +16,15 @@ "stop-mining": "Arrêtez le minage", "waiting-for-idle": "En attente d'inactivité" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Vous gagnez des récompenses pour le minage CPU et GPU séparément", "you-won-block": "Vous avez gagné le bloc #{{ blockHeight }}", "you-won-while-away": "Vous avez gagné {{ blocks }} pendant votre absence", diff --git a/public/locales/fr/settings.json b/public/locales/fr/settings.json index 7fc5cf9c1..093fae309 100644 --- a/public/locales/fr/settings.json +++ b/public/locales/fr/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Appliquer le code d\"invitation", "cancel": "Cancel", "change-language": "Langue", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Pairs connectés", @@ -46,6 +48,7 @@ "title": "Temps après lequel la machine est considérée comme inactive" }, "importing-wallet": "Importation du portefeuille", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Entrez 24 mots séparés par des espaces", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Code d\"invitation", @@ -82,8 +85,17 @@ }, "pool-mining": "Minage en pool", "pool-mining-description": "Lorsqu\"il est activé, vous minerez dans un pool et rejoindrez un groupe de mineurs.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Taux de hachage du réseau Randomx", "refresh-versions": "Rafraîchir les versions", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Signaler un problème", "reset-permanently": "Êtes-vous sûr de vouloir réinitialiser tous les paramètres de manière permanente ?", "reset-settings": "Réinitialiser les paramètres", @@ -103,6 +115,7 @@ "title": "Démarrage automatique au démarrage du système" }, "should-use-system-language": "Utiliser la langue du système", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,6 +124,7 @@ "general": "Général", "mining": "Minage", "p2p": "Minage en pool", + "releaseNotes": "Release Notes", "very_experimental": "Très Expérimental", "wallet": "Portefeuille" }, diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 92098b772..496edb6aa 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -10,6 +10,7 @@ "hashrate": "हैश दर", "installation-problem": "Installation problem", "max-temperature": "अधिकतम तापमान", + "minimize": "Minimize", "mode": "मोड", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "कृपया बाद में पुनः प्रयास करें। यदि समस्या बनी रहती है, तो कृपया हमसे संपर्क करें।", @@ -22,6 +23,7 @@ "temperature": "तापमान", "testnet": "टेस्टनेट", "unknown": "अज्ञात", + "unminimize": "Unminimize", "usage": "उपयोग", "utilization": "उपयोग", "version": "संस्करण", diff --git a/public/locales/hi/mining-view.json b/public/locales/hi/mining-view.json index e974ef65b..7348b079e 100644 --- a/public/locales/hi/mining-view.json +++ b/public/locales/hi/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "माइनिंग रोकें", "waiting-for-idle": "निष्क्रिय होने की प्रतीक्षा" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "आप CPU और GPU माइनिंग के लिए अलग-अलग पुरस्कार अर्जित करते हैं", "you-won-block": "आप ब्लॉक #{{ blockHeight }} के विजेता थे", "you-won-while-away": "आपने {{ blocks }} जीते जब आप दूर थे", diff --git a/public/locales/hi/settings.json b/public/locales/hi/settings.json index ae80e512a..44135d491 100644 --- a/public/locales/hi/settings.json +++ b/public/locales/hi/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "आमंत्रण कोड लागू करें", "cancel": "रद्द करें", "change-language": "भाषा", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "जुड़े हुए सहकर्मी", @@ -46,6 +48,7 @@ "title": "समय जिसके बाद मशीन को निष्क्रिय माना जाता है" }, "importing-wallet": "वॉलेट आयात किया जा रहा है", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "24 शब्दों को स्पेस से अलग करके दर्ज करें", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "आमंत्रण कोड", @@ -82,8 +85,17 @@ }, "pool-mining": "पूल माइनिंग", "pool-mining-description": "सक्षम होने पर, आप एक पूल में माइन करेंगे और माइनर्स के समूह में शामिल होंगे।", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx नेटवर्क हैशरेट", "refresh-versions": "संस्करण ताज़ा करें", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "समस्या की रिपोर्ट करें", "reset-permanently": "क्या आप वाकई सभी सेटिंग्स को स्थायी रूप से रीसेट करना चाहते हैं?", "reset-settings": "सेटिंग्स रीसेट करें", @@ -103,6 +115,7 @@ "title": "सिस्टम बूट पर स्वचालित शुरूआत" }, "should-use-system-language": "सिस्टम भाषा का उपयोग करें", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "एयरड्रॉप", @@ -111,6 +124,7 @@ "general": "सामान्य", "mining": "माइनिंग", "p2p": "पूल माइनिंग", + "releaseNotes": "Release Notes", "very_experimental": "बहुत प्रयोगात्मक", "wallet": "वॉलेट" }, diff --git a/public/locales/id/common.json b/public/locales/id/common.json index b7c0edf17..b0bed0dfe 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -10,6 +10,7 @@ "hashrate": "Hashrate", "installation-problem": "Installation problem", "max-temperature": "Suhu maksimum", + "minimize": "Minimize", "mode": "Mode", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Silakan coba lagi nanti. Jika masalah berlanjut, silakan hubungi kami.", @@ -22,6 +23,7 @@ "temperature": "Suhu", "testnet": "Testnet", "unknown": "Tidak diketahui", + "unminimize": "Unminimize", "usage": "Penggunaan", "utilization": "Pemanfaatan", "version": "Versi", diff --git a/public/locales/id/mining-view.json b/public/locales/id/mining-view.json index 92fe2ae40..19a9bafcd 100644 --- a/public/locales/id/mining-view.json +++ b/public/locales/id/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "Hentikan Penambangan", "waiting-for-idle": "Menunggu Tidak Aktif" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Anda mendapatkan hadiah untuk menambang CPU dan GPU secara terpisah", "you-won-block": "Anda adalah pemenang dari blok #{{ blockHeight }}", "you-won-while-away": "Anda memenangkan {{ blocks }} saat Anda pergi", diff --git a/public/locales/id/settings.json b/public/locales/id/settings.json index ae95dca7a..3d8f6559a 100644 --- a/public/locales/id/settings.json +++ b/public/locales/id/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Terapkan Kode Undangan", "cancel": "Batal", "change-language": "Bahasa", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Rekan Terhubung", @@ -46,6 +48,7 @@ "title": "Waktu setelah mesin dianggap tidak aktif" }, "importing-wallet": "Mengimpor dompet", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Masukkan 24 kata yang dipisahkan oleh spasi", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Kode Undangan", @@ -82,8 +85,17 @@ }, "pool-mining": "Penambangan Pool", "pool-mining-description": "Ketika diaktifkan, Anda akan menambang dalam pool dan bergabung dengan kelompok penambang.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Hashrate jaringan Randomx", "refresh-versions": "Segarkan versi", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Laporkan masalah", "reset-permanently": "Apakah Anda yakin ingin mengatur ulang semua pengaturan secara permanen?", "reset-settings": "Atur Ulang Pengaturan", @@ -103,6 +115,7 @@ "title": "Mulai otomatis saat boot sistem" }, "should-use-system-language": "Gunakan bahasa sistem", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,6 +124,7 @@ "general": "Umum", "mining": "Penambangan", "p2p": "Penambangan Pool", + "releaseNotes": "Release Notes", "very_experimental": "Sangat Eksperimental", "wallet": "Dompet" }, diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 4d99bda5e..fa9db31df 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -10,6 +10,7 @@ "hashrate": "ハッシュレート", "installation-problem": "Installation problem", "max-temperature": "最大温度", + "minimize": "Minimize", "mode": "モード", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "後でもう一度お試しください。問題が続く場合は、お問い合わせください。", @@ -22,6 +23,7 @@ "temperature": "温度", "testnet": "テストネット", "unknown": "不明", + "unminimize": "Unminimize", "usage": "使用量", "utilization": "利用率", "version": "バージョン", diff --git a/public/locales/ja/mining-view.json b/public/locales/ja/mining-view.json index d7e38290a..768451a86 100644 --- a/public/locales/ja/mining-view.json +++ b/public/locales/ja/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "マイニングを停止", "waiting-for-idle": "アイドル待機中" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "CPUとGPUのマイニングで別々に報酬を得ます", "you-won-block": "ブロック #{{ blockHeight }} の勝者です", "you-won-while-away": "不在中に{{ blocks }}を獲得しました", diff --git a/public/locales/ja/settings.json b/public/locales/ja/settings.json index 97aa4a1f4..c3f904e13 100644 --- a/public/locales/ja/settings.json +++ b/public/locales/ja/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "招待コードを適用", "cancel": "キャンセル", "change-language": "言語", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "接続されたピア", @@ -46,6 +48,7 @@ "title": "マシンがアイドルと見なされるまでの時間" }, "importing-wallet": "ウォレットのインポート", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "スペースで区切って24の単語を入力してください", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "招待コード", @@ -82,8 +85,17 @@ }, "pool-mining": "プールマイニング", "pool-mining-description": "有効にすると、プールでマイニングし、マイナーのグループに参加します。", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomxネットワークのハッシュレート", "refresh-versions": "バージョンを更新", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "問題を報告する", "reset-permanently": "すべての設定を永久にリセットしてもよろしいですか?", "reset-settings": "設定をリセット", @@ -103,6 +115,7 @@ "title": "システム起動時に自動開始" }, "should-use-system-language": "システム言語を使用", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "エアドロップ", @@ -111,6 +124,7 @@ "general": "一般", "mining": "マイニング", "p2p": "プールマイニング", + "releaseNotes": "Release Notes", "very_experimental": "非常に実験的", "wallet": "ウォレット" }, diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index c2979acb5..0c929b243 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -10,6 +10,7 @@ "hashrate": "해시레이트", "installation-problem": "Installation problem", "max-temperature": "최대 온도", + "minimize": "Minimize", "mode": "모드", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "나중에 다시 시도해 주세요. 문제가 계속되면 저희에게 연락해 주세요.", @@ -22,6 +23,7 @@ "temperature": "온도", "testnet": "테스트넷", "unknown": "알 수 없음", + "unminimize": "Unminimize", "usage": "사용량", "utilization": "활용도", "version": "버전", diff --git a/public/locales/ko/mining-view.json b/public/locales/ko/mining-view.json index b19798b95..eb56ebd74 100644 --- a/public/locales/ko/mining-view.json +++ b/public/locales/ko/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "채굴 중지", "waiting-for-idle": "유휴 상태 대기 중" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "CPU와 GPU 채굴에 대해 각각 보상을 받습니다", "you-won-block": "당신은 블록 #{{ blockHeight }}의 승자였습니다", "you-won-while-away": "자리를 비운 동안 {{ blocks }}를 획득했습니다", diff --git a/public/locales/ko/settings.json b/public/locales/ko/settings.json index 979d820ad..581529585 100644 --- a/public/locales/ko/settings.json +++ b/public/locales/ko/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "초대 코드 적용", "cancel": "취소", "change-language": "언어", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "연결된 피어", @@ -46,6 +48,7 @@ "title": "기기가 유휴 상태로 간주되는 시간" }, "importing-wallet": "지갑 가져오기", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "공백으로 구분된 24개의 단어를 입력하세요", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "초대 코드", @@ -82,8 +85,17 @@ }, "pool-mining": "풀 채굴", "pool-mining-description": "활성화되면 풀에서 채굴하고 마이너 그룹에 참여합니다.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx 네트워크 해시레이트", "refresh-versions": "버전 새로고침", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "문제 보고", "reset-permanently": "모든 설정을 영구적으로 초기화하시겠습니까?", "reset-settings": "설정 초기화", @@ -103,6 +115,7 @@ "title": "시스템 부팅 시 자동 시작" }, "should-use-system-language": "시스템 언어 사용", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "에어드롭", @@ -111,6 +124,7 @@ "general": "일반", "mining": "채굴", "p2p": "풀 채굴", + "releaseNotes": "Release Notes", "very_experimental": "매우 실험적", "wallet": "지갑" }, diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index aa761a148..bbdc2e7ae 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -10,6 +10,7 @@ "hashrate": "Prędkość ( hashrate )", "installation-problem": "Installation problem", "max-temperature": "Maksymalna temperatura", + "minimize": "Minimize", "mode": "Tryb", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Spróbuj ponownie później. Jeśli problem będzie się powtarzał, skontaktuj się z nami.", @@ -22,6 +23,7 @@ "temperature": "Temperatura", "testnet": "Testnet", "unknown": "Nieznany", + "unminimize": "Unminimize", "usage": "Użycie", "utilization": "Wykorzystanie", "version": "Wersja", diff --git a/public/locales/pl/mining-view.json b/public/locales/pl/mining-view.json index e4b7e9c8a..7dfc1bf0a 100644 --- a/public/locales/pl/mining-view.json +++ b/public/locales/pl/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "Zatrzymaj kopanie", "waiting-for-idle": "Oczekiwanie na bezczynność" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Zarabiasz nagrody za kopanie CPU i GPU osobno", "you-won-block": "Byłeś zwycięzcą bloku #{{ blockHeight }}", "you-won-while-away": "Wygrałeś {{ blocks }} podczas swojej nieobecności", diff --git a/public/locales/pl/settings.json b/public/locales/pl/settings.json index 9f28735e2..acd0e61df 100644 --- a/public/locales/pl/settings.json +++ b/public/locales/pl/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Zastosuj Kod Zaproszenia", "cancel": "Anuluj", "change-language": "Zmień język", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Połączone węzły", @@ -47,6 +49,7 @@ "title": "Czas po którym urządzenie jest uważane za bezczynne" }, "importing-wallet": "Importowanie portfela", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Wprowadź 24 słowa oddzielone spacjami", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Kod Zaproszenia", @@ -84,8 +87,17 @@ }, "pool-mining": "Kopanie w puli", "pool-mining-description": "Po włączeniu tej opcji będziesz wydobywać w puli i dołączać do grupy górników (plemienia).", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Hashrate sieci Randomx", "refresh-versions": "Odśwież wersje", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Zgłoś problem", "reset-permanently": "Czy na pewno chcesz trwale zresetować ustawienia?", "reset-settings": "Resetuj ustawienia", @@ -105,6 +117,7 @@ "title": "Automatyczne uruchamianie przy starcie systemu" }, "should-use-system-language": "Użyj języka systemowego", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -113,6 +126,7 @@ "general": "Ogólne", "mining": "Wydobycie", "p2p": "Kopanie w puli", + "releaseNotes": "Release Notes", "very_experimental": "Bardzo Eksperymentalne", "wallet": "Portfel" }, diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index d362e6a3a..086772191 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -10,6 +10,7 @@ "hashrate": "Хэшрейт", "installation-problem": "Installation problem", "max-temperature": "Максимальная температура", + "minimize": "Minimize", "mode": "Режим", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Пожалуйста, попробуйте позже. Если проблема сохраняется, свяжитесь с нами.", @@ -22,6 +23,7 @@ "temperature": "Температура", "testnet": "Тестовая сеть", "unknown": "Неизвестно", + "unminimize": "Unminimize", "usage": "Использование", "utilization": "Использование", "version": "Версия", diff --git a/public/locales/ru/mining-view.json b/public/locales/ru/mining-view.json index 0ed5fcb24..da82da207 100644 --- a/public/locales/ru/mining-view.json +++ b/public/locales/ru/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "Остановить майнинг", "waiting-for-idle": "Ожидание простоя" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "Вы получаете награды за майнинг на CPU и GPU отдельно", "you-won-block": "Вы выиграли блок #{{ blockHeight }}", "you-won-while-away": "Вы выиграли {{ blocks }}, пока вас не было", diff --git a/public/locales/ru/settings.json b/public/locales/ru/settings.json index 52ea2e8b6..af84d7657 100644 --- a/public/locales/ru/settings.json +++ b/public/locales/ru/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Применить код приглашения", "cancel": "Отмена", "change-language": "Язык", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Подключенные узлы", @@ -46,6 +48,7 @@ "title": "Время, после которого машина считается в простое" }, "importing-wallet": "Импорт кошелька", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Введите 24 слова, разделенные пробелами", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Код приглашения", @@ -82,8 +85,17 @@ }, "pool-mining": "Майнинг в пуле", "pool-mining-description": "При включении вы будете майнить в пуле и присоединитесь к группе майнеров.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Хэшрейт сети Randomx", "refresh-versions": "Обновить версии", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Сообщить о проблеме", "reset-permanently": "Вы уверены, что хотите сбросить все настройки навсегда?", "reset-settings": "Сбросить настройки", @@ -103,6 +115,7 @@ "title": "Автозапуск при загрузке системы" }, "should-use-system-language": "Использовать системный язык", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Эйрдроп", @@ -111,6 +124,7 @@ "general": "Общие", "mining": "Майнинг", "p2p": "Майнинг в пуле", + "releaseNotes": "Release Notes", "very_experimental": "Очень экспериментальные", "wallet": "Кошелек" }, diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index bb55db73d..907809255 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -10,6 +10,7 @@ "hashrate": "Hashrate", "installation-problem": "Installation problem", "max-temperature": "Maks. Sıcaklık", + "minimize": "Minimize", "mode": "Mod", "not-installed-in-applications-directory": "Oops! Tari Universe needs to live in the Applications directory. Mind installing it there?", "please-try-again-later": "Lütfen daha sonra tekrar deneyin. Sorun devam ederse, lütfen bizimle iletişime geçin.", @@ -22,6 +23,7 @@ "temperature": "Sıcaklık", "testnet": "Testnet", "unknown": "Bilinmeyen", + "unminimize": "Unminimize", "usage": "Kullanım", "utilization": "Fayda", "version": "Versiyon", diff --git a/public/locales/tr/mining-view.json b/public/locales/tr/mining-view.json index ce0475fda..54df1d55c 100644 --- a/public/locales/tr/mining-view.json +++ b/public/locales/tr/mining-view.json @@ -17,6 +17,15 @@ "stop-mining": "Madenciliği Durdur", "waiting-for-idle": "Boşta Bekliyor" }, + "orphan-chain-tooltip": { + "heading": "Things to try:", + "step_1": "Check your Internet connection", + "step_2": "Wait 30 mins", + "step_3": "Restart the app", + "step_4": "Try using a Tor Bridge (in Settings)", + "step_5": "Try disabling Tor (in Settings)", + "step_6": "Try an app reset (in Settings)" + }, "you-earn-rewards-separately": "CPU ve GPU madenciliği için ayrı ayrı ödüller kazanırsınız", "you-won-block": "blok #{{ blockHeight }} kazananı siz oldunuz", "you-won-while-away": "Uzakta olduğunuzda {{ blocks }} kazandınız", diff --git a/public/locales/tr/settings.json b/public/locales/tr/settings.json index 3b68f56ba..9200d6157 100644 --- a/public/locales/tr/settings.json +++ b/public/locales/tr/settings.json @@ -6,6 +6,8 @@ "applyInviteCode": "Davet Kodunu Uygula", "cancel": "İptal", "change-language": "Dil Değiştir", + "confirm": "Confirm", + "confirm-action": "Confirm action", "confirm-import-wallet": "Abandon current wallet?", "confirm-import-wallet-copy": "Are you sure you want to import a new wallet?", "connected-peers": "Bağlı Eşler", @@ -46,6 +48,7 @@ "title": "Makinenin boşta sayılacağı süre" }, "importing-wallet": "Cüzdan İçe Aktarılıyor", + "importing-wallet-copy": "Tari Universe will restart automatically once your wallet has been imported", "invalid-seed-words": "Boşluklarla ayrılmış 24 kelime girin", "invalid-stats-server-port": "Invalid stats server port", "inviteCode": "Davet Kodu", @@ -82,8 +85,17 @@ }, "pool-mining": "Havuz Madenciliği", "pool-mining-description": "Etkinleştirildiğinde, bir havuzda madencilik yapacak ve bir grup madenciye (kabileye) katılacaksınız.", + "pre-release": { + "description": "Explore the latest features before they go live and provide feedback", + "title": "Use pre-release version" + }, + "pre-release-note": "You are about to switch to the pre-release version of the application. This version can offer exciting new features and enhancements, with the possibility of encountering areas that may still be under refinement.", "randomx-network-hash-rate": "Randomx ağ hash oranı", "refresh-versions": "Sürümleri yenileyin", + "release-notes": { + "loading": "Loading release notes...", + "upgrade-available": "⚠️ Upgrade Available" + }, "report-issue": "Bir sorunu bildir", "reset-permanently": "Tüm ayarları kalıcı olarak sıfırlamak istediğinizden emin misiniz?", "reset-settings": "Ayarları sıfırla", @@ -103,6 +115,7 @@ "title": "Sistem açılışında otomatik başlat" }, "should-use-system-language": "Sistem Dilini Kullan", + "stable-version-note": "By turning off the pre-release version of the application, you will revert to the stable release, which prioritizes reliability and consistency. While you may miss out on the latest features and enhancements.", "stats-server-port": "Stats server port", "tabs": { "airdrop": "Airdrop", @@ -111,6 +124,7 @@ "general": "Genel", "mining": "Madencilik", "p2p": "Havuz Madenciliği", + "releaseNotes": "Release Notes", "very_experimental": "Çok Deneysel", "wallet": "Cüzdan" }, diff --git a/public/splash.html b/public/splash.html index 8ee044b30..5ec3fa41d 100644 --- a/public/splash.html +++ b/public/splash.html @@ -35,11 +35,11 @@ diff --git a/scripts/translator.js b/scripts/translator.js index 9f92b7299..ad8ac26ff 100644 --- a/scripts/translator.js +++ b/scripts/translator.js @@ -1,4 +1,8 @@ #!/usr/bin/env node + +// Copyright 2022 The Tari Project +// SPDX-License-Identifier: BSD-3-Clauses + import fs from 'fs'; import path from 'path'; import process from 'process'; diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 58f84ea23..46952dea7 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -142,18 +142,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" -dependencies = [ - "backtrace", -] +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arbitrary" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775a8770d29db3dadcb858482cc240af7b2ffde4ac4de67d1d4955728103f0e2" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -189,31 +186,33 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-broadcast" -version = "0.4.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d26004fe83b2d1cd3a97609b21e39f9a31535822210fe83205d2ce48866ea61" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ "event-listener", + "event-listener-strategy", "futures-core", - "parking_lot", + "pin-project-lite", ] [[package]] name = "async-channel" -version = "1.9.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-compression" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "bzip2", "deflate64", @@ -235,49 +234,69 @@ checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.1.1", - "futures-lite 2.4.0", + "fastrand", + "futures-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 = "1.13.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", - "autocfg", "cfg-if", "concurrent-queue", - "futures-lite 1.13.0", - "log", + "futures-io", + "futures-lite", "parking", - "polling 2.8.0", - "rustix 0.37.27", + "polling", + "rustix", "slab", - "socket2 0.4.10", - "waker-fn", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "2.8.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "async-recursion" -version = "0.3.2" +name = "async-process" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", ] [[package]] @@ -288,7 +307,25 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", ] [[package]] @@ -310,7 +347,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -327,7 +364,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -339,35 +376,34 @@ dependencies = [ "async-compression", "chrono", "crc32fast", - "futures-lite 2.4.0", + "futures-lite", "pin-project 1.1.7", - "thiserror", + "thiserror 1.0.69", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", ] [[package]] name = "atk" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" dependencies = [ "atk-sys", - "bitflags 1.3.2", "glib", "libc", ] [[package]] name = "atk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -382,8 +418,8 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" dependencies = [ - "dirs", - "thiserror", + "dirs 4.0.0", + "thiserror 1.0.69", "winreg 0.10.1", ] @@ -395,18 +431,18 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", - "bytes 1.8.0", + "bytes 1.9.0", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "itoa 1.0.11", + "itoa 1.0.14", "matchit", "memchr", "mime", @@ -414,7 +450,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower 0.5.1", "tower-layer", "tower-service", @@ -427,15 +463,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", - "bytes 1.8.0", + "bytes 1.9.0", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] @@ -461,7 +497,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978e81a45367d2409ecd33369a45dda2e9a3ca516153ec194de1fbda4b9fb79d" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -490,9 +526,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bigdecimal" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f850665a0385e070b64c38d2354e6c104c8479c59868d1e48a0c13ee2c7a1c1" +checksum = "7f31f3af01c5c65a07985c804d3366560e6fa7883d640a122819b14ec327482c" dependencies = [ "autocfg", "libm", @@ -573,11 +609,33 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "borsh" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03" dependencies = [ "borsh-derive", "cfg_aliases 0.2.1", @@ -585,23 +643,22 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.87", - "syn_derive", + "syn 2.0.90", ] [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -633,16 +690,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "bstr" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "build_const" version = "0.2.2" @@ -663,9 +710,9 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" [[package]] name = "byteorder" @@ -673,6 +720,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "0.5.6" @@ -681,9 +734,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -711,43 +764,76 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cairo-sys-rs", "glib", "libc", - "thiserror", + "once_cell", + "thiserror 1.0.69", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.2", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] name = "cargo_toml" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.7.8", + "toml 0.8.19", ] [[package]] name = "cc" -version = "1.1.35" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "jobserver", "libc", @@ -771,15 +857,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "cfg-expr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" -dependencies = [ - "smallvec", -] - [[package]] name = "cfg-expr" version = "0.15.8" @@ -845,9 +922,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -901,9 +978,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -911,9 +988,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -923,11 +1000,11 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.37" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11611dca53440593f38e6b25ec629de50b14cdfa63adc0fb856115a2c6d97595" +checksum = "d9647a559c112175f17cf724dc72d3645680a883c58481332779192b0d8e7a01" dependencies = [ - "clap 4.5.20", + "clap 4.5.23", ] [[package]] @@ -939,14 +1016,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clap_mangen" @@ -954,46 +1031,40 @@ version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbae9cbfdc5d4fa8711c09bd7b83f644cb48281ac35bf97af3e47b0675864bdf" dependencies = [ - "clap 4.5.20", + "clap 4.5.23", "roff", ] [[package]] name = "cocoa" -version = "0.24.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", "cocoa-foundation", - "core-foundation 0.9.4", + "core-foundation 0.10.0", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] [[package]] name = "cocoa-foundation" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", - "core-foundation 0.9.4", + "core-foundation 0.10.0", "core-graphics-types", "libc", "objc", ] -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "colorchoice" version = "1.0.3" @@ -1006,7 +1077,7 @@ version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "memchr", ] @@ -1043,6 +1114,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1071,25 +1152,25 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" -version = "0.22.3" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] [[package]] name = "core-graphics-types" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", + "bitflags 2.6.0", + "core-foundation 0.10.0", "libc", ] @@ -1104,9 +1185,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1249,17 +1330,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "ctor" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1297,7 +1378,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1321,7 +1402,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1332,7 +1413,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1389,13 +1470,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d475dfebcb4854d596b17b09f477616f80f17a550517f2b3615d8c205d5c802b" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1408,7 +1489,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1434,9 +1515,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" +checksum = "ccf1bedf64cdb9643204a36dd15b19a6ce8e7aa7f7b105868e9f1fad5ffa7d12" dependencies = [ "bigdecimal", "chrono", @@ -1460,7 +1541,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1480,7 +1561,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1500,24 +1581,23 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ - "dirs-sys", + "dirs-sys 0.3.7", ] [[package]] -name = "dirs-next" -version = "1.0.2" +name = "dirs" +version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf36e65a80337bea855cd4ef9b8401ffce06a7baedf2e85ec467b1ac3f6e82b6" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "cfg-if", - "dirs-sys-next", + "dirs-sys 0.4.1", ] [[package]] name = "dirs-next" -version = "2.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +checksum = "cf36e65a80337bea855cd4ef9b8401ffce06a7baedf2e85ec467b1ac3f6e82b6" dependencies = [ "cfg-if", "dirs-sys-next", @@ -1534,6 +1614,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -1559,7 +1651,30 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -1568,6 +1683,15 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + [[package]] name = "dsl_auto_type" version = "0.1.2" @@ -1579,7 +1703,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1617,9 +1741,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", "memchr", @@ -1644,6 +1768,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + [[package]] name = "endian-type" version = "0.1.2" @@ -1659,7 +1789,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1680,7 +1810,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -1689,42 +1819,58 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "erased-serde" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "event-listener" -version = "2.5.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] -name = "fastrand" -version = "1.9.0" +name = "event-listener-strategy" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "instant", + "event-listener", + "pin-project-lite", ] [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1751,7 +1897,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.1", + "memoffset", "rustc_version", ] @@ -1786,7 +1932,7 @@ source = "git+https://github.com/tauri-apps/fix-path-env-rs#0e479e2804edc1a7e5f1 dependencies = [ "home", "strip-ansi-escapes", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1809,23 +1955,14 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", ] -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1838,26 +1975,53 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "foreign-types" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ - "percent-encoding", + "foreign-types-macros", + "foreign-types-shared 0.3.1", ] [[package]] -name = "fs2" +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" @@ -1938,26 +2102,11 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1fa2f9765705486b33fd2acf1577f8ec449c2ba1f318ae5447697b7c08d210" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.1.1", + "fastrand", "futures-core", "futures-io", "parking", @@ -1972,7 +2121,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2023,11 +2172,10 @@ checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" [[package]] name = "gdk" -version = "0.15.4" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" dependencies = [ - "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -2039,35 +2187,35 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.11" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ - "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gdk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -2077,47 +2225,48 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gdkwayland-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" dependencies = [ "gdk-sys", "glib-sys", "gobject-sys", "libc", "pkg-config", - "system-deps 6.2.2", + "system-deps", ] [[package]] -name = "gdkx11-sys" -version = "0.15.1" +name = "gdkx11" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" dependencies = [ - "gdk-sys", - "glib-sys", + "gdk", + "gdkx11-sys", + "gio", + "glib", "libc", - "system-deps 6.2.2", "x11", ] [[package]] -name = "generator" -version = "0.7.5" +name = "gdkx11-sys" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" dependencies = [ - "cc", + "gdk-sys", + "glib-sys", "libc", - "log", - "rustversion", - "windows 0.48.0", + "system-deps", + "x11", ] [[package]] @@ -2130,6 +2279,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30" +dependencies = [ + "rustix", + "windows-targets 0.52.6", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -2172,77 +2331,81 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.15.12" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" dependencies = [ - "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", - "thiserror", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", "winapi", ] [[package]] name = "glib" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "glib-macros" -version = "0.15.13" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ - "anyhow", "heck 0.4.1", - "proc-macro-crate 1.1.3", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -2251,28 +2414,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "globset" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - [[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -2299,12 +2449,11 @@ dependencies = [ [[package]] name = "gtk" -version = "0.15.5" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" dependencies = [ "atk", - "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -2315,16 +2464,15 @@ dependencies = [ "gtk-sys", "gtk3-macros", "libc", - "once_cell", "pango", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -2335,58 +2483,38 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gtk3-macros" -version = "0.15.6" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" dependencies = [ - "anyhow", "proc-macro-crate 1.1.3", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes 1.8.0", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.6.0", - "slab", - "tokio", - "tokio-util 0.7.12", - "tracing", + "syn 2.0.90", ] [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", - "bytes 1.8.0", + "bytes 1.9.0", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", + "http", + "indexmap 2.7.0", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tracing", ] @@ -2404,9 +2532,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "hdrhistogram" @@ -2439,12 +2567,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" @@ -2477,7 +2599,7 @@ dependencies = [ "once_cell", "radix_trie", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -2488,7 +2610,7 @@ version = "0.25.0-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8270a1857fb962b9914aafd46a89a187a4e63d0eb4190c327e7c7b8256a2d055" dependencies = [ - "async-recursion 1.1.1", + "async-recursion", "async-trait", "bitflags 2.6.0", "cfg-if", @@ -2500,11 +2622,12 @@ dependencies = [ "idna 0.5.0", "ipnet", "once_cell", + "openssl", "rand 0.8.5", "ring", "rustls", - "rustls-pemfile 2.2.0", - "thiserror", + "rustls-pemfile", + "thiserror 1.0.69", "time", "tinyvec", "tokio", @@ -2529,7 +2652,7 @@ dependencies = [ "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -2590,35 +2713,13 @@ dependencies = [ [[package]] name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes 1.8.0", - "fnv", - "itoa 1.0.11", -] - -[[package]] -name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "fnv", - "itoa 1.0.11", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes 1.8.0", - "http 0.2.12", - "pin-project-lite", + "itoa 1.0.14", ] [[package]] @@ -2627,8 +2728,8 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes 1.8.0", - "http 1.1.0", + "bytes 1.9.0", + "http", ] [[package]] @@ -2637,19 +2738,13 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "futures-util", - "http 1.1.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] -[[package]] -name = "http-range" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" - [[package]] name = "httparse" version = "1.9.5" @@ -2662,12 +2757,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "human_format" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c3b1f728c459d27b12448862017b96ad4767b1ec2ec5e6434e99f1577f085b8" - [[package]] name = "humantime" version = "2.1.0" @@ -2676,43 +2765,19 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes 1.8.0", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa 1.0.11", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", - "itoa 1.0.11", + "itoa 1.0.14", "pin-project-lite", "smallvec", "tokio", @@ -2726,14 +2791,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.0", + "http", + "hyper", "hyper-util", "rustls", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", + "webpki-roots", ] [[package]] @@ -2742,35 +2808,22 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.5.0", + "hyper", "hyper-util", "pin-project-lite", "tokio", "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes 1.8.0", - "hyper 0.14.31", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2784,14 +2837,14 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.5.0", + "http", + "http-body", + "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower-service", "tracing", @@ -2945,7 +2998,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -2985,32 +3038,16 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.8", - "same-file", - "walkdir", - "winapi-util", -] - [[package]] name = "image" -version = "0.24.9" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", - "byteorder", - "color_quant", + "byteorder-lite", "num-traits", + "png", ] [[package]] @@ -3033,13 +3070,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -3074,20 +3111,20 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", "serde", ] [[package]] name = "infer" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" dependencies = [ "cfb", ] @@ -3116,24 +3153,13 @@ version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipconfig" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.7", + "socket2", "widestring", "windows-sys 0.48.0", "winreg 0.50.0", @@ -3205,15 +3231,15 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "javascriptcore-rs" -version = "0.16.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", "glib", @@ -3222,28 +3248,30 @@ dependencies = [ [[package]] name = "javascriptcore-rs-sys" -version = "0.4.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "jni" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -3263,32 +3291,32 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "json-patch" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonptr" -version = "0.4.7" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" dependencies = [ - "fluent-uri", "serde", "serde_json", ] @@ -3317,6 +3345,17 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + [[package]] name = "keyring" version = "3.6.1" @@ -3327,7 +3366,7 @@ dependencies = [ "linux-keyutils", "log", "security-framework 2.11.1", - "security-framework 3.0.0", + "security-framework 3.0.1", "windows-sys 0.59.0", ] @@ -3352,9 +3391,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libappindicator" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2d3cb96d092b4824cb306c9e544c856a4cb6210c1081945187f7f1924b47e8" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" dependencies = [ "glib", "gtk", @@ -3365,9 +3404,9 @@ dependencies = [ [[package]] name = "libappindicator-sys" -version = "0.7.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", "libloading 0.7.4", @@ -3376,9 +3415,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "liblmdb-sys" @@ -3402,9 +3441,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -3454,12 +3493,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -3468,9 +3501,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lmdb-zero" @@ -3537,27 +3570,12 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 1.0.69", "thread-id", "typemap-ors", "winapi", ] -[[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru-cache" version = "0.1.2" @@ -3642,15 +3660,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" @@ -3680,18 +3689,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.5" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -3775,13 +3775,13 @@ dependencies = [ "log", "mach2", "memmap2", - "memoffset 0.9.1", + "memoffset", "minidump-common", "nix 0.28.0", "procfs-core", "scroll", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3796,9 +3796,9 @@ dependencies = [ "log", "minidump-writer", "parking_lot", - "polling 3.7.3", + "polling", "scroll", - "thiserror", + "thiserror 1.0.69", "uds", ] @@ -3810,7 +3810,7 @@ checksum = "d7c4f23f835dbe67e44ddf884d3802ff549ca5948bf60e9fd70e9a13c96324d1" dependencies = [ "crash-handler", "minidumper", - "thiserror", + "thiserror 1.0.69", "uuid", ] @@ -3822,9 +3822,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "minisign-verify" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a05b5d0594e0cb1ad8cee3373018d2b84e25905dc75b2468114cc9a8e86cfc20" +checksum = "6367d84fb54d4242af283086402907277715b8fe46976963af5ebf173f8efba3" [[package]] name = "miniz_oxide" @@ -3838,16 +3838,16 @@ dependencies = [ [[package]] name = "minotari_app_grpc" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "argon2", "base64 0.13.1", "borsh", "chrono", "log", - "prost 0.13.3", - "prost-types 0.13.3", + "prost 0.13.4", + "prost-types 0.13.4", "rand 0.8.5", "rcgen", "subtle", @@ -3859,7 +3859,7 @@ dependencies = [ "tari_max_size", "tari_script", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "tonic", "tonic-build", @@ -3868,8 +3868,8 @@ dependencies = [ [[package]] name = "minotari_ledger_wallet_common" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "bs58 0.5.1", ] @@ -3877,7 +3877,7 @@ dependencies = [ [[package]] name = "minotari_node_grpc_client" version = "0.1.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "minotari_app_grpc", ] @@ -3885,21 +3885,20 @@ dependencies = [ [[package]] name = "minotari_wallet_grpc_client" version = "0.1.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "minotari_app_grpc", "tari_common_types", - "thiserror", + "thiserror 1.0.69", "tonic", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -3918,7 +3917,7 @@ dependencies = [ "hex-literal", "sealed", "serde", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", ] @@ -3932,7 +3931,27 @@ dependencies = [ "curve25519-dalek", "rand 0.8.5", "sha3", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "muda" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", ] [[package]] @@ -4009,15 +4028,17 @@ dependencies = [ [[package]] name = "ndk" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "thiserror", + "raw-window-handle", + "thiserror 1.0.69", ] [[package]] @@ -4028,9 +4049,9 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] @@ -4056,18 +4077,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.6.5", -] - [[package]] name = "nix" version = "0.28.0" @@ -4090,6 +4099,7 @@ dependencies = [ "cfg-if", "cfg_aliases 0.2.1", "libc", + "memoffset", ] [[package]] @@ -4123,16 +4133,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -4157,7 +4157,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4167,7 +4167,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" dependencies = [ "arrayvec", - "itoa 1.0.11", + "itoa 1.0.14", ] [[package]] @@ -4190,23 +4190,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -4216,10 +4216,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9bff0aa1d48904a1385ea2a8b97576fbdcbc9a3cfccd0d31fe978e1c4038c5" dependencies = [ "bitflags 2.6.0", - "libloading 0.8.5", + "libloading 0.8.6", "nvml-wrapper-sys", "static_assertions", - "thiserror", + "thiserror 1.0.69", "wrapcenum-derive", ] @@ -4229,7 +4229,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "698d45156f28781a4e79652b6ebe2eaa0589057d588d3aec1333f6466f13fcb5" dependencies = [ - "libloading 0.8.5", + "libloading 0.8.6", ] [[package]] @@ -4239,36 +4239,224 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] -name = "objc-foundation" -version = "0.1.1" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" dependencies = [ - "block", - "objc", - "objc_id", + "cc", ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ - "cc", + "objc-sys", + "objc2-encode", ] [[package]] -name = "objc_id" -version = "0.1.1" +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "objc", + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] @@ -4298,19 +4486,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "open" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" -dependencies = [ - "pathdiff", - "windows-sys 0.42.0", -] - -[[package]] -name = "open" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" dependencies = [ "is-wsl", "libc", @@ -4325,7 +4503,7 @@ checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -4340,7 +4518,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4349,6 +4527,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.104" @@ -4357,10 +4544,17 @@ checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-float" version = "2.10.1" @@ -4372,9 +4566,9 @@ dependencies = [ [[package]] name = "ordered-stream" -version = "0.0.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ "futures-core", "pin-project-lite", @@ -4382,9 +4576,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.8.2" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" +checksum = "e5ca711d8b83edbb00b44d504503cd247c9c0bd8b0fa2694f2a1a3d8165379ce" dependencies = [ "log", "serde", @@ -4401,19 +4595,13 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "pango" -version = "0.15.10" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ - "bitflags 1.3.2", + "gio", "glib", "libc", "once_cell", @@ -4422,14 +4610,14 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -4506,9 +4694,9 @@ checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" [[package]] name = "pathdiff" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pbkdf2" @@ -4543,7 +4731,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -4650,7 +4838,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4686,7 +4874,7 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dfa808155f59afafc457bd1a3835cb35d827f4387238099faa673447a656bfb" dependencies = [ - "clap 4.5.20", + "clap 4.5.23", "clap_complete", "clap_mangen", "include-lines", @@ -4731,7 +4919,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4746,6 +4934,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.31" @@ -4765,7 +4964,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.6.0", + "indexmap 2.7.0", "quick-xml", "serde", "time", @@ -4773,9 +4972,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.14" +version = "0.17.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +checksum = "b67582bd5b65bdff614270e2ea89a1cf15bef71245cc1e5f7ea126977144211d" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -4786,31 +4985,15 @@ dependencies = [ [[package]] name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix 0.38.39", + "rustix", "tracing", "windows-sys 0.59.0", ] @@ -4840,9 +5023,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -4882,7 +5065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -4903,10 +5086,19 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "thiserror", + "thiserror 1.0.69", "toml 0.5.11", ] +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -4948,9 +5140,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -4971,18 +5163,18 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "prost-derive 0.11.9", ] [[package]] name = "prost" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ - "bytes 1.8.0", - "prost-derive 0.13.3", + "bytes 1.9.0", + "prost-derive 0.13.4", ] [[package]] @@ -4991,7 +5183,7 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "heck 0.4.1", "itertools 0.10.5", "lazy_static", @@ -5009,11 +5201,10 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" +checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ - "bytes 1.8.0", "heck 0.5.0", "itertools 0.13.0", "log", @@ -5021,10 +5212,10 @@ dependencies = [ "once_cell", "petgraph", "prettyplease 0.2.25", - "prost 0.13.3", - "prost-types 0.13.3", + "prost 0.13.4", + "prost-types 0.13.4", "regex", - "syn 2.0.87", + "syn 2.0.90", "tempfile", ] @@ -5043,15 +5234,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5065,11 +5256,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" dependencies = [ - "prost 0.13.3", + "prost 0.13.4", ] [[package]] @@ -5087,6 +5278,58 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes 1.9.0", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.6", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes 1.9.0", + "getrandom 0.2.15", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.6", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd4b1eff68bf27940dd39811292c49e007f4d0b4c357358dc9b0197be6b527" +dependencies = [ + "cfg_aliases 0.2.1", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.37" @@ -5206,13 +5449,13 @@ dependencies = [ [[package]] name = "randomx-rs" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9abb8f2aa3432700c2b64a67406ac0da4956d78991f50559509cecc2b6abf249" +checksum = "09c347596479c4796192e68aec20e62e31655b57753586f2b1ec320b779ef14c" dependencies = [ "bitflags 1.3.2", "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5226,9 +5469,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" @@ -5291,7 +5534,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5302,84 +5545,27 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes 1.8.0", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tokio-util 0.7.12", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg 0.50.0", -] - [[package]] name = "reqwest" version = "0.12.9" @@ -5387,18 +5573,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", - "bytes 1.8.0", + "bytes 1.9.0", "encoding_rs", "futures-channel", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -5409,21 +5595,26 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "sync_wrapper 1.0.2", + "system-configuration", "tokio", "tokio-native-tls", - "tokio-util 0.7.12", + "tokio-rustls", + "tokio-util 0.7.13", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots", "windows-registry", ] @@ -5437,30 +5628,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "rfd" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" -dependencies = [ - "block", - "dispatch", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "lazy_static", - "log", - "objc", - "objc-foundation", - "objc_id", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.37.0", -] - [[package]] name = "ring" version = "0.17.8" @@ -5488,6 +5655,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -5505,36 +5678,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.27" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "log", "once_cell", @@ -5545,15 +5704,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -5568,6 +5718,9 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -5613,9 +5766,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -5630,10 +5783,31 @@ dependencies = [ ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.90", +] [[package]] name = "scopeguard" @@ -5658,7 +5832,7 @@ checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5670,7 +5844,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5688,9 +5862,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d0283c0a4a22a0f1b0e4edca251aa20b92fc96eaa09b84bec052f9415e9d71" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" dependencies = [ "bitflags 2.6.0", "core-foundation 0.10.0", @@ -5701,9 +5875,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -5746,8 +5920,7 @@ checksum = "5484316556650182f03b43d4c746ce0e3e48074a21e2f51244b648b6542e1066" dependencies = [ "httpdate", "native-tls", - "reqwest 0.12.9", - "sentry-anyhow", + "reqwest", "sentry-backtrace", "sentry-contexts", "sentry-core", @@ -5758,17 +5931,6 @@ dependencies = [ "ureq", ] -[[package]] -name = "sentry-anyhow" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d672bfd1ed4e90978435f3c0704edb71a7a9d86403657839d518cd6aa278aff5" -dependencies = [ - "anyhow", - "sentry-backtrace", - "sentry-core", -] - [[package]] name = "sentry-backtrace" version = "0.34.0" @@ -5837,21 +5999,7 @@ checksum = "c1356f9564dba35a7269402415ed1f3d6598a8ed51e62e8d8e75da1b4361b3f5" dependencies = [ "minidumper-child", "sentry", - "thiserror", -] - -[[package]] -name = "sentry-tauri" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe902aed0cf49c2636664a789f38faa220f29bad4b4b5d8a9f9ce3d9cd555b3" -dependencies = [ - "base64 0.22.1", - "sentry", - "sentry-rust-minidump", - "serde", - "tauri", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5877,7 +6025,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "url", "uuid", @@ -5885,13 +6033,24 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.214" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -5914,23 +6073,33 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.216" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", - "itoa 1.0.11", + "itoa 1.0.14", "memchr", "ryu", "serde", @@ -5944,7 +6113,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -5963,7 +6132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.11", + "itoa 1.0.14", "ryu", "serde", ] @@ -5978,7 +6147,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5995,7 +6164,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6004,8 +6173,8 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", - "itoa 1.0.11", + "indexmap 2.7.0", + "itoa 1.0.14", "ryu", "serde", "unsafe-libyaml", @@ -6013,9 +6182,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" dependencies = [ "serde", "serde_json", @@ -6024,13 +6193,13 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 1.0.109", ] [[package]] @@ -6043,15 +6212,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - [[package]] name = "sha1" version = "0.10.6" @@ -6063,12 +6223,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - [[package]] name = "sha2" version = "0.10.8" @@ -6090,15 +6244,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shared_child" version = "1.0.1" @@ -6138,7 +6283,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -6171,7 +6316,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6214,50 +6359,60 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.10" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "socket2" -version = "0.5.7" +name = "softbuffer" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ - "libc", - "windows-sys 0.52.0", + "bytemuck", + "cfg_aliases 0.2.1", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", ] [[package]] -name = "soup2" -version = "0.2.1" +name = "soup3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" dependencies = [ - "bitflags 1.3.2", + "futures-channel", "gio", "glib", "libc", - "once_cell", - "soup2-sys", + "soup3-sys", ] [[package]] -name = "soup2-sys" -version = "0.2.0" +name = "soup3-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] @@ -6278,15 +6433,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7386b49cb287f6fafbfd3bd604914bccb99fb8d53483f40e1ecfda5d45f3370" -[[package]] -name = "state" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" -dependencies = [ - "loom", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -6392,21 +6538,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "171758edb47aa306a78dfa4ab9aeb5167405bd4e3dc2b64e88f6a84bbe98bd63" [[package]] -name = "syn" -version = "1.0.109" +name = "swift-rs" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "base64 0.21.7", + "serde", + "serde_json", ] [[package]] name = "syn" -version = "2.0.87" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -6414,15 +6560,14 @@ dependencies = [ ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "syn" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.87", + "unicode-ident", ] [[package]] @@ -6433,9 +6578,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -6460,7 +6605,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6486,17 +6631,6 @@ dependencies = [ "windows 0.57.0", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -6505,17 +6639,7 @@ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.6.0", "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -6528,61 +6652,39 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" -dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] - [[package]] name = "system-deps" version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.15.8", + "cfg-expr", "heck 0.5.0", "pkg-config", "toml 0.8.19", - "version-compare 0.2.0", + "version-compare", ] [[package]] name = "tao" -version = "0.16.10" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d298c441a1da46e28e8ad8ec205aab7fd8cd71b9d10e05454224eef422e1ae" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "cc", + "bitflags 2.6.0", "cocoa", - "core-foundation 0.9.4", + "core-foundation 0.10.0", "core-graphics", "crossbeam-channel", - "dirs-next 2.0.0", "dispatch", - "gdk", - "gdk-pixbuf", - "gdk-sys", + "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", - "gio", - "glib", - "glib-sys", "gtk", - "image", "instant", "jni", "lazy_static", - "libappindicator", "libc", "log", "ndk", @@ -6591,15 +6693,14 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", "raw-window-handle", "scopeguard", - "serde", "tao-macros", "unicode-segmentation", - "uuid", - "windows 0.39.0", - "windows-implement 0.39.0", + "url", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", "x11-dl", ] @@ -6611,7 +6712,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -6649,7 +6750,7 @@ dependencies = [ [[package]] name = "tari-universe" -version = "0.8.14" +version = "0.8.15" dependencies = [ "anyhow", "async-trait", @@ -6659,14 +6760,14 @@ dependencies = [ "blake2", "chrono", "device_query", + "dirs 5.0.1", "dunce", "dyn-clone", "embed-resource", "fix-path-env", "flate2", - "futures-lite 2.4.0", + "futures-lite", "futures-util", - "human_format", "jsonwebtoken", "keyring", "libsqlite3-sys", @@ -6677,15 +6778,14 @@ dependencies = [ "monero-address-creator", "nix 0.29.0", "nvml-wrapper", - "open 5.3.0", + "open", + "openssl", "phraze", "rand 0.8.5", "regex", - "reqwest 0.12.9", + "reqwest", "sanitize-filename", "semver", - "sentry", - "sentry-tauri", "serde", "serde_cbor", "serde_json", @@ -6703,13 +6803,18 @@ dependencies = [ "tari_utilities", "tauri", "tauri-build", + "tauri-plugin-os", + "tauri-plugin-process", + "tauri-plugin-sentry", + "tauri-plugin-shell", "tauri-plugin-single-instance", - "thiserror", + "tauri-plugin-updater", + "thiserror 1.0.69", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "winreg 0.52.0", "xz2", - "zip 2.2.0", + "zip", ] [[package]] @@ -6735,12 +6840,12 @@ dependencies = [ [[package]] name = "tari_common" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "anyhow", "config", - "dirs-next 1.0.2", + "dirs-next", "log", "log4rs", "multiaddr", @@ -6753,28 +6858,28 @@ dependencies = [ "structopt", "tari_features", "tempfile", - "thiserror", + "thiserror 1.0.69", "toml 0.5.11", ] [[package]] name = "tari_common_sqlite" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "diesel", "diesel_migrations", "log", "serde", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "tari_common_types" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "base64 0.21.7", "bitflags 2.6.0", @@ -6794,19 +6899,19 @@ dependencies = [ "tari_common", "tari_crypto", "tari_utilities", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tari_comms" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "anyhow", "async-trait", "bitflags 2.6.0", "blake2", - "bytes 1.8.0", + "bytes 1.9.0", "chrono", "cidr", "data-encoding", @@ -6820,7 +6925,7 @@ dependencies = [ "nom", "once_cell", "pin-project 1.1.7", - "prost 0.13.3", + "prost 0.13.4", "rand 0.8.5", "serde", "serde_derive", @@ -6831,7 +6936,7 @@ dependencies = [ "tari_shutdown", "tari_storage", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util 0.6.10", @@ -6843,8 +6948,8 @@ dependencies = [ [[package]] name = "tari_comms_dht" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "anyhow", "bitflags 2.6.0", @@ -6859,7 +6964,7 @@ dependencies = [ "log", "log-mdc", "pin-project 0.4.30", - "prost 0.13.3", + "prost 0.13.4", "rand 0.8.5", "serde", "tari_common", @@ -6870,7 +6975,7 @@ dependencies = [ "tari_shutdown", "tari_storage", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "tower 0.4.13", "zeroize", @@ -6878,8 +6983,8 @@ dependencies = [ [[package]] name = "tari_comms_rpc_macros" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "proc-macro2", "quote", @@ -6888,9 +6993,10 @@ dependencies = [ [[package]] name = "tari_core" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ + "anyhow", "async-trait", "bincode", "bitflags 2.6.0", @@ -6902,10 +7008,12 @@ dependencies = [ "decimal-rs", "derivative", "digest", - "dirs-next 1.0.2", + "dirs-next", "fs2", "futures 0.3.31", "hex", + "hickory-client", + "hickory-proto", "integer-encoding", "lmdb-zero", "log", @@ -6917,7 +7025,7 @@ dependencies = [ "num-traits", "once_cell", "primitive-types", - "prost 0.13.3", + "prost 0.13.4", "rand 0.8.5", "randomx-rs", "serde", @@ -6947,7 +7055,7 @@ dependencies = [ "tari_storage", "tari_test_utils", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "zeroize", @@ -6979,13 +7087,13 @@ dependencies = [ [[package]] name = "tari_features" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" [[package]] name = "tari_hashing" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "borsh", "digest", @@ -6994,8 +7102,8 @@ dependencies = [ [[package]] name = "tari_key_manager" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "argon2", "async-trait", @@ -7020,26 +7128,26 @@ dependencies = [ "tari_crypto", "tari_service_framework", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "zeroize", ] [[package]] name = "tari_max_size" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "borsh", "serde", "tari_utilities", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tari_mmr" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "borsh", "digest", @@ -7047,22 +7155,23 @@ dependencies = [ "serde", "tari_crypto", "tari_utilities", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tari_p2p" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "anyhow", "fs2", "futures 0.3.31", "hickory-client", + "hickory-proto", "hickory-resolver", "lmdb-zero", "log", - "prost 0.13.3", + "prost 0.13.4", "rand 0.8.5", "rustls", "serde", @@ -7074,7 +7183,7 @@ dependencies = [ "tari_shutdown", "tari_storage", "tari_utilities", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tower 0.4.13", @@ -7083,8 +7192,8 @@ dependencies = [ [[package]] name = "tari_script" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "blake2", "borsh", @@ -7096,48 +7205,48 @@ dependencies = [ "tari_crypto", "tari_max_size", "tari_utilities", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tari_service_framework" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "anyhow", "async-trait", "futures 0.3.31", "log", "tari_shutdown", - "thiserror", + "thiserror 1.0.69", "tokio", "tower-service", ] [[package]] name = "tari_shutdown" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "futures 0.3.31", ] [[package]] name = "tari_storage" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "bincode", "lmdb-zero", "log", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tari_test_utils" -version = "1.8.0-pre.0" -source = "git+https://github.com/tari-project/tari.git?branch=development#e61b5e2d172f782e953f351a81723713b150c57d" +version = "1.9.1-pre.0" +source = "git+https://github.com/tari-project/tari.git?branch=development#b127883b8df10f7404caa184d083099f9d273eac" dependencies = [ "futures 0.3.31", "rand 0.8.5", @@ -7168,97 +7277,84 @@ dependencies = [ [[package]] name = "tauri" -version = "1.8.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf327e247698d3f39af8aa99401c9708384290d1f5c544bf5d251d44c2fea22" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", - "base64 0.22.1", - "bytes 1.8.0", - "cocoa", - "dirs-next 2.0.0", + "bytes 1.9.0", + "dirs 5.0.1", "dunce", "embed_plist", - "encoding_rs", - "flate2", "futures-util", "getrandom 0.2.15", - "glib", "glob", "gtk", "heck 0.5.0", - "http 0.2.12", - "ico", - "ignore", - "indexmap 1.9.3", - "infer", + "http", + "image", + "jni", + "libc", "log", - "minisign-verify", - "objc", - "once_cell", - "open 3.2.0", - "os_info", - "os_pipe", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", "plist", - "png", - "rand 0.8.5", "raw-window-handle", - "regex", - "reqwest 0.11.27", - "rfd", - "semver", + "reqwest", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", - "state", - "sys-locale", - "tar", + "swift-rs", + "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "tempfile", - "thiserror", - "time", + "thiserror 2.0.6", "tokio", + "tray-icon", "url", - "uuid", + "urlpattern", "webkit2gtk", "webview2-com", - "windows 0.39.0", - "zip 0.6.6", + "window-vibrancy", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "1.5.5" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "586f3e677f940c8bb4f70c52eda05dc59b79e61543f1182de83516810bb8e35d" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", - "dirs-next 2.0.0", + "dirs 5.0.1", + "glob", "heck 0.5.0", "json-patch", + "schemars", "semver", "serde", "serde_json", - "tauri-codegen", "tauri-utils", "tauri-winres", + "toml 0.8.19", "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.5" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a9e3f5cebf779a63bf24903e714ec91196c307d8249a0008b882424328bcda" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "brotli", "ico", "json-patch", @@ -7266,101 +7362,218 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver", "serde", "serde_json", "sha2", + "syn 2.0.90", "tauri-utils", - "thiserror", + "thiserror 2.0.6", "time", + "url", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.6" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d0e989f54fe06c5ef0875c5e19cf96453d099a0a774d5192ab47e80471cdab" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", "tauri-codegen", "tauri-utils", ] [[package]] -name = "tauri-plugin-single-instance" -version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#0a8484c52d74215bc4cbcc7fcb58e376f4fcd1f7" +name = "tauri-plugin" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.19", + "walkdir", +] + +[[package]] +name = "tauri-plugin-os" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dda2d571a9baf0664c1f2088db227e3072f9028602fafa885deade7547c3b738" +dependencies = [ + "gethostname", + "log", + "os_info", + "serde", + "serde_json", + "serialize-to-javascript", + "sys-locale", + "tauri", + "tauri-plugin", + "thiserror 2.0.6", +] + +[[package]] +name = "tauri-plugin-process" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40cc553ab29581c8c43dfa5fb0c9d5aee8ba962ad3b42908eea26c79610441b7" +dependencies = [ + "tauri", + "tauri-plugin", +] + +[[package]] +name = "tauri-plugin-sentry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd62441cb95406e41c7fed4da6b24aedae52a24566133f4056dc9a1178404770" +dependencies = [ + "base64 0.22.1", + "schemars", + "sentry", + "sentry-rust-minidump", + "serde", + "tauri", + "tauri-plugin", + "thiserror 1.0.69", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c50a63e60fb8925956cc5b7569f4b750ac197a4d39f13b8dd46ea8e2bad79" dependencies = [ + "encoding_rs", "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.6", + "tokio", +] + +[[package]] +name = "tauri-plugin-single-instance" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f36019ee9832dc99e4450bb55a21cfad8633b19c2c18bd17c7741939b070ede" +dependencies = [ "serde", "serde_json", "tauri", - "thiserror", + "thiserror 2.0.6", + "tracing", "windows-sys 0.59.0", "zbus", ] +[[package]] +name = "tauri-plugin-updater" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7351014c140906bcfff59d96e04b1170c8f602557f40eb37f7de356d4e7067b" +dependencies = [ + "base64 0.22.1", + "dirs 5.0.1", + "flate2", + "futures-util", + "http", + "infer", + "minisign-verify", + "percent-encoding", + "reqwest", + "semver", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror 2.0.6", + "time", + "tokio", + "url", + "windows-sys 0.59.0", + "zip", +] + [[package]] name = "tauri-runtime" -version = "0.14.5" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33fda7d213e239077fad52e96c6b734cecedb30c2382118b64f94cb5103ff3a" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ + "dpi", "gtk", - "http 0.2.12", - "http-range", - "rand 0.8.5", + "http", + "jni", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.6", "url", - "uuid", - "webview2-com", - "windows 0.39.0", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.10" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18c447dcd9b0f09c7dc4b752cc33e72788805bfd761fbda5692d30c48289efec" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ - "cocoa", "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "rand 0.8.5", "raw-window-handle", + "softbuffer", + "tao", "tauri-runtime", "tauri-utils", - "uuid", + "url", "webkit2gtk", "webview2-com", - "windows 0.39.0", + "windows 0.58.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.6.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0c939e88d82903a0a7dfb28388b12a3c03504d6bd6086550edaa3b6d8beaa" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ - "aes-gcm", "brotli", + "cargo_metadata", "ctor", "dunce", - "getrandom 0.2.15", "glob", - "heck 0.5.0", "html5ever", + "http", "infer", "json-patch", "kuchikiki", @@ -7369,15 +7582,20 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", + "regex", + "schemars", "semver", "serde", + "serde-untagged", "serde_json", "serde_with", - "serialize-to-javascript", - "thiserror", + "swift-rs", + "thiserror 2.0.6", + "toml 0.8.19", "url", + "urlpattern", + "uuid", "walkdir", - "windows-version", ] [[package]] @@ -7392,14 +7610,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand", "once_cell", - "rustix 0.38.39", + "rustix", "windows-sys 0.59.0", ] @@ -7431,22 +7649,42 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.6", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -7479,24 +7717,14 @@ dependencies = [ "winapi", ] -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", - "itoa 1.0.11", + "itoa 1.0.14", "num-conv", "powerfmt", "serde", @@ -7512,9 +7740,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -7556,18 +7784,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", - "bytes 1.8.0", + "bytes 1.9.0", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -7580,7 +7808,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -7595,25 +7823,24 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", ] [[package]] @@ -7622,7 +7849,7 @@ version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "futures-core", "futures-io", "futures-sink", @@ -7633,11 +7860,11 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ - "bytes 1.8.0", + "bytes 1.9.0", "futures-core", "futures-io", "futures-sink", @@ -7693,20 +7920,31 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", "winnow 0.5.40", ] +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.7.0", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -7723,19 +7961,19 @@ dependencies = [ "async-trait", "axum", "base64 0.22.1", - "bytes 1.8.0", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", + "bytes 1.9.0", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project 1.1.7", - "prost 0.13.3", - "rustls-pemfile 2.2.0", - "socket2 0.5.7", + "prost 0.13.4", + "rustls-pemfile", + "socket2", "tokio", "tokio-rustls", "tokio-stream", @@ -7753,10 +7991,10 @@ checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" dependencies = [ "prettyplease 0.2.25", "proc-macro2", - "prost-build 0.13.3", - "prost-types 0.13.3", + "prost-build 0.13.4", + "prost-types 0.13.4", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -7774,7 +8012,7 @@ dependencies = [ "rand 0.8.5", "slab", "tokio", - "tokio-util 0.7.12", + "tokio-util 0.7.13", "tower-layer", "tower-service", "tracing", @@ -7808,9 +8046,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -7820,52 +8058,53 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "tracing-subscriber" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ - "log", - "once_cell", "tracing-core", ] [[package]] -name = "tracing-subscriber" -version = "0.3.18" +name = "tray-icon" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" dependencies = [ - "matchers", - "nu-ansi-term", + "core-graphics", + "crossbeam-channel", + "dirs 5.0.1", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", ] [[package]] @@ -7874,6 +8113,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + [[package]] name = "typemap-ors" version = "1.0.0" @@ -7904,7 +8149,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.1", + "memoffset", "tempfile", "winapi", ] @@ -7930,6 +8175,47 @@ dependencies = [ "libc", ] +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicase" version = "2.8.0" @@ -7944,9 +8230,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -8014,9 +8300,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.10.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ "base64 0.22.1", "log", @@ -8027,9 +8313,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna 1.0.3", @@ -8037,6 +8323,18 @@ dependencies = [ "serde", ] +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + [[package]] name = "utf-8" version = "0.7.6" @@ -8083,12 +8381,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" - [[package]] name = "version-compare" version = "0.2.0" @@ -8141,12 +8433,6 @@ dependencies = [ "quote", ] -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - [[package]] name = "walkdir" version = "2.5.0" @@ -8180,9 +8466,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -8191,36 +8477,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8228,22 +8514,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" @@ -8260,9 +8546,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -8280,9 +8566,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -8298,20 +8584,18 @@ dependencies = [ "javascriptcore-rs", "libc", "once_cell", - "soup2", + "soup3", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.18.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" dependencies = [ - "atk-sys", "bitflags 1.3.2", "cairo-sys-rs", - "gdk-pixbuf-sys", "gdk-sys", "gio-sys", "glib-sys", @@ -8319,57 +8603,54 @@ dependencies = [ "gtk-sys", "javascriptcore-rs-sys", "libc", - "pango-sys", "pkg-config", - "soup2-sys", - "system-deps 6.2.2", + "soup3-sys", + "system-deps", ] [[package]] name = "webpki-roots" -version = "0.26.6" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] [[package]] name = "webview2-com" -version = "0.19.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.39.0", - "windows-implement 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-implement 0.58.0", + "windows-interface 0.58.0", ] [[package]] name = "webview2-com-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] name = "webview2-com-sys" -version = "0.19.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "regex", - "serde", - "serde_json", - "thiserror", - "windows 0.39.0", - "windows-bindgen", - "windows-metadata", + "thiserror 1.0.69", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -8381,7 +8662,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.39", + "rustix", ] [[package]] @@ -8422,30 +8703,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" -dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", -] - -[[package]] -name = "windows" -version = "0.39.0" +name = "window-vibrancy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" dependencies = [ - "windows-implement 0.39.0", - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.0", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", ] [[package]] @@ -8478,13 +8746,13 @@ dependencies = [ ] [[package]] -name = "windows-bindgen" -version = "0.39.0" +name = "windows" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-metadata", - "windows-tokens", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] @@ -8503,19 +8771,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement 0.57.0", - "windows-interface", + "windows-interface 0.57.0", "windows-result 0.1.2", "windows-targets 0.52.6", ] [[package]] -name = "windows-implement" -version = "0.39.0" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "syn 1.0.109", - "windows-tokens", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] @@ -8526,7 +8797,18 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -8537,14 +8819,19 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] -name = "windows-metadata" -version = "0.39.0" +name = "windows-interface" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] [[package]] name = "windows-registry" @@ -8587,17 +8874,11 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.42.2", ] [[package]] @@ -8627,6 +8908,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -8658,12 +8954,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-tokens" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" - [[package]] name = "windows-version" version = "0.1.1" @@ -8691,18 +8981,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -8721,18 +8999,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" - -[[package]] -name = "windows_i686_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -8757,18 +9023,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" - -[[package]] -name = "windows_i686_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -8787,18 +9041,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -8835,18 +9077,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -8921,7 +9151,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -8938,40 +9168,45 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.24.11" +version = "0.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55c80b12287eb1ff7c365fc2f7a5037cb6181bd44c9fce81c8d1cf7605ffad6" +checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73" dependencies = [ - "base64 0.13.1", - "block", - "cocoa", - "core-graphics", + "base64 0.22.1", + "block2", + "cookie", "crossbeam-channel", + "dpi", "dunce", - "gdk", - "gio", - "glib", + "gdkx11", "gtk", "html5ever", - "http 0.2.12", + "http", + "javascriptcore-rs", + "jni", "kuchikiki", "libc", - "log", - "objc", - "objc_id", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "once_cell", - "serde", - "serde_json", + "percent-encoding", + "raw-window-handle", "sha2", - "soup2", - "tao", - "thiserror", + "soup3", + "tao-macros", + "thiserror 1.0.69", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.39.0", - "windows-implement 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", + "x11-dl", ] [[package]] @@ -9011,8 +9246,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.39", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -9026,9 +9271,9 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31b5e376a8b012bee9c423acdbb835fc34d45001cfa3106236a624e4b738028" +checksum = "17610762a1207ee816c6fadc29220904753648aba0a9ed61c7b8336e80a559c4" dependencies = [ "futures 0.3.31", "log", @@ -9051,9 +9296,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -9063,50 +9308,49 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "synstructure 0.13.1", ] [[package]] name = "zbus" -version = "3.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ce2de393c874ba871292e881bf3c13a0d5eb38170ebab2e50b4c410eaa222b" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ "async-broadcast", - "async-channel", "async-executor", + "async-fs", "async-io", "async-lock", - "async-recursion 0.3.2", + "async-process", + "async-recursion", "async-task", "async-trait", - "byteorder", - "derivative", - "dirs", + "blocking", "enumflags2", "event-listener", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.24.3", - "once_cell", + "nix 0.29.0", "ordered-stream", "rand 0.8.5", "serde", "serde_repr", - "sha1 0.6.1", + "sha1", "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", + "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -9114,22 +9358,22 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13d08f5dc6cf725b693cb6ceacd43cd430ec0664a879188f29e7d7dcd98f96d" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "regex", - "syn 1.0.109", + "syn 2.0.90", + "zvariant_utils", ] [[package]] name = "zbus_names" -version = "2.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a408fd8a352695690f53906dc7fd036be924ec51ea5e05666ff42685ed0af5" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -9154,27 +9398,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", "synstructure 0.13.1", ] @@ -9195,7 +9439,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.90", ] [[package]] @@ -9217,25 +9461,14 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "byteorder", - "crc32fast", - "crossbeam-utils", + "syn 2.0.90", ] [[package]] name = "zip" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" +checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" dependencies = [ "aes", "arbitrary", @@ -9247,13 +9480,13 @@ dependencies = [ "displaydoc", "flate2", "hmac", - "indexmap 2.6.0", + "indexmap 2.7.0", "lzma-rs", "memchr", "pbkdf2", "rand 0.8.5", - "sha1 0.10.6", - "thiserror", + "sha1", + "thiserror 2.0.6", "time", "zeroize", "zopfli", @@ -9304,13 +9537,12 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.7.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794fb7f59af4105697b0449ba31731ee5dbb3e773a17dbdf3d36206ea1b1644" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -9318,12 +9550,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.7.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd58d4b6c8e26d3dd2149c8c40c6613ef6451b9885ff1296d1ac86c388351a54" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index bd8f2e8a2..8d3fd2268 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -4,13 +4,13 @@ description = "Tari Universe" edition = "2021" name = "tari-universe" repository = "https://github.com/tari-project/universe" -version = "0.8.14" +version = "0.8.15" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] embed-resource = "2.5.0" -tauri-build = { version = "1.5.5", features = ["isolation"] } +tauri-build = { version = "2", features = [] } [dependencies] anyhow = "1" @@ -27,7 +27,6 @@ fix-path-env = { git = "https://github.com/tauri-apps/fix-path-env-rs" } flate2 = "1.0.30" futures-lite = "2.3.0" futures-util = "0.3.30" -human_format = "1.1.0" jsonwebtoken = "9.3.0" keyring = { version = "3.0.5", features = [ "windows-native", @@ -51,8 +50,6 @@ regex = "1.10.5" reqwest = { version = "0.12.5", features = ["stream", "json", "multipart"] } sanitize-filename = "0.5" semver = "1.0.23" -sentry = { version = "0.34.0", features = ["anyhow"] } -sentry-tauri = "0.3.0" serde = { version = "1", features = ["derive"] } serde_cbor = "0.11.2" serde_json = "1" @@ -66,37 +63,33 @@ tari_common_types = { git = "https://github.com/tari-project/tari.git", branch = tari_core = { git = "https://github.com/tari-project/tari.git", branch = "development", features = [ "transactions", ] } + tari_crypto = "0.21.0" tari_key_manager = { git = "https://github.com/tari-project/tari.git", branch = "development" } tari_shutdown = { git = "https://github.com/tari-project/tari.git", branch = "development" } tari_utilities = "0.8.0" -tauri = { version = "1.8.0", features = [ - "window-unmaximize", - "window-unminimize", - "os-all", - "system-tray", - "updater", - "window-close", - "window-hide", - "window-maximize", - "window-minimize", - "window-show", - "window-start-dragging", - "window-maximize", - "window-close", +tauri = { version = "2", features = [ "macos-private-api", - "isolation", - "shell-open", - "icon-ico", - "icon-png", - "process-command-api", + "image-png", + "image-ico", + "tray-icon", + ] } -tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } +tauri-plugin-os = "2" +tauri-plugin-sentry = "0.2.0" +tauri-plugin-shell = "2" +tauri-plugin-single-instance = "^2" +tauri-plugin-updater = "^2" thiserror = "1.0.26" tokio = { version = "1", features = ["full"] } tokio-util = { version = "0.7.11", features = ["compat"] } xz2 = { version = "0.1.7", features = ["static"] } # static bind lzma zip = "2.2.0" +dirs = "5.0.1" +tauri-plugin-process = "2" + +# temporary fix for openssl +openssl = { version = "0.10", features = ["vendored"] } [target.'cfg(windows)'.dependencies] winreg = "0.52.0" @@ -108,7 +101,6 @@ libsqlite3-sys = { version = "0.25.1", features = ["bundled"] } log = "0.4.22" nvml-wrapper = "0.10.0" rand = "0.8.5" -sentry-tauri = "0.3.0" sys-locale = "0.3.1" # tonic = "0.12.0" @@ -122,4 +114,10 @@ release-ci = ["tauri/custom-protocol"] release-ci-beta = ["tauri/custom-protocol"] [package.metadata.cargo-machete] -ignored = ["log4rs", "xz2", "libsqlite3-sys", "minotari_wallet_grpc_client"] +ignored = [ + "libsqlite3-sys", + "log4rs", + "minotari_wallet_grpc_client", + "xz2", + "openssl", +] diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 77dd6444b..f0cf24a90 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + fn main() { if cfg!(target_os = "windows") { let mut windows = tauri_build::WindowsAttributes::new(); diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 000000000..540160433 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,21 @@ +{ + "identifier": "default", + "windows": ["main"], + "permissions": [ + "core:path:default", + "core:event:default", + "core:window:default", + "core:app:default", + "core:resources:default", + "core:menu:default", + "core:tray:default", + "core:window:allow-close", + "core:window:allow-destroy", + "core:window:allow-minimize", + "core:window:allow-unminimize", + "shell:allow-open", + "sentry:default", + "process:allow-restart", + "process:default" + ] +} diff --git a/src-tauri/capabilities/desktop.json b/src-tauri/capabilities/desktop.json new file mode 100644 index 000000000..00ff1a697 --- /dev/null +++ b/src-tauri/capabilities/desktop.json @@ -0,0 +1,11 @@ +{ + "identifier": "desktop-capability", + "platforms": [ + "macOS", + "windows", + "linux" + ], + "permissions": [ + "updater:default" + ] +} \ No newline at end of file diff --git a/src-tauri/capabilities/migrated.json b/src-tauri/capabilities/migrated.json new file mode 100644 index 000000000..2018241e2 --- /dev/null +++ b/src-tauri/capabilities/migrated.json @@ -0,0 +1,13 @@ +{ + "identifier": "migrated", + "description": "permissions that were migrated from v1", + "local": true, + "windows": [ + "main" + ], + "permissions": [ + "core:default", + "updater:default", + "os:default" + ] +} \ No newline at end of file diff --git a/src-tauri/src/app_config.rs b/src-tauri/src/app_config.rs index 6ef73e29f..582d11672 100644 --- a/src-tauri/src/app_config.rs +++ b/src-tauri/src/app_config.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::credential_manager::{Credential, KEYRING_ACCESSED}; use std::{path::PathBuf, time::SystemTime}; use sys_locale::get_locale; @@ -88,6 +110,8 @@ pub struct AppConfigFromFile { show_experimental_settings: bool, #[serde(default = "default_p2pool_stats_server_port")] p2pool_stats_server_port: Option, + #[serde(default = "default_false")] + pre_release: bool, } impl Default for AppConfigFromFile { @@ -129,6 +153,7 @@ impl Default for AppConfigFromFile { window_settings: default_window_settings(), show_experimental_settings: false, p2pool_stats_server_port: default_p2pool_stats_server_port(), + pre_release: false, } } } @@ -241,6 +266,7 @@ pub(crate) struct AppConfig { window_settings: Option, show_experimental_settings: bool, p2pool_stats_server_port: Option, + pre_release: bool, } impl AppConfig { @@ -285,6 +311,7 @@ impl AppConfig { show_experimental_settings: false, keyring_accessed: false, p2pool_stats_server_port: default_p2pool_stats_server_port(), + pre_release: false, } } @@ -361,6 +388,7 @@ impl AppConfig { self.window_settings = config.window_settings; self.show_experimental_settings = config.show_experimental_settings; self.p2pool_stats_server_port = config.p2pool_stats_server_port; + self.pre_release = config.pre_release; KEYRING_ACCESSED.store( config.keyring_accessed, @@ -672,6 +700,10 @@ impl AppConfig { Ok(()) } + pub fn auto_update(&self) -> bool { + self.auto_update + } + pub async fn set_auto_update(&mut self, auto_update: bool) -> Result<(), anyhow::Error> { self.auto_update = auto_update; self.update_config_file().await?; @@ -702,6 +734,16 @@ impl AppConfig { Ok(()) } + pub fn pre_release(&self) -> bool { + self.pre_release + } + + pub async fn set_pre_release(&mut self, pre_release: bool) -> Result<(), anyhow::Error> { + self.pre_release = pre_release; + self.update_config_file().await?; + Ok(()) + } + // Allow needless update because in future there may be fields that are // missing #[allow(clippy::needless_update)] @@ -748,6 +790,7 @@ impl AppConfig { window_settings: self.window_settings.clone(), show_experimental_settings: self.show_experimental_settings, p2pool_stats_server_port: self.p2pool_stats_server_port, + pre_release: self.pre_release, }; let config = serde_json::to_string(config)?; debug!(target: LOG_TARGET, "Updating config file: {:?} {:?}", file, self.clone()); diff --git a/src-tauri/src/app_in_memory_config.rs b/src-tauri/src/app_in_memory_config.rs index 79fe25e77..57d6c8713 100644 --- a/src-tauri/src/app_in_memory_config.rs +++ b/src-tauri/src/app_in_memory_config.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use serde::{Deserialize, Serialize}; #[cfg(feature = "airdrop-env")] diff --git a/src-tauri/src/auto_launcher.rs b/src-tauri/src/auto_launcher.rs index 04eae4d73..e43185327 100644 --- a/src-tauri/src/auto_launcher.rs +++ b/src-tauri/src/auto_launcher.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::sync::LazyLock; use anyhow::anyhow; diff --git a/src-tauri/src/binaries/adapter_github.rs b/src-tauri/src/binaries/adapter_github.rs index bc7f09079..649ad3cdd 100644 --- a/src-tauri/src/binaries/adapter_github.rs +++ b/src-tauri/src/binaries/adapter_github.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use anyhow::Error; @@ -5,7 +27,6 @@ use async_trait::async_trait; use log::{error, info}; use regex::Regex; use tari_common::configuration::Network; -use tauri::api::path::cache_dir; use crate::{ download_utils::download_file_with_retries, github, progress_tracker::ProgressTracker, @@ -52,7 +73,7 @@ impl LatestVersionApiAdapter for GithubReleasesAdapter { fn get_binary_folder(&self) -> Result { let cache_path = - cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; + dirs::cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; let binary_folder_path = cache_path .join(APPLICATION_FOLDER_ID) diff --git a/src-tauri/src/binaries/adapter_tor.rs b/src-tauri/src/binaries/adapter_tor.rs index 0cb8ae751..6aaa4169c 100644 --- a/src-tauri/src/binaries/adapter_tor.rs +++ b/src-tauri/src/binaries/adapter_tor.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::binaries::binaries_resolver::{ LatestVersionApiAdapter, VersionAsset, VersionDownloadInfo, }; @@ -10,7 +32,7 @@ use log::{error, info}; use regex::Regex; use std::path::PathBuf; use tari_common::configuration::Network; -use tauri::api::path::cache_dir; + pub const LOG_TARGET: &str = "tari::universe::adapter_tor"; pub(crate) struct TorReleaseAdapter {} @@ -82,7 +104,7 @@ impl LatestVersionApiAdapter for TorReleaseAdapter { fn get_binary_folder(&self) -> Result { let cache_path = - cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; + dirs::cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; let binary_folder_path = cache_path .join(APPLICATION_FOLDER_ID) diff --git a/src-tauri/src/binaries/adapter_xmrig.rs b/src-tauri/src/binaries/adapter_xmrig.rs index feaab5f68..e0552c72b 100644 --- a/src-tauri/src/binaries/adapter_xmrig.rs +++ b/src-tauri/src/binaries/adapter_xmrig.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use anyhow::Error; @@ -5,7 +27,6 @@ use async_trait::async_trait; use log::error; use regex::Regex; use tari_common::configuration::Network; -use tauri::api::path::cache_dir; use crate::{github, progress_tracker::ProgressTracker, APPLICATION_FOLDER_ID}; @@ -42,7 +63,7 @@ impl LatestVersionApiAdapter for XmrigVersionApiAdapter { fn get_binary_folder(&self) -> Result { let cache_path = - cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; + dirs::cache_dir().ok_or_else(|| anyhow::anyhow!("Failed to get cache directory"))?; let binary_folder_path = cache_path .join(APPLICATION_FOLDER_ID) diff --git a/src-tauri/src/binaries/binaries_list.rs b/src-tauri/src/binaries/binaries_list.rs index 715269c85..a3b6b972f 100644 --- a/src-tauri/src/binaries/binaries_list.rs +++ b/src-tauri/src/binaries/binaries_list.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use semver::Version; diff --git a/src-tauri/src/binaries/binaries_manager.rs b/src-tauri/src/binaries/binaries_manager.rs index b053f75c7..6ea44eedb 100644 --- a/src-tauri/src/binaries/binaries_manager.rs +++ b/src-tauri/src/binaries/binaries_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{anyhow, Error}; use semver::{Version, VersionReq}; use serde::{Deserialize, Serialize}; @@ -448,8 +470,7 @@ impl BinaryManager { progress_tracker .send_last_action(format!( "Downloading binary: {} with version: {}", - self.binary_name, - version.to_string() + self.binary_name, version )) .await; download_file_with_retries( diff --git a/src-tauri/src/binaries/binaries_resolver.rs b/src-tauri/src/binaries/binaries_resolver.rs index 48caee158..609784c2a 100644 --- a/src-tauri/src/binaries/binaries_resolver.rs +++ b/src-tauri/src/binaries/binaries_resolver.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::ProgressTracker; use anyhow::{anyhow, Error}; use async_trait::async_trait; @@ -9,6 +31,7 @@ use std::path::PathBuf; use std::sync::LazyLock; use std::time::Duration; use tari_common::configuration::Network; +use tauri_plugin_sentry::sentry; use tokio::sync::watch::Receiver; use tokio::sync::RwLock; use tokio::time::timeout; @@ -301,10 +324,7 @@ impl BinaryResolver { .send_last_action(format!( "Checking if files exist before download: {} {}", binary.name(), - highest_version - .clone() - .unwrap_or(Version::new(0, 0, 0)) - .to_string() + highest_version.clone().unwrap_or(Version::new(0, 0, 0)) )) .await; @@ -320,10 +340,7 @@ impl BinaryResolver { .send_last_action(format!( "Checking if files exist after download: {} {}", binary.name(), - highest_version - .clone() - .unwrap_or(Version::new(0, 0, 0)) - .to_string() + highest_version.clone().unwrap_or(Version::new(0, 0, 0)) )) .await; let check_if_files_exist = diff --git a/src-tauri/src/binaries/mod.rs b/src-tauri/src/binaries/mod.rs index 4e18fc0f4..5ffed0f92 100644 --- a/src-tauri/src/binaries/mod.rs +++ b/src-tauri/src/binaries/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + mod adapter_github; mod adapter_tor; mod adapter_xmrig; diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 1f8863180..fc3f05ed3 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::app_config::{AppConfig, GpuThreads}; use crate::app_in_memory_config::AirdropInMemoryConfig; use crate::auto_launcher::AutoLauncher; @@ -12,7 +34,6 @@ use crate::internal_wallet::{InternalWallet, PaperWalletConfig}; use crate::node_manager::NodeManagerError; use crate::p2pool::models::{Connections, Stats}; use crate::progress_tracker::ProgressTracker; -use crate::systemtray_manager::{SystemtrayManager, SystrayData}; use crate::tor_adapter::TorConfig; use crate::utils::shutdown_utils::stop_all_processes; use crate::wallet_adapter::{TransactionInfo, WalletBalance}; @@ -22,7 +43,6 @@ use keyring::Entry; use log::{debug, error, info, warn}; use monero_address_creator::Seed as MoneroSeed; use regex::Regex; -use sentry::integrations::anyhow::capture_anyhow; use serde::Serialize; use std::fs::{read_dir, remove_dir_all, remove_file, File}; use std::sync::atomic::Ordering; @@ -31,6 +51,8 @@ use std::time::{Duration, Instant, SystemTime}; use tari_common::configuration::Network; use tari_core::transactions::tari_amount::MicroMinotari; use tauri::{Manager, PhysicalPosition, PhysicalSize}; +use tauri_plugin_sentry::sentry; +use tauri_plugin_sentry::sentry::protocol::Event; const MAX_ACCEPTABLE_COMMAND_TIME: Duration = Duration::from_secs(1); const LOG_TARGET: &str = "tari::universe::commands"; @@ -108,17 +130,17 @@ pub struct CpuMinerConnectionStatus { } #[tauri::command] -pub async fn close_splashscreen(window: tauri::Window) { - let splashscreen_window = window - .get_window("splashscreen") +pub async fn close_splashscreen(app: tauri::AppHandle) { + let splashscreen_window = app + .get_webview_window("splashscreen") .expect("no window labeled 'splashscreen' found"); - let main_window = window - .get_window("main") + let main_window = app + .get_webview_window("main") .expect("no window labeled 'main' found"); if let (Ok(window_position), Ok(window_size)) = ( splashscreen_window.outer_position(), - splashscreen_window.outer_size(), + splashscreen_window.inner_size(), ) { splashscreen_window.close().expect("could not close"); main_window.show().expect("could not show"); @@ -163,12 +185,8 @@ pub async fn download_and_start_installer( } #[tauri::command] -pub async fn exit_application( - _window: tauri::Window, - state: tauri::State<'_, UniverseAppState>, - app: tauri::AppHandle, -) -> Result<(), String> { - stop_all_processes(state.inner().clone(), true).await?; +pub async fn exit_application(_window: tauri::Window, app: tauri::AppHandle) -> Result<(), String> { + stop_all_processes(app.clone(), true).await?; app.exit(0); Ok(()) @@ -338,13 +356,12 @@ pub async fn get_network( #[tauri::command] pub async fn get_miner_metrics( state: tauri::State<'_, UniverseAppState>, - app: tauri::AppHandle, ) -> Result { let timer = Instant::now(); if state.is_getting_miner_metrics.load(Ordering::SeqCst) { let read = state.cached_miner_metrics.read().await; if let Some(metrics) = &*read { - warn!(target: LOG_TARGET, "Already getting miner metrics, returning cached value"); + debug!(target: LOG_TARGET, "Already getting miner metrics, returning cached value"); return Ok(metrics.clone()); } warn!(target: LOG_TARGET, "Already getting miner metrics"); @@ -352,19 +369,14 @@ pub async fn get_miner_metrics( } state.is_getting_miner_metrics.store(true, Ordering::SeqCst); - // info!(target: LOG_TARGET, "1 elapsed {:?}", timer.elapsed()); - let (sha_hash_rate, randomx_hash_rate, block_reward, block_height, block_time, is_synced) = - state - .node_manager - .get_network_hash_rate_and_block_reward() - .await - .unwrap_or_else(|e| { - if !matches!(e, NodeManagerError::NodeNotStarted) { - warn!(target: LOG_TARGET, "Error getting network hash rate and block reward: {}", e); - } - (0, 0, MicroMinotari(0), 0, 0, false) - }); - // info!(target: LOG_TARGET, "2 elapsed {:?}", timer.elapsed()); + let (sha_hash_rate, randomx_hash_rate, block_reward, block_height, block_time, is_synced) = state.node_manager + .get_network_hash_rate_and_block_reward().await + .unwrap_or_else(|e| { + if !matches!(e, NodeManagerError::NodeNotStarted) { + warn!(target: LOG_TARGET, "Error getting network hash rate and block reward: {}", e); + } + (0, 0, MicroMinotari(0), 0, 0, false) + }); let cpu_miner = state.cpu_miner.read().await; let cpu_mining_status = match cpu_miner @@ -383,8 +395,6 @@ pub async fn get_miner_metrics( }; drop(cpu_miner); - // info!(target: LOG_TARGET, "3 elapsed {:?}", timer.elapsed()); - let gpu_miner = state.gpu_miner.read().await; let gpu_mining_status = match gpu_miner.status(sha_hash_rate, block_reward).await { Ok(gpu) => gpu, @@ -398,45 +408,11 @@ pub async fn get_miner_metrics( }; drop(gpu_miner); - // let config_path = app - // .path_resolver() - // .app_config_dir() - // .expect("Could not get config dir"); - // let _unused = HardwareMonitor::current() - // .write() - // .await - // .load_status_file(config_path); - // let hardware_status = HardwareMonitor::current() - // .write() - // .await - // .read_hardware_parameters(); - - // info!(target: LOG_TARGET, "4 elapsed {:?}", timer.elapsed()); let gpu_public_parameters = HardwareStatusMonitor::current() .get_gpu_devices_public_properties() .await .map_err(|e| e.to_string())?; - // .map_err(|e| e.to_string())?; - // info!(target: LOG_TARGET, "5 elapsed {:?}", timer.elapsed()); - // let cpu_public_parameters = HardwareStatusMonitor::current() - // .get_cpu_public_properties() - // .await - // .map_err(|e| e.to_string())?; - - // info!(target: LOG_TARGET, "6 elapsed {:?}", timer.elapsed()); - - let new_systemtray_data: SystrayData = SystemtrayManager::current().create_systemtray_data( - cpu_mining_status.hash_rate, - gpu_mining_status.hash_rate as f64, - // gpu_public_parameters.clone(), - // cpu_public_parameters.clone(), - (cpu_mining_status.estimated_earnings + gpu_mining_status.estimated_earnings) as f64, - ); - - // info!(target: LOG_TARGET, "7 elapsed {:?}", timer.elapsed()); - SystemtrayManager::current().update_systray(app, new_systemtray_data); - - // info!(target: LOG_TARGET, "8 elapsed {:?}", timer.elapsed()); + let connected_peers = state .node_manager .list_connected_peers() @@ -447,7 +423,7 @@ pub async fn get_miner_metrics( warn!(target: LOG_TARGET, "get_miner_metrics took too long: {:?}", timer.elapsed()); } - let ret = MinerMetrics { + let metrics_ret = MinerMetrics { sha_network_hash_rate: sha_hash_rate, randomx_network_hash_rate: randomx_hash_rate, cpu: CpuMinerMetrics { @@ -466,13 +442,14 @@ pub async fn get_miner_metrics( connected_peers, }, }; + let mut lock = state.cached_miner_metrics.write().await; - *lock = Some(ret.clone()); + *lock = Some(metrics_ret.clone()); state .is_getting_miner_metrics .store(false, Ordering::SeqCst); - Ok(ret) + Ok(metrics_ret) } #[tauri::command] @@ -489,7 +466,7 @@ pub async fn get_monero_seed_words( } let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); @@ -610,7 +587,7 @@ pub async fn get_used_p2pool_stats_server_port( pub async fn get_paper_wallet_details(app: tauri::AppHandle) -> Result { let timer = Instant::now(); let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); let internal_wallet = InternalWallet::load_or_create(config_path) @@ -635,7 +612,7 @@ pub async fn get_seed_words( ) -> Result, String> { let timer = Instant::now(); let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); let internal_wallet = InternalWallet::load_or_create(config_path) @@ -773,35 +750,33 @@ pub async fn get_transaction_history( pub async fn import_seed_words( seed_words: Vec, _window: tauri::Window, - state: tauri::State<'_, UniverseAppState>, app: tauri::AppHandle, ) -> Result<(), String> { let timer = Instant::now(); let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); let data_dir = app - .path_resolver() + .path() .app_local_data_dir() .expect("Could not get data dir"); - stop_all_processes(state.inner().clone(), false).await?; + stop_all_processes(app.clone(), false).await?; - tauri::async_runtime::spawn(async move { - match InternalWallet::create_from_seed(config_path, seed_words).await { - Ok(_wallet) => { - InternalWallet::clear_wallet_local_data(data_dir).await?; - info!(target: LOG_TARGET, "[import_seed_words] Restarting the app"); - app.restart(); - Ok(()) - } - Err(e) => { - error!(target: LOG_TARGET, "Error loading internal wallet: {:?}", e); - Err(e) - } + match InternalWallet::create_from_seed(config_path, seed_words).await { + Ok(_wallet) => { + InternalWallet::clear_wallet_local_data(data_dir) + .await + .map_err(|e| e.to_string())?; + info!(target: LOG_TARGET, "[import_seed_words] Restarting the app"); + app.restart(); } - }); + Err(e) => { + error!(target: LOG_TARGET, "Error loading internal wallet: {:?}", e); + e.to_string(); + } + } if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { warn!(target: LOG_TARGET, "import_seed_words took too long: {:?}", timer.elapsed()); @@ -822,10 +797,7 @@ pub fn log_web_message(level: String, message: Vec) { #[tauri::command] pub fn open_log_dir(app: tauri::AppHandle) { - let log_dir = app - .path_resolver() - .app_log_dir() - .expect("Could not get log dir"); + let log_dir = app.path().app_log_dir().expect("Could not get log dir"); if let Err(e) = open::that(log_dir) { error!(target: LOG_TARGET, "Could not open log dir: {:?}", e); } @@ -835,16 +807,15 @@ pub fn open_log_dir(app: tauri::AppHandle) { pub async fn reset_settings<'r>( reset_wallet: bool, _window: tauri::Window, - state: tauri::State<'_, UniverseAppState>, app: tauri::AppHandle, ) -> Result<(), String> { - stop_all_processes(state.inner().clone(), true).await?; + stop_all_processes(app.clone(), true).await?; let network = Network::get_current_or_user_setting_or_default().as_key_str(); - let app_config_dir = app.path_resolver().app_config_dir(); - let app_cache_dir = app.path_resolver().app_cache_dir(); - let app_data_dir = app.path_resolver().app_data_dir(); - let app_local_data_dir = app.path_resolver().app_local_data_dir(); + let app_config_dir = app.path().app_config_dir(); + let app_cache_dir = app.path().app_cache_dir(); + let app_data_dir = app.path().app_data_dir(); + let app_local_data_dir = app.path().app_local_data_dir(); let dirs_to_remove = [ app_config_dir, @@ -855,7 +826,7 @@ pub async fn reset_settings<'r>( let valid_dir_paths: Vec = dirs_to_remove .iter() .filter_map(|dir| { - if let Some(path) = dir { + if let Ok(path) = dir { path.to_str().map(|s| s.to_string()) } else { None @@ -930,8 +901,6 @@ pub async fn reset_settings<'r>( info!(target: LOG_TARGET, "[reset_settings] Restarting the app"); app.restart(); - - Ok(()) } #[tauri::command] @@ -948,15 +917,13 @@ pub async fn resolve_application_language( pub async fn restart_application( should_stop_miners: bool, _window: tauri::Window, - state: tauri::State<'_, UniverseAppState>, app: tauri::AppHandle, ) -> Result<(), String> { if should_stop_miners { - stop_all_processes(state.inner().clone(), true).await?; + stop_all_processes(app.clone(), true).await?; } app.restart(); - Ok(()) } #[tauri::command] @@ -968,15 +935,13 @@ pub async fn send_feedback( app: tauri::AppHandle, ) -> Result { let timer = Instant::now(); + let app_log_dir = Some(app.path().app_log_dir().expect("Could not get log dir.")); + let reference = state .feedback .read() .await - .send_feedback( - feedback, - include_logs, - app.path_resolver().app_log_dir().clone(), - ) + .send_feedback(feedback, include_logs, app_log_dir.clone()) .await .inspect_err(|e| error!("error at send_feedback {:?}", e)) .map_err(|e| e.to_string())?; @@ -1260,7 +1225,7 @@ pub async fn set_p2pool_enabled( .await .map_err(|error| error.to_string())?; origin_config.set_to_use_base_node(base_node_grpc_port); - }; + } state .mm_proxy_manager .change_config(origin_config) @@ -1268,7 +1233,7 @@ pub async fn set_p2pool_enabled( .map_err(|error| error.to_string())?; } } - }; + } if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { warn!(target: LOG_TARGET, "set_p2pool_enabled took too long: {:?}", timer.elapsed()); @@ -1374,7 +1339,7 @@ pub async fn set_use_tor( .map_err(|e| e.to_string())?; let config_dir = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); @@ -1427,7 +1392,12 @@ pub async fn setup_application( rollback.set_value(true, Duration::from_millis(1000)).await; setup_inner(window, state.clone(), app).await.map_err(|e| { warn!(target: LOG_TARGET, "Error setting up application: {:?}", e); - capture_anyhow(&e); + sentry::capture_event(Event { + level: sentry::Level::Error, + message: Some(e.to_string()), + culprit: Some("setup-inner".to_string()), + ..Default::default() + }); e.to_string() })?; @@ -1479,15 +1449,13 @@ pub async fn start_mining<'r>( &cpu_miner_config, monero_address.to_string(), mm_proxy_port, - app.path_resolver() + app.path() .app_local_data_dir() .expect("Could not get data dir"), - app.path_resolver() + app.path() .app_config_dir() .expect("Could not get config dir"), - app.path_resolver() - .app_log_dir() - .expect("Could not get log dir"), + app.path().app_log_dir().expect("Could not get log dir"), mode, custom_cpu_usage, ) @@ -1542,15 +1510,13 @@ pub async fn start_mining<'r>( state.shutdown.to_signal(), tari_address, source, - app.path_resolver() + app.path() .app_local_data_dir() .expect("Could not get data dir"), - app.path_resolver() + app.path() .app_config_dir() .expect("Could not get config dir"), - app.path_resolver() - .app_log_dir() - .expect("Could not get log dir"), + app.path().app_log_dir().expect("Could not get log dir"), mode, telemetry_id, custom_gpu_usage, @@ -1618,12 +1584,7 @@ pub async fn update_applications( ) .map_err(|e| e.to_string())?; - let progress_tracker = ProgressTracker::new( - app.get_window("main") - .expect("Could not get main window") - .clone(), - None, - ); + let progress_tracker = ProgressTracker::new(app.clone(), None); binary_resolver .update_binary(Binaries::Xmrig, progress_tracker.clone()) .await @@ -1657,3 +1618,91 @@ pub async fn update_applications( Ok(()) } + +#[tauri::command] +pub async fn set_pre_release( + app: tauri::AppHandle, + pre_release: bool, + state: tauri::State<'_, UniverseAppState>, +) -> Result<(), String> { + let timer = Instant::now(); + state + .config + .write() + .await + .set_pre_release(pre_release) + .await + .map_err(|e| e.to_string())?; + + info!(target: LOG_TARGET, "Pre-release set to {}, try_update called", pre_release); + + state + .updates_manager + .try_update(app.clone(), true, !pre_release) + .await + .map_err(|e| e.to_string())?; + + if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { + warn!(target: LOG_TARGET, "set_pre_release took too long: {:?}", timer.elapsed()); + } + + Ok(()) +} + +#[tauri::command] +pub async fn check_for_updates( + app: tauri::AppHandle, + state: tauri::State<'_, UniverseAppState>, +) -> Result, String> { + let timer = Instant::now(); + + let update = state + .updates_manager + .check_for_update(app.clone(), false) + .await + .map_err(|e| e.to_string())?; + + if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { + warn!(target: LOG_TARGET, "check_for_updates took too long: {:?}", timer.elapsed()); + } + + Ok(update.map(|u| u.version)) +} + +#[tauri::command] +pub async fn try_update( + force: Option, + app: tauri::AppHandle, + state: tauri::State<'_, UniverseAppState>, +) -> Result<(), String> { + let timer = Instant::now(); + + state + .updates_manager + .try_update(app.clone(), force.unwrap_or(false), false) + .await + .map_err(|e| e.to_string())?; + + if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { + warn!(target: LOG_TARGET, "check_for_updates took too long: {:?}", timer.elapsed()); + } + + Ok(()) +} + +#[tauri::command] +pub async fn proceed_with_update( + app: tauri::AppHandle, + state: tauri::State<'_, UniverseAppState>, +) -> Result<(), String> { + let timer = Instant::now(); + state + .updates_manager + .proceed_with_update(app.clone()) + .await + .map_err(|e| e.to_string())?; + if timer.elapsed() > MAX_ACCEPTABLE_COMMAND_TIME { + warn!(target: LOG_TARGET, "proceed_with_update took too long: {:?}", timer.elapsed()); + } + Ok(()) +} diff --git a/src-tauri/src/consts.rs b/src-tauri/src/consts.rs index 7e35c82bd..09d145a5b 100644 --- a/src-tauri/src/consts.rs +++ b/src-tauri/src/consts.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #[cfg(target_os = "windows")] pub const PROCESS_CREATION_NO_WINDOW: u32 = 0x08000000; diff --git a/src-tauri/src/cpu_miner.rs b/src-tauri/src/cpu_miner.rs index 838691f19..bac4e8ce8 100644 --- a/src-tauri/src/cpu_miner.rs +++ b/src-tauri/src/cpu_miner.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::app_config::MiningMode; use crate::binaries::Binaries; use crate::commands::{CpuMinerConnection, CpuMinerConnectionStatus, CpuMinerStatus}; diff --git a/src-tauri/src/credential_manager.rs b/src-tauri/src/credential_manager.rs index f449a1b8d..1f9968ae5 100644 --- a/src-tauri/src/credential_manager.rs +++ b/src-tauri/src/credential_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::internal_wallet::WalletConfig; use crate::APPLICATION_FOLDER_ID; use keyring::{Entry, Error as KeyringError}; diff --git a/src-tauri/src/download_utils.rs b/src-tauri/src/download_utils.rs index 719133314..7703402d2 100644 --- a/src-tauri/src/download_utils.rs +++ b/src-tauri/src/download_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::ProgressTracker; use anyhow::{anyhow, Error}; use async_zip::base::read::seek::ZipFileReader; diff --git a/src-tauri/src/external_dependencies.rs b/src-tauri/src/external_dependencies.rs index aa9c2b5ca..451180fc2 100644 --- a/src-tauri/src/external_dependencies.rs +++ b/src-tauri/src/external_dependencies.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{anyhow, Error}; use futures_util::StreamExt; use log::info; diff --git a/src-tauri/src/feedback.rs b/src-tauri/src/feedback.rs index 346e85cf0..f55130fad 100644 --- a/src-tauri/src/feedback.rs +++ b/src-tauri/src/feedback.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::fs::File; use std::io::{Read, Write}; use std::path::{Path, PathBuf}; diff --git a/src-tauri/src/github/mod.rs b/src-tauri/src/github/mod.rs index 9309ce779..6d05b8245 100644 --- a/src-tauri/src/github/mod.rs +++ b/src-tauri/src/github/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::anyhow; use log::{debug, info, warn}; use reqwest::Client; diff --git a/src-tauri/src/gpu_miner.rs b/src-tauri/src/gpu_miner.rs index 4098c8896..f12767e78 100644 --- a/src-tauri/src/gpu_miner.rs +++ b/src-tauri/src/gpu_miner.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::{path::PathBuf, sync::Arc}; use log::info; @@ -163,16 +185,24 @@ impl GpuMiner { pub async fn detect(&mut self, config_dir: PathBuf) -> Result<(), anyhow::Error> { info!(target: LOG_TARGET, "Verify if gpu miner can work on the system"); - let output_file = config_dir + let config_file = config_dir + .join("gpuminer") + .join("config.json") + .to_string_lossy() + .to_string(); + let gpu_status_file = config_dir .join("gpuminer") .join("gpu_status.json") .to_string_lossy() .to_string(); + let args: Vec = vec![ "--detect".to_string(), "true".to_string(), + "--config".to_string(), + config_file.clone(), "--gpu-status-file".to_string(), - output_file.clone(), + gpu_status_file.clone(), ]; let gpuminer_bin = BinaryResolver::current() .read() @@ -184,7 +214,7 @@ impl GpuMiner { let child = process_utils::launch_child_process(&gpuminer_bin, &config_dir, None, &args)?; let output = child.wait_with_output().await?; info!(target: LOG_TARGET, "Gpu detect exit code: {:?}", output.status.code().unwrap_or_default()); - let gpu_settings = std::fs::read_to_string(output_file)?; + let gpu_settings = std::fs::read_to_string(gpu_status_file)?; let gpu_settings: GpuStatusJson = serde_json::from_str(&gpu_settings)?; self.gpu_devices = gpu_settings.gpu_devices; match output.status.code() { diff --git a/src-tauri/src/gpu_miner_adapter.rs b/src-tauri/src/gpu_miner_adapter.rs index 695bdfe81..6dfa4a6bb 100644 --- a/src-tauri/src/gpu_miner_adapter.rs +++ b/src-tauri/src/gpu_miner_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::app_config::GpuThreads; use crate::gpu_miner::GpuConfig; use crate::port_allocator::PortAllocator; diff --git a/src-tauri/src/hardware/cpu_readers/amd_cpu_reader.rs b/src-tauri/src/hardware/cpu_readers/amd_cpu_reader.rs index ecf89f523..daa0888cc 100644 --- a/src-tauri/src/hardware/cpu_readers/amd_cpu_reader.rs +++ b/src-tauri/src/hardware/cpu_readers/amd_cpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::ops::Deref; use anyhow::Error; diff --git a/src-tauri/src/hardware/cpu_readers/apple_cpu_reader.rs b/src-tauri/src/hardware/cpu_readers/apple_cpu_reader.rs index a5d281015..f257642f1 100644 --- a/src-tauri/src/hardware/cpu_readers/apple_cpu_reader.rs +++ b/src-tauri/src/hardware/cpu_readers/apple_cpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::ops::DerefMut; use anyhow::Error; diff --git a/src-tauri/src/hardware/cpu_readers/intel_cpu_reader.rs b/src-tauri/src/hardware/cpu_readers/intel_cpu_reader.rs index 8b4d886f0..8d5543330 100644 --- a/src-tauri/src/hardware/cpu_readers/intel_cpu_reader.rs +++ b/src-tauri/src/hardware/cpu_readers/intel_cpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::ops::Deref; use anyhow::Error; diff --git a/src-tauri/src/hardware/cpu_readers/mod.rs b/src-tauri/src/hardware/cpu_readers/mod.rs index 3b5155b0a..322ca80b4 100644 --- a/src-tauri/src/hardware/cpu_readers/mod.rs +++ b/src-tauri/src/hardware/cpu_readers/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub mod amd_cpu_reader; pub mod apple_cpu_reader; pub mod intel_cpu_reader; diff --git a/src-tauri/src/hardware/gpu_readers/amd_gpu_reader.rs b/src-tauri/src/hardware/gpu_readers/amd_gpu_reader.rs index 55c1355ed..bd1e91857 100644 --- a/src-tauri/src/hardware/gpu_readers/amd_gpu_reader.rs +++ b/src-tauri/src/hardware/gpu_readers/amd_gpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // use std::{fs::OpenOptions, os::fd::IntoRawFd}; use anyhow::Error; diff --git a/src-tauri/src/hardware/gpu_readers/apple_gpu_reader.rs b/src-tauri/src/hardware/gpu_readers/apple_gpu_reader.rs index dc8cb1a01..aa04a6f66 100644 --- a/src-tauri/src/hardware/gpu_readers/apple_gpu_reader.rs +++ b/src-tauri/src/hardware/gpu_readers/apple_gpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{Error, Ok}; use async_trait::async_trait; diff --git a/src-tauri/src/hardware/gpu_readers/intel_gpu_reader.rs b/src-tauri/src/hardware/gpu_readers/intel_gpu_reader.rs index 9dc45a2a9..2e9b3eb45 100644 --- a/src-tauri/src/hardware/gpu_readers/intel_gpu_reader.rs +++ b/src-tauri/src/hardware/gpu_readers/intel_gpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{Error, Ok}; use async_trait::async_trait; diff --git a/src-tauri/src/hardware/gpu_readers/mod.rs b/src-tauri/src/hardware/gpu_readers/mod.rs index e6d9215e3..82015d304 100644 --- a/src-tauri/src/hardware/gpu_readers/mod.rs +++ b/src-tauri/src/hardware/gpu_readers/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub mod amd_gpu_reader; pub mod apple_gpu_reader; pub mod intel_gpu_reader; diff --git a/src-tauri/src/hardware/gpu_readers/nvidia_gpu_reader.rs b/src-tauri/src/hardware/gpu_readers/nvidia_gpu_reader.rs index 717e8825b..4ab248e8c 100644 --- a/src-tauri/src/hardware/gpu_readers/nvidia_gpu_reader.rs +++ b/src-tauri/src/hardware/gpu_readers/nvidia_gpu_reader.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{anyhow, Error}; use async_trait::async_trait; use log::{debug, error}; diff --git a/src-tauri/src/hardware/hardware_status_monitor.rs b/src-tauri/src/hardware/hardware_status_monitor.rs index 0f73fa487..9a3d5bb47 100644 --- a/src-tauri/src/hardware/hardware_status_monitor.rs +++ b/src-tauri/src/hardware/hardware_status_monitor.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::{path::PathBuf, sync::LazyLock}; use crate::{ @@ -15,11 +37,10 @@ use super::{ intel_gpu_reader::IntelGpuReader, nvidia_gpu_reader::NvidiaGpuReader, GpuParametersReader, }, }; -use anyhow::{Context, Error}; +use anyhow::Error; use log::{error, info, warn}; use serde::{Deserialize, Serialize}; use sysinfo::{CpuRefreshKind, RefreshKind, System}; -use tauri::api::path::config_dir; use tokio::sync::RwLock; const LOG_TARGET: &str = "tari::universe::auto_launcher"; @@ -144,12 +165,11 @@ impl HardwareStatusMonitor { } } - async fn load_gpu_devices_from_status_file(&self) -> Result { - let config_dir = config_dir().context("Failed to get config directory")?; - let file: PathBuf = config_dir - .join(APPLICATION_FOLDER_ID) - .join("gpuminer") - .join("gpu_status.json"); + async fn load_gpu_devices_from_status_file( + &self, + config_dir: PathBuf, + ) -> Result { + let file: PathBuf = config_dir.join("gpuminer").join("gpu_status.json"); if file.exists() { info!(target: LOG_TARGET, "Loading gpu status from file: {:?}", file); let content = tokio::fs::read_to_string(file).await?; @@ -178,7 +198,10 @@ impl HardwareStatusMonitor { } async fn initialize_gpu_devices(&self) -> Result, Error> { - let gpu_status_file_content = self.load_gpu_devices_from_status_file().await?; + let config_dir = dirs::config_dir() + .expect("Could not get config dir") + .join(APPLICATION_FOLDER_ID); + let gpu_status_file_content = self.load_gpu_devices_from_status_file(config_dir).await?; let mut platform_devices = Vec::new(); for gpu_device in &gpu_status_file_content.gpu_devices { diff --git a/src-tauri/src/hardware/mod.rs b/src-tauri/src/hardware/mod.rs index 1c5bef5aa..75924e13b 100644 --- a/src-tauri/src/hardware/mod.rs +++ b/src-tauri/src/hardware/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + mod cpu_readers; mod gpu_readers; diff --git a/src-tauri/src/hardware_monitor.rs b/src-tauri/src/hardware_monitor.rs index a78a33050..4af6d432f 100644 --- a/src-tauri/src/hardware_monitor.rs +++ b/src-tauri/src/hardware_monitor.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::{fs, ops::Deref, path::PathBuf, sync::LazyLock}; use anyhow::anyhow; diff --git a/src-tauri/src/internal_wallet.rs b/src-tauri/src/internal_wallet.rs index 3b8d63e63..b8878db03 100644 --- a/src-tauri/src/internal_wallet.rs +++ b/src-tauri/src/internal_wallet.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::anyhow; use log::{info, warn}; use rand::Rng; @@ -25,7 +47,7 @@ use tari_key_manager::mnemonic_wordlists::MNEMONIC_ENGLISH_WORDS; use tari_key_manager::SeedWords; use tari_utilities::hex::Hex; -use crate::credential_manager::CredentialManager; +use crate::credential_manager::{Credential, CredentialError, CredentialManager}; const KEY_MANAGER_COMMS_SECRET_KEY_BRANCH_KEY: &str = "comms"; const LOG_TARGET: &str = "tari::universe::internal_wallet"; @@ -163,6 +185,14 @@ impl InternalWallet { creds.tari_seed_passphrase } }, + Err(CredentialError::NoEntry(_)) => { + let credentials = Credential { + tari_seed_passphrase: Some(SafePassword::from(generate_password(32))), + monero_seed: None, + }; + cm.set_credentials(&credentials)?; + credentials.tari_seed_passphrase + } Err(_) => { return Err(anyhow!( "Credentials didn't exist, and this shouldn't happen" diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index dd3d63d07..ba5596c56 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] @@ -8,6 +30,7 @@ use log::{debug, error, info, warn}; use p2pool::models::Connections; use std::fs::{create_dir_all, remove_dir_all, remove_file, File}; use tokio::sync::watch::{self}; +use updates_manager::UpdatesManager; use log4rs::config::RawConfig; use serde::Serialize; @@ -19,7 +42,8 @@ use tari_common::configuration::Network; use tari_common_types::tari_address::TariAddress; use tari_shutdown::Shutdown; use tauri::async_runtime::{block_on, JoinHandle}; -use tauri::{Manager, PhysicalPosition, PhysicalSize, RunEvent, UpdaterEvent, WindowEvent}; +use tauri::{Emitter, Manager, PhysicalPosition, PhysicalSize, RunEvent, WindowEvent}; +use tauri_plugin_sentry::{minidump, sentry}; use tokio::sync::{Mutex, RwLock}; use tokio::time; use utils::logging_utils::setup_logging; @@ -31,7 +55,6 @@ use binaries::{binaries_list::Binaries, binaries_resolver::BinaryResolver}; use node_manager::NodeManagerError; use progress_tracker::ProgressTracker; use setup_status_event::SetupStatusEvent; -use systemtray_manager::SystemtrayManager; use telemetry_manager::TelemetryManager; use crate::cpu_miner::CpuMiner; @@ -86,11 +109,11 @@ mod process_utils; mod process_watcher; mod progress_tracker; mod setup_status_event; -mod systemtray_manager; mod telemetry_manager; mod tests; mod tor_adapter; mod tor_manager; +mod updates_manager; mod user_listener; mod utils; mod wallet_adapter; @@ -108,7 +131,7 @@ const APPLICATION_FOLDER_ID: &str = "com.tari.universe"; #[cfg(all(feature = "release-ci-beta", not(feature = "release-ci")))] const APPLICATION_FOLDER_ID: &str = "com.tari.universe.beta"; -pub struct CpuMinerConfig { +struct CpuMinerConfig { node_connection: CpuMinerConnection, tari_address: TariAddress, eco_mode_xmrig_options: Vec, @@ -118,13 +141,6 @@ pub struct CpuMinerConfig { ludicrous_mode_cpu_percentage: Option, } -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -struct UpdateProgressRustEvent { - chunk_length: usize, - content_length: u64, - downloaded: u64, -} #[derive(Debug, Serialize, Clone)] #[allow(dead_code)] struct CriticalProblemEvent { @@ -138,46 +154,46 @@ async fn setup_inner( state: tauri::State<'_, UniverseAppState>, app: tauri::AppHandle, ) -> Result<(), anyhow::Error> { - window - .emit( - "message", - SetupStatusEvent { - event_type: "setup_status".to_string(), - title: "starting-up".to_string(), - title_params: None, - progress: 0.0, - }, - ) - .inspect_err(|e| error!(target: LOG_TARGET, "Could not emit event 'message': {:?}", e))?; + app.emit( + "message", + SetupStatusEvent { + event_type: "setup_status".to_string(), + title: "starting-up".to_string(), + title_params: None, + progress: 0.0, + }, + ) + .inspect_err(|e| error!(target: LOG_TARGET, "Could not emit event 'message': {:?}", e))?; #[cfg(target_os = "macos")] if !cfg!(dev) && !is_app_in_applications_folder() { - window - .emit( - "critical_problem", - CriticalProblemEvent { - title: None, - description: Some("not-installed-in-applications-directory".to_string()), - }, - ) - .inspect_err( - |e| error!(target: LOG_TARGET, "Could not emit event 'critical_problem': {:?}", e), - )?; + app.emit( + "critical_problem", + CriticalProblemEvent { + title: None, + description: Some("not-installed-in-applications-directory".to_string()), + }, + ) + .inspect_err( + |e| error!(target: LOG_TARGET, "Could not emit event 'critical_problem': {:?}", e), + )?; return Ok(()); } + state + .updates_manager + .init_periodic_updates(app.clone()) + .await?; + let data_dir = app - .path_resolver() + .path() .app_local_data_dir() .expect("Could not get data dir"); let config_dir = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); - let log_dir = app - .path_resolver() - .app_log_dir() - .expect("Could not get log dir"); + let log_dir = app.path().app_log_dir().expect("Could not get log dir"); #[cfg(target_os = "windows")] if cfg!(target_os = "windows") && !cfg!(dev) { @@ -192,8 +208,7 @@ async fn setup_inner( .await; if is_missing { - window - .emit( + app.emit( "missing-applications", external_dependencies ).inspect_err(|e| error!(target: LOG_TARGET, "Could not emit event 'missing-applications': {:?}", e))?; @@ -213,7 +228,7 @@ async fn setup_inner( .await?; let (tx, rx) = watch::channel("".to_string()); - let progress = ProgressTracker::new(window.clone(), Some(tx)); + let progress = ProgressTracker::new(app.clone(), Some(tx)); let last_binaries_update_timestamp = state.config.read().await.last_binaries_update_timestamp(); let now = SystemTime::now(); @@ -478,7 +493,7 @@ async fn setup_inner( mm_proxy_manager.wait_ready().await?; *state.is_setup_finished.write().await = true; drop( - window + app.clone() .emit( "message", SetupStatusEvent { @@ -491,15 +506,35 @@ async fn setup_inner( .inspect_err(|e| error!(target: LOG_TARGET, "Could not emit event 'message': {:?}", e)), ); + let move_handle = app.clone(); + tauri::async_runtime::spawn(async move { + let mut interval: time::Interval = time::interval(Duration::from_secs(1)); + loop { + let app_state = move_handle.state::().clone(); + + if app_state.shutdown.is_triggered() { + break; + } + + interval.tick().await; + if let Ok(metrics_ret) = commands::get_miner_metrics(app_state).await { + drop(move_handle.clone().emit("miner_metrics", metrics_ret)); + } + } + }); + let app_handle_clone: tauri::AppHandle = app.clone(); tauri::async_runtime::spawn(async move { let mut interval: time::Interval = time::interval(Duration::from_secs(30)); let mut has_send_error = false; loop { - interval.tick().await; - let state = app_handle_clone.state::().inner(); + if state.shutdown.is_triggered() { + break; + } + + interval.tick().await; let check_if_orphan = state .node_manager .check_if_is_orphan_chain(!has_send_error) @@ -512,7 +547,7 @@ async fn setup_inner( if is_stuck && !has_send_error { has_send_error = true; } - drop(app_handle_clone.emit_all("is_stuck", is_stuck)); + drop(app_handle_clone.emit("is_stuck", is_stuck)); } Err(ref e) => { error!(target: LOG_TARGET, "{}", e); @@ -523,6 +558,7 @@ async fn setup_inner( Ok(()) } + #[derive(Clone)] struct UniverseAppState { stop_start_mutex: Arc>, @@ -547,6 +583,7 @@ struct UniverseAppState { airdrop_access_token: Arc>>, p2pool_manager: P2poolManager, tor_manager: TorManager, + updates_manager: UpdatesManager, cached_p2pool_stats: Arc>>>, cached_p2pool_connections: Arc>>>, cached_wallet_details: Arc>>, @@ -565,16 +602,18 @@ fn main() { let _unused = fix_path_env::fix(); // TODO: Integrate sentry into logs. Because we are using Tari's logging infrastructure, log4rs // sets the logger and does not expose a way to add sentry into it. - let client = sentry_tauri::sentry::init(( + + let client = sentry::init(( "https://edd6b9c1494eb7fda6ee45590b80bcee@o4504839079002112.ingest.us.sentry.io/4507979991285760", - sentry_tauri::sentry::ClientOptions { - release: sentry_tauri::sentry::release_name!(), + sentry::ClientOptions { + release: sentry::release_name!(), + attach_stacktrace: true, ..Default::default() }, )); - let _guard = sentry_tauri::minidump::init(&client); + let _guard = minidump::init(&client); - let mut shutdown = Shutdown::new(); + let shutdown = Shutdown::new(); // NOTE: Nothing is started at this point, so ports are not known. You can only start settings ports // and addresses once the different services have been started. @@ -613,18 +652,10 @@ fn main() { p2pool_manager.clone(), ); + let updates_manager = UpdatesManager::new(app_config.clone(), shutdown.to_signal()); + let feedback = Feedback::new(app_in_memory_config.clone(), app_config.clone()); - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // let mm_proxy_config = if app_config_raw.p2pool_enabled { - // MergeMiningProxyConfig::new_with_p2pool(mm_proxy_port, p2pool_config.grpc_port, None) - // } else { - // MergeMiningProxyConfig::new( - // mm_proxy_port, - // p2pool_config.grpc_port, - // base_node_grpc_port, - // None, - // ) - // }; + let mm_proxy_manager = MmProxyManager::new(); let app_state = UniverseAppState { stop_start_mutex: Arc::new(Mutex::new(())), @@ -649,6 +680,7 @@ fn main() { feedback: Arc::new(RwLock::new(feedback)), airdrop_access_token: Arc::new(RwLock::new(None)), tor_manager: TorManager::new(), + updates_manager, cached_p2pool_stats: Arc::new(RwLock::new(None)), cached_p2pool_connections: Arc::new(RwLock::new(None)), cached_wallet_details: Arc::new(RwLock::new(None)), @@ -656,30 +688,29 @@ fn main() { setup_counter: Arc::new(RwLock::new(AutoRollback::new(false))), }; - let systray = SystemtrayManager::current().get_systray().clone(); - let app = tauri::Builder::default() - .system_tray(systray) - .on_system_tray_event(|app, event| { - SystemtrayManager::current().handle_system_tray_event(app.clone(), event) - }) + .plugin(tauri_plugin_process::init()) + .plugin(tauri_plugin_sentry::init_with_no_injection(&client)) + .plugin(tauri_plugin_os::init()) + .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { println!("{}, {argv:?}, {cwd}", app.package_info().name); - app.emit_all("single-instance", Payload { args: argv, cwd }) + app.emit("single-instance", Payload { args: argv, cwd }) .unwrap_or_else( |e| error!(target: LOG_TARGET, "Could not emit single-instance event: {:?}", e), ); })) + .plugin(tauri_plugin_updater::Builder::new().build()) .manage(app_state.clone()) .setup(|app| { let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); // Remove this after it's been rolled out for a few versions - let log_path = app.path_resolver().app_log_dir().expect("Could not get log dir"); + let log_path = app.path().app_log_dir().map_err(|e| e.to_string())?; let logs_cleared_file = log_path.join("logs_cleared"); if !logs_cleared_file.exists() { match remove_dir_all(&log_path) { @@ -696,9 +727,7 @@ fn main() { .join("universe") .join("configs") .join("log4rs_config_universe.yml"), - &app.path_resolver() - .app_log_dir() - .expect("Could not get log dir"), + &app.path().app_log_dir().expect("Could not get log dir"), include_str!("../log4rs/universe_sample.yml"), ) .expect("Could not set up logging"); @@ -707,7 +736,7 @@ fn main() { log4rs::init_raw_config(config).expect("Could not initialize logging"); let splash_window = app - .get_window("splashscreen") + .get_webview_window("splashscreen") .expect("Main window not found"); // The start of needed restart operations. Break this out into a module if we need n+1 @@ -755,6 +784,7 @@ fn main() { if let Some(w_settings) = app_conf.window_settings() { let window_position = PhysicalPosition::new(w_settings.x, w_settings.y); let window_size = PhysicalSize::new(w_settings.width, w_settings.height); + if let Err(e) = splash_window.set_position(window_position).and_then(|_| splash_window.set_size(window_size)) { error!(target: LOG_TARGET, "Could not set splashscreen window position or size: {:?}", e); } @@ -770,7 +800,7 @@ fn main() { }; let config_path = app - .path_resolver() + .path() .app_config_dir() .expect("Could not get config dir"); let address = app.state::().tari_address.clone(); @@ -823,6 +853,7 @@ fn main() { commands::get_max_consumption_levels, commands::get_miner_metrics, commands::get_monero_seed_words, + commands::get_network, commands::get_p2pool_stats, commands::get_paper_wallet_details, commands::get_seed_words, @@ -863,7 +894,10 @@ fn main() { commands::get_p2pool_connections, commands::set_p2pool_stats_server_port, commands::get_used_p2pool_stats_server_port, - commands::get_network + commands::proceed_with_update, + commands::set_pre_release, + commands::check_for_updates, + commands::try_update, ]) .build(tauri::generate_context!()) .inspect_err( @@ -876,42 +910,16 @@ fn main() { "Starting Tari Universe version: {}", app.package_info().version ); - let mut downloaded: u64 = 0; - app.run(move |app_handle, event| match event { - tauri::RunEvent::Updater(updater_event) => match updater_event { - UpdaterEvent::Error(e) => { - error!(target: LOG_TARGET, "Updater error: {:?}", e); - } - UpdaterEvent::DownloadProgress { chunk_length, content_length } => { - downloaded += chunk_length as u64; - let content_length = content_length.unwrap_or_else(|| { - warn!(target: LOG_TARGET, "Unable to determine content length"); - downloaded - }); - - info!(target: LOG_TARGET, "Chunk Length: {} | Download progress: {} / {}", chunk_length, downloaded, content_length); - if let Some(window) = app_handle.get_window("main") { - drop(window.emit("update-progress", UpdateProgressRustEvent { chunk_length, content_length, downloaded: downloaded.min(content_length) }).inspect_err(|e| error!(target: LOG_TARGET, "Could not emit event 'update-progress': {:?}", e)) - ); - } - } - UpdaterEvent::Downloaded => { - shutdown.trigger(); - } - _ => { - info!(target: LOG_TARGET, "Updater event: {:?}", updater_event); - } - }, + app.run(move |app_handle, event| match event { tauri::RunEvent::ExitRequested { api: _, .. } => { - // api.prevent_exit(); - info!(target: LOG_TARGET, "App shutdown caught"); - let _unused = block_on(stop_all_processes(app_state.clone(), true)); + info!(target: LOG_TARGET, "App shutdown request caught"); + let _unused = block_on(stop_all_processes(app_handle.clone(), true)); info!(target: LOG_TARGET, "App shutdown complete"); } tauri::RunEvent::Exit => { info!(target: LOG_TARGET, "App shutdown caught"); - let _unused = block_on(stop_all_processes(app_state.clone(), true)); + let _unused = block_on(stop_all_processes(app_handle.clone(), true)); info!(target: LOG_TARGET, "Tari Universe v{} shut down successfully", app_handle.package_info().version); } RunEvent::MainEventsCleared => { @@ -920,8 +928,8 @@ fn main() { RunEvent::WindowEvent { label, event, .. } => { trace!(target: LOG_TARGET, "Window event: {:?} {:?}", label, event); if let WindowEvent::CloseRequested { .. } = event { - if let Some(window) = app_handle.get_window(&label) { - if let (Ok(window_position), Ok(window_size)) = (window.outer_position(), window.outer_size()) { + if let Some(window) = app_handle.get_webview_window(&label) { + if let (Ok(window_position), Ok(window_size)) = (window.outer_position(), window.inner_size()) { let window_settings = WindowSettings { x: window_position.x, y: window_position.y, diff --git a/src-tauri/src/mm_proxy_adapter.rs b/src-tauri/src/mm_proxy_adapter.rs index 5d0a2a088..5cec6e634 100644 --- a/src-tauri/src/mm_proxy_adapter.rs +++ b/src-tauri/src/mm_proxy_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use crate::process_adapter::{ diff --git a/src-tauri/src/mm_proxy_manager.rs b/src-tauri/src/mm_proxy_manager.rs index b4ab44c36..1ccb2f69c 100644 --- a/src-tauri/src/mm_proxy_manager.rs +++ b/src-tauri/src/mm_proxy_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use std::sync::Arc; diff --git a/src-tauri/src/network_utils.rs b/src-tauri/src/network_utils.rs index 34a4053d5..031a51ae4 100644 --- a/src-tauri/src/network_utils.rs +++ b/src-tauri/src/network_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use serde::Deserialize; use std::fmt::Write as _; use tari_common::configuration::Network; diff --git a/src-tauri/src/node_adapter.rs b/src-tauri/src/node_adapter.rs index 9554f20d6..24169aafc 100644 --- a/src-tauri/src/node_adapter.rs +++ b/src-tauri/src/node_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::node_manager::NodeIdentity; use crate::port_allocator::PortAllocator; use crate::process_adapter::{ diff --git a/src-tauri/src/node_manager.rs b/src-tauri/src/node_manager.rs index 0cc4d312b..325b5f4d8 100644 --- a/src-tauri/src/node_manager.rs +++ b/src-tauri/src/node_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::{Path, PathBuf}; use std::sync::Arc; use std::time::SystemTime; @@ -5,12 +27,14 @@ use std::time::SystemTime; use chrono::{NaiveDateTime, TimeZone, Utc}; use log::{error, info}; use minotari_node_grpc_client::grpc::Peer; -use sentry::protocol::Event; +use serde_json::json; use tari_common::configuration::Network; use tari_core::transactions::tari_amount::MicroMinotari; use tari_crypto::ristretto::RistrettoPublicKey; use tari_shutdown::ShutdownSignal; use tari_utilities::hex::Hex; +use tauri_plugin_sentry::sentry; +use tauri_plugin_sentry::sentry::protocol::Event; use tokio::fs; use tokio::sync::RwLock; @@ -263,14 +287,27 @@ impl NodeManager { .any(|local_block| block_scan_block.1 == local_block.1) { if report_to_sentry { - let error_msg = format!( - "Orphan chain detected: block {} at height {} not found in local chain. Block scan tip height: {} - Local tip height: {}", - block_scan_block.1, block_scan_block.0, block_scan_tip, local_tip - ); + let error_msg = "Orphan chain detected".to_string(); + let extra = vec![ + ( + "block_scan_block_height".to_string(), + json!(block_scan_block.0.to_string()), + ), + ( + "block_scan_block_hash".to_string(), + json!(block_scan_block.1.clone()), + ), + ( + "block_scan_tip_height".to_string(), + json!(block_scan_tip.to_string()), + ), + ("local_tip_height".to_string(), json!(local_tip.to_string())), + ]; sentry::capture_event(Event { message: Some(error_msg), level: sentry::Level::Error, culprit: Some("orphan-chain".to_string()), + extra: extra.into_iter().collect(), ..Default::default() }); } diff --git a/src-tauri/src/p2pool/mod.rs b/src-tauri/src/p2pool/mod.rs index 51d985387..26656b3f0 100644 --- a/src-tauri/src/p2pool/mod.rs +++ b/src-tauri/src/p2pool/mod.rs @@ -1,2 +1,24 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub mod models; pub mod stats_client; diff --git a/src-tauri/src/p2pool/models.rs b/src-tauri/src/p2pool/models.rs index 463511d3e..e9980b6dc 100644 --- a/src-tauri/src/p2pool/models.rs +++ b/src-tauri/src/p2pool/models.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use serde::{Deserialize, Serialize}; use tari_core::transactions::tari_amount::MicroMinotari; use tari_utilities::epoch_time::EpochTime; diff --git a/src-tauri/src/p2pool/stats_client.rs b/src-tauri/src/p2pool/stats_client.rs index 537ddb067..6c6966282 100644 --- a/src-tauri/src/p2pool/stats_client.rs +++ b/src-tauri/src/p2pool/stats_client.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::p2pool::models::{Connections, Stats}; use anyhow::Error; use log::warn; diff --git a/src-tauri/src/p2pool_adapter.rs b/src-tauri/src/p2pool_adapter.rs index 85874e68f..c551a87cd 100644 --- a/src-tauri/src/p2pool_adapter.rs +++ b/src-tauri/src/p2pool_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::anyhow; use anyhow::Error; use async_trait::async_trait; diff --git a/src-tauri/src/p2pool_manager.rs b/src-tauri/src/p2pool_manager.rs index d1fdd9519..099c42b7f 100644 --- a/src-tauri/src/p2pool_manager.rs +++ b/src-tauri/src/p2pool_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use std::sync::Arc; use std::time::Duration; diff --git a/src-tauri/src/port_allocator.rs b/src-tauri/src/port_allocator.rs index 6b06a8731..1c056654e 100644 --- a/src-tauri/src/port_allocator.rs +++ b/src-tauri/src/port_allocator.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{anyhow, Error}; use log::{error, info, warn}; use std::net::TcpListener; diff --git a/src-tauri/src/process_adapter.rs b/src-tauri/src/process_adapter.rs index 32c645037..ea8e3652b 100644 --- a/src-tauri/src/process_adapter.rs +++ b/src-tauri/src/process_adapter.rs @@ -1,13 +1,35 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::{anyhow, Error}; use async_trait::async_trait; use futures_util::future::FusedFuture; use log::{error, info, warn}; use sentry::protocol::Event; -use sentry_tauri::sentry; use std::collections::HashMap; use std::fs; use std::path::PathBuf; use tari_shutdown::Shutdown; +use tauri_plugin_sentry::sentry; use tokio::runtime::Handle; use tokio::select; use tokio::task::JoinHandle; diff --git a/src-tauri/src/process_killer.rs b/src-tauri/src/process_killer.rs index 55842a23d..583ca7e41 100644 --- a/src-tauri/src/process_killer.rs +++ b/src-tauri/src/process_killer.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::Result; pub async fn kill_process(pid: i32) -> Result<(), anyhow::Error> { diff --git a/src-tauri/src/process_utils.rs b/src-tauri/src/process_utils.rs index f3a01ba1a..48b94159d 100644 --- a/src-tauri/src/process_utils.rs +++ b/src-tauri/src/process_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::Path; pub fn launch_child_process( diff --git a/src-tauri/src/process_watcher.rs b/src-tauri/src/process_watcher.rs index 0b0117596..128ccd959 100644 --- a/src-tauri/src/process_watcher.rs +++ b/src-tauri/src/process_watcher.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::binaries::{Binaries, BinaryResolver}; use crate::process_adapter::{HealthStatus, ProcessAdapter, ProcessInstance, StatusMonitor}; use futures_util::future::FusedFuture; diff --git a/src-tauri/src/progress_tracker.rs b/src-tauri/src/progress_tracker.rs index 57d7b775c..54af1a1d8 100644 --- a/src-tauri/src/progress_tracker.rs +++ b/src-tauri/src/progress_tracker.rs @@ -1,6 +1,29 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::{collections::HashMap, sync::Arc}; use log::error; +use tauri::{AppHandle, Emitter}; use tokio::sync::{watch::Sender, RwLock}; use crate::setup_status_event::SetupStatusEvent; @@ -20,9 +43,9 @@ impl Clone for ProgressTracker { } impl ProgressTracker { - pub fn new(window: tauri::Window, channel: Option>) -> Self { + pub fn new(app_handle: AppHandle, channel: Option>) -> Self { Self { - inner: Arc::new(RwLock::new(ProgressTrackerInner::new(window, channel))), + inner: Arc::new(RwLock::new(ProgressTrackerInner::new(app_handle, channel))), } } @@ -48,16 +71,16 @@ impl ProgressTracker { } pub struct ProgressTrackerInner { - window: tauri::Window, + app_handle: AppHandle, min: u64, next_max: u64, last_action_channel: Option>, } impl ProgressTrackerInner { - pub fn new(window: tauri::Window, channel: Option>) -> Self { + pub fn new(app_handle: AppHandle, channel: Option>) -> Self { Self { - window, + app_handle: app_handle.clone(), min: 0, next_max: 0, last_action_channel: channel, @@ -98,7 +121,7 @@ impl ProgressTrackerInner { .inspect_err(|e| error!(target: LOG_TARGET, "Could not send last action: {:?}", e)) .ok(); } - self.window + self.app_handle .emit( "message", SetupStatusEvent { diff --git a/src-tauri/src/setup_status_event.rs b/src-tauri/src/setup_status_event.rs index 19448e449..f70e1d141 100644 --- a/src-tauri/src/setup_status_event.rs +++ b/src-tauri/src/setup_status_event.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use serde::Serialize; use std::collections::HashMap; diff --git a/src-tauri/src/systemtray_manager.rs b/src-tauri/src/systemtray_manager.rs deleted file mode 100644 index 05a0d48c4..000000000 --- a/src-tauri/src/systemtray_manager.rs +++ /dev/null @@ -1,389 +0,0 @@ -use human_format::Formatter; -use log::{error, info}; - -#[allow(unused_imports)] -use std::{ops::Div, sync::LazyLock}; -use tauri::{ - AppHandle, CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, - SystemTrayMenuItem, -}; - -#[allow(unused_imports)] -use crate::hardware::hardware_status_monitor::PublicDeviceProperties; - -const LOG_TARGET: &str = "tari::universe::systemtray_manager"; -static INSTANCE: LazyLock = LazyLock::new(SystemtrayManager::new); - -pub enum SystrayItemId { - CpuHashrate, - GpuHashrate, - #[allow(dead_code)] - CpuUsage, - #[allow(dead_code)] - GpuUsage, - EstimatedEarning, - UnMinimize, -} - -impl SystrayItemId { - pub fn to_str(&self) -> &str { - match self { - SystrayItemId::CpuHashrate => "cpu_hashrate", - SystrayItemId::GpuHashrate => "gpu_hashrate", - SystrayItemId::CpuUsage => "cpu_usage", - SystrayItemId::GpuUsage => "gpu_usage", - SystrayItemId::EstimatedEarning => "estimated_earning", - SystrayItemId::UnMinimize => "unminimize", - } - } - - pub fn get_title(&self, value: f64) -> String { - match self { - SystrayItemId::CpuHashrate => format!( - "CPU Hashrate: {} H/s", - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(value) - ), - SystrayItemId::GpuHashrate => format!( - "GPU Hashrate: {} H/s", - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(value) - ), - SystrayItemId::CpuUsage => format!("CPU Usage: {:.2}%", value), - SystrayItemId::GpuUsage => format!("GPU Usage: {:.2}%", value), - SystrayItemId::EstimatedEarning => { - format!( - "Est earning: {} tXTM/day", - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(value / 1_000_000.0) - ) - } - SystrayItemId::UnMinimize => "Unminimize".to_string(), - } - } -} - -pub enum CurrentOperatingSystem { - Windows, - Linux, - MacOS, -} - -#[derive(Debug, Clone)] -pub struct SystrayData { - pub cpu_hashrate: f64, - pub gpu_hashrate: f64, - // pub cpu_usage: f64, - // pub gpu_usage: f64, - pub estimated_earning: f64, -} - -pub struct SystemtrayManager { - pub systray: SystemTray, -} - -impl SystemtrayManager { - pub fn new() -> Self { - let systray = SystemtrayManager::initialize_systray(); - - Self { systray } - } - fn initialize_menu() -> SystemTrayMenu { - info!(target: LOG_TARGET, "Initializing system tray menu"); - let cpu_hashrate = CustomMenuItem::new( - SystrayItemId::CpuHashrate.to_str(), - SystrayItemId::CpuHashrate.get_title(0.0), - ) - .disabled(); - let gpu_hashrate = CustomMenuItem::new( - SystrayItemId::GpuHashrate.to_str(), - SystrayItemId::GpuHashrate.get_title(0.0), - ) - .disabled(); - // let cpu_usage = CustomMenuItem::new( - // SystrayItemId::CpuUsage.to_str(), - // SystrayItemId::CpuUsage.get_title(0.0), - // ) - // .disabled(); - // let gpu_usage = CustomMenuItem::new( - // SystrayItemId::GpuUsage.to_str(), - // SystrayItemId::GpuUsage.get_title(0.0), - // ) - // .disabled(); - let estimated_earning = CustomMenuItem::new( - SystrayItemId::EstimatedEarning.to_str(), - SystrayItemId::EstimatedEarning.get_title(0.0), - ) - .disabled(); - let unminimize = CustomMenuItem::new( - SystrayItemId::UnMinimize.to_str(), - SystrayItemId::UnMinimize.get_title(0.0), - ); - - SystemTrayMenu::new() - // .add_item(cpu_usage) - .add_item(cpu_hashrate) - .add_native_item(SystemTrayMenuItem::Separator) - // .add_item(gpu_usage) - .add_item(gpu_hashrate) - .add_native_item(SystemTrayMenuItem::Separator) - .add_item(estimated_earning) - .add_native_item(SystemTrayMenuItem::Separator) - .add_item(unminimize) - } - - fn initialize_systray() -> SystemTray { - info!(target: LOG_TARGET, "Initializing system tray"); - let current_os = SystemtrayManager::detect_current_os(); - let systray = SystemTray::new(); - - let empty_data = SystrayData { - cpu_hashrate: 0.0, - gpu_hashrate: 0.0, - // cpu_usage: 0.0, - // gpu_usage: 0.0, - estimated_earning: 0.0, - }; - let tray_menu = SystemtrayManager::initialize_menu(); - let tooltip = SystemtrayManager::internal_create_tooltip_from_data(empty_data.clone()); - - match current_os { - CurrentOperatingSystem::Windows => { - return systray.with_tooltip(tooltip.clone().as_str()); - } - CurrentOperatingSystem::Linux => systray.with_menu(tray_menu), - CurrentOperatingSystem::MacOS => { - return systray - .with_menu(tray_menu) - .with_tooltip(tooltip.clone().as_str()) - } - } - } - - fn internal_create_tooltip_from_data(data: SystrayData) -> String { - let current_os = SystemtrayManager::detect_current_os(); - - match current_os { - CurrentOperatingSystem::Windows => { - format!( - "Hashrate \nCPU: {} H/s\nGPU: {} H/s\nEst. earning: {} tXTM/day", - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(data.cpu_hashrate), - // data.cpu_usage, - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(data.gpu_hashrate), - // data.gpu_usage, - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(data.estimated_earning / 1_000_000.0) - ) - } - CurrentOperatingSystem::Linux => "Not supported".to_string(), - CurrentOperatingSystem::MacOS => { - format!( - "CPU:\n Hashrate: {} H/s\nGPU:\n Hashrate: {} H/s\nEst. earning: {} tXTM/day", - Formatter::new() - .with_decimals(0) - .with_separator("") - .format(data.cpu_hashrate), - // data.cpu_usage, - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(data.gpu_hashrate), - // data.gpu_usage, - Formatter::new() - .with_decimals(2) - .with_separator("") - .format(data.estimated_earning / 1_000_000.0) - ) - } - } - } - - fn update_menu_field(&self, app: AppHandle, item_id: SystrayItemId, value: f64) { - app.tray_handle() - .get_item(item_id.to_str()) - .set_title(item_id.get_title(value)) - .unwrap_or_else(|e| { - error!(target: LOG_TARGET, "Failed to update menu field: {}", e); - }); - } - - fn update_menu_with_data(&self, app: AppHandle, data: SystrayData) { - self.update_menu_field(app.clone(), SystrayItemId::CpuHashrate, data.cpu_hashrate); - self.update_menu_field(app.clone(), SystrayItemId::GpuHashrate, data.gpu_hashrate); - // self.update_menu_field(app.clone(), SystrayItemId::CpuUsage, data.cpu_usage); - // self.update_menu_field(app.clone(), SystrayItemId::GpuUsage, data.gpu_usage); - self.update_menu_field( - app.clone(), - SystrayItemId::EstimatedEarning, - data.estimated_earning, - ); - self.update_minimize(app.clone()); - } - - #[allow(dead_code)] - pub fn create_tooltip_from_data(&self, data: SystrayData) -> String { - SystemtrayManager::internal_create_tooltip_from_data(data) - } - - pub fn update_minimize(&self, app: AppHandle) { - let window = app.get_window("main").expect("Could not get window"); - let _unused = app - .tray_handle() - .get_item(SystrayItemId::UnMinimize.to_str()) - .set_enabled(window.is_minimized().expect("Could not get is_minimized")); - } - - fn detect_current_os() -> CurrentOperatingSystem { - if cfg!(target_os = "windows") { - CurrentOperatingSystem::Windows - } else if cfg!(target_os = "linux") { - CurrentOperatingSystem::Linux - } else if cfg!(target_os = "macos") { - CurrentOperatingSystem::MacOS - } else { - panic!("Unsupported OS"); - } - } - - pub fn update_systray(&self, app: AppHandle, data: SystrayData) { - let current_os = SystemtrayManager::detect_current_os(); - let tooltip = SystemtrayManager::internal_create_tooltip_from_data(data.clone()); - - match current_os { - CurrentOperatingSystem::Windows => { - app.tray_handle() - .set_tooltip(tooltip.as_str()) - .unwrap_or_else(|e| { - error!(target: LOG_TARGET, "Failed to update tooltip: {}", e); - }); - } - CurrentOperatingSystem::Linux => { - self.update_menu_with_data(app, data); - } - CurrentOperatingSystem::MacOS => { - self.update_menu_with_data(app.clone(), data); - app.clone() - .tray_handle() - .set_tooltip(tooltip.as_str()) - .unwrap_or_else(|e| { - error!(target: LOG_TARGET, "Failed to update tooltip: {}", e); - }); - } - } - } - - pub fn handle_system_tray_event(&self, app: AppHandle, event: SystemTrayEvent) { - let window = match app.get_window("main") { - Some(window) => window, - None => { - error!(target: LOG_TARGET, "Failed to get main window"); - return; - } - }; - match event { - SystemTrayEvent::DoubleClick { .. } => { - window.unminimize().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to unminimize window: {}", error); - }); - window.set_focus().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to set focus on window: {}", error); - }); - } - SystemTrayEvent::MenuItemClick { id, .. } => { - info!(target: LOG_TARGET, "System tray menu item click event: {}", id); - match id.as_str() { - "unminimize" => { - info!(target: LOG_TARGET, "Unminimizing window"); - match SystemtrayManager::detect_current_os() { - CurrentOperatingSystem::Linux => { - let is_minimized = window.is_minimized().unwrap_or(false); - let is_visible = window.is_visible().unwrap_or(false); - - if is_minimized | !is_visible { - // Ony soultion to unminimize and show the window on Linux - // At least one that I found - window.hide().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed hide window: {}", error); - }); - window.unminimize().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to unminimize window: {}", error); - }); - window.show().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to show window: {}", error); - }); - window.set_focus().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to set focus on window: {}", error); - }); - } - } - CurrentOperatingSystem::MacOS => { - window.unminimize().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to unminimize window: {}", error); - }); - window.set_focus().unwrap_or_else(|error| { - error!(target: LOG_TARGET, "Failed to set focus on window: {}", error); - }); - } - _ => {} - } - } - _ => { - info!(target: LOG_TARGET, "Unknown menu item click event: {}", id); - } - } - } - _ => { - info!(target: LOG_TARGET, "System tray event"); - } - } - } - - pub fn create_systemtray_data( - &self, - cpu_hashrate: f64, - gpu_hashrate: f64, - // gpu_parameters: Vec, - // cpu_parameters: Vec, - estimated_earning: f64, - ) -> SystrayData { - // let cpu_usage_percentage = cpu_parameters - // .iter() - // .map(|cpu| f64::from(cpu.clone().parameters.unwrap_or_default().usage_percentage)) - // .sum::() - // .div(cpu_parameters.len() as f64); - // let gpu_usage_percentage = gpu_parameters - // .iter() - // .map(|gpu| f64::from(gpu.clone().parameters.unwrap_or_default().usage_percentage)) - // .sum::() - // .div(gpu_parameters.len() as f64); - SystrayData { - cpu_hashrate, - gpu_hashrate, - // cpu_usage: cpu_usage_percentage, - // gpu_usage: gpu_usage_percentage, - estimated_earning, - } - } - - pub fn get_systray(&self) -> &SystemTray { - &self.systray - } - - pub fn current() -> &'static SystemtrayManager { - &INSTANCE - } -} diff --git a/src-tauri/src/telemetry_manager.rs b/src-tauri/src/telemetry_manager.rs index 97af722ce..56e5e6298 100644 --- a/src-tauri/src/telemetry_manager.rs +++ b/src-tauri/src/telemetry_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::app_in_memory_config::AppInMemoryConfig; use crate::hardware::hardware_status_monitor::HardwareStatusMonitor; use crate::p2pool_manager::{self, P2poolManager}; @@ -26,6 +48,7 @@ use std::{sync::Arc, thread::sleep, time::Duration}; use tari_common::configuration::Network; use tari_core::transactions::tari_amount::MicroMinotari; use tari_utilities::encoding::MBase58; +use tauri::Emitter; use tokio::sync::RwLock; use tokio_util::sync::CancellationToken; diff --git a/src-tauri/src/tests/app_config_tests.rs b/src-tauri/src/tests/app_config_tests.rs index b1d110863..d93161369 100644 --- a/src-tauri/src/tests/app_config_tests.rs +++ b/src-tauri/src/tests/app_config_tests.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #[cfg(test)] mod tests { use std::time::{Duration, SystemTime}; diff --git a/src-tauri/src/tests/mod.rs b/src-tauri/src/tests/mod.rs index 2ee726d69..bc7db7d2c 100644 --- a/src-tauri/src/tests/mod.rs +++ b/src-tauri/src/tests/mod.rs @@ -1 +1,23 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + mod app_config_tests; diff --git a/src-tauri/src/tor_adapter.rs b/src-tauri/src/tor_adapter.rs index e1ca883ec..a33692c2f 100644 --- a/src-tauri/src/tor_adapter.rs +++ b/src-tauri/src/tor_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::PathBuf; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; diff --git a/src-tauri/src/tor_manager.rs b/src-tauri/src/tor_manager.rs index cdd5b34a7..9a668a2c0 100644 --- a/src-tauri/src/tor_manager.rs +++ b/src-tauri/src/tor_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::process_watcher::ProcessWatcher; use crate::tor_adapter::{TorAdapter, TorConfig}; use std::{path::PathBuf, sync::Arc}; diff --git a/src-tauri/src/updates_manager.rs b/src-tauri/src/updates_manager.rs new file mode 100644 index 000000000..7b38e9f35 --- /dev/null +++ b/src-tauri/src/updates_manager.rs @@ -0,0 +1,221 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use std::sync::Arc; +use tokio::time; + +use anyhow::anyhow; +use log::{error, info, warn}; + +use serde::{Deserialize, Serialize}; +use tauri::{Emitter, Url}; +use tauri_plugin_updater::{Update, UpdaterExt}; +use tokio::sync::RwLock; + +use crate::app_config::AppConfig; +use tari_shutdown::ShutdownSignal; +use tokio::time::Duration; + +const LOG_TARGET: &str = "tari::universe::updates_manager"; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DownloadProgressPayload { + pub event_type: String, + pub downloaded: u64, + pub total: u64, +} + +impl DownloadProgressPayload { + pub fn new(downloaded: u64, total: u64) -> Self { + Self { + event_type: "download_progress".to_string(), + downloaded, + total, + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct AskForUpdatePayload { + pub event_type: String, + pub version: String, +} + +impl AskForUpdatePayload { + pub fn new(version: String) -> Self { + Self { + event_type: "ask_for_update".to_string(), + version, + } + } +} + +#[derive(Clone)] +pub struct UpdatesManager { + config: Arc>, + update: Arc>>, + app_shutdown: ShutdownSignal, +} + +impl UpdatesManager { + pub fn new(config: Arc>, app_shutdown: ShutdownSignal) -> Self { + Self { + config, + update: Arc::new(RwLock::new(None)), + app_shutdown, + } + } + + pub async fn init_periodic_updates(&self, app: tauri::AppHandle) -> Result<(), anyhow::Error> { + let app_clone = app.clone(); + let self_clone = self.clone(); + tauri::async_runtime::spawn(async move { + let mut interval = time::interval(Duration::from_secs(3600)); + loop { + if self_clone.app_shutdown.is_triggered() && self_clone.app_shutdown.is_triggered() + { + break; + }; + interval.tick().await; + if let Err(e) = self_clone.try_update(app_clone.clone(), false, false).await { + error!(target: LOG_TARGET, "Error checking for updates: {:?}", e); + } + } + }); + + Ok(()) + } + + pub async fn try_update( + &self, + app: tauri::AppHandle, + force: bool, + enable_downgrade: bool, + ) -> Result<(), anyhow::Error> { + match self.check_for_update(app.clone(), enable_downgrade).await? { + Some(update) => { + let version = update.version.clone(); + info!(target: LOG_TARGET, "try_update: Update available: {:?}", version); + *self.update.write().await = Some(update); + let is_auto_update = self.config.read().await.auto_update(); + + if force { + info!(target: LOG_TARGET, "try_update: Proceeding with force update"); + self.proceed_with_update(app.clone()).await?; + } else if is_auto_update { + info!(target: LOG_TARGET, "try_update: Auto update is enabled. Proceeding with update"); + self.proceed_with_update(app.clone()).await?; + } else { + info!(target: LOG_TARGET, "try_update: Auto update is disabled. Prompting user to update"); + let payload = AskForUpdatePayload { + event_type: "ask_for_update".to_string(), + version, + }; + drop(app.emit("updates_event", payload).inspect_err(|e| { + warn!(target: LOG_TARGET, "Failed to emit 'updates-event' with UpdateAvailablePayload: {}", e); + })); + // proceed_with_update will be trigger by the user + } + } + None => { + info!(target: LOG_TARGET, "No updates available"); + } + } + + Ok(()) + } + + pub async fn check_for_update( + &self, + app: tauri::AppHandle, + enable_downgrade: bool, + ) -> Result, anyhow::Error> { + let is_pre_release = self.config.read().await.pre_release(); + let updates_url = self.get_updates_url(is_pre_release); + + let update = app + .updater_builder() + .version_comparator(move |current, update| { + if enable_downgrade { + // Needed for switching off the pre-release + update.version != current + } else { + update.version > current + } + }) + .endpoints(vec![updates_url]) + .expect("Failed to set update URL") + .build() + .expect("Failed to build updater") + .check() + .await + .expect("Failed to check for updates"); + + Ok(update) + } + + fn get_updates_url(&self, is_pre_release: bool) -> Url { + let updater_filename = if is_pre_release { + "alpha-latest" + } else { + "latest" + }; + + let update_url_string = format!("https://raw.githubusercontent.com/tari-project/universe/main/.updater/{updater_filename}.json"); + Url::parse(&update_url_string).expect("Failed to parse update URL") + } + + pub async fn proceed_with_update(&self, app: tauri::AppHandle) -> Result<(), anyhow::Error> { + let mut downloaded: u64 = 0; + let update = self + .update + .read() + .await + .clone() + .ok_or_else(|| anyhow!("No update available"))?; + + let mut last_emit = std::time::Instant::now(); + update + .download_and_install( + |chunk_length, content_length| { + downloaded += chunk_length as u64; + + let now = std::time::Instant::now(); + let is_last_chunk = content_length.map(|cl| downloaded >= cl).unwrap_or(false); + + if is_last_chunk || now.duration_since(last_emit) >= Duration::from_millis(100) { + last_emit = std::time::Instant::now(); + let payload = DownloadProgressPayload::new(downloaded, content_length.unwrap_or(downloaded)); + drop(app.emit("updates_event", payload).inspect_err(|e| { + warn!(target: LOG_TARGET, "Failed to emit 'updates_event' event: {}", e); + })); + } + }, + || { + app.restart(); + }, + ) + .await?; + + Ok(()) + } +} diff --git a/src-tauri/src/user_listener.rs b/src-tauri/src/user_listener.rs index 85b25edf2..bff90178b 100644 --- a/src-tauri/src/user_listener.rs +++ b/src-tauri/src/user_listener.rs @@ -1,5 +1,28 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use device_query::{DeviceQuery, DeviceState}; use log::{error, info}; +use tauri::Emitter; use tokio::time::{sleep, Duration}; use tokio_util::sync::CancellationToken; diff --git a/src-tauri/src/utils/auto_rollback.rs b/src-tauri/src/utils/auto_rollback.rs index 414d98d53..ee5a72524 100644 --- a/src-tauri/src/utils/auto_rollback.rs +++ b/src-tauri/src/utils/auto_rollback.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::sync::{Arc, Mutex}; use tokio::time::{sleep, Duration}; diff --git a/src-tauri/src/utils/file_utils.rs b/src-tauri/src/utils/file_utils.rs index 14304bc59..c0114c58a 100644 --- a/src-tauri/src/utils/file_utils.rs +++ b/src-tauri/src/utils/file_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use std::path::{Component, Path, PathBuf}; use anyhow::anyhow; diff --git a/src-tauri/src/utils/logging_utils.rs b/src-tauri/src/utils/logging_utils.rs index c93d4e587..15fe440df 100644 --- a/src-tauri/src/utils/logging_utils.rs +++ b/src-tauri/src/utils/logging_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::Error; use std::{fs, fs::File, io::Write, path::Path}; diff --git a/src-tauri/src/utils/macos_utils.rs b/src-tauri/src/utils/macos_utils.rs index ebb056831..6c9861163 100644 --- a/src-tauri/src/utils/macos_utils.rs +++ b/src-tauri/src/utils/macos_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #[cfg(target_os = "macos")] use std::env; #[cfg(target_os = "macos")] @@ -5,7 +27,7 @@ use std::path::Path; #[cfg(target_os = "macos")] pub fn is_app_in_applications_folder() -> bool { - let current_exe = env::current_exe().unwrap(); + let current_exe = env::current_exe().expect("Failed to get current executable path"); let applications_folder = Path::new("/Applications"); current_exe.starts_with(applications_folder) } diff --git a/src-tauri/src/utils/mod.rs b/src-tauri/src/utils/mod.rs index a85a4dac5..2d57f834e 100644 --- a/src-tauri/src/utils/mod.rs +++ b/src-tauri/src/utils/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub mod auto_rollback; pub mod file_utils; pub mod logging_utils; diff --git a/src-tauri/src/utils/platform_utils.rs b/src-tauri/src/utils/platform_utils.rs index 61a2da481..58352c5bf 100644 --- a/src-tauri/src/utils/platform_utils.rs +++ b/src-tauri/src/utils/platform_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub enum CurrentOperatingSystem { Windows, Linux, diff --git a/src-tauri/src/utils/setup_utils.rs b/src-tauri/src/utils/setup_utils.rs index e22c7853b..e6870f06d 100644 --- a/src-tauri/src/utils/setup_utils.rs +++ b/src-tauri/src/utils/setup_utils.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #[cfg(windows)] pub mod setup_utils { use log::{error, info}; diff --git a/src-tauri/src/utils/shutdown_utils.rs b/src-tauri/src/utils/shutdown_utils.rs index 37593c0d0..d94bcf36f 100644 --- a/src-tauri/src/utils/shutdown_utils.rs +++ b/src-tauri/src/utils/shutdown_utils.rs @@ -1,21 +1,47 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::{UniverseAppState, APPLICATION_FOLDER_ID}; use log::info; -use tauri::api::path::local_data_dir; +use tauri::Manager; static LOG_TARGET: &str = "tari::universe::shutdown_utils"; pub async fn stop_all_processes( - state: UniverseAppState, + app_handle: tauri::AppHandle, should_shutdown: bool, ) -> Result<(), String> { info!(target: LOG_TARGET, "Stopping all miners"); - info!(target: LOG_TARGET, "Entering shutdown sequence"); - if should_shutdown { + let state = app_handle.state::().inner(); + + if should_shutdown && !state.shutdown.is_triggered() { + info!(target: LOG_TARGET, "Entering shutdown sequence"); state.shutdown.clone().trigger(); } - let base_path = local_data_dir() + let base_path = app_handle + .path() + .local_data_dir() .expect("Could not get data dir") .join(APPLICATION_FOLDER_ID); @@ -27,8 +53,8 @@ pub async fn stop_all_processes( if cpu_miner_is_running || cpu_miner_pid_file_exists { cpu_miner.stop().await.map_err(|e| e.to_string())?; - drop(cpu_miner); } + drop(cpu_miner); let gpu_miner = state.gpu_miner.read().await; let gpu_miner_pid_file_exists = gpu_miner.is_pid_file_exists(base_path.clone()).await; @@ -38,10 +64,10 @@ pub async fn stop_all_processes( if gpu_miner_is_running || gpu_miner_pid_file_exists { gpu_miner.stop().await.map_err(|e| e.to_string())?; - drop(gpu_miner); } + drop(gpu_miner); - let wallet_manager = state.wallet_manager; + let wallet_manager = state.wallet_manager.clone(); let wallet_manager_is_running = wallet_manager.is_running().await; let wallet_manager_pid_file_exists = wallet_manager.is_pid_file_exists(base_path.clone()).await; @@ -51,7 +77,7 @@ pub async fn stop_all_processes( wallet_manager.stop().await.map_err(|e| e.to_string())?; } - let node_manager = state.node_manager; + let node_manager = state.node_manager.clone(); let node_manager_is_running = node_manager.is_running().await; let node_manager_pid_file_exists = node_manager.is_pid_file_exists(base_path.clone()).await; @@ -61,7 +87,7 @@ pub async fn stop_all_processes( node_manager.stop().await.map_err(|e| e.to_string())?; } - let mm_proxy_manager = state.mm_proxy_manager; + let mm_proxy_manager = state.mm_proxy_manager.clone(); let mm_proxy_manager_is_running = mm_proxy_manager.is_running().await; let mm_proxy_manager_pid_file_exists = mm_proxy_manager.is_pid_file_exists(base_path.clone()).await; @@ -72,7 +98,7 @@ pub async fn stop_all_processes( mm_proxy_manager.stop().await.map_err(|e| e.to_string())?; } - let p2pool_manager = state.p2pool_manager; + let p2pool_manager = state.p2pool_manager.clone(); let p2pool_manager_is_running = p2pool_manager.is_running().await; let p2pool_manager_pid_file_exists = p2pool_manager.is_pid_file_exists(base_path.clone()).await; @@ -82,7 +108,7 @@ pub async fn stop_all_processes( p2pool_manager.stop().await.map_err(|e| e.to_string())?; } - let tor_manager = state.tor_manager; + let tor_manager = state.tor_manager.clone(); let tor_manager_is_running = tor_manager.is_running().await; let tor_manager_pid_file_exists = tor_manager.is_pid_file_exists(base_path.clone()).await; @@ -92,7 +118,7 @@ pub async fn stop_all_processes( tor_manager.stop().await.map_err(|e| e.to_string())?; } - if should_shutdown { + if should_shutdown && !state.shutdown.is_triggered() { state.shutdown.clone().trigger(); } diff --git a/src-tauri/src/wallet_adapter.rs b/src-tauri/src/wallet_adapter.rs index f62ed70e4..40e0f6d99 100644 --- a/src-tauri/src/wallet_adapter.rs +++ b/src-tauri/src/wallet_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::port_allocator::PortAllocator; use crate::process_adapter::{ HealthStatus, ProcessAdapter, ProcessInstance, ProcessStartupSpec, StatusMonitor, diff --git a/src-tauri/src/wallet_manager.rs b/src-tauri/src/wallet_manager.rs index 14d4772ea..564d8892f 100644 --- a/src-tauri/src/wallet_manager.rs +++ b/src-tauri/src/wallet_manager.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use crate::node_manager::NodeManager; use crate::node_manager::NodeManagerError; use crate::process_watcher::ProcessWatcher; diff --git a/src-tauri/src/xmrig/http_api/mod.rs b/src-tauri/src/xmrig/http_api/mod.rs index ded948ea5..914d9b7cb 100644 --- a/src-tauri/src/xmrig/http_api/mod.rs +++ b/src-tauri/src/xmrig/http_api/mod.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub mod models; use log::{debug, error}; const LOG_TARGET: &str = "tari::universe::xmrig::http_api"; diff --git a/src-tauri/src/xmrig/http_api/models.rs b/src-tauri/src/xmrig/http_api/models.rs index 8a562f69b..94e768f45 100644 --- a/src-tauri/src/xmrig/http_api/models.rs +++ b/src-tauri/src/xmrig/http_api/models.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use serde::Deserialize; #[derive(Deserialize, Debug)] diff --git a/src-tauri/src/xmrig/mod.rs b/src-tauri/src/xmrig/mod.rs index 7c1cd8894..99c02f1dc 100644 --- a/src-tauri/src/xmrig/mod.rs +++ b/src-tauri/src/xmrig/mod.rs @@ -1 +1,23 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pub(crate) mod http_api; diff --git a/src-tauri/src/xmrig_adapter.rs b/src-tauri/src/xmrig_adapter.rs index 5a6ea86cf..2ac591188 100644 --- a/src-tauri/src/xmrig_adapter.rs +++ b/src-tauri/src/xmrig_adapter.rs @@ -1,3 +1,25 @@ +// Copyright 2024. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + use anyhow::Error; use async_trait::async_trait; use log::warn; @@ -108,6 +130,7 @@ impl ProcessAdapter for XmrigAdapter { )); #[allow(clippy::collapsible_match)] // don't specify threads for ludicrous mode + #[allow(clippy::collapsible_match)] if let Some(cpu_threads) = self.cpu_threads { if let Some(cpu_threads) = cpu_threads { args.push(format!("--threads={}", cpu_threads)); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e2be4abdc..46e52d614 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,57 +1,60 @@ { + "version": "0.8.15", + "productName": "Tari Universe (Alpha)", + "mainBinaryName": "Tari Universe (Alpha)", + "identifier": "com.tari.universe.alpha", "build": { "beforeDevCommand": "npm run dev", "beforeBuildCommand": "npm run build", - "devPath": "http://localhost:1420", - "distDir": "../dist", - "withGlobalTauri": true + "frontendDist": "../dist", + "devUrl": "http://localhost:1420" }, - "package": { - "productName": "Tari Universe (Alpha)", - "version": "0.8.14" - }, - "tauri": { - "systemTray": { - "iconPath": "icons/systray_icon.ico", - "menuOnLeftClick": true - }, - "updater": { - "active": true, - "endpoints": [ - "https://raw.githubusercontent.com/tari-project/universe/main/.updater/alpha-latest.json" - ], - "dialog": false, - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEYxNUJBOEFEQkQ4RjJBMjYKUldRbUtvKzlyYWhiOFJIUmFFditENVV3d3hRbjNlZm1DMi9aMjluRUpVdHhQTytadTV3ODN3bUMK" + "bundle": { + "active": true, + "targets": ["deb", "rpm", "appimage", "msi", "dmg"], + "macOS": { + "providerShortName": "Tari Labs, LLC" }, - "allowlist": { - "all": false, - "shell": { - "all": false, - "open": true, - "sidecar": false - }, - "window": { - "all": false, - "close": true, - "hide": true, - "show": true, - "maximize": true, - "minimize": true, - "unmaximize": true, - "unminimize": true, - "startDragging": true - }, - "os": { - "all": true - } + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico", + "icons/icon.png", + "icons/StoreLogo.png", + "icons/systray_icon.icns", + "icons/systray_icon.ico", + "icons/systray_icon.png" + ], + "copyright": "Copyright (c) 2024 Tari Labs, LLC", + "shortDescription": "Tari Universe is a mining app for Tari.", + "longDescription": "Introducing Tari Universe, the beautifully simple mining app for Tari. Install it on your Mac or PC and start mining Tari with one click.", + "publisher": "Tari Labs, LLC", + "createUpdaterArtifacts": "v1Compatible" + }, + "app": { + "security": { + "capabilities": ["desktop-capability", "default", "migrated"], + "csp": null }, - "pattern": { - "use": "isolation", - "options": { - "dir": "../dist-isolation" - } + "trayIcon": { + "id": "universe-tray-id", + "iconPath": "icons/systray_icon.ico", + "iconAsTemplate": true }, + "macOSPrivateApi": true, + "withGlobalTauri": true, "windows": [ + { + "title": "Tari Universe (Alpha) | Testnet", + "width": 1380, + "height": 780, + "label": "splashscreen", + "url": "/splash.html", + "center": true, + "useHttpsScheme": true + }, { "title": "Tari Universe (Alpha) | Testnet", "label": "main", @@ -63,44 +66,18 @@ "fullscreen": false, "transparent": false, "visible": false, - "center": true - }, - { - "title": "Tari Universe (Alpha) | Testnet", - "width": 1380, - "height": 780, - "label": "splashscreen", - "url": "splash.html", - "center": true + "center": true, + "useHttpsScheme": true } - ], - "security": { - "csp": null - }, - "bundle": { - "active": true, - "targets": "all", - "identifier": "com.tari.universe.alpha", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico", - "icons/icon.png", - "icons/StoreLogo.png", - "icons/systray_icon.icns", - "icons/systray_icon.ico", - "icons/systray_icon.png" - ], - "copyright": "Copyright (c) 2024 Tari Labs, LLC", - "shortDescription": "Tari Universe is a mining app for Tari.", - "longDescription": "Introducing Tari Universe, the beautifully simple mining app for Tari. Install it on your Mac or PC and start mining Tari with one click.", - "publisher": "Tari Labs, LLC", - "macOS": { - "providerShortName": "Tari Labs, LLC" + ] + }, + "plugins": { + "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEYxNUJBOEFEQkQ4RjJBMjYKUldRbUtvKzlyYWhiOFJIUmFFditENVV3d3hRbjNlZm1DMi9aMjluRUpVdHhQTytadTV3ODN3bUMK", + "endpoints": ["https://raw.githubusercontent.com/tari-project/universe/main/.updater/alpha-latest.json"], + "windows": { + "installMode": "passive" } - }, - "macOSPrivateApi": true + } } -} \ No newline at end of file +} diff --git a/src/App/App.tsx b/src/App/App.tsx index 89f4c654c..fe0fa1d7b 100644 --- a/src/App/App.tsx +++ b/src/App/App.tsx @@ -1,7 +1,8 @@ -import { AppContentContainer } from '@app/App/App.styles'; import * as Sentry from '@sentry/react'; import { useEffect } from 'react'; -import { useShuttingDown } from '@app/hooks/useShuttingDown'; +import { AppContentContainer } from '@app/App/App.styles'; +import { useShuttingDown } from '@app/hooks'; + import { useAppStateStore } from '@app/store/appStateStore'; import { LazyMotion, domMax, MotionConfig, AnimatePresence } from 'framer-motion'; import { useUIStore } from '@app/store/useUIStore.ts'; @@ -18,6 +19,9 @@ import ThemeProvider from '../theme/ThemeProvider.tsx'; export default function App() { const isShuttingDown = useShuttingDown(); const isSettingUp = useAppStateStore((s) => s.isSettingUp); + + const showSetup = isSettingUp && !isShuttingDown; + const setError = useAppStateStore((s) => s.setError); const setIsWebglNotSupported = useUIStore((s) => s.setIsWebglNotSupported); const { t } = useTranslation('common', { useSuspense: false }); @@ -51,12 +55,12 @@ export default function App() { - {!isShuttingDown && isSettingUp ? ( + {showSetup ? ( ) : null} - {isShuttingDown || isSettingUp ? null : ( + {isShuttingDown || showSetup ? null : ( diff --git a/src/App/AppWrapper.tsx b/src/App/AppWrapper.tsx index cbae896ca..90ca15271 100644 --- a/src/App/AppWrapper.tsx +++ b/src/App/AppWrapper.tsx @@ -1,15 +1,14 @@ -import { IGNORE_FETCHING } from '@app/App/sentryIgnore'; -import { useDisableRefresh } from '@app/hooks/useDisableRefresh'; -import { useListenForExternalDependencies } from '@app/hooks/useListenForExternalDependencies'; -import { useUpdateListener } from '@app/hooks/useUpdateStatus'; -import * as Sentry from '@sentry/react'; import { useEffect } from 'react'; +import { defaultOptions } from 'tauri-plugin-sentry-api'; +import * as Sentry from '@sentry/react'; +import { IGNORE_FETCHING } from '@app/App/sentryIgnore'; +import { initSystray } from '@app/utils'; + +import { useDetectMode, useDisableRefresh, useLangaugeResolver, useListenForExternalDependencies } from '@app/hooks'; import packageInfo from '../../package.json'; -import { useLangaugeResolver } from '../hooks/useLanguageResolver.ts'; import { useAppConfigStore } from '../store/useAppConfigStore.ts'; -import { setupLogger } from '../utils/shared-logger.ts'; -import { useDetectMode } from '../hooks/helpers/useDetectMode.ts'; +import setupLogger from '../utils/shared-logger.ts'; import App from './App.tsx'; import useListenForCriticalProblem from '@app/hooks/useListenForCriticalProblem.tsx'; import { useMiningStore } from '@app/store/useMiningStore.ts'; @@ -18,6 +17,7 @@ import { useMiningStore } from '@app/store/useMiningStore.ts'; const environment = import.meta.env.MODE; const sentryOptions = { + ...defaultOptions, dsn: 'https://edd6b9c1494eb7fda6ee45590b80bcee@o4504839079002112.ingest.us.sentry.io/4507979991285760', integrations: [Sentry.captureConsoleIntegration({ levels: ['warn', 'error'] }), Sentry.extraErrorDataIntegration()], release: packageInfo.version, @@ -40,13 +40,14 @@ export default function AppWrapper() { useDetectMode(); useDisableRefresh(); - useUpdateListener(); useLangaugeResolver(); useListenForExternalDependencies(); useListenForCriticalProblem(); + useEffect(() => { async function initialize() { await fetchAppConfig(); + await initSystray(); await setMiningNetwork(); } initialize(); diff --git a/src/components/AdminUI/groups/OtherUIGroup.tsx b/src/components/AdminUI/groups/OtherUIGroup.tsx index 4f09cface..873dc3037 100644 --- a/src/components/AdminUI/groups/OtherUIGroup.tsx +++ b/src/components/AdminUI/groups/OtherUIGroup.tsx @@ -2,12 +2,13 @@ import { useUIStore } from '@app/store/useUIStore'; import { useShellOfSecretsStore } from '../../../store/useShellOfSecretsStore'; import { Button, ButtonGroup, CategoryLabel } from '../styles'; +import { useAirdropStore } from '@app/store/useAirdropStore.ts'; export function OtherUIGroup() { const setAdminShow = useUIStore((s) => s.setAdminShow); // prevent messing up the actual setup progress value const adminShow = useUIStore((s) => s.adminShow); const { showWidget, setShowWidget } = useShellOfSecretsStore(); - + const setFlare = useAirdropStore((s) => s.setFlareAnimationType); return ( <> Other UI @@ -18,7 +19,19 @@ export function OtherUIGroup() { - {/* TODO: add the other sections if we want */} + + + Gem animations + {/* TODO: add the other sections if we want */} + + + + ); diff --git a/src/components/dialogs/ConfirmationDialog.tsx b/src/components/dialogs/ConfirmationDialog.tsx new file mode 100644 index 000000000..382bddad6 --- /dev/null +++ b/src/components/dialogs/ConfirmationDialog.tsx @@ -0,0 +1,62 @@ +import { useTranslation } from 'react-i18next'; +import { Dialog, DialogContent } from '@app/components/elements/dialog/Dialog.tsx'; +import { Stack } from '@app/components/elements/Stack.tsx'; +import { Typography } from '@app/components/elements/Typography.tsx'; +import { Button } from '@app/components/elements/buttons/Button.tsx'; + +import { IoClose } from 'react-icons/io5'; +import { Divider } from '@app/components/elements/Divider.tsx'; +import { TextButton } from '@app/components/elements/buttons/TextButton.tsx'; +import { IconButton } from '@app/components/elements/buttons/IconButton.tsx'; +import { useTheme } from 'styled-components'; + +interface ConfirmationDialogProps { + title?: string; + description: string; + onConfirm: () => void; + onCancel: () => void; +} + +export default function ConfirmationDialog({ + title = 'confirm-action', + description, + onConfirm, + onCancel, +}: ConfirmationDialogProps) { + const { t } = useTranslation('settings', { useSuspense: false }); + const theme = useTheme(); + + return ( + + + + + {t(title)} + + + + + + + + {t(description)} + + + + + + {t('cancel')} + + + + + + + ); +} diff --git a/src/components/dialogs/RestartDialog.tsx b/src/components/dialogs/RestartDialog.tsx index a040ad012..4ff1af047 100644 --- a/src/components/dialogs/RestartDialog.tsx +++ b/src/components/dialogs/RestartDialog.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { Dialog, DialogContent } from '@app/components/elements/dialog/Dialog.tsx'; import { Stack } from '@app/components/elements/Stack.tsx'; import { Typography } from '@app/components/elements/Typography.tsx'; diff --git a/src/components/dialogs/SendLogsDialog.tsx b/src/components/dialogs/SendLogsDialog.tsx index 275c19080..4ee9a67e1 100644 --- a/src/components/dialogs/SendLogsDialog.tsx +++ b/src/components/dialogs/SendLogsDialog.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { useUIStore } from '@app/store/useUIStore.ts'; import { Dialog, DialogContent } from '@app/components/elements/dialog/Dialog.tsx'; diff --git a/src/components/elements/List.tsx b/src/components/elements/List.tsx new file mode 100644 index 000000000..d2fbb33dd --- /dev/null +++ b/src/components/elements/List.tsx @@ -0,0 +1,31 @@ +import styled from 'styled-components'; + +const ListItem = styled.li` + color: ${({ theme }) => theme.palette.text.secondary}; + font-size: 12px; + font-weight: 400; +`; + +const ListWrapper = styled.div` + display: flex; + width: 100%; + ol, + ul { + max-width: 100%; + padding: 0; + padding-inline-start: 20px; + line-height: 1.35; + margin: 0; + } +`; + +interface ListProps { + items: string[]; + ordered?: boolean; +} + +export const List = ({ items, ordered = false }: ListProps) => { + const itemMarkup = items?.map((item, i) => {item}); + + return {ordered ?
    {itemMarkup}
:
    {itemMarkup}
}
; +}; diff --git a/src/containers/floating/AutoUpdateDialog/AutoUpdateDialog.tsx b/src/containers/floating/AutoUpdateDialog/AutoUpdateDialog.tsx index cc21c120a..fcf0c723b 100644 --- a/src/containers/floating/AutoUpdateDialog/AutoUpdateDialog.tsx +++ b/src/containers/floating/AutoUpdateDialog/AutoUpdateDialog.tsx @@ -1,37 +1,92 @@ -import { useUIStore } from '@app/store/useUIStore'; - import { useTranslation } from 'react-i18next'; -import { SquaredButton } from '@app/components/elements/buttons/SquaredButton'; +import { useUIStore } from '@app/store/useUIStore'; + import { DialogContent, Dialog } from '@app/components/elements/dialog/Dialog'; +import { SquaredButton } from '@app/components/elements/buttons/SquaredButton'; import { Typography } from '@app/components/elements/Typography'; -import { ButtonsWrapper } from './AutoUpdateDialog.styles'; -import { useHandleUpdate, useUpdateStatus } from '@app/hooks/useUpdateStatus'; + import { UpdatedStatus } from './UpdatedStatus'; +import { ButtonsWrapper } from './AutoUpdateDialog.styles'; +import { useCallback, useEffect, useState } from 'react'; +import { listen } from '@tauri-apps/api/event'; +import { invoke } from '@tauri-apps/api/core'; + +interface DownloadProgressPayload { + event_type: 'download_progress'; + downloaded: number; + total: number; +} + +interface AskForUpdatePayload { + event_type: 'ask_for_update'; + version: string; +} export default function AutoUpdateDialog() { const { t } = useTranslation('setup-view', { useSuspense: false }); - const { handleUpdate, handleClose, isLoading } = useHandleUpdate(); - const { contentLength, downloaded } = useUpdateStatus(); - const open = useUIStore((s) => s.dialogToShow === 'autoUpdate'); - const latestVersion = useUIStore((s) => s.latestVersion); + const setDialogToShow = useUIStore((s) => s.setDialogToShow); + const [version, setVersion] = useState(''); + const [downloaded, setDownloaded] = useState(0); + const [contentLength, setContentLength] = useState(0); + + const isDownloading = downloaded > 0; + const isDownloaded = isDownloading && downloaded === contentLength; + const subtitle = isDownloading ? 'installing-latest-version' : 'would-you-like-to-install'; + + useEffect(() => { + const unlistenPromise = listen( + 'updates_event', + ({ payload }: { payload: AskForUpdatePayload | DownloadProgressPayload }) => { + switch (payload.event_type) { + case 'ask_for_update': + setDialogToShow('autoUpdate'); + setVersion(payload.version); + break; + case 'download_progress': + if (!open) { + // open when auto update is triggered + setDialogToShow('autoUpdate'); + } + setDownloaded(payload.downloaded); + setContentLength(payload.total); + break; + default: + console.warn('Unknown tauri event: ', payload); + break; + } + } + ); + return () => { + unlistenPromise.then((unlisten) => unlisten()); + }; + }, [open, setDialogToShow]); + + const handleClose = useCallback(() => { + console.info('Update declined'); + setDialogToShow(null); + }, [setDialogToShow]); - const subtitle = isLoading ? 'installing-latest-version' : 'would-you-like-to-install'; + const handleUpdate = useCallback(() => { + console.info('Proceed with update'); + invoke('proceed_with_update').catch((e) => console.error('Failed to proceed with update', e)); + }, []); return ( {t('new-tari-version-available')} - {t(subtitle, { version: latestVersion })} - {isLoading && } + {t(subtitle, { version })} + {isDownloading && } + {isDownloaded && {`Update downloaded: Restarting Tari Universe`}} - {!isLoading && ( + {!isDownloading && ( <> - handleClose()} color="warning"> + {t('no')} - handleUpdate()} color="green"> + {t('yes')} diff --git a/src/containers/floating/AutoUpdateDialog/UpdatedStatus.tsx b/src/containers/floating/AutoUpdateDialog/UpdatedStatus.tsx index 356851c6f..f93d8f4b8 100644 --- a/src/containers/floating/AutoUpdateDialog/UpdatedStatus.tsx +++ b/src/containers/floating/AutoUpdateDialog/UpdatedStatus.tsx @@ -19,9 +19,9 @@ export function UpdatedStatus({ contentLength, downloaded }: UpdatedStatusProps) const shouldShowProgress = contentLength > 0; return ( - + - + {shouldShowProgress && ( {`${formatSize(downloaded)} / ${formatSize(contentLength)}`} diff --git a/src/containers/floating/CriticalErrorDialog/CriticalErrorDialog.tsx b/src/containers/floating/CriticalErrorDialog/CriticalErrorDialog.tsx index 60711eca3..b18665e8a 100644 --- a/src/containers/floating/CriticalErrorDialog/CriticalErrorDialog.tsx +++ b/src/containers/floating/CriticalErrorDialog/CriticalErrorDialog.tsx @@ -6,12 +6,12 @@ import { Typography } from '@app/components/elements/Typography'; import { IoAlertCircleOutline, IoCheckmarkOutline, IoCopyOutline } from 'react-icons/io5'; import { Trans, useTranslation } from 'react-i18next'; import { useAppStateStore } from '@app/store/appStateStore'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { useCallback, useState } from 'react'; import { CircularProgress } from '@app/components/elements/CircularProgress'; import { SendLogsDialog } from '@app/components/dialogs/SendLogsDialog.tsx'; import { useUIStore } from '@app/store/useUIStore.ts'; -import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard.ts'; +import { useCopyToClipboard } from '@app/hooks'; import { SquaredButton } from '@app/components/elements/buttons/SquaredButton.tsx'; import { IconButton } from '@app/components/elements/buttons/IconButton'; import { TextButton } from '@app/components/elements/buttons/TextButton.tsx'; diff --git a/src/containers/floating/CriticalProblemDialog/CriticalProblemDialog.tsx b/src/containers/floating/CriticalProblemDialog/CriticalProblemDialog.tsx index 631ee97e7..c6c2f2d9d 100644 --- a/src/containers/floating/CriticalProblemDialog/CriticalProblemDialog.tsx +++ b/src/containers/floating/CriticalProblemDialog/CriticalProblemDialog.tsx @@ -4,7 +4,8 @@ import { Dialog, DialogContent } from '@app/components/elements/dialog/Dialog'; import { Stack } from '@app/components/elements/Stack'; import { Typography } from '@app/components/elements/Typography'; import { useAppStateStore } from '@app/store/appStateStore'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; + import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/src/containers/floating/ExternalDependenciesDialog/ExternalDependenciesDialog.tsx b/src/containers/floating/ExternalDependenciesDialog/ExternalDependenciesDialog.tsx index ec2df6c6e..2484f368c 100644 --- a/src/containers/floating/ExternalDependenciesDialog/ExternalDependenciesDialog.tsx +++ b/src/containers/floating/ExternalDependenciesDialog/ExternalDependenciesDialog.tsx @@ -6,7 +6,7 @@ import { Typography } from '@app/components/elements/Typography'; import { useAppStateStore } from '@app/store/appStateStore'; import { useUIStore } from '@app/store/useUIStore'; import { ExternalDependencyStatus } from '@app/types/app-status'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { useCallback, useState } from 'react'; import { ExternalDependencyCard } from './ExternalDependencyCard'; import { useTranslation } from 'react-i18next'; diff --git a/src/containers/floating/ExternalDependenciesDialog/ExternalDependencyCard.tsx b/src/containers/floating/ExternalDependenciesDialog/ExternalDependencyCard.tsx index 1a92e2697..6c3c60383 100644 --- a/src/containers/floating/ExternalDependenciesDialog/ExternalDependencyCard.tsx +++ b/src/containers/floating/ExternalDependenciesDialog/ExternalDependencyCard.tsx @@ -6,7 +6,7 @@ import { ExternalDependency, ExternalDependencyStatus } from '@app/types/app-sta import { IoArrowDownCircleOutline } from 'react-icons/io5'; import { useAppStateStore } from '@app/store/appStateStore'; import { useCallback } from 'react'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { useTranslation } from 'react-i18next'; import { Button } from '@app/components/elements/buttons/Button.tsx'; diff --git a/src/containers/floating/PaperWalletModal/sections/ConnectSection/ConnectSection.tsx b/src/containers/floating/PaperWalletModal/sections/ConnectSection/ConnectSection.tsx index 0922be140..b24a6c0cc 100644 --- a/src/containers/floating/PaperWalletModal/sections/ConnectSection/ConnectSection.tsx +++ b/src/containers/floating/PaperWalletModal/sections/ConnectSection/ConnectSection.tsx @@ -12,7 +12,7 @@ import qrTooltipImage from '../../images/qr-tooltip.png'; import { useTranslation } from 'react-i18next'; import { useCallback, useState } from 'react'; import { usePaperWalletStore } from '@app/store/usePaperWalletStore'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import LoadingSvg from '@app/components/svgs/LoadingSvg'; interface Props { diff --git a/src/containers/floating/Settings/components/Card.component.tsx b/src/containers/floating/Settings/components/Card.component.tsx index 6d45a93be..fb3ffa220 100644 --- a/src/containers/floating/Settings/components/Card.component.tsx +++ b/src/containers/floating/Settings/components/Card.component.tsx @@ -3,7 +3,7 @@ import { CardItem, CardItemLabel, CardItemLabelValue, CardItemLabelWrapper, Card import { truncateMiddle } from '@app/utils/truncateString.ts'; export interface CardComponentProps { - heading: string; + heading?: string; labels: { labelText: ReactNode; labelValue: string | number }[]; } @@ -21,7 +21,7 @@ export const CardComponent = ({ heading, labels }: CardComponentProps) => { }); return ( - {heading} + {heading ? {heading} : null} {labelMarkup} ); diff --git a/src/containers/floating/Settings/components/Navigation.tsx b/src/containers/floating/Settings/components/Navigation.tsx index 8e45999fa..4c33121e3 100644 --- a/src/containers/floating/Settings/components/Navigation.tsx +++ b/src/containers/floating/Settings/components/Navigation.tsx @@ -4,7 +4,7 @@ import { Typography } from '@app/components/elements/Typography'; import { SETTINGS_TYPES, SettingsType } from '../types.ts'; import { ButtonContainer, Container, SectionButton, TermsBtn } from './Navigation.styles.ts'; -import { open } from '@tauri-apps/api/shell'; +import { open } from '@tauri-apps/plugin-shell'; interface SettingsNavigationProps { activeSection: SettingsType; onChangeActiveSection: (section: SettingsType) => void; diff --git a/src/containers/floating/Settings/sections/airdrop/ApplyInviteCode.tsx b/src/containers/floating/Settings/sections/airdrop/ApplyInviteCode.tsx index 7fb3bbeec..21eae8652 100644 --- a/src/containers/floating/Settings/sections/airdrop/ApplyInviteCode.tsx +++ b/src/containers/floating/Settings/sections/airdrop/ApplyInviteCode.tsx @@ -15,7 +15,7 @@ import { v4 as uuidv4 } from 'uuid'; import { useAirdropStore } from '@app/store/useAirdropStore'; import { useAppConfigStore } from '@app/store/useAppConfigStore'; -import { open } from '@tauri-apps/api/shell'; +import { open } from '@tauri-apps/plugin-shell'; import { CircularProgress } from '@app/components/elements/CircularProgress.tsx'; export const ApplyInviteCode = () => { diff --git a/src/containers/floating/Settings/sections/experimental/AppVersions.tsx b/src/containers/floating/Settings/sections/experimental/AppVersions.tsx index 231602c07..22b1cd196 100644 --- a/src/containers/floating/Settings/sections/experimental/AppVersions.tsx +++ b/src/containers/floating/Settings/sections/experimental/AppVersions.tsx @@ -1,9 +1,10 @@ import { useTranslation } from 'react-i18next'; + import { Typography } from '@app/components/elements/Typography.tsx'; import { CardComponent } from '@app/containers/floating/Settings/components/Card.component'; import { CardContainer } from '@app/containers/floating/Settings/components/Settings.styles'; import { SettingsGroupWrapper } from '@app/containers/floating/Settings/components/SettingsGroup.styles'; -import { Environment, useEnvironment } from '@app/hooks/useEnvironment.ts'; +import { Environment, useEnvironment } from '@app/hooks'; import { Stack } from '@app/components/elements/Stack.tsx'; import { useAppStateStore } from '@app/store/appStateStore'; diff --git a/src/containers/floating/Settings/sections/experimental/P2poolMarkup.tsx b/src/containers/floating/Settings/sections/experimental/P2poolMarkup.tsx index 627af6e0c..3d162d3e7 100644 --- a/src/containers/floating/Settings/sections/experimental/P2poolMarkup.tsx +++ b/src/containers/floating/Settings/sections/experimental/P2poolMarkup.tsx @@ -16,7 +16,7 @@ import { SettingsGroupTitle, SettingsGroupAction, } from '../../components/SettingsGroup.styles'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; export const ErrorTypography = styled(Typography)(({ theme }) => ({ color: theme.palette.error.main, diff --git a/src/containers/floating/Settings/sections/experimental/TorMarkup/TorDebug.tsx b/src/containers/floating/Settings/sections/experimental/TorMarkup/TorDebug.tsx index 7aa1d39ad..1be376722 100644 --- a/src/containers/floating/Settings/sections/experimental/TorMarkup/TorDebug.tsx +++ b/src/containers/floating/Settings/sections/experimental/TorMarkup/TorDebug.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { Typography } from '@app/components/elements/Typography'; import { useAppStateStore } from '@app/store/appStateStore'; diff --git a/src/containers/floating/Settings/sections/experimental/TorMarkup/TorMarkup.tsx b/src/containers/floating/Settings/sections/experimental/TorMarkup/TorMarkup.tsx index c0fc04644..cd7bcf545 100644 --- a/src/containers/floating/Settings/sections/experimental/TorMarkup/TorMarkup.tsx +++ b/src/containers/floating/Settings/sections/experimental/TorMarkup/TorMarkup.tsx @@ -1,10 +1,11 @@ +import { invoke } from '@tauri-apps/api/core'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Trans, useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api/tauri'; import { useUIStore } from '@app/store/useUIStore.ts'; import { useAppConfigStore } from '@app/store/useAppConfigStore.ts'; import { ToggleSwitch } from '@app/components/elements/ToggleSwitch.tsx'; + import { Typography } from '@app/components/elements/Typography'; import { TorConfig } from '@app/types/app-status'; import { Input } from '@app/components/elements/inputs/Input'; @@ -22,7 +23,7 @@ import { import { TorDebug } from './TorDebug'; import { ErrorTypography, StyledInput, TorSettingsContainer } from './TorMarkup.styles'; -import { type } from '@tauri-apps/api/os'; +import { type } from '@tauri-apps/plugin-os'; interface EditedTorConfig { // it's also string here to prevent an empty value @@ -54,9 +55,9 @@ export const TorMarkup = () => { const hasCheckedOs = useRef(false); const checkPlatform = useCallback(async () => { - const osType = await type(); + const osType = type(); if (osType) { - setIsMac(osType === 'Darwin'); + setIsMac(osType === 'macos'); hasCheckedOs.current = true; } diff --git a/src/containers/floating/Settings/sections/general/GeneralSettings.tsx b/src/containers/floating/Settings/sections/general/GeneralSettings.tsx index aa123ec43..03b853d77 100644 --- a/src/containers/floating/Settings/sections/general/GeneralSettings.tsx +++ b/src/containers/floating/Settings/sections/general/GeneralSettings.tsx @@ -7,12 +7,14 @@ import LanguageSettings from './LanguageSettings.tsx'; import { ResetSettingsButton } from './ResetSettingsButton.tsx'; import StartApplicationOnBootSettings from './StartApplicationOnBootSettings.tsx'; import AutoUpdate from './AutoUpdate.tsx'; +import PreReleaseSettings from './PreReleaseSettings.tsx'; export const GeneralSettings = () => { return ( <> + diff --git a/src/containers/floating/Settings/sections/general/LogsSettings.tsx b/src/containers/floating/Settings/sections/general/LogsSettings.tsx index db67e32a6..53556c56b 100644 --- a/src/containers/floating/Settings/sections/general/LogsSettings.tsx +++ b/src/containers/floating/Settings/sections/general/LogsSettings.tsx @@ -1,6 +1,18 @@ -import { Typography } from '@app/components/elements/Typography.tsx'; +import { IoCheckmarkOutline, IoCopyOutline } from 'react-icons/io5'; + import { Trans, useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; + +import { useUIStore } from '@app/store/useUIStore.ts'; + +import { Button } from '@app/components/elements/buttons/Button.tsx'; +import { SendLogsDialog } from '@app/components/dialogs/SendLogsDialog.tsx'; +import { Typography } from '@app/components/elements/Typography.tsx'; +import { Stack } from '@app/components/elements/Stack.tsx'; +import { IconButton } from '@app/components/elements/buttons/IconButton.tsx'; +import { useCopyToClipboard } from '@app/hooks'; +import { useAppStateStore } from '@app/store/appStateStore.ts'; + import { SettingsGroup, SettingsGroupAction, @@ -8,16 +20,6 @@ import { SettingsGroupTitle, SettingsGroupWrapper, } from '../../components/SettingsGroup.styles.ts'; -import { Button } from '@app/components/elements/buttons/Button.tsx'; -import { SendLogsDialog } from '@app/components/dialogs/SendLogsDialog.tsx'; -import { useUIStore } from '@app/store/useUIStore.ts'; - -import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard.ts'; -import { Stack } from '@app/components/elements/Stack.tsx'; - -import { IoCheckmarkOutline, IoCopyOutline } from 'react-icons/io5'; -import { IconButton } from '@app/components/elements/buttons/IconButton.tsx'; -import { useAppStateStore } from '@app/store/appStateStore.ts'; export default function LogsSettings() { const { t } = useTranslation(['common', 'settings'], { useSuspense: false }); diff --git a/src/containers/floating/Settings/sections/general/PreReleaseSettings.tsx b/src/containers/floating/Settings/sections/general/PreReleaseSettings.tsx new file mode 100644 index 000000000..05bf85324 --- /dev/null +++ b/src/containers/floating/Settings/sections/general/PreReleaseSettings.tsx @@ -0,0 +1,57 @@ +import { useTranslation } from 'react-i18next'; +import { ToggleSwitch } from '@app/components/elements/ToggleSwitch'; +import { useAppConfigStore } from '@app/store/useAppConfigStore'; +import { useCallback, useState } from 'react'; +import { Typography } from '@app/components/elements/Typography.tsx'; +import { + SettingsGroupWrapper, + SettingsGroup, + SettingsGroupContent, + SettingsGroupTitle, + SettingsGroupAction, +} from '../../components/SettingsGroup.styles'; +import ConfirmationDialog from '@app/components/dialogs/ConfirmationDialog'; + +export default function PreReleaseSettings() { + const isPreRelease = useAppConfigStore((s) => s.pre_release); + const setPreRelease = useAppConfigStore((s) => s.setPreRelease); + const { t } = useTranslation('settings', { useSuspense: false }); + const [isDialogOpen, setDialogOpen] = useState(false); + + const closeDialog = useCallback(() => { + setDialogOpen(false); + }, [setDialogOpen]); + + const askForConfirmation = useCallback(() => { + setDialogOpen(true); + }, [setDialogOpen]); + + const applyChange = useCallback(() => { + closeDialog(); + setPreRelease(!isPreRelease); + }, [closeDialog, isPreRelease, setPreRelease]); + + return ( + + + + + {t('pre-release.title')} + + {t('pre-release.description')} + + + + + + + {isDialogOpen && ( + + )} + + ); +} diff --git a/src/containers/floating/Settings/sections/general/ResetSettingsButton.tsx b/src/containers/floating/Settings/sections/general/ResetSettingsButton.tsx index 540bf0ef0..010eca8bc 100644 --- a/src/containers/floating/Settings/sections/general/ResetSettingsButton.tsx +++ b/src/containers/floating/Settings/sections/general/ResetSettingsButton.tsx @@ -1,7 +1,8 @@ import { useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { useAppStateStore } from '@app/store/appStateStore'; + import { Typography } from '@app/components/elements/Typography.tsx'; import { CircularProgress } from '@app/components/elements/CircularProgress.tsx'; import { Stack } from '@app/components/elements/Stack.tsx'; diff --git a/src/containers/floating/Settings/sections/p2p/P2PConnectionData.tsx b/src/containers/floating/Settings/sections/p2p/P2PConnectionData.tsx index 7667b6860..f9a58c765 100644 --- a/src/containers/floating/Settings/sections/p2p/P2PConnectionData.tsx +++ b/src/containers/floating/Settings/sections/p2p/P2PConnectionData.tsx @@ -6,6 +6,7 @@ import { IconButton } from '@app/components/elements/buttons/IconButton.tsx'; import { IoCheckmarkOutline, IoCopyOutline } from 'react-icons/io5'; import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard.ts'; import { + CardContainer, CardItem, CardItemLabel, CardItemLabelValue, @@ -16,12 +17,26 @@ import { StatWrapper } from '@app/containers/floating/Settings/sections/p2p/P2Po import { useEffect, useState } from 'react'; +import { CardComponent } from '@app/containers/floating/Settings/components/Card.component.tsx'; + export default function P2PConnectionData() { const { t } = useTranslation('p2p'); const [copiedId, setCopiedId] = useState(); const { copyToClipboard } = useCopyToClipboard(); const connectionInfo = useP2poolStatsStore((s) => s?.connection_info); + const { established_incoming, established_outgoing, pending_incoming, pending_outgoing } = + connectionInfo?.network_info?.connection_counters || {}; + + const pendingLabels = [ + { labelText: 'incoming', labelValue: pending_incoming || '-' }, + { labelText: 'outgoing', labelValue: pending_outgoing || '-' }, + ]; + + const establishedLabels = [ + { labelText: 'incoming', labelValue: established_incoming || '-' }, + { labelText: 'outgoing', labelValue: established_outgoing || '-' }, + ]; useEffect(() => { if (copiedId) { @@ -57,9 +72,19 @@ export default function P2PConnectionData() { }); return ( - - {t('listener-addresses')} - {listenerMarkup} - + <> + + + {t('listener-addresses')} + {!connectionInfo?.listener_addresses?.length && ` -`} + + {listenerMarkup} + + + + + + + ); } diff --git a/src/containers/floating/Settings/sections/p2p/P2PoolStats.styles.ts b/src/containers/floating/Settings/sections/p2p/P2PoolStats.styles.ts index bc728f88c..a6ad3ad77 100644 --- a/src/containers/floating/Settings/sections/p2p/P2PoolStats.styles.ts +++ b/src/containers/floating/Settings/sections/p2p/P2PoolStats.styles.ts @@ -2,9 +2,11 @@ import styled, { css } from 'styled-components'; import { CSSProperties } from 'react'; export const TableOverflowWrapper = styled.div` + overflow: hidden; overflow-y: auto; height: 100%; padding: 0 8px 0 0; + &::-webkit-scrollbar { width: 3px; display: unset; @@ -20,29 +22,34 @@ export const TableOverflowWrapper = styled.div` `; export const Table = styled.div` - display: grid; + display: flex; + flex-direction: column; width: 100%; - height: auto; - max-height: 20vh; - overflow: hidden; + max-height: max(40vh, 320px); `; -export const TableRow = styled.div<{ $isHeadingRow?: boolean; $altBg?: boolean }>` +export const TableRow = styled.div<{ $isHeadingRow?: boolean; $altBg?: boolean; $isTopRow?: boolean }>` display: grid; width: 100%; gap: 2px; grid-template-columns: 0.8fr 6fr repeat(3, 5fr); justify-content: center; background-color: ${({ $altBg }) => ($altBg ? 'rgba(0, 0, 0, 0.02)' : 'none')}; + height: min-content; ${({ $isHeadingRow }) => $isHeadingRow && css` white-space: pre; padding: 6px 0; `} + ${({ $isTopRow }) => + $isTopRow && + css` + padding: 0 11px 0 0; + `} `; -export const Cell = styled.div<{ $alignment?: CSSProperties['alignItems'] }>` +export const Cell = styled.div<{ $alignment?: CSSProperties['alignItems']; $diff?: number }>` display: flex; font-variant-numeric: tabular-nums; padding: 4px 2px; @@ -50,11 +57,31 @@ export const Cell = styled.div<{ $alignment?: CSSProperties['alignItems'] }>` align-items: center; text-align: right; justify-content: ${({ $alignment = 'end' }) => $alignment}; + gap: 4px; + position: relative; p { font-size: 11px; color: ${({ theme }) => theme.palette.text.secondary}; } + + img { + height: 10px; + } + + ${({ $diff, theme }) => + $diff !== undefined && + css` + &::after { + content: '${$diff === 0 ? '✓' : $diff < 0 ? '↑' : '↓'}'; + position: absolute; + font-size: 7px; + right: -7px; + top: 50%; + transform: translateY(-50%); + color: ${$diff === 0 ? theme.colors.green[600] : $diff < 0 ? theme.colors.red[600] : 'inherit'}; + } + `} `; export const StatWrapper = styled.div` diff --git a/src/containers/floating/Settings/sections/p2p/P2PoolStats.tsx b/src/containers/floating/Settings/sections/p2p/P2PoolStats.tsx index 3d1a87f22..1b2466f40 100644 --- a/src/containers/floating/Settings/sections/p2p/P2PoolStats.tsx +++ b/src/containers/floating/Settings/sections/p2p/P2PoolStats.tsx @@ -1,10 +1,7 @@ import { useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { CardComponent } from '@app/containers/floating/Settings/components/Card.component'; -import { CardContainer } from '@app/containers/floating/Settings/components/Settings.styles'; import { - SettingsGroupContent, SettingsGroupWrapper, SettingsGroupTitle, } from '@app/containers/floating/Settings/components/SettingsGroup.styles'; @@ -15,16 +12,16 @@ import PeerTable from './PeerTable.tsx'; import { Divider } from '@app/components/elements/Divider.tsx'; import { ConnectedPeerInfo } from '@app/types/app-status.ts'; import P2PConnectionData from './P2PConnectionData.tsx'; +import { timeAgo } from '@app/utils/getTimeAgo.ts'; export type ConnectedPeerInfoExtended = ConnectedPeerInfo & { - sha3WithinRange?: boolean; - randomxWithinRange?: boolean; + sha3Diff?: number; + randomxDiff?: number; }; const P2PoolStats = () => { const { t } = useTranslation('p2p', { useSuspense: false }); const connectedSince = useP2poolStatsStore((s) => s?.connected_since); - const connectionInfo = useP2poolStatsStore((s) => s?.connection_info); const sha3Stats = useP2poolStatsStore((s) => s?.sha3x_stats); const randomXStats = useP2poolStatsStore((s) => s?.randomx_stats); const peers = useP2poolStatsStore((s) => s?.peers); @@ -33,8 +30,8 @@ const P2PoolStats = () => { useEffect(() => { const fetchP2pStatsInterval = setInterval(async () => { - await fetchP2pStats(); - await fetchP2poolConnections(); + await fetchP2pStats?.(); + await fetchP2poolConnections?.(); }, 5000); return () => { @@ -47,11 +44,13 @@ const P2PoolStats = () => { const randomXHeight = randomXStats?.height; return peers?.map((peer) => { const { current_sha3x_height, current_random_x_height } = peer.peer_info || {}; - const sha3WithinRange = sha3Height ? Math.abs(sha3Height - current_sha3x_height) <= 5 : undefined; - const randomxWithinRange = randomXHeight - ? Math.abs(randomXHeight - current_random_x_height) <= 5 - : undefined; - return { ...peer, sha3WithinRange, randomxWithinRange }; + const sha3Diff = sha3Height ? sha3Height - current_sha3x_height : undefined; + const randomxDiff = randomXHeight ? randomXHeight - current_random_x_height : undefined; + + const sha3DiffInRange = sha3Diff && Math.abs(sha3Diff) <= 3 ? 0 : sha3Diff; + const randomxDiffInRange = randomxDiff && Math.abs(randomxDiff) <= 3 ? 0 : randomxDiff; + + return { ...peer, sha3Diff: sha3DiffInRange, randomxDiff: randomxDiffInRange }; }) as ConnectedPeerInfoExtended[]; }, [peers, randomXStats?.height, sha3Stats?.height]); @@ -59,58 +58,20 @@ const P2PoolStats = () => { {t('p2pool-stats')} - {connectedSince ? {`Connected since: ${connectedSince}`} : null} + {connectedSince ? ( + {`Connected since: ${timeAgo(+connectedSince)}`} + ) : null} - - - - - ({ - labelText: key.replace('_', ' '), - labelValue: value, - }))} - /> - ({ - labelText: key.replace('_', ' '), - labelValue: value, - }))} - /> - - {displayPeers?.length ? ( - + <> {`Connected Peers: ${displayPeers?.length}`} {displayPeers ? : null} - + ) : null} ); diff --git a/src/containers/floating/Settings/sections/p2p/P2pMarkup.tsx b/src/containers/floating/Settings/sections/p2p/P2pMarkup.tsx index 1b5e7b048..67275db3c 100644 --- a/src/containers/floating/Settings/sections/p2p/P2pMarkup.tsx +++ b/src/containers/floating/Settings/sections/p2p/P2pMarkup.tsx @@ -15,7 +15,11 @@ import { SettingsGroupWrapper, } from '../../components/SettingsGroup.styles.ts'; -const P2pMarkup = () => { +interface P2pMarkupProps { + setDisabledStats: (value: boolean) => void; +} + +const P2pMarkup = ({ setDisabledStats }: P2pMarkupProps) => { const { t } = useTranslation(['common', 'settings'], { useSuspense: false }); const isP2poolEnabled = useAppConfigStore((state) => state.p2pool_enabled); const setP2poolEnabled = useAppConfigStore((state) => state.setP2poolEnabled); @@ -25,10 +29,11 @@ const P2pMarkup = () => { const handleP2poolEnabled = useCallback( async (event: React.ChangeEvent) => { + setDisabledStats(true); await setP2poolEnabled(event.target.checked); setDialogToShow('restart'); }, - [setDialogToShow, setP2poolEnabled] + [setDialogToShow, setDisabledStats, setP2poolEnabled] ); return ( diff --git a/src/containers/floating/Settings/sections/p2p/PeerTable.tsx b/src/containers/floating/Settings/sections/p2p/PeerTable.tsx index 12c75cf95..750e7367b 100644 --- a/src/containers/floating/Settings/sections/p2p/PeerTable.tsx +++ b/src/containers/floating/Settings/sections/p2p/PeerTable.tsx @@ -3,10 +3,17 @@ import { Typography } from '@app/components/elements/Typography.tsx'; import { timeAgo } from '@app/utils/getTimeAgo.ts'; import { truncateMiddle } from '@app/utils/truncateString.ts'; import { ConnectedPeerInfoExtended } from '@app/containers/floating/Settings/sections/p2p/P2PoolStats.tsx'; +import { useP2poolStatsStore } from '@app/store/useP2poolStatsStore.ts'; const headings = ['#', 'Peer ID', 'RandomX Height', 'SHA3X Height', 'Last Ping']; export default function PeerTable({ peers }: { peers: ConnectedPeerInfoExtended[] }) { + const sha3Stats = useP2poolStatsStore((s) => s?.sha3x_stats); + const randomXStats = useP2poolStatsStore((s) => s?.randomx_stats); + + const sha3Height = sha3Stats?.height; + const randomXHeight = randomXStats?.height; + const headingMarkup = headings.map((heading, idx) => { const alignment = idx === 1 ? 'start' : 'end'; return ( @@ -15,28 +22,41 @@ export default function PeerTable({ peers }: { peers: ConnectedPeerInfoExtended[ ); }); - const peerMarkup = peers.map(({ peer_id, peer_info, last_ping, sha3WithinRange, randomxWithinRange }, idx) => { - const count = idx + 1; + const peerMarkup = peers.map(({ peer_id, peer_info, last_ping, randomxDiff, sha3Diff }, idx) => { + const count = idx + 2; const displayId = truncateMiddle(peer_id, 9); const { current_sha3x_height: sha3x_height, current_random_x_height: random_x_height } = peer_info || {}; return ( - + {`${count}.`} {displayId} - {random_x_height ? `${random_x_height} | ${randomxWithinRange ? '✓' : '☹'}` : '-'} - {sha3x_height ? `${sha3x_height} | ${sha3WithinRange ? '✓' : '☹'}` : '-'} + {random_x_height || '-'} + {sha3x_height || '-'} {last_ping ? timeAgo(+last_ping) : '-'} ); }); + + const meMarkup = ( + + + {`1.`} + + {`Me`} + {randomXHeight} + {sha3Height} + + + ); return ( {headingMarkup} + {meMarkup} {peerMarkup}
); diff --git a/src/containers/floating/Settings/sections/p2p/PoolMiningSettings.tsx b/src/containers/floating/Settings/sections/p2p/PoolMiningSettings.tsx index 74c5012fa..c54dff252 100644 --- a/src/containers/floating/Settings/sections/p2p/PoolMiningSettings.tsx +++ b/src/containers/floating/Settings/sections/p2p/PoolMiningSettings.tsx @@ -1,14 +1,15 @@ +import { useState } from 'react'; import P2pMarkup from './P2pMarkup.tsx'; import P2PoolStats from './P2PoolStats.tsx'; import { useAppConfigStore } from '@app/store/useAppConfigStore'; export const PoolMiningSettings = () => { + const [disabledStats, setDisabledStats] = useState(false); const isP2poolEnabled = useAppConfigStore((s) => s.p2pool_enabled); - return ( <> - - {isP2poolEnabled && } + + {isP2poolEnabled && !disabledStats && } ); }; diff --git a/src/containers/floating/Settings/sections/releaseNotes/ReleaseNotes.tsx b/src/containers/floating/Settings/sections/releaseNotes/ReleaseNotes.tsx index af5107f10..387bc79b8 100644 --- a/src/containers/floating/Settings/sections/releaseNotes/ReleaseNotes.tsx +++ b/src/containers/floating/Settings/sections/releaseNotes/ReleaseNotes.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import ReactMarkdown from 'react-markdown'; import { IconImage, @@ -15,8 +15,7 @@ import { AccordionItem } from './AccordionItem/AccordionItem'; import tariIcon from './tari-icon.png'; import packageInfo from '../../../../../../package.json'; import { useTranslation } from 'react-i18next'; -import { useUIStore } from '@app/store/useUIStore'; -import { checkUpdate } from '@tauri-apps/api/updater'; +import { invoke } from '@tauri-apps/api/core'; const appVersion = packageInfo.version; const versionString = `v${appVersion}`; @@ -46,7 +45,6 @@ interface ReleaseSection { } export const ReleaseNotes = () => { - const { setDialogToShow } = useUIStore(); const [sections, setSections] = useState([]); const [isLoading, setIsLoading] = useState(true); const [openSectionIndex, setOpenSectionIndex] = useState(0); @@ -77,8 +75,10 @@ export const ReleaseNotes = () => { useEffect(() => { const checkForUpdates = async () => { - const { shouldUpdate } = await checkUpdate(); - setNeedsUpgrade(shouldUpdate); + const version = await invoke('check_for_updates').catch((err) => { + console.error('Error checking for updates:', err); + }); + setNeedsUpgrade(!!version); }; checkForUpdates(); @@ -88,6 +88,12 @@ export const ReleaseNotes = () => { setOpenSectionIndex(openSectionIndex === index ? null : index); }; + const handleUpdate = useCallback(async () => { + invoke('proceed_with_update', { force: true }).catch((err) => { + console.error('Error updating:', err); + }); + }, []); + return ( @@ -100,7 +106,7 @@ export const ReleaseNotes = () => { {needsUpgrade && !isLoading && ( - setDialogToShow('autoUpdate')}> + {t('settings:release-notes.upgrade-available')} )} diff --git a/src/containers/floating/Settings/sections/wallet/MoneroAddressMarkup/MoneroAddressEditor.tsx b/src/containers/floating/Settings/sections/wallet/MoneroAddressMarkup/MoneroAddressEditor.tsx index 96c45835a..6228f83b2 100644 --- a/src/containers/floating/Settings/sections/wallet/MoneroAddressMarkup/MoneroAddressEditor.tsx +++ b/src/containers/floating/Settings/sections/wallet/MoneroAddressMarkup/MoneroAddressEditor.tsx @@ -4,7 +4,7 @@ import { IoCopyOutline, IoCheckmarkOutline, IoCloseOutline } from 'react-icons/i import { Stack } from '@app/components/elements/Stack.tsx'; import { Input } from '@app/components/elements/inputs/Input'; import styled from 'styled-components'; -import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard.ts'; +import { useCopyToClipboard } from '@app/hooks'; import { IconButton } from '@app/components/elements/buttons/IconButton.tsx'; const moneroAddressRegex = /^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$/; diff --git a/src/containers/floating/Settings/sections/wallet/MoneroSeedWords/MoneroSeedWordSettings.tsx b/src/containers/floating/Settings/sections/wallet/MoneroSeedWords/MoneroSeedWordSettings.tsx index 76ffb1ed8..7844d3d75 100644 --- a/src/containers/floating/Settings/sections/wallet/MoneroSeedWords/MoneroSeedWordSettings.tsx +++ b/src/containers/floating/Settings/sections/wallet/MoneroSeedWords/MoneroSeedWordSettings.tsx @@ -5,7 +5,7 @@ import { } from '@app/containers/floating/Settings/components/SettingsGroup.styles'; import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard'; import { useCallback, useRef, useState } from 'react'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { CircularProgress } from '@app/components/elements/CircularProgress.tsx'; import { IoCheckmarkOutline, IoCopyOutline, IoEyeOffOutline, IoEyeOutline } from 'react-icons/io5'; import { Stack } from '@app/components/elements/Stack.tsx'; diff --git a/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/SeedWordsEdit.tsx b/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/SeedWordsEdit.tsx index 6dba8ff8c..5428db9bd 100644 --- a/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/SeedWordsEdit.tsx +++ b/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/SeedWordsEdit.tsx @@ -53,8 +53,15 @@ export const GreyTypography = styled(Typography)(({ theme }) => ({ const seedWordsRegex = /^(([a-zA-Z]+)\s){23}([a-zA-Z]+)$/; +const dialogStyles = { + width: '380px', + padding: '16px 30px', + gap: 16, +}; + export const SeedWordsEdit = ({ seedWords, seedWordsFetching, toggleEdit }: SeedWordsEditProps) => { const [showConfirm, setShowConfirm] = useState(false); + const [newSeedWords, setNewSeedWords] = useState(); const importSeedWords = useWalletStore((s) => s.importSeedWords); const isWalletImporting = useWalletStore((s) => s.is_wallet_importing); @@ -95,7 +102,7 @@ export const SeedWordsEdit = ({ seedWords, seedWordsFetching, toggleEdit }: Seed [hasChanges] ); - const handleConfrimed = useCallback(async () => { + const handleConfirmed = useCallback(async () => { if (hasChanges && newSeedWords) { setShowConfirm(false); await importSeedWords(newSeedWords); @@ -158,23 +165,29 @@ export const SeedWordsEdit = ({ seedWords, seedWordsFetching, toggleEdit }: Seed {errors.seedWords && errors.seedWords.message} - - - {t('importing-wallet')} - + + + {t('importing-wallet')} + + + {t('importing-wallet-copy')} + +
+ +
- - + + {t('confirm-import-wallet')} {t('confirm-import-wallet-copy')} setShowConfirm(false)}>{t('cancel')} - + {t('yes')} diff --git a/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/useGetSeedWords.ts b/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/useGetSeedWords.ts index 3e5302862..760e046ff 100644 --- a/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/useGetSeedWords.ts +++ b/src/containers/floating/Settings/sections/wallet/SeedWordsMarkup/useGetSeedWords.ts @@ -1,5 +1,5 @@ import { useCallback, useState } from 'react'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; export function useGetSeedWords() { const [seedWords, setSeedWords] = useState([]); diff --git a/src/containers/floating/Settings/sections/wallet/WalletAddressMarkup.tsx b/src/containers/floating/Settings/sections/wallet/WalletAddressMarkup.tsx index 5e429653c..b1203da0b 100644 --- a/src/containers/floating/Settings/sections/wallet/WalletAddressMarkup.tsx +++ b/src/containers/floating/Settings/sections/wallet/WalletAddressMarkup.tsx @@ -12,7 +12,7 @@ import { styled } from 'styled-components'; import { BsArrowsExpandVertical, BsArrowsCollapseVertical } from 'react-icons/bs'; import { useWalletStore } from '@app/store/useWalletStore'; -import { useCopyToClipboard } from '@app/hooks/helpers/useCopyToClipboard.ts'; +import { useCopyToClipboard } from '@app/hooks'; import { useTranslation } from 'react-i18next'; const Dot = styled.div` diff --git a/src/containers/floating/StagedSecurity/StagedSecurity.tsx b/src/containers/floating/StagedSecurity/StagedSecurity.tsx index 974b1d4be..4f357b800 100644 --- a/src/containers/floating/StagedSecurity/StagedSecurity.tsx +++ b/src/containers/floating/StagedSecurity/StagedSecurity.tsx @@ -46,6 +46,10 @@ export default function StagedSecurity() { setShowReminderTip(true); }; + const handleSection = useCallback((section: StagedSecuritySectionType) => { + setSection(section); + }, []); + useEffect(() => { if (section == 'SeedPhrase' || section == 'VerifySeedPhrase') { setBoxWidth(710); @@ -54,6 +58,9 @@ export default function StagedSecurity() { } }, [section]); + const seedPhraseSection = + section == 'SeedPhrase' ? : null; + return ( <> @@ -61,12 +68,12 @@ export default function StagedSecurity() { - {section == 'ProtectIntro' && ( + {section == 'ProtectIntro' ? ( - )} - {section == 'SeedPhrase' && } + ) : null} + {seedPhraseSection} {section == 'VerifySeedPhrase' && ( - + )} )} diff --git a/src/containers/floating/StagedSecurity/sections/SeedPhrase/SeedPhrase.tsx b/src/containers/floating/StagedSecurity/sections/SeedPhrase/SeedPhrase.tsx index e16c32602..0a5cb22b4 100644 --- a/src/containers/floating/StagedSecurity/sections/SeedPhrase/SeedPhrase.tsx +++ b/src/containers/floating/StagedSecurity/sections/SeedPhrase/SeedPhrase.tsx @@ -8,7 +8,8 @@ import { CheckboxText, CheckboxWrapper, CopyButton, - Divider, + GroupCol, + GroupDivider, PhraseWrapper, TextWrapper, Word, @@ -20,22 +21,20 @@ import CopyIcon from '../../icons/CopyIcon'; import CheckIcon from '../../icons/CheckIcon'; import { AnimatePresence } from 'framer-motion'; import { useTranslation } from 'react-i18next'; +import { useCopyToClipboard } from '@app/hooks'; + interface Props { setSection: (section: StagedSecuritySectionType) => void; words: string[]; } -export default function SeedPhrase({ setSection, words }: Props) { - const { t } = useTranslation(['staged-security'], { useSuspense: false }); - - const [copied, setCopied] = useState(false); +const SeedPhrase = ({ setSection, words }: Props) => { + const { t } = useTranslation('staged-security'); + const { isCopied, copyToClipboard } = useCopyToClipboard(); const [checked, setChecked] = useState(false); - const copyToClipboard = () => { - navigator.clipboard.writeText(words.join(' ')).then(() => { - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }); + const handleCopy = () => { + copyToClipboard(words.join(' ')); }; const handleCheckboxClick = () => { @@ -58,7 +57,7 @@ export default function SeedPhrase({ setSection, words }: Props) { {wordGroups.map((group, groupIndex) => ( - <> + {group.map((word, index) => ( @@ -67,13 +66,13 @@ export default function SeedPhrase({ setSection, words }: Props) { ))} - {groupIndex < 3 && } - + {groupIndex < 3 && } + ))} - - {copied ? ( + + {isCopied ? ( t('seedPhrase.copied') ) : ( <> @@ -107,4 +106,6 @@ export default function SeedPhrase({ setSection, words }: Props) {
); -} +}; + +export default SeedPhrase; diff --git a/src/containers/floating/StagedSecurity/sections/SeedPhrase/styles.ts b/src/containers/floating/StagedSecurity/sections/SeedPhrase/styles.ts index f6defb479..50e03e230 100644 --- a/src/containers/floating/StagedSecurity/sections/SeedPhrase/styles.ts +++ b/src/containers/floating/StagedSecurity/sections/SeedPhrase/styles.ts @@ -27,6 +27,13 @@ export const PhraseWrapper = styled('div')` width: 100%; `; +export const GroupCol = styled('div')` + display: flex; + justify-content: space-between; + padding-right: 20px; + gap: 20px; + width: 100%; +`; export const WordList = styled('div')` display: flex; gap: 5px; @@ -57,7 +64,7 @@ export const Word = styled('div')` } `; -export const Divider = styled('div')` +export const GroupDivider = styled('div')` background: rgba(0, 0, 0, 0.15); width: 1px; height: 241px; diff --git a/src/containers/main/Airdrop/AirdropGiftTracker/AirdropGiftTracker.tsx b/src/containers/main/Airdrop/AirdropGiftTracker/AirdropGiftTracker.tsx index 36eb9c001..7502f6b3a 100644 --- a/src/containers/main/Airdrop/AirdropGiftTracker/AirdropGiftTracker.tsx +++ b/src/containers/main/Airdrop/AirdropGiftTracker/AirdropGiftTracker.tsx @@ -1,12 +1,14 @@ +import { useTranslation } from 'react-i18next'; + import { useAirdropStore } from '@app/store/useAirdropStore'; -import { Title, TitleWrapper, Wrapper } from './styles'; -import LoggedOut from './sections/LoggedOut/LoggedOut'; -import LoggedIn from './sections/LoggedIn/LoggedIn'; import { useAirdropSyncState } from '@app/hooks/airdrop/useAirdropSyncState'; -import { useTranslation } from 'react-i18next'; -import InfoTooltip from './components/InfoTooltip/InfoTooltip'; import { useWebsocket } from '@app/hooks/airdrop/useWebsocket.ts'; +import InfoTooltip from './components/InfoTooltip/InfoTooltip'; +import LoggedOut from './sections/LoggedOut/LoggedOut'; +import LoggedIn from './sections/LoggedIn/LoggedIn'; +import { Title, TitleWrapper, Wrapper } from './styles'; + export default function AirdropGiftTracker() { useAirdropSyncState(); useWebsocket(); diff --git a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/LoggedIn.tsx b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/LoggedIn.tsx index 7d317e4e1..696aef231 100644 --- a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/LoggedIn.tsx +++ b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/LoggedIn.tsx @@ -9,27 +9,26 @@ import { AnimatePresence } from 'framer-motion'; export default function LoggedIn() { const [gems, setGems] = useState(0); - - const { - userDetails, - userPoints, - flareAnimationType, - bonusTiers, - setFlareAnimationType, - referralQuestPoints, - miningRewardPoints, - } = useAirdropStore(); + const { userRankGems, userPointsGems, flareAnimationType, bonusTiers, referralGems, miningRewardPoints } = + useAirdropStore((s) => ({ + userRankGems: s.userDetails?.user?.rank?.gems, + userPointsGems: s.userPoints?.base?.gems, + flareAnimationType: s.flareAnimationType, + bonusTiers: s.bonusTiers, + referralGems: s.referralQuestPoints?.pointsForClaimingReferral || REFERRAL_GEMS, + miningRewardPoints: s.miningRewardPoints, + })); useEffect(() => { - setGems(userPoints?.base?.gems || userDetails?.user?.rank?.gems || 0); - }, [userPoints?.base?.gems, userDetails?.user?.rank?.gems]); + setGems(userPointsGems || userRankGems || 0); + }, [userPointsGems, userRankGems]); const bonusTier = useMemo( () => bonusTiers ?.sort((a, b) => a.target - b.target) - .find((t) => t.target == (userPoints?.base?.gems || userDetails?.user?.rank?.gems || 0)), - [bonusTiers, userDetails?.user?.rank?.gems, userPoints?.base?.gems] + .find((t) => t.target == (userPointsGems || userRankGems || 0)), + [bonusTiers, userRankGems, userPointsGems] ); const flareGems = useMemo(() => { @@ -37,18 +36,13 @@ export default function LoggedIn() { case 'GoalComplete': return bonusTier?.bonusGems || 0; case 'FriendAccepted': - return referralQuestPoints?.pointsForClaimingReferral || REFERRAL_GEMS; + return referralGems; case 'BonusGems': return miningRewardPoints?.reward || 0; default: return 0; } - }, [ - flareAnimationType, - bonusTier?.bonusGems, - referralQuestPoints?.pointsForClaimingReferral, - miningRewardPoints?.reward, - ]); + }, [flareAnimationType, bonusTier?.bonusGems, referralGems, miningRewardPoints?.reward]); return ( @@ -60,14 +54,7 @@ export default function LoggedIn() { - {flareAnimationType && ( - setFlareAnimationType()} - onClick={() => setFlareAnimationType()} - /> - )} + {flareAnimationType ? : null} ); diff --git a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/BonusGems/BonusGems.tsx b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/BonusGems/BonusGems.tsx index 217c4099f..5b36ab6ea 100644 --- a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/BonusGems/BonusGems.tsx +++ b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/BonusGems/BonusGems.tsx @@ -1,27 +1,18 @@ -import { useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; + import GemsAnimation from '../GemsAnimation/GemsAnimation'; -import { Background, Wrapper } from './styles'; import { Number, Text, TextBottom, TextBottomPosition } from '../styles'; -import { useTranslation } from 'react-i18next'; import { formatNumber, FormatPreset } from '@app/utils/formatters'; +import { Background, Wrapper } from './styles'; interface Props { gems: number; - onAnimationComplete: () => void; } -export default function BonusGems({ gems, onAnimationComplete }: Props) { +export default function BonusGems({ gems }: Props) { const { t } = useTranslation('airdrop', { useSuspense: false }); const formattedNumber = formatNumber(gems, FormatPreset.DECIMAL_COMPACT); - useEffect(() => { - const timer = setTimeout(() => { - onAnimationComplete(); - }, 3500); - - return () => clearTimeout(timer); - }, [onAnimationComplete]); - return ( void; - onClick: () => void; } -export default function Flare({ gems, animationType, onAnimationComplete, onClick }: Props) { - return ( - - {animationType === 'GoalComplete' && } +const GOAL_COMPLETE_DURATION = 1000 * 11.5; +const REFERRAL_DURATION = 1000 * 10; +const BONUS_GEMS_DURATION = 3500; + +const durations = { + GoalComplete: GOAL_COMPLETE_DURATION, + FriendAccepted: REFERRAL_DURATION, + BonusGems: BONUS_GEMS_DURATION, +}; - {animationType === 'FriendAccepted' && ( - - )} +export default function Flare({ gems, animationType }: Props) { + const setFlareAnimationType = useAirdropStore((s) => s.setFlareAnimationType); + const clearFlareAnimationType = useCallback(() => setFlareAnimationType(), [setFlareAnimationType]); - {animationType === 'BonusGems' && } + useEffect(() => { + const duration = durations[animationType] || 0; + const animationTimeout = setTimeout(clearFlareAnimationType, duration); + return () => { + clearTimeout(animationTimeout); + }; + }, [animationType, clearFlareAnimationType]); + + return ( + + {animationType === 'GoalComplete' && } + {animationType === 'FriendAccepted' && } + {animationType === 'BonusGems' && } ); } diff --git a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/FriendAccepted/FriendAccepted.tsx b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/FriendAccepted/FriendAccepted.tsx index 85f2751cd..5c5da0870 100644 --- a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/FriendAccepted/FriendAccepted.tsx +++ b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedIn/segments/Flare/FriendAccepted/FriendAccepted.tsx @@ -1,4 +1,3 @@ -import { useEffect } from 'react'; import GemsAnimation from '../GemsAnimation/GemsAnimation'; import { Background, Wrapper } from './styles'; import { Number, Text, TextBottom, TextBottomPosition } from '../styles'; @@ -6,20 +5,11 @@ import { useTranslation } from 'react-i18next'; interface Props { gems: number; - onAnimationComplete: () => void; } -export default function FriendAccepted({ gems, onAnimationComplete }: Props) { +export default function FriendAccepted({ gems }: Props) { const { t } = useTranslation('airdrop', { useSuspense: false }); - useEffect(() => { - const timer = setTimeout(() => { - onAnimationComplete(); - }, 10000); - - return () => clearTimeout(timer); - }, [onAnimationComplete]); - return ( void; } -export default function FriendAccepted({ gems, onAnimationComplete }: Props) { +export default function GoalComplete({ gems }: Props) { const { t } = useTranslation('airdrop', { useSuspense: false }); const [showIntro, setShowIntro] = useState(true); const [showGiftBox, setShowGiftBox] = useState(true); const introDuration = 2000; - const mainDuration = 11500; useEffect(() => { const introTimer = setTimeout(() => { @@ -27,15 +25,10 @@ export default function FriendAccepted({ gems, onAnimationComplete }: Props) { setShowGiftBox(false); }, introDuration); - const mainTimer = setTimeout(() => { - onAnimationComplete(); - }, mainDuration); - return () => { clearTimeout(introTimer); - clearTimeout(mainTimer); }; - }, [onAnimationComplete]); + }, []); return ( diff --git a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedOut/LoggedOut.tsx b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedOut/LoggedOut.tsx index a5f56a324..3e8c6fd35 100644 --- a/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedOut/LoggedOut.tsx +++ b/src/containers/main/Airdrop/AirdropGiftTracker/sections/LoggedOut/LoggedOut.tsx @@ -1,7 +1,7 @@ import { GIFT_GEMS, useAirdropStore } from '@app/store/useAirdropStore'; import { ClaimButton, GemPill, Image, Title, Wrapper } from './styles'; import { useCallback, useEffect, useState } from 'react'; -import { open } from '@tauri-apps/api/shell'; +import { open } from '@tauri-apps/plugin-shell'; import { v4 as uuidv4 } from 'uuid'; import ClaimModal from '../../components/ClaimModal/ClaimModal'; import { useTranslation } from 'react-i18next'; diff --git a/src/containers/main/MainView.tsx b/src/containers/main/MainView.tsx index ac9868260..2571c9662 100644 --- a/src/containers/main/MainView.tsx +++ b/src/containers/main/MainView.tsx @@ -1,11 +1,13 @@ +import { useUpdateSystemTray } from '@app/hooks'; + import { DashboardContainer } from '@app/theme/styles.ts'; import { Dashboard } from '@app/containers/main/Dashboard'; import SideBar from '@app/containers/main/SideBar/SideBar.tsx'; import { useAppConfigStore } from '@app/store/useAppConfigStore'; export default function MainView() { + useUpdateSystemTray(); const visualMode = useAppConfigStore((s) => s.visual_mode); - return ( diff --git a/src/containers/main/SideBar/Miner/Miner.tsx b/src/containers/main/SideBar/Miner/Miner.tsx index 745e2ef03..d55d77541 100644 --- a/src/containers/main/SideBar/Miner/Miner.tsx +++ b/src/containers/main/SideBar/Miner/Miner.tsx @@ -1,15 +1,17 @@ -import Tile from './components/Tile.tsx'; -import { MinerContainer, TileContainer, Unit } from './styles.ts'; - -import ModeSelect from './components/ModeSelect.tsx'; +import ModeSelect from '@app/containers/main/SideBar/Miner/components/ModeSelect'; +import { useTheme } from 'styled-components'; +import { Trans, useTranslation } from 'react-i18next'; import { useMiningStore } from '@app/store/useMiningStore.ts'; import { Typography } from '@app/components/elements/Typography.tsx'; import { useAppConfigStore } from '@app/store/useAppConfigStore.ts'; -import useMiningStatesSync from '@app/hooks/mining/useMiningStatesSync.ts'; -import { useTheme } from 'styled-components'; -import { Trans, useTranslation } from 'react-i18next'; + +import Tile from './components/Tile.tsx'; +import { MinerContainer, TileContainer, Unit } from './styles.ts'; + +import { useMiningStatesSync } from '@app/hooks'; + import { ExpandableTile } from '@app/containers/main/SideBar/Miner/components/ExpandableTile.tsx'; import { ExpandableTileItem, @@ -18,9 +20,9 @@ import { import { formatHashrate, formatNumber, FormatPreset } from '@app/utils/formatters.ts'; export default function Miner() { + useMiningStatesSync(); const theme = useTheme(); const { t } = useTranslation('mining-view', { useSuspense: false }); - useMiningStatesSync(); const miningInitiated = useMiningStore((s) => s.miningInitiated); const isCpuMiningEnabled = useAppConfigStore((s) => s.cpu_mining_enabled); diff --git a/src/containers/main/SideBar/SideBar.tsx b/src/containers/main/SideBar/SideBar.tsx index 722fa5a59..8dd0f940e 100644 --- a/src/containers/main/SideBar/SideBar.tsx +++ b/src/containers/main/SideBar/SideBar.tsx @@ -4,8 +4,8 @@ import Heading from './components/Heading'; import LostConnectionAlert from './components/LostConnectionAlert'; import MiningButton from './components/MiningButton/MiningButton'; import Miner from './Miner/Miner'; +import OrphanChainAlert from './components/OrphanChainAlert/OrphanChainAlert.tsx'; import { Bottom, Scroll, SideBarContainer, SidebarTop, Top } from './styles'; -import OrphanChainAlert from './components/OrphanChainAlert.tsx'; export default function SideBar() { return ( diff --git a/src/containers/main/SideBar/components/LostConnectionAlert.tsx b/src/containers/main/SideBar/components/LostConnectionAlert.tsx index 14013ac42..25b5e5f6f 100644 --- a/src/containers/main/SideBar/components/LostConnectionAlert.tsx +++ b/src/containers/main/SideBar/components/LostConnectionAlert.tsx @@ -18,13 +18,11 @@ const LostConnectionAlert = () => { const isSettingUp = useAppStateStore((s) => s.isSettingUp); return !isConnectedToTari && !isSettingUp ? ( - - + + {t('lost-connection')} - ) : ( - <> - ); + ) : null; }; export default LostConnectionAlert; diff --git a/src/containers/main/SideBar/components/OrphanChainAlert.tsx b/src/containers/main/SideBar/components/OrphanChainAlert.tsx deleted file mode 100644 index d888789af..000000000 --- a/src/containers/main/SideBar/components/OrphanChainAlert.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { IoAlertCircleSharp } from 'react-icons/io5'; -import { Stack } from '@app/components/elements/Stack'; -import { Typography } from '@app/components/elements/Typography'; -import { useTranslation } from 'react-i18next'; -import styled from 'styled-components'; -import { useEffect, useState } from 'react'; -import { listen } from '@tauri-apps/api/event'; - -const LostConnectionIcon = styled(IoAlertCircleSharp)(({ theme }) => ({ - color: theme.palette.warning.main, -})); - -export const OrphanChainAlert = () => { - const [isOrphanChain, setIsOrphanChain] = useState(false); - const { t } = useTranslation('settings', { useSuspense: false }); - - useEffect(() => { - const unlistenPromise = listen('is_stuck', (event) => { - setIsOrphanChain(event.payload); - }); - return () => { - unlistenPromise.then((unlisten) => unlisten()); - }; - }, [setIsOrphanChain]); - - return isOrphanChain ? ( - - - {t('is-on-orphan-chain')} - - ) : ( - <> - ); -}; - -export default OrphanChainAlert; diff --git a/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.styles.ts b/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.styles.ts new file mode 100644 index 000000000..5527ce52f --- /dev/null +++ b/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.styles.ts @@ -0,0 +1,56 @@ +import styled from 'styled-components'; + +import { m } from 'framer-motion'; +import { convertHexToRGBA } from '@app/utils'; + +export const AlertWrapper = styled.div` + display: flex; + position: relative; +`; + +export const AlertIconWrapper = styled.div` + display: flex; + background: ${({ theme }) => convertHexToRGBA(theme.palette.contrast, 0.1)}; + color: ${({ theme }) => theme.palette.text.secondary}; + flex-shrink: 0; + border-radius: 100%; + width: 14px; + height: 14px; +`; +export const TooltipTrigger = styled.div` + cursor: pointer; + display: flex; + padding: 6px 8px 4px; + flex-direction: row; + font-size: 0.7rem; + gap: 4px; + align-items: flex-start; + color: ${({ theme }) => theme.palette.warning.dark}; +`; + +export const TooltipWrapper = styled(m.div).attrs({ + initial: { opacity: 0 }, + animate: { opacity: 1 }, +})` + display: flex; + flex-direction: column; + border-radius: ${({ theme }) => theme.shape.borderRadius.app}; + background-color: ${({ theme }) => theme.palette.background.default}; + box-shadow: 2px 8px 8px 0 rgba(0, 0, 0, 0.04); + position: absolute; + padding: 6px 8px 10px; + gap: 6px; + left: 0; + top: 100%; + z-index: 2; + width: 100%; +`; + +export const TooltipTop = styled.div` + display: flex; + align-items: center; + gap: 6px; + img { + max-height: 12px; + } +`; diff --git a/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.tsx b/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.tsx new file mode 100644 index 000000000..153e0ac59 --- /dev/null +++ b/src/containers/main/SideBar/components/OrphanChainAlert/OrphanChainAlert.tsx @@ -0,0 +1,79 @@ +import { Typography } from '@app/components/elements/Typography'; +import { useTranslation } from 'react-i18next'; +import { useEffect, useState } from 'react'; +import { listen } from '@tauri-apps/api/event'; +import { autoUpdate, safePolygon, useFloating, useHover, useInteractions } from '@floating-ui/react'; +import { + TooltipTrigger, + AlertWrapper, + TooltipWrapper, + TooltipTop, + AlertIconWrapper, +} from './OrphanChainAlert.styles.ts'; +import { AnimatePresence } from 'framer-motion'; +import { List } from '@app/components/elements/List.tsx'; + +import tinkerEmoji from '@app/assets/icons/emoji/custom.png'; +import { useUIStore } from '@app/store/useUIStore.ts'; +import QuestionMarkSvg from '@app/components/svgs/QuestionMarkSvg.tsx'; + +export const OrphanChainAlert = () => { + const { t } = useTranslation(['settings', 'mining-view'], { useSuspense: false }); + const adminShow = useUIStore((s) => s.adminShow); + const [isOrphanChain, setIsOrphanChain] = useState(false); + + const [open, setOpen] = useState(false); + const { refs, context } = useFloating({ + open: open, + onOpenChange: setOpen, + + whileElementsMounted(referenceEl, floatingEl, update) { + return autoUpdate(referenceEl, floatingEl, update, { + layoutShift: false, + }); + }, + }); + + const hover = useHover(context, { + move: !open, + handleClose: safePolygon(), + }); + const { getReferenceProps, getFloatingProps } = useInteractions([hover]); + + useEffect(() => { + const unlistenPromise = listen('is_stuck', (event) => { + setIsOrphanChain(event.payload); + }); + return () => { + unlistenPromise.then((unlisten) => unlisten()); + }; + }, [setIsOrphanChain]); + + const steps = Array.from({ length: 6 }).map((_, i) => t(`mining-view:orphan-chain-tooltip.step_${i + 1}`)); + + const alertMarkup = ( + + + {t('is-on-orphan-chain')} + + + + + + {open && ( + + + + {t('mining-view:orphan-chain-tooltip.heading')} + + + + )} + + + ); + + return isOrphanChain || adminShow === 'orphanChainWarning' ? alertMarkup : null; +}; + +export default OrphanChainAlert; diff --git a/src/containers/main/SideBar/components/Wallet/Wallet.tsx b/src/containers/main/SideBar/components/Wallet/Wallet.tsx index ae91da231..f1abb2617 100644 --- a/src/containers/main/SideBar/components/Wallet/Wallet.tsx +++ b/src/containers/main/SideBar/components/Wallet/Wallet.tsx @@ -1,6 +1,21 @@ import { useCallback, useState, useEffect } from 'react'; import { useBlockchainVisualisationStore } from '@app/store/useBlockchainVisualisationStore'; +import { useTranslation } from 'react-i18next'; +import { AnimatePresence } from 'framer-motion'; +import { IoEyeOutline, IoEyeOffOutline } from 'react-icons/io5'; import CharSpinner from '@app/components/CharSpinner/CharSpinner.tsx'; +import { formatNumber, FormatPreset } from '@app/utils/formatters.ts'; +import { Typography } from '@app/components/elements/Typography.tsx'; +import { Stack } from '@app/components/elements/Stack.tsx'; + +import { useWalletStore } from '@app/store/useWalletStore.ts'; +import { usePaperWalletStore } from '@app/store/usePaperWalletStore.ts'; +import { useAppConfigStore } from '@app/store/useAppConfigStore.ts'; + +import useFetchTx from '@app/hooks/mining/useTransactions.ts'; +import SyncTooltip from './SyncTooltip/SyncTooltip.tsx'; +import History from './History.tsx'; + import { BalanceVisibilityButton, CornerButton, @@ -13,18 +28,6 @@ import { WalletContainer, WalletCornerButtons, } from './Wallet.styles.ts'; -import { Typography } from '@app/components/elements/Typography.tsx'; -import { useTranslation } from 'react-i18next'; -import { IoEyeOutline, IoEyeOffOutline } from 'react-icons/io5'; -import { Stack } from '@app/components/elements/Stack.tsx'; -import { useWalletStore } from '@app/store/useWalletStore.ts'; -import { AnimatePresence } from 'framer-motion'; -import History from './History.tsx'; -import useFetchTx from '@app/hooks/mining/useTransactions.ts'; -import { usePaperWalletStore } from '@app/store/usePaperWalletStore.ts'; -import { useAppConfigStore } from '@app/store/useAppConfigStore.ts'; -import SyncTooltip from './SyncTooltip/SyncTooltip.tsx'; -import { formatNumber, FormatPreset } from '@app/utils/formatters.ts'; export default function Wallet() { const { t } = useTranslation('sidebar', { useSuspense: false }); diff --git a/src/containers/main/SideBar/styles.ts b/src/containers/main/SideBar/styles.ts index 3581b1ad1..29725cc8d 100644 --- a/src/containers/main/SideBar/styles.ts +++ b/src/containers/main/SideBar/styles.ts @@ -38,7 +38,7 @@ export const SidebarTop = styled('div')` display: flex; flex-direction: column; padding: 0 10px 10px 10px; - gap: 20px; + gap: 10px; @media (max-height: 670px) { gap: 5px; @@ -50,4 +50,7 @@ export const Bottom = styled(m.div)` flex-direction: column; gap: 12px; padding-bottom: 188px; // to cater for wallet card + @media (max-height: 670px) { + padding-bottom: 150px; + } `; diff --git a/src/containers/phase/Setup/Setup.tsx b/src/containers/phase/Setup/Setup.tsx index cd747ec6f..2b10d56a8 100644 --- a/src/containers/phase/Setup/Setup.tsx +++ b/src/containers/phase/Setup/Setup.tsx @@ -1,5 +1,5 @@ import Footer from '@app/containers/phase/Setup/components/Footer'; -import { useSetUp } from '@app/hooks/useSetUp'; +import { useSetUp } from '@app/hooks'; import HeroText from './components/HeroText'; import InfoNav from './components/InfoNav/InfoNav'; import { SetupWrapper } from '@app/containers/phase/Setup/Setup.styles'; diff --git a/src/hooks/airdrop/stateHelpers/useAirdropUserPointsListener.ts b/src/hooks/airdrop/stateHelpers/useAirdropUserPointsListener.ts index c9947576f..99a9104e5 100644 --- a/src/hooks/airdrop/stateHelpers/useAirdropUserPointsListener.ts +++ b/src/hooks/airdrop/stateHelpers/useAirdropUserPointsListener.ts @@ -1,51 +1,38 @@ import { useAirdropStore, UserPoints } from '@app/store/useAirdropStore'; import { listen } from '@tauri-apps/api/event'; -import { useEffect } from 'react'; +import { useCallback, useEffect } from 'react'; export const useAirdropUserPointsListener = () => { - const setUserPoints = useAirdropStore((state) => state.setUserPoints); - const referralCount = useAirdropStore((state) => state.referralCount); + const setUserPoints = useAirdropStore((state) => state?.setUserPoints); + const currentReferralData = useAirdropStore((state) => state?.referralCount); const bonusTiers = useAirdropStore((state) => state.bonusTiers); - const setUserPointsReferralCount = useAirdropStore((state) => state.setReferralCount); const setFlareAnimationType = useAirdropStore((state) => state.setFlareAnimationType); - useEffect(() => { - let unListen: () => void = () => { - //do nothing - }; + const handleAirdropPoints = useCallback( + (pointsPayload: UserPoints) => { + const incomingReferralData = pointsPayload?.referralCount; + if (incomingReferralData?.count && incomingReferralData?.count !== currentReferralData?.count) { + setFlareAnimationType('FriendAccepted'); - listen('UserPoints', (event) => { - if (event.payload) { - const payload = event.payload as UserPoints; - setUserPoints(payload); - if (payload.referralCount) { - if (referralCount?.count !== payload.referralCount.count) { - if (referralCount?.count) { - setFlareAnimationType('FriendAccepted'); - if ( - payload.referralCount.count && - bonusTiers?.find((t) => t.target === payload?.referralCount?.count) - ) { - setTimeout(() => { - setFlareAnimationType('GoalComplete'); - }, 2000); - } - } - setUserPointsReferralCount(payload.referralCount); - } + const goalComplete = bonusTiers?.find((t) => t.target === incomingReferralData?.count); + if (goalComplete) { + setTimeout(() => setFlareAnimationType('GoalComplete'), 3000); } + + setUserPoints(pointsPayload); } - }) - .then((unListenFunction) => { - unListen = unListenFunction; - }) - .catch((e) => { - console.error('User points error: ', e); - }); + }, + [bonusTiers, currentReferralData?.count, setFlareAnimationType, setUserPoints] + ); + useEffect(() => { + const ul = listen('UserPoints', ({ payload }) => { + if (payload) { + handleAirdropPoints(payload as UserPoints); + } + }); return () => { - unListen(); + ul.then((unlisten) => unlisten()); }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [bonusTiers, referralCount?.count]); + }, [handleAirdropPoints]); }; diff --git a/src/hooks/airdrop/stateHelpers/useGetReferralQuestPoints.ts b/src/hooks/airdrop/stateHelpers/useGetReferralQuestPoints.ts index 38ebee6be..9cd7d9dbc 100644 --- a/src/hooks/airdrop/stateHelpers/useGetReferralQuestPoints.ts +++ b/src/hooks/airdrop/stateHelpers/useGetReferralQuestPoints.ts @@ -23,7 +23,7 @@ interface QuestDataResponse { export const useGetReferralQuestPoints = () => { const handleRequest = useAirdropRequest(); - const { setReferralQuestPoints } = useAirdropStore(); + const setReferralQuestPoints = useAirdropStore((s) => s.setReferralQuestPoints); useEffect(() => { const handleFetch = async () => { diff --git a/src/hooks/app/index.ts b/src/hooks/app/index.ts new file mode 100644 index 000000000..1af1019ab --- /dev/null +++ b/src/hooks/app/index.ts @@ -0,0 +1,8 @@ +export * from './useDisableRefresh.ts'; +export * from './useEnvironment.ts'; +export * from './useHardwareStats.ts'; +export * from './useLanguageResolver.ts'; +export * from './useListenForExternalDependencies.ts'; +export * from './useSetUp.ts'; +export * from './useShuttingDown.ts'; +export * from './useSystemTray.ts'; diff --git a/src/hooks/useDisableRefresh.ts b/src/hooks/app/useDisableRefresh.ts similarity index 95% rename from src/hooks/useDisableRefresh.ts rename to src/hooks/app/useDisableRefresh.ts index 7be36d8ca..d87eae637 100644 --- a/src/hooks/useDisableRefresh.ts +++ b/src/hooks/app/useDisableRefresh.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -export const useDisableRefresh = () => { +export function useDisableRefresh() { useEffect(() => { if (process.env.NODE_ENV === 'development') { return; @@ -24,4 +24,4 @@ export const useDisableRefresh = () => { document.removeEventListener('contextmenu', contextmenuListener); }; }, []); -}; +} diff --git a/src/hooks/useEnvironment.ts b/src/hooks/app/useEnvironment.ts similarity index 82% rename from src/hooks/useEnvironment.ts rename to src/hooks/app/useEnvironment.ts index 4bd1903c4..bb690138e 100644 --- a/src/hooks/useEnvironment.ts +++ b/src/hooks/app/useEnvironment.ts @@ -6,10 +6,8 @@ export enum Environment { } export const useEnvironment = () => { - const environment = useMemo(() => { + return useMemo(() => { if (window.location.host.startsWith('localhost:')) return Environment.Development; return Environment.Production; }, []); - - return environment; }; diff --git a/src/hooks/useHardwareStats.ts b/src/hooks/app/useHardwareStats.ts similarity index 94% rename from src/hooks/useHardwareStats.ts rename to src/hooks/app/useHardwareStats.ts index 1ad972e2f..7fb940967 100644 --- a/src/hooks/useHardwareStats.ts +++ b/src/hooks/app/useHardwareStats.ts @@ -1,5 +1,5 @@ import { useMiningStore } from '@app/store/useMiningStore'; -import { HardwareParameters } from '../types/app-status'; +import { HardwareParameters } from '../../types/app-status'; import { useMemo } from 'react'; const roundTo = (num: number, precision = 2) => { @@ -7,7 +7,7 @@ const roundTo = (num: number, precision = 2) => { return Math.round(num * factor) / factor; }; -export const useHardwareStats = () => { +export function useHardwareStats() { const cpuHardwareStats = useMiningStore((s) => s.cpu.hardware); const gpuHardwareStats = useMiningStore((s) => s.gpu.hardware); @@ -43,4 +43,4 @@ export const useHardwareStats = () => { const doesAnyGpuHasReadings = gpuHardwareStats?.some((gpu) => gpu.status.is_reader_implemented); return { cpu, gpu, doesAnyCpuHasReadings, doesAnyGpuHasReadings }; -}; +} diff --git a/src/hooks/useLanguageResolver.ts b/src/hooks/app/useLanguageResolver.ts similarity index 85% rename from src/hooks/useLanguageResolver.ts rename to src/hooks/app/useLanguageResolver.ts index 423992171..9fe8686cf 100644 --- a/src/hooks/useLanguageResolver.ts +++ b/src/hooks/app/useLanguageResolver.ts @@ -1,4 +1,4 @@ -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { useEffect } from 'react'; import { changeLanguage } from 'i18next'; diff --git a/src/hooks/useListenForExternalDependencies.ts b/src/hooks/app/useListenForExternalDependencies.ts similarity index 100% rename from src/hooks/useListenForExternalDependencies.ts rename to src/hooks/app/useListenForExternalDependencies.ts diff --git a/src/hooks/useSetUp.ts b/src/hooks/app/useSetUp.ts similarity index 78% rename from src/hooks/useSetUp.ts rename to src/hooks/app/useSetUp.ts index 5a4b06425..cbda61289 100644 --- a/src/hooks/useSetUp.ts +++ b/src/hooks/app/useSetUp.ts @@ -1,14 +1,14 @@ import { useUIStore } from '@app/store/useUIStore'; import { useCallback, useEffect, useRef } from 'react'; import { listen } from '@tauri-apps/api/event'; -import { invoke } from '@tauri-apps/api/tauri'; +import { TauriEvent } from '../../types.ts'; -import { TauriEvent } from '../types.ts'; +import { invoke } from '@tauri-apps/api/core'; -import { useAppStateStore } from '../store/appStateStore.ts'; +import { useAppStateStore } from '../../store/appStateStore.ts'; import { useAirdropStore } from '@app/store/useAirdropStore.ts'; -import { useHandleAirdropTokensRefresh } from '@app/hooks/airdrop/stateHelpers/useAirdropTokensRefresh.ts'; +import { useHandleAirdropTokensRefresh } from '../airdrop/stateHelpers/useAirdropTokensRefresh.ts'; export function useSetUp() { const isInitializingRef = useRef(false); @@ -16,7 +16,6 @@ export function useSetUp() { const adminShow = useUIStore((s) => s.adminShow); const setSetupDetails = useAppStateStore((s) => s.setSetupDetails); const setCriticalError = useAppStateStore((s) => s.setCriticalError); - const isAfterAutoUpdate = useAppStateStore((s) => s.isAfterAutoUpdate); const setSettingUpFinished = useAppStateStore((s) => s.setSettingUpFinished); const fetchApplicationsVersionsWithRetry = useAppStateStore((s) => s.fetchApplicationsVersionsWithRetry); @@ -50,14 +49,14 @@ export function useSetUp() { useEffect(() => { if (adminShow === 'setup') return; - const unlistenPromise = listen('message', ({ event: e, payload: p }: TauriEvent) => { + const unlistenPromise = listen('message', async ({ event: e, payload: p }: TauriEvent) => { switch (p.event_type) { case 'setup_status': if (p.progress > 0) { setSetupDetails(p.title, p.title_params, p.progress); } if (p.progress >= 1) { - handlePostSetup(); + await handlePostSetup(); } break; default: @@ -65,7 +64,7 @@ export function useSetUp() { break; } }); - if (isAfterAutoUpdate && syncedAidropWithBackend && !isInitializingRef.current) { + if (syncedAidropWithBackend && !isInitializingRef.current) { isInitializingRef.current = true; clearStorage(); invoke('setup_application').catch((e) => { @@ -76,13 +75,5 @@ export function useSetUp() { return () => { unlistenPromise.then((unlisten) => unlisten()); }; - }, [ - syncedAidropWithBackend, - clearStorage, - handlePostSetup, - isAfterAutoUpdate, - setCriticalError, - setSetupDetails, - adminShow, - ]); + }, [clearStorage, handlePostSetup, setCriticalError, setSetupDetails, adminShow, syncedAidropWithBackend]); } diff --git a/src/hooks/useShuttingDown.ts b/src/hooks/app/useShuttingDown.ts similarity index 51% rename from src/hooks/useShuttingDown.ts rename to src/hooks/app/useShuttingDown.ts index 57baa9e59..298c2d059 100644 --- a/src/hooks/useShuttingDown.ts +++ b/src/hooks/app/useShuttingDown.ts @@ -1,24 +1,31 @@ +import { tray } from '@app/utils'; import { useEffect, useState } from 'react'; -import { appWindow } from '@tauri-apps/api/window'; +import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'; import { resetAllStores } from '@app/store/create.ts'; +import { invoke } from '@tauri-apps/api/core'; +const appWindow = getCurrentWebviewWindow(); export function useShuttingDown() { const [isShuttingDown, setIsShuttingDown] = useState(false); useEffect(() => { - appWindow.onCloseRequested(async (e) => { + const ul = appWindow.onCloseRequested(async (event) => { if (!isShuttingDown) { setIsShuttingDown(true); - e.preventDefault(); + event.preventDefault(); } }); + return () => { + ul.then((unlisten) => unlisten()); + }; }, [isShuttingDown]); useEffect(() => { if (isShuttingDown) { - setTimeout(() => { + setTimeout(async () => { + tray?.close(); resetAllStores(); - appWindow.close(); + await invoke('exit_application'); }, 250); } }, [isShuttingDown]); diff --git a/src/hooks/app/useSystemTray.ts b/src/hooks/app/useSystemTray.ts new file mode 100644 index 000000000..038ae8b35 --- /dev/null +++ b/src/hooks/app/useSystemTray.ts @@ -0,0 +1,84 @@ +import { MinerMetrics } from '@app/types/app-status'; +import { + menu, + CPU_HASH_ITEM_ID, + GPU_HASH_ITEM_ID, + EARNINGS_ITEM_ID, + UNMINIMIZE_ITEM_ID, + MINIMIZE_ITEM_ID, +} from '@app/utils'; +import { listen } from '@tauri-apps/api/event'; +import { getCurrentWindow } from '@tauri-apps/api/window'; +import { useCallback, useEffect, useMemo, useState } from 'react'; + +import { formatHashrate, formatNumber, FormatPreset } from '@app/utils'; +import { MenuItem } from '@tauri-apps/api/menu/menuItem'; + +const currentWindow = getCurrentWindow(); + +export function useUpdateSystemTray() { + const [metrics, setMetrics] = useState(); + + const totalEarningsFormatted = useMemo(() => { + const cpu_est = metrics?.cpu?.mining?.estimated_earnings || 0; + const gpu_est = metrics?.gpu?.mining?.estimated_earnings || 0; + const total = cpu_est + gpu_est; + return total > 0 ? formatNumber(total, FormatPreset.TXTM_COMPACT) : '0'; + }, [metrics]); + + const updateMenuItemEnabled = useCallback(async (itemId: string, enabled: boolean) => { + const item = await menu.get(itemId); + + if (item) { + const menuItem = item as MenuItem; + const currentEnabled = await menuItem?.isEnabled(); + if (currentEnabled !== enabled) { + await menuItem.setEnabled(enabled); + } + } + }, []); + const updateMenuItem = useCallback(async ({ itemId, itemText }: { itemId: string; itemText?: string }) => { + const item = await menu.get(itemId); + if (item && itemText) { + await item.setText(itemText); + } + }, []); + + const items = useMemo(() => { + const { cpu, gpu } = metrics || {}; + const cpu_h = cpu?.mining?.hash_rate || 0; + const gpu_h = gpu?.mining?.hash_rate || 0; + + const cpuHashItemText = `CPU Hashrate: ${cpu_h ? `${formatHashrate(cpu_h)}` : '-'}`; + const gpuHashItemText = `GPU Hashrate: ${gpu_h ? `${formatHashrate(gpu_h)}` : '-'}`; + const estEarningsItemText = `Est earning: ${totalEarningsFormatted !== '0' ? totalEarningsFormatted : '-'} tXTM/day`; + + return [ + { itemId: CPU_HASH_ITEM_ID, itemText: cpuHashItemText }, + { itemId: GPU_HASH_ITEM_ID, itemText: gpuHashItemText }, + { itemId: EARNINGS_ITEM_ID, itemText: estEarningsItemText }, + ]; + }, [metrics, totalEarningsFormatted]); + + useEffect(() => { + items.forEach(async (item) => { + await updateMenuItem({ ...item }); + }); + }, [items, updateMenuItem]); + + useEffect(() => { + const ul = listen('miner_metrics', async ({ payload }) => { + const minimized = await currentWindow.isMinimized(); + + if (payload) { + setMetrics(payload as MinerMetrics); + } + + await updateMenuItemEnabled(UNMINIMIZE_ITEM_ID, minimized); + await updateMenuItemEnabled(MINIMIZE_ITEM_ID, !minimized); + }); + return () => { + ul.then((unlisten) => unlisten()); + }; + }, [updateMenuItemEnabled]); +} diff --git a/src/hooks/helpers/index.ts b/src/hooks/helpers/index.ts new file mode 100644 index 000000000..55a787cb7 --- /dev/null +++ b/src/hooks/helpers/index.ts @@ -0,0 +1,4 @@ +export * from './useCopyToClipboard.ts'; +export * from './useDetectMode.ts'; +export * from './useInterval.ts'; +export * from './useKeyboardEvent.ts'; diff --git a/src/hooks/useInterval.ts b/src/hooks/helpers/useInterval.ts similarity index 100% rename from src/hooks/useInterval.ts rename to src/hooks/helpers/useInterval.ts diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 000000000..d333da5b7 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,3 @@ +export * from './app'; +export * from './helpers'; +export * from './mining'; diff --git a/src/hooks/mining/index.ts b/src/hooks/mining/index.ts new file mode 100644 index 000000000..9370dfdb7 --- /dev/null +++ b/src/hooks/mining/index.ts @@ -0,0 +1,6 @@ +export * from './useBlockInfo.ts'; +export * from './useEarningsRecap.ts'; +export * from './useMiningMetricsUpdater.ts'; +export * from './useMiningStatesSync.ts'; +export * from './useMiningUiStateMachine.ts'; +export * from './useTransactions.ts'; diff --git a/src/hooks/mining/useBlockInfo.ts b/src/hooks/mining/useBlockInfo.ts index 9bdfce571..3c97746b9 100644 --- a/src/hooks/mining/useBlockInfo.ts +++ b/src/hooks/mining/useBlockInfo.ts @@ -1,9 +1,11 @@ -import calculateTimeSince from '@app/utils/calculateTimeSince.ts'; -import { useMiningStore } from '@app/store/useMiningStore.ts'; import { useEffect, useMemo, useRef } from 'react'; -import { useInterval } from '@app/hooks/useInterval'; + +import { useMiningStore } from '@app/store/useMiningStore.ts'; import { useBlockchainVisualisationStore } from '@app/store/useBlockchainVisualisationStore'; +import calculateTimeSince from '@app/utils/calculateTimeSince.ts'; +import { useInterval } from '../helpers/useInterval'; + const INTERVAL = 1000; // 1 sec export function useBlockInfo() { diff --git a/src/hooks/mining/useEarningsRecap.ts b/src/hooks/mining/useEarningsRecap.ts index 9ad796216..96aae9d13 100644 --- a/src/hooks/mining/useEarningsRecap.ts +++ b/src/hooks/mining/useEarningsRecap.ts @@ -1,8 +1,9 @@ import { useBlockchainVisualisationStore } from '@app/store/useBlockchainVisualisationStore.ts'; import { useCallback, useEffect } from 'react'; import { listen } from '@tauri-apps/api/event'; -import { appWindow } from '@tauri-apps/api/window'; +import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'; import { useWalletStore } from '@app/store/useWalletStore.ts'; +const appWindow = getCurrentWebviewWindow(); export default function useEarningsRecap() { const recapIds = useBlockchainVisualisationStore((s) => s.recapIds); @@ -22,14 +23,17 @@ export default function useEarningsRecap() { }, [handleWinRecap, recapIds, transactions]); useEffect(() => { - const listener = listen('tauri://focus', async (event) => { - const minimized = await appWindow?.isMinimized(); - const documentIsVisible = document?.visibilityState === 'visible' || false; - - if (documentIsVisible && !minimized && event.windowLabel == 'main') { - getMissedEarnings(); - } - }); + const listener = listen( + 'tauri://focus', + async () => { + const minimized = await appWindow?.isMinimized(); + const documentIsVisible = document?.visibilityState === 'visible' || false; + if (documentIsVisible && !minimized) { + getMissedEarnings(); + } + }, + { target: { kind: 'WebviewWindow', label: 'main' } } + ); return () => { listener.then((unlisten) => unlisten()); diff --git a/src/hooks/useMiningMetricsUpdater.ts b/src/hooks/mining/useMiningMetricsUpdater.ts similarity index 62% rename from src/hooks/useMiningMetricsUpdater.ts rename to src/hooks/mining/useMiningMetricsUpdater.ts index 824ebc16f..128f0193e 100644 --- a/src/hooks/useMiningMetricsUpdater.ts +++ b/src/hooks/mining/useMiningMetricsUpdater.ts @@ -1,10 +1,11 @@ -import { ALREADY_FETCHING } from '@app/App/sentryIgnore'; -import { useMiningStore } from '@app/store/useMiningStore'; -import { useCallback, useState } from 'react'; -import { invoke } from '@tauri-apps/api'; +import { useCallback } from 'react'; +import { MinerMetrics } from '@app/types/app-status'; + import { setAnimationState } from '@app/visuals.ts'; +import { useMiningStore } from '@app/store/useMiningStore'; import { useBlockchainVisualisationStore } from '@app/store/useBlockchainVisualisationStore.ts'; -import useFetchTx from '@app/hooks/mining/useTransactions.ts'; + +import useFetchTx from './useTransactions.ts'; export default function useMiningMetricsUpdater() { const fetchTx = useFetchTx(); @@ -14,14 +15,9 @@ export default function useMiningMetricsUpdater() { const handleNewBlock = useBlockchainVisualisationStore((s) => s.handleNewBlock); const displayBlockHeight = useBlockchainVisualisationStore((s) => s.displayBlockHeight); const setDisplayBlockHeight = useBlockchainVisualisationStore((s) => s.setDisplayBlockHeight); - const [isFetchingMetrics, setIsFetchingMetrics] = useState(false); - - return useCallback(async () => { - if (isFetchingMetrics) return; - try { - setIsFetchingMetrics(true); - const metrics = await invoke('get_miner_metrics'); + return useCallback( + async (metrics: MinerMetrics) => { if (metrics) { const isMining = metrics.cpu?.mining.is_mining || metrics.gpu?.mining.is_mining; // Pause animation when lost connection to the Tari Network @@ -33,30 +29,33 @@ export default function useMiningMetricsUpdater() { const blockHeight = metrics.base_node.block_height; if (blockHeight > 0 && currentBlockHeight > 0 && blockHeight > currentBlockHeight) { - await fetchTx(); - await handleNewBlock(blockHeight, isMining); + try { + fetchTx() + .then(async () => { + await handleNewBlock(blockHeight, isMining); + }) + .catch(() => { + setDisplayBlockHeight(blockHeight); + }); + } catch (_) { + setDisplayBlockHeight(blockHeight); + } } else { if (blockHeight && !displayBlockHeight) { setDisplayBlockHeight(blockHeight); } } setMiningMetrics(metrics); - setIsFetchingMetrics(false); - } - } catch (e) { - setIsFetchingMetrics(false); - if (e !== ALREADY_FETCHING.METRICS) { - console.error('Fetch mining metrics error:', e); } - } - }, [ - baseNodeConnected, - currentBlockHeight, - displayBlockHeight, - fetchTx, - handleNewBlock, - isFetchingMetrics, - setDisplayBlockHeight, - setMiningMetrics, - ]); + }, + [ + baseNodeConnected, + currentBlockHeight, + displayBlockHeight, + fetchTx, + handleNewBlock, + setDisplayBlockHeight, + setMiningMetrics, + ] + ); } diff --git a/src/hooks/mining/useMiningStatesSync.ts b/src/hooks/mining/useMiningStatesSync.ts index c1f091b9c..1250fcce3 100644 --- a/src/hooks/mining/useMiningStatesSync.ts +++ b/src/hooks/mining/useMiningStatesSync.ts @@ -1,14 +1,17 @@ -import useMiningMetricsUpdater from '@app/hooks/useMiningMetricsUpdater.ts'; -import { useBlockInfo } from '@app/hooks/mining/useBlockInfo.ts'; -import { useUiMiningStateMachine } from '@app/hooks/mining/useMiningUiStateMachine.ts'; +import { MinerMetrics } from '@app/types/app-status'; +import { listen } from '@tauri-apps/api/event'; +import { useCallback, useEffect } from 'react'; import { useWalletStore } from '@app/store/useWalletStore.ts'; -import { useCallback, useEffect } from 'react'; -import useEarningsRecap from '@app/hooks/mining/useEarningsRecap.ts'; import { useAppStateStore } from '@app/store/appStateStore'; -export default function useMiningStatesSync() { - const fetchMiningMetrics = useMiningMetricsUpdater(); +import { useBlockInfo } from './useBlockInfo.ts'; +import { useUiMiningStateMachine } from './useMiningUiStateMachine.ts'; +import useMiningMetricsUpdater from './useMiningMetricsUpdater.ts'; +import useEarningsRecap from './useEarningsRecap.ts'; + +export function useMiningStatesSync() { + const handleMiningMetrics = useMiningMetricsUpdater(); const fetchWalletDetails = useWalletStore((s) => s.fetchWalletDetails); const setupProgress = useAppStateStore((s) => s.setupProgress); const isSettingUp = useAppStateStore((s) => s.isSettingUp); @@ -21,10 +24,7 @@ export default function useMiningStatesSync() { if (setupProgress >= 0.75) { await fetchWalletDetails(); } - if (!isSettingUp) { - await fetchMiningMetrics(); - } - }, [fetchMiningMetrics, fetchWalletDetails, isSettingUp, setupProgress]); + }, [fetchWalletDetails, setupProgress]); // intervalItems useEffect(() => { @@ -36,4 +36,16 @@ export default function useMiningStatesSync() { clearInterval(fetchInterval); }; }, [callIntervalItems]); + + useEffect(() => { + if (isSettingUp) return; + const ul = listen('miner_metrics', async ({ payload }) => { + if (payload) { + await handleMiningMetrics(payload as MinerMetrics); + } + }); + return () => { + ul.then((unlisten) => unlisten()); + }; + }, [handleMiningMetrics, isSettingUp]); } diff --git a/src/hooks/mining/useTransactions.ts b/src/hooks/mining/useTransactions.ts index 7bafd9e30..cddf30a08 100644 --- a/src/hooks/mining/useTransactions.ts +++ b/src/hooks/mining/useTransactions.ts @@ -1,6 +1,6 @@ import { ALREADY_FETCHING } from '@app/App/sentryIgnore'; import { useCallback } from 'react'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { useAppStateStore } from '@app/store/appStateStore.ts'; import { useWalletStore } from '@app/store/useWalletStore.ts'; import { Transaction } from '@app/types/wallet.ts'; @@ -11,7 +11,6 @@ export default function useFetchTx() { const setTransactionsLoading = useWalletStore((s) => s.setTransactionsLoading); const setupProgress = useAppStateStore((s) => s.setupProgress); const setTransactions = useWalletStore((s) => s.setTransactions); - const setError = useAppStateStore((s) => s.setError); const setItems = useCallback( async (newTx: Transaction[]) => { @@ -48,10 +47,12 @@ export default function useFetchTx() { setTransactionsLoading(false); } catch (error) { setTransactionsLoading(false); - setError('Could not get transaction history'); + if (error !== ALREADY_FETCHING.HISTORY) { console.error('Could not get transaction history: ', error); } + } finally { + setTransactionsLoading(false); } - }, [isTransactionLoading, setError, setItems, setTransactionsLoading, setupProgress]); + }, [isTransactionLoading, setItems, setTransactionsLoading, setupProgress]); } diff --git a/src/hooks/useUpdateStatus.ts b/src/hooks/useUpdateStatus.ts deleted file mode 100644 index 34a7c93c1..000000000 --- a/src/hooks/useUpdateStatus.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { useInterval } from '@app/hooks/useInterval'; -import { useAppStateStore } from '@app/store/appStateStore'; -import { useAppConfigStore } from '@app/store/useAppConfigStore'; -import { checkUpdate, installUpdate, onUpdaterEvent } from '@tauri-apps/api/updater'; -import { useUIStore } from '@app/store/useUIStore'; -import { listen } from '@tauri-apps/api/event'; -import { invoke } from '@tauri-apps/api/tauri'; - -import { useCallback, useEffect, useRef, useState } from 'react'; - -export type UpdateStatus = 'NONE' | 'DOWNLOADING' | 'DONE'; - -interface UpdateStatusEvent { - status: UpdateStatus; - error: null | string; -} - -interface UpdateDownloadProgressEvent { - contentLength: number; - chunkLength: number; - downloaded: number; -} - -export const useUpdateStatus = () => { - const [status, setStatus] = useState('NONE'); - const [contentLength, setContentLength] = useState(0); - const [downloaded, setDownloaded] = useState(0); - - useEffect(() => { - const ul = listen('tauri://update-status', (status) => { - const statusString = status.payload.status; - setStatus(statusString); - }); - - return () => { - ul.then((unlisten) => unlisten()); - }; - }, []); - - useEffect(() => { - const ul = listen('update-progress', (progressEvent) => { - const contentLength = progressEvent.payload.contentLength; - setContentLength(contentLength); - if (contentLength === 0) { - setStatus('NONE'); - } - if (contentLength > 0) { - setStatus('DOWNLOADING'); - const downloaded = progressEvent.payload.downloaded; - setDownloaded(downloaded); - } - }); - return () => { - ul.then((unlisten) => unlisten()); - }; - }, []); - - return { status, contentLength, downloaded }; -}; - -const UPDATE_CHECK_INTERVAL = 1000 * 60 * 60; // 1 hour - -export const useHandleUpdate = () => { - const [isLoading, setIsLoading] = useState(false); - const setIsAfterAutoUpdate = useAppStateStore((s) => s.setIsAfterAutoUpdate); - const setDialogToShow = useUIStore((s) => s.setDialogToShow); - - const handleClose = useCallback(() => { - setDialogToShow(null); - setIsAfterAutoUpdate(true); - }, [setIsAfterAutoUpdate, setDialogToShow]); - - const handleUpdate = useCallback(async () => { - setIsLoading(true); - await installUpdate(); - console.info('Installing latest version of Tari Universe'); - try { - console.info('Restarting application after update'); - await invoke('restart_application', { shouldStopMiners: false }); - } catch (e) { - console.error('Relaunch error', e); - } - handleClose(); - }, [handleClose]); - - return { handleUpdate, isLoading, handleClose }; -}; - -export function useUpdateListener() { - const initialCheck = useRef(false); - const setLatestVersion = useUIStore((s) => s.setLatestVersion); - const auto_update = useAppConfigStore((s) => s.auto_update); - const setIsAfterAutoUpdate = useAppStateStore((s) => s.setIsAfterAutoUpdate); - const setDialogToShow = useUIStore((s) => s.setDialogToShow); - - const { handleUpdate, isLoading } = useHandleUpdate(); - const checkUpdateTariUniverse = useCallback(async () => { - if (isLoading) return; - try { - const { shouldUpdate, manifest } = await checkUpdate(); - if (shouldUpdate) { - console.info('New Tari Universe version available', manifest); - if (manifest?.version) { - setLatestVersion(manifest?.version); - } - if (auto_update) { - console.info('Proceed with auto-update'); - await handleUpdate(); - } - setDialogToShow('autoUpdate'); - } else { - setIsAfterAutoUpdate(true); - } - } catch (error) { - console.error('AutoUpdate error:', error); - setIsAfterAutoUpdate(true); - } - }, [auto_update, handleUpdate, isLoading, setDialogToShow, setIsAfterAutoUpdate, setLatestVersion]); - - useInterval(() => checkUpdateTariUniverse(), UPDATE_CHECK_INTERVAL); - - useEffect(() => { - const unlistenPromise = onUpdaterEvent(({ error, status }) => { - // This will log all updater events, including status updates and errors. - console.info('Updater event', error, status); - }); - return () => { - unlistenPromise?.then((unlisten) => unlisten()); - }; - }, [checkUpdateTariUniverse]); - - useEffect(() => { - if (initialCheck.current) return; - initialCheck.current = true; - - checkUpdateTariUniverse(); - }, [checkUpdateTariUniverse]); -} diff --git a/src/hooks/useVersions.ts b/src/hooks/useVersions.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/store/appStateStore.ts b/src/store/appStateStore.ts index 9854bafef..47065e268 100644 --- a/src/store/appStateStore.ts +++ b/src/store/appStateStore.ts @@ -1,14 +1,12 @@ import { ApplicationsVersions, CriticalProblem, ExternalDependency } from '@app/types/app-status'; import { setAnimationState } from '@app/visuals'; import { create } from './create'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { useAppConfigStore } from './useAppConfigStore'; import { useMiningStore } from './useMiningStore'; import { addToast } from '@app/components/ToastStack/useToastStore'; interface AppState { - isAfterAutoUpdate: boolean; - setIsAfterAutoUpdate: (value: boolean) => void; criticalError?: string; setCriticalError: (value: string | undefined) => void; error?: string; @@ -38,8 +36,6 @@ interface AppState { } export const useAppStateStore = create()((set, getState) => ({ - isAfterAutoUpdate: false, - setIsAfterAutoUpdate: (value: boolean) => set({ isAfterAutoUpdate: value }), criticalError: undefined, setCriticalError: (criticalError) => set({ criticalError }), error: undefined, @@ -64,7 +60,6 @@ export const useAppStateStore = create()((set, getState) => ({ isSettingUp: true, setIsSettingUp: (value: boolean) => set({ isSettingUp: value }), setSettingUpFinished: async () => { - set({ isSettingUp: false }); setAnimationState('showVisual'); // Proceed with auto mining when enabled @@ -73,6 +68,7 @@ export const useAppStateStore = create()((set, getState) => ({ const startMining = useMiningStore.getState().startMining; await startMining(); } + set({ isSettingUp: false }); }, applications_versions: undefined, fetchApplicationsVersions: async () => { diff --git a/src/store/useAirdropStore.ts b/src/store/useAirdropStore.ts index 011936dc1..84bab011b 100644 --- a/src/store/useAirdropStore.ts +++ b/src/store/useAirdropStore.ts @@ -1,6 +1,6 @@ import { createWithEqualityFn as create } from 'zustand/traditional'; import { persist } from 'zustand/middleware'; -import { invoke } from '@tauri-apps/api/tauri'; +import { invoke } from '@tauri-apps/api/core'; import { useMiningStore } from './useMiningStore'; export const GIFT_GEMS = 5000; @@ -197,7 +197,7 @@ export const useAirdropStore = create()( } }, setReferralCount: (referralCount) => set({ referralCount }), - setUserPoints: (userPoints) => set({ userPoints }), + setUserPoints: (userPoints) => set({ userPoints, referralCount: userPoints?.referralCount }), setUserGems: (userGems: number) => set((state) => { const userPointsFormatted = { diff --git a/src/store/useAppConfigStore.ts b/src/store/useAppConfigStore.ts index 82b0d8c00..adeefed24 100644 --- a/src/store/useAppConfigStore.ts +++ b/src/store/useAppConfigStore.ts @@ -1,4 +1,4 @@ -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { create } from './create'; import { AppConfig, GpuThreads } from '../types/app-status.ts'; import { useAppStateStore } from './appStateStore.ts'; @@ -34,6 +34,7 @@ interface Actions { setVisualMode: (enabled: boolean) => void; setShowExperimentalSettings: (showExperimentalSettings: boolean) => Promise; setP2poolStatsServerPort: (port: number | null) => Promise; + setPreRelease: (preRelease: boolean) => Promise; } type AppConfigStoreState = State & Actions; @@ -63,6 +64,7 @@ const initialState: State = { custom_max_gpu_usage: [], show_experimental_settings: false, p2pool_stats_server_port: null, + pre_release: false, }; export const useAppConfigStore = create()((set, getState) => ({ @@ -301,4 +303,13 @@ export const useAppConfigStore = create()((set, getState) = set({ p2pool_stats_server_port: port }); }); }, + setPreRelease: async (preRelease) => { + set({ pre_release: preRelease }); + invoke('set_pre_release', { preRelease }).catch((e) => { + const appStateStore = useAppStateStore.getState(); + console.error('Could not set pre release', e); + appStateStore.setError('Could not change pre release'); + set({ pre_release: !preRelease }); + }); + }, })); diff --git a/src/store/useBlockchainVisualisationStore.ts b/src/store/useBlockchainVisualisationStore.ts index 02c9816d2..c682c4cab 100644 --- a/src/store/useBlockchainVisualisationStore.ts +++ b/src/store/useBlockchainVisualisationStore.ts @@ -2,11 +2,12 @@ import { Transaction } from '@app/types/wallet'; import { create } from './create'; import { useMiningStore } from './useMiningStore.ts'; -import { appWindow } from '@tauri-apps/api/window'; +import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow'; import { BlockTimeData } from '@app/types/mining.ts'; import { setAnimationState } from '@app/visuals.ts'; import { TransactionInfo } from '@app/types/app-status.ts'; -import { useWalletStore } from '@app/store/useWalletStore.ts'; +import { useWalletStore } from './useWalletStore.ts'; +const appWindow = getCurrentWebviewWindow(); interface Recap { count: number; diff --git a/src/store/useMiningStore.ts b/src/store/useMiningStore.ts index de80cf0b8..19cb329c3 100644 --- a/src/store/useMiningStore.ts +++ b/src/store/useMiningStore.ts @@ -1,7 +1,7 @@ import { GpuThreads, MaxConsumptionLevels, MinerMetrics } from '@app/types/app-status'; import { create } from './create'; import * as Sentry from '@sentry/react'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { useAppStateStore } from './appStateStore'; import { useAppConfigStore } from './useAppConfigStore'; import { modeType } from './types'; diff --git a/src/store/useP2poolStatsStore.ts b/src/store/useP2poolStatsStore.ts index 615c1eb85..e7cd7c3f1 100644 --- a/src/store/useP2poolStatsStore.ts +++ b/src/store/useP2poolStatsStore.ts @@ -1,4 +1,4 @@ -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { create } from './create'; import { P2poolConnections, P2poolStats, P2poolStatsResult } from '../types/app-status.ts'; diff --git a/src/store/useUIStore.ts b/src/store/useUIStore.ts index 3e200e808..d009c181c 100644 --- a/src/store/useUIStore.ts +++ b/src/store/useUIStore.ts @@ -18,7 +18,7 @@ interface State { showExternalDependenciesDialog: boolean; dialogToShow?: DialogType | null; isWebglNotSupported: boolean; - adminShow?: 'setup' | 'main' | 'shutdown' | null; + adminShow?: 'setup' | 'main' | 'shutdown' | 'orphanChainWarning' | null; } interface Actions { setTheme: (theme: Theme) => void; diff --git a/src/store/useWalletStore.ts b/src/store/useWalletStore.ts index accf43e1b..c9e83eda8 100644 --- a/src/store/useWalletStore.ts +++ b/src/store/useWalletStore.ts @@ -1,7 +1,7 @@ import { ALREADY_FETCHING } from '@app/App/sentryIgnore'; import { create } from './create'; import { WalletBalance } from '../types/app-status.ts'; -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; import { Transaction } from '@app/types/wallet.ts'; interface State extends WalletBalance { diff --git a/src/theme/palettes/light.ts b/src/theme/palettes/light.ts index 25e96d8cf..9f3d50cc4 100644 --- a/src/theme/palettes/light.ts +++ b/src/theme/palettes/light.ts @@ -69,7 +69,7 @@ const lightPalette: ThemePalette = { }, warning: { main: c.warning[400], - dark: c.warning[950], + dark: c.warning[800], light: c.warning[50], contrast: c.warning[300], wisp: colorsAlpha.warningDarkAlpha[5], diff --git a/src/types/app-status.ts b/src/types/app-status.ts index e6f336e78..84737ed6d 100644 --- a/src/types/app-status.ts +++ b/src/types/app-status.ts @@ -47,6 +47,7 @@ export interface AppConfig { monero_address_is_generated?: boolean; created_at: string; p2pool_stats_server_port: number | null; + pre_release: boolean; } export enum ExternalDependencyStatus { diff --git a/src/types/invoke.ts b/src/types/invoke.ts index ea0fa3b63..4f3041cb4 100644 --- a/src/types/invoke.ts +++ b/src/types/invoke.ts @@ -15,7 +15,7 @@ import { Language } from '@app/i18initializer'; import { PaperWalletDetails } from '@app/types/app-status.ts'; import { displayMode, modeType } from '@app/store/types.ts'; -declare module '@tauri-apps/api/tauri' { +declare module '@tauri-apps/api/core' { function invoke( param: 'set_should_always_use_system_language', payload: { shouldAlwaysUseSystemLanguage: boolean } @@ -72,6 +72,10 @@ declare module '@tauri-apps/api/tauri' { function invoke(param: 'fetch_tor_bridges'): Promise; function invoke(param: 'get_tor_entry_guards'): Promise; function invoke(param: 'set_visual_mode', payload: { enabled: boolean }): Promise; + function invoke(param: 'set_pre_release', payload: { preRelease: boolean }): Promise; + function invoke(param: 'proceed_with_update'): Promise; + function invoke(param: 'check_for_updates'): Promise; + function invoke(param: 'try_update', payload?: { force?: boolean }): Promise; function invoke( param: 'set_show_experimental_settings', payload: { showExperimentalSettings: boolean } diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 000000000..db5c61581 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,6 @@ +export * from './calculateTimeSince.ts'; +export * from './convertHex.ts'; +export * from './formatters.ts'; +export * from './shared-logger.ts'; +export * from './systray.ts'; +export * from './truncateString.ts'; diff --git a/src/utils/shared-logger.ts b/src/utils/shared-logger.ts index 15ba209b3..6365293e7 100644 --- a/src/utils/shared-logger.ts +++ b/src/utils/shared-logger.ts @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -import { invoke } from '@tauri-apps/api'; +import { invoke } from '@tauri-apps/api/core'; // Override console functions @@ -32,9 +32,11 @@ const getOptions = (args, level) => { return originalConsole[level](...args); }; -export const setupLogger = () => { +const setupLogger = () => { // Override console.log = (...args) => getOptions(args, 'log'); console.info = (...args) => getOptions(args, 'info'); console.error = (...args) => getOptions(args, 'error'); }; + +export default setupLogger; diff --git a/src/utils/systray.ts b/src/utils/systray.ts new file mode 100644 index 000000000..7a2e0a317 --- /dev/null +++ b/src/utils/systray.ts @@ -0,0 +1,96 @@ +import { Menu } from '@tauri-apps/api/menu'; +import { TrayIcon } from '@tauri-apps/api/tray'; +import { MenuItemOptions } from '@tauri-apps/api/menu/menuItem'; +import { PredefinedMenuItemOptions } from '@tauri-apps/api/menu/predefinedMenuItem'; +import { getCurrentWindow } from '@tauri-apps/api/window'; + +const TRAY_ID = 'universe-tray-id'; +const TRAY_MENU_ID = 'universe-tray-menu-id'; + +export const CPU_HASH_ITEM_ID = 'cpu_hashrate'; +export const GPU_HASH_ITEM_ID = 'gpu_hashrate'; +export const EARNINGS_ITEM_ID = 'estimated_earning'; +export const UNMINIMIZE_ITEM_ID = 'unminimize'; +export const MINIMIZE_ITEM_ID = 'minimize'; + +const about = { + item: { About: null }, +} as PredefinedMenuItemOptions; +const separator = { + item: 'Separator', +} as PredefinedMenuItemOptions; + +const currentWindow = getCurrentWindow(); + +async function handleMinimize(itemId: string): Promise { + if (itemId === UNMINIMIZE_ITEM_ID) { + await currentWindow.unminimize(); + } + + if (itemId === MINIMIZE_ITEM_ID) { + await currentWindow.minimize(); + } +} + +// TODO use translations +const dynamicItems = [ + { + id: CPU_HASH_ITEM_ID, + text: `CPU Hashrate: -`, + enabled: false, + }, + { + id: GPU_HASH_ITEM_ID, + text: `GPU Hashrate: -`, + enabled: false, + }, + separator, + { + id: EARNINGS_ITEM_ID, + text: `Est earning: -`, + enabled: false, + }, + separator, + { + id: UNMINIMIZE_ITEM_ID, + text: 'Uninimize', + enabled: false, + action: handleMinimize, + }, + { + id: MINIMIZE_ITEM_ID, + text: 'Minimize', + enabled: true, + action: handleMinimize, + }, +] as MenuItemOptions[]; + +let tray: TrayIcon | null; +let menu: Menu; + +export async function initSystray() { + try { + menu = await Menu.new({ + id: TRAY_MENU_ID, + items: [about, separator, ...dynamicItems], + }); + } catch (e) { + console.error('Menu error: ', e); + } + + try { + tray = await TrayIcon.getById(TRAY_ID); + } catch (e) { + console.error('TrayIcon error: ', e); + } + + try { + if (tray && menu) { + await tray?.setMenu(menu); + } + } catch (e) { + console.error('Set TrayIcon Menu error: ', e); + } +} + +export { tray, menu };