diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..77f9381 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,93 @@ +name: Bug/Crash Report +description: Create a bug or crash report for Vesktop. +labels: [bug] +title: "[Bug] " + +body: + - type: markdown + attributes: + value: | + GitHub Issues are for development, not support! + + Vesktop and Vencord are two separate things. This issue tracker is only for Vesktop. If your Vesktop crashes, it is very likely an issue with Vencord, not Vesktop. + + If you are experiencing any of the following issues, go to our [Discord server](https://discord.gg/D9uwnFnqmd) for support: + - Vesktop doesn't work or crashes + - A Vencord plugin doesn't work anymore + - You are having issues installing Vesktop + - You want to ask a question about Vesktop, Vencord or one of its plugins + + - type: input + id: vesktop-version + attributes: + label: Vesktop Version + placeholder: e.g. 1.6.7 + validations: + required: true + + - type: input + id: os + attributes: + label: Operating System + placeholder: e.g. Windows 11, macOS Tahoe, Fedora Linux 44 (GNOME), Arch Linux (Hyprland) + validations: + required: true + + - type: input + id: install-method + attributes: + label: Install Method + placeholder: e.g. Setup exe, dmg, Flatpak, rpm, vesktop-git AUR + validations: + required: true + + - type: textarea + id: bug-description + attributes: + label: What happens when the bug or crash occurs? + description: Where does this bug or crash occur, when does it occur, etc. + placeholder: The bug/crash happens sometimes when I do ..., causing this to not work/the app to crash. I think it happens because of ... + validations: + required: true + + - type: textarea + id: expected-behaviour + attributes: + label: What is the expected behaviour? + description: Simply detail what the expected behaviour is. + placeholder: I expect Vesktop/Discord to open the ... page instead of ..., it prevents me from doing ... + validations: + required: true + + - type: textarea + id: steps-to-take + attributes: + label: How do you recreate this bug or crash? + description: Give us a list of steps in order to recreate the bug or crash. + placeholder: | + 1. Do ... + 2. Then ... + 3. Do this ..., ... and then ... + 4. Observe "the bug" or "the crash" + validations: + required: true + + - type: textarea + id: crash-log + attributes: + label: Errors + render: text + description: Open the Developer Console with `Ctrl+Shift+i` / `Cmd+Option+i`. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them. Run Vesktop from the command line to get console output and also paste that here + validations: + required: false + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + description: We only accept reports for bugs that happen on official builds on Discord Stable. Canary and PTB are Development branches and may be unstable + options: + - label: I've searched existing issues and this hasn't been reported before + - label: I installed Vesktop via an official method (download from vesktop.dev or from source), not via something like Nix packages + - label: This is not a support request + - label: I am willing to submit a fix for this myself diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 471fd51..9e96e5f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,11 @@ blank_issues_enabled: false contact_links: - - name: Vencord Support Server - url: https://discord.gg/D9uwnFnqmd - about: "Need Help? Join our support server and ask in the #vesktop-support channel!" + - name: 💬 Discord Community + url: https://discord.gg/D9uwnFnqmd + about: For plugin requests, support questions, and general help - join our Discord server + - name: 🔌 Plugin Requests + url: https://discord.gg/D9uwnFnqmd + about: Want a new plugin? Request it in our Discord community, not here + - name: ❓ Support & Questions + url: https://discord.gg/D9uwnFnqmd + about: Need help? Ask in our Discord server for faster responses diff --git a/.github/ISSUE_TEMPLATE/dev-issue.yml b/.github/ISSUE_TEMPLATE/dev-issue.yml deleted file mode 100644 index 501989b..0000000 --- a/.github/ISSUE_TEMPLATE/dev-issue.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Vesktop Developer Issue -description: Reserved for Vesktop Developers. Join our support server for support. - -body: - - type: markdown - attributes: - value: | - # This form is reserved for Vesktop Developers. Do not open an issue. - - Instead, use the [#vesktop-support channel](https://discord.com/channels/1015060230222131221/1345457031426871417) on our [Discord server](https://vencord.dev/discord) for help and reporting issues. - - Your issue will be closed immediately with no comment and you will be blocked if you ignore this. - - This is because 99% of issues are not actually bugs, but rather user or system issues and it adds a lot of noise to our development process. - - type: textarea - id: content - attributes: - label: Content - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..2a8d59f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,45 @@ +name: Feature Request +description: Have an idea for a new feature? Request it here! No plugin requests, go to our Discord server for that +labels: [enhancement] +title: "[Feature] <title>" + +body: + - type: markdown + attributes: + value: | + This form is not for any of the following: + - Plugin requests — Go to our [Discord server](https://discord.gg/D9uwnFnqmd) for that + - Feature requests for plugins — Go to our [Discord server](https://discord.gg/D9uwnFnqmd) for that + + - type: textarea + id: feature-description + attributes: + label: A clear and concise description of the feature you'd like to see + validations: + required: true + + - type: textarea + id: implementation-notes + attributes: + label: Implementation Notes + description: If you have ideas about how this could be implemented technically, share them here + validations: + required: false + + - type: textarea + id: additional-context + attributes: + label: Additional context + description: Screenshots, mockups, examples from other apps, etc. + validations: + required: false + + - type: checkboxes + id: agreement-check + attributes: + label: Request Agreement + options: + - label: I've searched existing issues and this hasn't been suggested before + - label: This is a **core modification feature**, not a plugin request (those go in Discord) + - label: This feature would benefit most users, not just a specific use case + - label: I am willing to work on this myself diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..fc8ae34 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,12 @@ +<!-- +We do not accept PRs that were created by AI. You will be permanently blocked with no further warning if you submit AI generated PRs. +Also do not use AI in communication, it makes me ill +--> + +## Describe your Changes + +## Screenshots (if applicable) + +## Checklist before submitting +<!-- Hint: [x] this is how to check boxes --> +- [ ] This pull request was written by me, and not an AI agent diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 6b03113..989d226 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -1,9 +1,6 @@ -name: Update metainfo on release +name: Upload release metainfo on: - release: - types: - - published workflow_dispatch: permissions: @@ -15,10 +12,22 @@ jobs: steps: - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - name: Get latest tag + id: latest_tag + run: | + tag=$(git tag --sort=-creatordate | head -n1) + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Checkout latest tag + run: git checkout "${{ steps.latest_tag.outputs.tag }}" + - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 @@ -27,12 +36,11 @@ jobs: - name: Update metainfo run: pnpm generateMeta - - - name: Commit and merge in changes - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - gh release upload "${{ github.event.release.tag_name }}" dist/dev.vencord.Vesktop.metainfo.xml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload metainfo to release + run: | + gh release upload "${{ steps.latest_tag.outputs.tag }}" dist/dev.vencord.Vesktop.metainfo.xml env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee14c98..db5c06b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 cache: "pnpm" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bdfef7f..69f0458 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json - name: Use Node.js 24 - uses: actions/setup-node@v6 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 24 cache: "pnpm" diff --git a/package.json b/package.json index ec7e229..4020f98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vesktop", - "version": "1.6.5", + "version": "1.6.7", "private": true, "description": "Vesktop is a custom Discord desktop app", "keywords": [], @@ -22,42 +22,40 @@ "test": "pnpm lint && pnpm testTypes", "testTypes": "tsc --noEmit", "watch": "pnpm build --watch", - "generateMeta": "tsx scripts/utils/generateMeta.mts", - "updateArrpcDB": "node ./node_modules/arrpc/update_db.js", - "postinstall": "pnpm updateArrpcDB" + "generateMeta": "tsx scripts/utils/generateMeta.mts" }, "dependencies": { - "arrpc": "github:OpenAsar/arrpc#2234e9c9111f4c42ebcc3aa6a2215bfd979eef77", + "arrpc": "github:Vencord/arrpc#82ece7442564d725d8202a8bb9bed5903ee85026", "electron-updater": "6.6.2" }, "optionalDependencies": { - "@vencord/venmic": "^6.1.0" + "@vencord/venmic": "^7.2.3" }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", "@stylistic/eslint-plugin": "^5.10.0", - "@types/node": "^26.0.1", + "@types/node": "^26.2.0", "@types/react": "19.2.9", - "@vencord/types": "^1.14.1", + "@vencord/types": "^1.15.1", "dotenv": "^17.3.1", - "electron": "^43.0.0", + "electron": "43.2.0", "electron-builder": "^26.15.3", - "esbuild": "^0.28.1", - "eslint": "^10.6.0", + "esbuild": "^0.28.2", + "eslint": "^10.8.1", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "^2.1.0", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", "eslint-plugin-simple-header": "^1.2.2", - "eslint-plugin-simple-import-sort": "^13.0.0", + "eslint-plugin-simple-import-sort": "^14.0.0", "eslint-plugin-unused-imports": "^4.4.1", "libvesktop": "link:packages/libvesktop", - "prettier": "^3.9.4", + "prettier": "^3.9.6", "source-map-support": "^0.5.21", - "tsx": "^4.22.4", - "type-fest": "^5.7.0", + "tsx": "^4.23.12", + "type-fest": "^5.8.0", "typescript": "^6.0.3", - "typescript-eslint": "^8.62.1", + "typescript-eslint": "^8.67.0", "xml-formatter": "^3.6.7" }, "packageManager": "pnpm@11.9.0", diff --git a/patches/arrpc@3.5.0.patch b/patches/arrpc@3.5.0.patch deleted file mode 100644 index baae84c..0000000 --- a/patches/arrpc@3.5.0.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/src/process/index.js b/src/process/index.js -index 389b0845256a34b4536d6da99edb00d17f13a6b4..f17a0ac687e9110ebfd33cb91fd2f6250d318643 100644 ---- a/src/process/index.js -+++ b/src/process/index.js -@@ -5,8 +5,20 @@ import fs from 'node:fs'; - import { dirname, join } from 'path'; - import { fileURLToPath } from 'url'; - --const __dirname = dirname(fileURLToPath(import.meta.url)); --const DetectableDB = JSON.parse(fs.readFileSync(join(__dirname, 'detectable.json'), 'utf8')); -+const DetectableDB = require('./detectable.json'); -+DetectableDB.push( -+ { -+ aliases: ["Obs"], -+ executables: [ -+ { is_launcher: false, name: "obs", os: "linux" }, -+ { is_launcher: false, name: "obs.exe", os: "win32" }, -+ { is_launcher: false, name: "obs.app", os: "darwin" } -+ ], -+ hook: true, -+ id: "STREAMERMODE", -+ name: "OBS" -+ } -+); - - import * as Natives from './native/index.js'; - const Native = Natives[process.platform]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4cb06d8..a5bb8e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - arrpc@3.5.0: 4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4 electron-updater: 080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887 importers: @@ -13,91 +12,91 @@ importers: .: dependencies: arrpc: - specifier: github:OpenAsar/arrpc#2234e9c9111f4c42ebcc3aa6a2215bfd979eef77 - version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4) + specifier: github:Vencord/arrpc#82ece7442564d725d8202a8bb9bed5903ee85026 + version: https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026 electron-updater: specifier: 6.6.2 - version: 6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887) + version: 6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887)(supports-color@7.2.0) devDependencies: '@fal-works/esbuild-plugin-global-externals': specifier: ^2.1.2 version: 2.1.2 '@stylistic/eslint-plugin': specifier: ^5.10.0 - version: 5.10.0(eslint@10.6.0(jiti@2.7.0)) + version: 5.10.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@types/node': - specifier: ^26.0.1 - version: 26.0.1 + specifier: ^26.2.0 + version: 26.2.0 '@types/react': specifier: 19.2.9 version: 19.2.9 '@vencord/types': - specifier: ^1.14.1 - version: 1.14.1(@types/react-dom@18.3.1)(@types/react@19.2.9) + specifier: ^1.15.1 + version: 1.15.1(@types/react-dom@18.3.1)(@types/react@19.2.9) dotenv: specifier: ^17.3.1 version: 17.4.2 electron: - specifier: ^43.0.0 - version: 43.0.0 + specifier: 43.2.0 + version: 43.2.0(supports-color@7.2.0) electron-builder: specifier: ^26.15.3 - version: 26.15.3(electron-builder-squirrel-windows@26.15.3) + version: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) esbuild: - specifier: ^0.28.1 - version: 0.28.1 + specifier: ^0.28.2 + version: 0.28.2 eslint: - specifier: ^10.6.0 - version: 10.6.0(jiti@2.7.0) + specifier: ^10.8.1 + version: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)) eslint-plugin-path-alias: specifier: ^2.1.0 - version: 2.1.0(eslint@10.6.0(jiti@2.7.0)) + version: 2.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint@10.6.0(jiti@2.7.0))(prettier@3.9.4) + version: 5.5.6(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@10.6.0(jiti@2.7.0)) + version: 7.37.5(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-simple-header: specifier: ^1.2.2 - version: 1.2.2(eslint@10.6.0(jiti@2.7.0)) + version: 1.2.2(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-simple-import-sort: - specifier: ^13.0.0 - version: 13.0.0(eslint@10.6.0(jiti@2.7.0)) + specifier: ^14.0.0 + version: 14.0.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) eslint-plugin-unused-imports: specifier: ^4.4.1 - version: 4.4.1(@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) + version: 4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) libvesktop: specifier: link:packages/libvesktop version: link:packages/libvesktop prettier: - specifier: ^3.9.4 - version: 3.9.4 + specifier: ^3.9.6 + version: 3.9.6 source-map-support: specifier: ^0.5.21 version: 0.5.21 tsx: - specifier: ^4.22.4 - version: 4.22.4 + specifier: ^4.23.12 + version: 4.23.12 type-fest: - specifier: ^5.7.0 - version: 5.7.0 + specifier: ^5.8.0 + version: 5.8.0 typescript: specifier: ^6.0.3 version: 6.0.3 typescript-eslint: - specifier: ^8.62.1 - version: 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.67.0 + version: 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) xml-formatter: specifier: ^3.6.7 version: 3.7.0 optionalDependencies: '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 + specifier: ^7.2.3 + version: 7.2.3(supports-color@7.2.0) packages/libvesktop: devDependencies: @@ -106,12 +105,12 @@ importers: version: 8.9.0 node-gyp: specifier: ^11.4.2 - version: 11.5.0 + version: 11.5.0(supports-color@7.2.0) packages: - '@electron-internal/extract-zip@1.0.4': - resolution: {integrity: sha512-Zr1Vs7E9tpCNhZHDAbFVXc2gEVCG9RqPDjrno5+bdgB6LRAuvgyMHJut4NCVyYwtAieapMzc3fiQ3CSTi75ARg==} + '@electron-internal/extract-zip@1.0.5': + resolution: {integrity: sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==} engines: {node: '>=22.12.0'} '@electron/asar@3.4.1': @@ -127,8 +126,8 @@ packages: resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} engines: {node: '>=14'} - '@electron/get@5.0.0': - resolution: {integrity: sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==} + '@electron/get@5.1.0': + resolution: {integrity: sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==} engines: {node: '>=22.12.0'} '@electron/notarize@2.5.0': @@ -154,162 +153,168 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -324,8 +329,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -461,20 +466,17 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + '@types/lodash@4.17.19': + resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.20.0': - resolution: {integrity: sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==} + '@types/node@24.13.3': + resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/node@24.13.2': - resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} - - '@types/node@26.0.1': - resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} '@types/react-dom@18.3.1': resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} @@ -485,39 +487,39 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@typescript-eslint/eslint-plugin@8.62.1': - resolution: {integrity: sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==} + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.62.1 + '@typescript-eslint/parser': ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.62.1': - resolution: {integrity: sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==} + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.62.1': - resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.62.1': - resolution: {integrity: sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==} + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.62.1': - resolution: {integrity: sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==} + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.62.1': - resolution: {integrity: sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==} + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -527,42 +529,47 @@ packages: resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.62.1': - resolution: {integrity: sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==} + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.62.1': - resolution: {integrity: sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==} + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.62.1': - resolution: {integrity: sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==} + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vencord/discord-types@1.0.1': - resolution: {integrity: sha512-uSQMDUTo9hMFgOMykNtTMTxScSKVVUHHFCevktO3bMyaLh1s3iDMfIvUvqU1fBkmFwvMbmEYsUrztsVKKHvang==} + '@vencord/discord-types@1.0.2': + resolution: {integrity: sha512-nq3YZebbv085/FsFcKhoVBCs9U9QuAEPy1noL9x9Bb5B29TdhQqr/hJCcApSWjY8J299+tLi30LEe0YGo3yn0Q==} peerDependencies: - '@types/react': ^19.0.10 + '@types/react': 19.1.0 - '@vencord/types@1.14.1': - resolution: {integrity: sha512-P4eYl3IJKXLjAWH2Ejs2/z8eOS0LsuTNFqL9OHXQRXtOWoAEYNG6z9MXH25Thr/dIUH839IZCW872XjOSVIauQ==} + '@vencord/types@1.15.1': + resolution: {integrity: sha512-69hnv7kLzMhHWyIAQ9WE3gIXE1kf4wl9bioBVk7nRxZomDHeYUwTPA5r6MnJcAts52IcupZfswi/gUxRBSnrtg==} peerDependencies: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 - '@vencord/venmic@6.1.0': - resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} + '@vencord/venmic@7.2.3': + resolution: {integrity: sha512-57ei2g+mSJidLf8B2SSYPbHBsh5SS/Y08IWqkJ2+uWaj66qnWLPQjtJ2TslczgZqbVwE1JvYxCNTR1zVJGLW9A==} engines: {node: '>=14.15'} os: [linux] '@xmldom/xmldom@0.8.13': resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} @@ -674,9 +681,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77: - resolution: {gitHosted: true, tarball: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77} - version: 3.5.0 + arrpc@https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026: + resolution: {gitHosted: true, integrity: sha512-2Tj4F1K+WEmu2gOLZC3Do8NtIPlMhLFvA2OrlE3lOV/HV9Lf8i5KboRv+NWv86zyrlCMzZUSVnzjYKPKuP3Ssw==, tarball: https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026} + version: 3.7.0 hasBin: true asn1js@3.0.10: @@ -717,8 +724,8 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axios@1.18.1: - resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -747,9 +754,9 @@ packages: brace-expansion@2.1.1: resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1035,8 +1042,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@43.0.0: - resolution: {integrity: sha512-PV60GsWU6qufhuOhw3n+Yix3WPDcqDtBqE8orbEQGQGHEkgp9o/JCPgb7L4vIL0r1HnfPdqSRtboOTqbDkcFDQ==} + electron@43.2.0: + resolution: {integrity: sha512-80zvrgG7ZRXD+tD0IyLvrnN9n+veSxadMRsMaC9wKKP3iUbtC7rGM8+dVuCmOb0Rrwwv8ESW4awnUZh9Hbp1fA==} engines: {node: '>= 22.12.0'} hasBin: true @@ -1102,8 +1109,8 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -1185,8 +1192,8 @@ packages: peerDependencies: eslint: '>=8.41.0' - eslint-plugin-simple-import-sort@13.0.0: - resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} + eslint-plugin-simple-import-sort@14.0.0: + resolution: {integrity: sha512-NUJO0+XFCkk+o5EsAJruTgnfMEpeWrPWeJS15UVF60GgXmqz1BJ9/3hzlvG7lkL8Bubzos5cCLptThbFfPnSMQ==} peerDependencies: eslint: '>=5.0.0' @@ -1215,8 +1222,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.6.0: - resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1311,8 +1318,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -1351,8 +1358,8 @@ packages: resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} - fs-extra@11.3.6: - resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -1908,8 +1915,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -1979,6 +1986,9 @@ packages: engines: {node: '>=10'} hasBin: true + moment@2.22.2: + resolution: {integrity: sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw==} + moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -2007,6 +2017,10 @@ packages: resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} engines: {node: ^18 || ^20 || >= 21} + node-addon-api@8.9.2: + resolution: {integrity: sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==} + engines: {node: ^18 || ^20 || >= 21} + node-api-headers@1.9.0: resolution: {integrity: sha512-2oNILP4jXwRB4ywnYKjVk1YyJ96n2D4EOVJO6S3oYZ5PtbJrw3Yt9TpAuX3nBLMuzn74rnfGQrv13pS9vC+YiA==} @@ -2191,8 +2205,8 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.9.4: - resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -2620,8 +2634,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.12: + resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} engines: {node: '>=18.0.0'} hasBin: true @@ -2633,12 +2647,8 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - type-fest@5.7.0: - resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} engines: {node: '>=20'} typed-array-buffer@1.0.3: @@ -2657,8 +2667,8 @@ packages: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.62.1: - resolution: {integrity: sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==} + typescript-eslint@8.67.0: + resolution: {integrity: sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2673,9 +2683,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -2686,8 +2693,8 @@ packages: resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} - undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} union-value@1.0.1: @@ -2793,8 +2800,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2842,7 +2849,7 @@ packages: snapshots: - '@electron-internal/extract-zip@1.0.4': {} + '@electron-internal/extract-zip@1.0.5': {} '@electron/asar@3.4.1': dependencies: @@ -2856,45 +2863,45 @@ snapshots: fs-extra: 9.1.0 minimist: 1.2.8 - '@electron/get@3.1.0': + '@electron/get@3.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 semver: 6.3.1 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: global-agent: 3.0.0 transitivePeerDependencies: - supports-color - '@electron/get@5.0.0': + '@electron/get@5.1.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) env-paths: 3.0.0 graceful-fs: 4.2.11 progress: 2.0.3 semver: 7.8.5 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@7.2.0) optionalDependencies: - undici: 7.28.0 + undici: 7.29.0 transitivePeerDependencies: - supports-color - '@electron/notarize@2.5.0': + '@electron/notarize@2.5.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.3': + '@electron/osx-sign@1.3.3(supports-color@7.2.0)': dependencies: compare-version: 0.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -2902,134 +2909,139 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/rebuild@4.0.6': + '@electron/rebuild@4.0.6(supports-color@7.2.0)': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) node-abi: 4.32.0 node-api-version: 0.2.1 node-gyp: 12.4.0 - read-binary-file-arch: 1.0.6 + read-binary-file-arch: 1.0.6(supports-color@7.2.0) transitivePeerDependencies: - supports-color - '@electron/universal@2.0.3': + '@electron/universal@2.0.3(supports-color@7.2.0)': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) dir-compare: 4.2.0 - fs-extra: 11.3.6 + fs-extra: 11.4.0 minimatch: 9.0.9 plist: 3.1.0 transitivePeerDependencies: - supports-color - '@electron/windows-sign@1.2.2': + '@electron/windows-sign@1.2.2(supports-color@7.2.0)': dependencies: cross-dirname: 0.1.0 - debug: 4.4.3 - fs-extra: 11.3.6 + debug: 4.4.3(supports-color@7.2.0) + fs-extra: 11.4.0 minimist: 1.2.8 postject: 1.0.0-alpha.6 transitivePeerDependencies: - supports-color optional: true - '@esbuild/aix-ppc64@0.28.1': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.28.1': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.28.1': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.28.1': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.28.1': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.28.1': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.28.1': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.28.1': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.28.1': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.28.1': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.28.1': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.28.1': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.28.1': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.28.1': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.28.1': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.28.1': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.28.1': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.28.1': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.28.1': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.28.1': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.28.1': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.28.1': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.28.1': + '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.28.1': + '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.28.1': + '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.28.1': + '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': + dependencies: + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@7.2.0)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.5 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -3079,9 +3091,9 @@ snapshots: dependencies: cross-spawn: 7.0.6 - '@malept/flatpak-bundler@0.4.0': + '@malept/flatpak-bundler@0.4.0(supports-color@7.2.0)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 9.1.0 lodash: 4.18.1 tmp-promise: 3.0.3 @@ -3092,13 +3104,13 @@ snapshots: '@noble/hashes@2.2.0': {} - '@npmcli/agent@3.0.0': + '@npmcli/agent@3.0.0(supports-color@7.2.0)': dependencies: agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) lru-cache: 10.4.3 - socks-proxy-agent: 8.0.5 + socks-proxy-agent: 8.0.5(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -3137,11 +3149,11 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.6.0(jiti@2.7.0))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@typescript-eslint/types': 8.62.1 - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -3155,7 +3167,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 26.0.1 + '@types/node': 26.2.0 '@types/responselike': 1.0.3 '@types/debug@4.1.13': @@ -3168,7 +3180,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 '@types/http-cache-semantics@4.2.0': {} @@ -3178,21 +3190,17 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 - '@types/lodash@4.17.15': {} + '@types/lodash@4.17.19': {} '@types/ms@2.1.0': {} - '@types/node@22.20.0': - dependencies: - undici-types: 6.21.0 - - '@types/node@24.13.2': + '@types/node@24.13.3': dependencies: undici-types: 7.18.2 - '@types/node@26.0.1': + '@types/node@26.2.0': dependencies: undici-types: 8.3.0 @@ -3206,17 +3214,17 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 26.0.1 + '@types/node': 26.2.0 - '@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/type-utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3224,43 +3232,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.62.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - debug: 4.4.3 + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.62.1': + '@typescript-eslint/scope-manager@8.67.0': dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.62.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + debug: 4.4.3(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -3268,14 +3276,16 @@ snapshots: '@typescript-eslint/types@8.62.1': {} - '@typescript-eslint/typescript-estree@8.62.1(typescript@6.0.3)': + '@typescript-eslint/types@8.67.0': {} + + '@typescript-eslint/typescript-estree@8.67.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.62.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@6.0.3) - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/visitor-keys': 8.62.1 - debug: 4.4.3 - minimatch: 10.2.5 + '@typescript-eslint/project-service': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3283,44 +3293,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.62.1 - '@typescript-eslint/types': 8.62.1 - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.62.1': + '@typescript-eslint/visitor-keys@8.67.0': dependencies: - '@typescript-eslint/types': 8.62.1 + '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 - '@vencord/discord-types@1.0.1(@types/react@19.2.9)': + '@vencord/discord-types@1.0.2(@types/react@19.2.9)': dependencies: '@types/react': 19.2.9 - moment: 2.30.1 - type-fest: 4.41.0 + moment: 2.22.2 + type-fest: 5.8.0 - '@vencord/types@1.14.1(@types/react-dom@18.3.1)(@types/react@19.2.9)': + '@vencord/types@1.15.1(@types/react-dom@18.3.1)(@types/react@19.2.9)': dependencies: - '@types/lodash': 4.17.15 - '@types/node': 22.20.0 + '@types/lodash': 4.17.19 + '@types/node': 26.2.0 '@types/react': 19.2.9 '@types/react-dom': 18.3.1 - '@vencord/discord-types': 1.0.1(@types/react@19.2.9) + '@vencord/discord-types': 1.0.2(@types/react@19.2.9) highlight.js: 11.11.1 moment: 2.30.1 ts-pattern: 5.9.0 - type-fest: 4.41.0 + type-fest: 5.8.0 - '@vencord/venmic@6.1.0': + '@vencord/venmic@7.2.3(supports-color@7.2.0)': dependencies: - cmake-js: 7.4.0 - node-addon-api: 8.9.0 + cmake-js: 7.4.0(supports-color@7.2.0) + node-addon-api: 8.9.2 pkg-prebuilds: 0.2.1 transitivePeerDependencies: - supports-color @@ -3338,9 +3348,9 @@ snapshots: acorn@8.17.0: {} - agent-base@6.0.2: + agent-base@6.0.2(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color optional: true @@ -3371,33 +3381,33 @@ snapshots: ansi-styles@6.2.3: {} - app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3): + app-builder-lib@26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.0.6 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 + '@electron/get': 3.1.0(supports-color@7.2.0) + '@electron/notarize': 2.5.0(supports-color@7.2.0) + '@electron/osx-sign': 1.3.3(supports-color@7.2.0) + '@electron/rebuild': 4.0.6(supports-color@7.2.0) + '@electron/universal': 2.0.3(supports-color@7.2.0) + '@malept/flatpak-bundler': 0.4.0(supports-color@7.2.0) '@noble/hashes': 2.2.0 '@peculiar/webcrypto': 1.7.1 '@types/fs-extra': 9.0.13 ajv: 8.20.0 asn1js: 3.0.10 async-exit-hook: 2.0.1 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chromium-pickle-js: 0.2.0 ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) + debug: 4.4.3(supports-color@7.2.0) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3) - electron-publish: 26.15.3 + electron-builder-squirrel-windows: 26.15.3(dmg-builder@26.15.3)(supports-color@7.2.0) + electron-publish: 26.15.3(supports-color@7.2.0) fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.7 @@ -3405,7 +3415,7 @@ snapshots: js-yaml: 4.3.0 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.2.5 + minimatch: 10.2.6 pkijs: 3.4.0 plist: 3.1.0 proper-lockfile: 4.1.2 @@ -3503,9 +3513,9 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=4313fe844324a52ef0453078a86f5d1ee2d4f406331201211020d9fa243323c4): + arrpc@https://codeload.github.com/Vencord/arrpc/tar.gz/82ece7442564d725d8202a8bb9bed5903ee85026: dependencies: - ws: 8.21.0 + ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -3536,11 +3546,11 @@ snapshots: aws4@1.13.2: {} - axios@1.18.1(debug@4.4.3): + axios@1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - follow-redirects: 1.16.0(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3(supports-color@7.2.0)) form-data: 4.0.6 - https-proxy-agent: 5.0.1 + https-proxy-agent: 5.0.1(supports-color@7.2.0) proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -3577,36 +3587,36 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.7: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 buffer-from@1.1.2: {} - builder-util-runtime@9.3.1: + builder-util-runtime@9.3.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) sax: 1.6.0 transitivePeerDependencies: - supports-color - builder-util-runtime@9.7.0: + builder-util-runtime@9.7.0(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) sax: 1.6.0 transitivePeerDependencies: - supports-color - builder-util@26.15.3: + builder-util@26.15.3(supports-color@7.2.0): dependencies: '@types/debug': 4.1.13 - builder-util-runtime: 9.7.0 + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@7.2.0) + https-proxy-agent: 7.0.6(supports-color@7.2.0) js-yaml: 4.3.0 sanitize-filename: 1.6.4 source-map-support: 0.5.21 @@ -3707,11 +3717,11 @@ snapshots: dependencies: mimic-response: 1.0.1 - cmake-js@7.4.0: + cmake-js@7.4.0(supports-color@7.2.0): dependencies: - axios: 1.18.1(debug@4.4.3) - debug: 4.4.3 - fs-extra: 11.3.6 + axios: 1.20.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + debug: 4.4.3(supports-color@7.2.0) + fs-extra: 11.4.0 memory-stream: 1.0.0 node-api-headers: 1.9.0 npmlog: 6.0.2 @@ -3790,17 +3800,23 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debug@2.6.9: + debug@2.6.9(supports-color@7.2.0): dependencies: ms: 2.0.0 + optionalDependencies: + supports-color: 7.2.0 - debug@3.2.7: + debug@3.2.7(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 - debug@4.4.3: + debug@4.4.3(supports-color@7.2.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 7.2.0 decode-uri-component@0.2.2: {} @@ -3853,10 +3869,10 @@ snapshots: minimatch: 3.1.5 p-limit: 3.1.0 - dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): + dmg-builder@26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.0 transitivePeerDependencies: @@ -3891,23 +3907,23 @@ snapshots: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3): + electron-builder-squirrel-windows@26.15.3(dmg-builder@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - electron-winstaller: 5.4.0 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) + electron-winstaller: 5.4.0(supports-color@7.2.0) transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3): + electron-builder@26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0): dependencies: - app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3) - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + app-builder-lib: 26.15.3(dmg-builder@26.15.3)(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3) + dmg-builder: 26.15.3(electron-builder-squirrel-windows@26.15.3)(supports-color@7.2.0) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -3916,12 +3932,12 @@ snapshots: - electron-builder-squirrel-windows - supports-color - electron-publish@26.15.3: + electron-publish@26.15.3(supports-color@7.2.0): dependencies: '@types/fs-extra': 9.0.13 aws4: 1.13.2 - builder-util: 26.15.3 - builder-util-runtime: 9.7.0 + builder-util: 26.15.3(supports-color@7.2.0) + builder-util-runtime: 9.7.0(supports-color@7.2.0) chalk: 4.1.2 form-data: 4.0.6 fs-extra: 10.1.0 @@ -3930,9 +3946,9 @@ snapshots: transitivePeerDependencies: - supports-color - electron-updater@6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887): + electron-updater@6.6.2(patch_hash=080505564abb2ebbda932bbf8fe91540c74dd905de994888d52ffce6f882f887)(supports-color@7.2.0): dependencies: - builder-util-runtime: 9.3.1 + builder-util-runtime: 9.3.1(supports-color@7.2.0) fs-extra: 10.1.0 js-yaml: 4.3.0 lazy-val: 1.0.5 @@ -3943,23 +3959,23 @@ snapshots: transitivePeerDependencies: - supports-color - electron-winstaller@5.4.0: + electron-winstaller@5.4.0(supports-color@7.2.0): dependencies: '@electron/asar': 3.4.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) fs-extra: 7.0.1 lodash: 4.18.1 temp: 0.9.4 optionalDependencies: - '@electron/windows-sign': 1.2.2 + '@electron/windows-sign': 1.2.2(supports-color@7.2.0) transitivePeerDependencies: - supports-color - electron@43.0.0: + electron@43.2.0(supports-color@7.2.0): dependencies: - '@electron-internal/extract-zip': 1.0.4 - '@electron/get': 5.0.0 - '@types/node': 24.13.2 + '@electron-internal/extract-zip': 1.0.5 + '@electron/get': 5.1.0(supports-color@7.2.0) + '@types/node': 24.13.3 transitivePeerDependencies: - supports-color @@ -4096,73 +4112,73 @@ snapshots: es6-error@4.1.1: optional: true - esbuild@0.28.1: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - eslint-import-resolver-node@0.3.10: + eslint-import-resolver-node@0.3.10(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) is-core-module: 2.16.2 resolve: 2.0.0-next.7 transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.6.0(jiti@2.7.0)): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7 + debug: 3.2.7(supports-color@7.2.0) doctrine: 2.1.0 - eslint: 10.6.0(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.6.0(jiti@2.7.0)) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -4174,29 +4190,29 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-path-alias@2.1.0(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-path-alias@2.1.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) find-pkg: 2.0.0 get-tsconfig: 4.14.0 - nanomatch: 1.2.13 + nanomatch: 1.2.13(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.5.6(eslint@10.6.0(jiti@2.7.0))(prettier@3.9.4): + eslint-plugin-prettier@5.5.6(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(prettier@3.9.6): dependencies: - eslint: 10.6.0(jiti@2.7.0) - prettier: 3.9.4 + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) + prettier: 3.9.6 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 - eslint-plugin-react@7.37.5(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4204,7 +4220,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.3 - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -4218,19 +4234,19 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-header@1.2.2(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-simple-header@1.2.2(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-simple-import-sort@13.0.0(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-simple-import-sort@14.0.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)): dependencies: - eslint: 10.6.0(jiti@2.7.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint-scope@9.1.2: dependencies: @@ -4245,12 +4261,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.6.0(jiti@2.7.0): + eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 + '@eslint/config-array': 0.23.5(supports-color@7.2.0) + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -4259,7 +4275,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -4274,7 +4290,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.5 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -4358,14 +4374,14 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 - flatted@3.4.2: {} + flatted@3.4.4: {} - follow-redirects@1.16.0(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3(supports-color@7.2.0)): optionalDependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) optional: true for-each@0.3.5: @@ -4403,7 +4419,7 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.3.6: + fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -4633,10 +4649,10 @@ snapshots: http-cache-semantics@4.2.0: {} - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4645,18 +4661,18 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: + https-proxy-agent@5.0.1(supports-color@7.2.0): dependencies: - agent-base: 6.0.2 - debug: 4.4.3 + agent-base: 6.0.2(supports-color@7.2.0) + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color optional: true - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -4962,9 +4978,9 @@ snapshots: dependencies: yallist: 4.0.0 - make-fetch-happen@14.0.3: + make-fetch-happen@14.0.3(supports-color@7.2.0): dependencies: - '@npmcli/agent': 3.0.0 + '@npmcli/agent': 3.0.0(supports-color@7.2.0) cacache: 19.0.1 http-cache-semantics: 4.2.0 minipass: 7.1.3 @@ -5008,9 +5024,9 @@ snapshots: mimic-response@3.1.0: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.8 minimatch@3.1.5: dependencies: @@ -5081,13 +5097,15 @@ snapshots: mkdirp@1.0.4: optional: true + moment@2.22.2: {} + moment@2.30.1: {} ms@2.0.0: {} ms@2.1.3: {} - nanomatch@1.2.13: + nanomatch@1.2.13(supports-color@7.2.0): dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -5098,7 +5116,7 @@ snapshots: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2 + snapdragon: 0.8.2(supports-color@7.2.0) to-regex: 3.0.2 transitivePeerDependencies: - supports-color @@ -5113,6 +5131,9 @@ snapshots: node-addon-api@8.9.0: {} + node-addon-api@8.9.2: + optional: true + node-api-headers@1.9.0: optional: true @@ -5127,12 +5148,12 @@ snapshots: object.entries: 1.1.9 semver: 6.3.1 - node-gyp@11.5.0: + node-gyp@11.5.0(supports-color@7.2.0): dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 14.0.3 + make-fetch-happen: 14.0.3(supports-color@7.2.0) nopt: 8.1.0 proc-log: 5.0.0 semver: 7.8.5 @@ -5320,7 +5341,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.9.4: {} + prettier@3.9.6: {} proc-log@5.0.0: {} @@ -5375,9 +5396,9 @@ snapshots: react-is@16.13.1: {} - read-binary-file-arch@1.0.6: + read-binary-file-arch@1.0.6(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5602,10 +5623,10 @@ snapshots: smart-buffer@4.2.0: {} - snapdragon@0.8.2: + snapdragon@0.8.2(supports-color@7.2.0): dependencies: base: 0.11.2 - debug: 2.6.9 + debug: 2.6.9(supports-color@7.2.0) define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -5615,10 +5636,10 @@ snapshots: transitivePeerDependencies: - supports-color - socks-proxy-agent@8.0.5: + socks-proxy-agent@8.0.5(supports-color@7.2.0): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) socks: 2.8.9 transitivePeerDependencies: - supports-color @@ -5749,9 +5770,9 @@ snapshots: strip-json-comments@2.0.1: optional: true - sumchecker@3.0.1: + sumchecker@3.0.1(supports-color@7.2.0): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: - supports-color @@ -5842,9 +5863,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.22.4: + tsx@4.23.12: dependencies: - esbuild: 0.28.1 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 @@ -5855,9 +5876,7 @@ snapshots: type-fest@0.13.1: optional: true - type-fest@4.41.0: {} - - type-fest@5.7.0: + type-fest@5.8.0: dependencies: tagged-tag: 1.0.0 @@ -5894,13 +5913,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.62.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.6.0(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.67.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5914,15 +5933,13 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} - undici-types@7.18.2: {} undici-types@8.3.0: {} undici@6.27.0: {} - undici@7.28.0: + undici@7.29.0: optional: true union-value@1.0.1: @@ -6058,7 +6075,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.0: {} + ws@8.21.3: {} xml-formatter@3.7.0: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 23f5fc8..bdc4996 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,4 @@ patchedDependencies: - arrpc@3.5.0: patches/arrpc@3.5.0.patch electron-updater: patches/electron-updater.patch nodeLinker: hoisted allowBuilds: @@ -13,4 +12,5 @@ recursiveInstall: false packages: - packages/* minimumReleaseAgeExclude: - - electron \ No newline at end of file + - electron + - '@vencord/*' diff --git a/scripts/utils/generateMeta.mts b/scripts/utils/generateMeta.mts index 486f657..9120a2a 100644 --- a/scripts/utils/generateMeta.mts +++ b/scripts/utils/generateMeta.mts @@ -46,7 +46,8 @@ function generateDescription(description: string, descriptionNode: Element) { const releases = await fetch("https://api.github.com/repos/Vencord/Vesktop/releases", { headers: { Accept: "application/vnd.github+json", - "X-Github-Api-Version": "2022-11-28" + "X-Github-Api-Version": "2022-11-28", + Authorization: `Bearer ${process.env.GITHUB_TOKEN}` } }).then(res => res.json()); diff --git a/src/main/arrpc/index.ts b/src/main/arrpc/index.ts index d4d663d..a190fae 100644 --- a/src/main/arrpc/index.ts +++ b/src/main/arrpc/index.ts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { resolve } from "path"; +import { SESSION_DATA_DIR } from "main/constants"; +import { join, resolve } from "path"; import { IpcCommands } from "shared/IpcEvents"; import { MessageChannel, Worker } from "worker_threads"; @@ -19,6 +20,8 @@ const inviteCodeRegex = /^(\w|-)+$/; export async function initArRPC() { if (worker || !Settings.store.arRPC) return; + process.env.ARRPC_DETECTABLE_CACHE_PATH = join(SESSION_DATA_DIR, "arrpc-detectable-db.json"); + try { const { port1: hostPort, port2: workerPort } = new MessageChannel(); diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 395540b..aee11f3 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -149,7 +149,7 @@ handle(IpcEvents.SELECT_VENCORD_DIR, async (_e, value?: null) => { if (!res.filePaths.length) return "cancelled"; const dir = res.filePaths[0]; - if (!isValidVencordInstall(dir)) return "invalid"; + if (!(await isValidVencordInstall(dir))) return "invalid"; State.store.vencordDir = dir; diff --git a/src/main/main.ts b/src/main/main.ts index 37ea561..3d5fea2 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -46,7 +46,7 @@ function init() { app.commandLine.removeSwitch("enable-features"); app.commandLine.removeSwitch("disable-features"); - if (hardwareAcceleration === false || process.argv.includes("--disable-gpu")) { + if (!hardwareAcceleration || process.argv.includes("--disable-gpu")) { enableHardwareAcceleration = false; app.disableHardwareAcceleration(); } else { @@ -65,29 +65,14 @@ function init() { app.commandLine.appendSwitch("disable-smooth-scrolling"); } - // disable renderer backgrounding to prevent the app from unloading when in the background - // https://github.com/electron/electron/issues/2822 - // https://github.com/GoogleChrome/chrome-launcher/blob/5a27dd574d47a75fec0fb50f7b774ebf8a9791ba/docs/chrome-flags-for-tools.md#task-throttling - app.commandLine.appendSwitch("disable-renderer-backgrounding"); - app.commandLine.appendSwitch("disable-background-timer-throttling"); - app.commandLine.appendSwitch("disable-backgrounding-occluded-windows"); - if (process.platform === "win32") { - disabledFeatures.add("CalculateNativeWinOcclusion"); - } - // work around chrome 66 disabling autoplay by default app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required"); - // WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows. - // HardwareMediaKeyHandling, MediaSessionService: Prevent Discord from registering as a media service. - disabledFeatures.add("WinRetrieveSuggestionsOnlyOnDemand"); + // Prevent Discord from registering as a media service. disabledFeatures.add("HardwareMediaKeyHandling"); disabledFeatures.add("MediaSessionService"); if (isLinux) { - // Support TTS on Linux using https://wiki.archlinux.org/title/Speech_dispatcher - app.commandLine.appendSwitch("enable-speech-dispatcher"); - // This is needed to fix washed out colours - https://github.com/electron/electron/issues/49566 // Supposed to be fixed already according to comments there, but it's just not lol, I can repro on Electron 43.0.0 // when moving the window from my main monitor (HDR - not sure if this is relevant lol) to second monitor (SDR) and back @@ -99,8 +84,8 @@ function init() { disabledFeatures.forEach(feat => enabledFeatures.delete(feat)); - const enabledFeaturesArray = enabledFeatures.values().filter(Boolean).toArray(); - const disabledFeaturesArray = disabledFeatures.values().filter(Boolean).toArray(); + const enabledFeaturesArray = [...enabledFeatures].filter(Boolean); + const disabledFeaturesArray = [...disabledFeatures].filter(Boolean); if (enabledFeaturesArray.length) { app.commandLine.appendSwitch("enable-features", enabledFeaturesArray.join(",")); diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 979629d..08bfe2e 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -156,6 +156,25 @@ function initMenuBar(win: BrowserWindow) { accelerator: "CmdOrCtrl+=", role: "zoomIn", visible: false + }, + // numpad zooms + { + label: "Zoom in (hidden)", + accelerator: "CmdOrCtrl+numadd", + role: "zoomIn", + visible: false + }, + { + label: "Zoom out (hidden)", + accelerator: "CmdOrCtrl+numsub", + role: "zoomOut", + visible: false + }, + { + label: "Reset Zoom (hidden)", + accelerator: "CmdOrCtrl+num0", + role: "resetZoom", + visible: false } ] satisfies MenuItemList; @@ -312,17 +331,24 @@ function getWindowBoundsOptions(): BrowserWindowConstructorOptions { } function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { - const { staticTitle, transparencyOption, enableMenu, customTitleBar, splashTheming, splashBackground } = - Settings.store; + const { + staticTitle, + transparencyOption, + enableMenu, + enableShadow, + enableRoundedCorners, + nativeTitleBar, + splashTheming, + splashBackground + } = Settings.store; - const { frameless, transparent, macosVibrancyStyle } = VencordSettings.store; + const { transparent, macosVibrancyStyle } = VencordSettings.store; - const noFrame = frameless === true || customTitleBar === true; - const backgroundColor = - splashTheming !== false ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; + const frameless = !nativeTitleBar; + const backgroundColor = splashTheming ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; const options: BrowserWindowConstructorOptions = { - show: Settings.store.enableSplashScreen === false && !CommandLine.values["start-minimized"], + show: !Settings.store.enableSplashScreen && !CommandLine.values["start-minimized"], backgroundColor, webPreferences: { nodeIntegration: false, @@ -334,8 +360,10 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { // disable renderer backgrounding to prevent the app from unloading when in the background backgroundThrottling: false }, - frame: !noFrame, + frame: !frameless, autoHideMenuBar: enableMenu, + hasShadow: enableShadow, + roundedCorners: enableRoundedCorners, ...getWindowBoundsOptions() }; @@ -348,7 +376,7 @@ function buildBrowserWindowOptions(): BrowserWindowConstructorOptions { options.backgroundColor = "#00000000"; options.backgroundMaterial = transparencyOption; - if (customTitleBar) { + if (frameless) { options.transparent = true; } } @@ -378,10 +406,10 @@ function createMainWindow() { const win = (mainWin = new BrowserWindow(buildBrowserWindowOptions())); win.setMenuBarVisibility(false); - if (process.platform === "darwin" && Settings.store.customTitleBar) win.setWindowButtonVisibility(false); + if (process.platform === "darwin" && Settings.store.nativeTitleBar) win.setWindowButtonVisibility(false); win.on("close", e => { - const useTray = !isDeckGameMode && Settings.store.minimizeToTray !== false && Settings.store.tray !== false; + const useTray = !isDeckGameMode && Settings.store.minimizeToTray && Settings.store.tray; if (isQuitting || (process.platform !== "darwin" && !useTray)) return; e.preventDefault(); @@ -441,7 +469,7 @@ export async function createWindows() { const startMinimized = CommandLine.values["start-minimized"]; let splash: BrowserWindow | undefined; - if (Settings.store.enableSplashScreen !== false) { + if (Settings.store.enableSplashScreen) { splash = createSplashWindow(startMinimized); // SteamOS letterboxes and scales it terribly, so just full screen it diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index a96b1ce..019fbe0 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -5,6 +5,7 @@ */ import { desktopCapturer, session, Streams } from "electron"; +import { release } from "os"; import type { StreamPick } from "renderer/components/ScreenSharePicker"; import { IpcCommands, IpcEvents } from "shared/IpcEvents"; @@ -14,6 +15,8 @@ import { handle } from "./utils/ipcWrappers"; const isWayland = process.platform === "linux" && (process.env.XDG_SESSION_TYPE === "wayland" || !!process.env.WAYLAND_DISPLAY); +const supportsLoopbackWithoutChrome = process.platform === "win32" && Number(release().split(".").pop()) >= 19045; + export function registerScreenShareHandler() { handle(IpcEvents.CAPTURER_GET_LARGE_THUMBNAIL, async (_, id: string) => { const sources = await desktopCapturer.getSources({ @@ -78,7 +81,10 @@ export function registerScreenShareHandler() { const streams: Streams = { video: source }; - if (choice.audio && process.platform === "win32") streams.audio = "loopback"; + if (choice.audio && process.platform === "win32") { + // @ts-expect-error loopbackWithoutChrome is real but not documented + streams.audio = supportsLoopbackWithoutChrome ? "loopbackWithoutChrome" : "loopback"; + } callback(streams); }); diff --git a/src/main/settings.ts b/src/main/settings.ts index f23cbe5..267e2bf 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -7,15 +7,17 @@ import { type Settings as TVencordSettings } from "@vencord/types/Vencord"; import { mkdirSync, readFileSync, writeFileSync } from "fs"; import { dirname, join } from "path"; +import { DefaultVesktopSettings } from "shared/defaultSettings"; import type { Settings as TSettings, State as TState } from "shared/settings"; import { SettingsStore } from "shared/utils/SettingsStore"; import { DATA_DIR, VENCORD_SETTINGS_FILE } from "./constants"; +import { mergeDefaults } from "./utils/mergeDefaults"; const SETTINGS_FILE = join(DATA_DIR, "settings.json"); const STATE_FILE = join(DATA_DIR, "state.json"); -function loadSettings<T extends object = any>(file: string, name: string) { +function loadSettings<T extends object = any>(file: string, name: string, defaults?: T) { let settings = {} as T; try { const content = readFileSync(file, "utf8"); @@ -26,6 +28,10 @@ function loadSettings<T extends object = any>(file: string, name: string) { } } catch {} + if (defaults) { + mergeDefaults(settings, defaults); + } + const store = new SettingsStore(settings); store.addGlobalChangeListener(o => { try { @@ -39,6 +45,6 @@ function loadSettings<T extends object = any>(file: string, name: string) { return store; } -export const Settings = loadSettings<TSettings>(SETTINGS_FILE, "Vesktop settings"); +export const Settings = loadSettings<TSettings>(SETTINGS_FILE, "Vesktop settings", DefaultVesktopSettings); export const VencordSettings = loadSettings<TVencordSettings>(VENCORD_SETTINGS_FILE, "Vencord settings"); export const State = loadSettings<TState>(STATE_FILE, "Vesktop state"); diff --git a/src/main/splash.ts b/src/main/splash.ts index cfc7746..e11ec9d 100644 --- a/src/main/splash.ts +++ b/src/main/splash.ts @@ -26,7 +26,7 @@ export function createSplashWindow(startMinimized = false) { const { splashBackground, splashColor, splashTheming, splashPixelated } = Settings.store; - if (splashTheming !== false) { + if (splashTheming) { if (splashColor) { const semiTransparentSplashColor = splashColor.replace("rgb(", "rgba(").replace(")", ", 0.2)"); diff --git a/src/main/utils/mergeDefaults.ts b/src/main/utils/mergeDefaults.ts new file mode 100644 index 0000000..58f52b6 --- /dev/null +++ b/src/main/utils/mergeDefaults.ts @@ -0,0 +1,24 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2026 Vendicated and Vesktop contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/** + * Recursively merges defaults into an object and returns the same object + * @param obj Object + * @param defaults Defaults + * @returns obj + */ +export function mergeDefaults<T>(obj: T, defaults: T): T { + for (const key in defaults) { + const v = defaults[key]; + if (typeof v === "object" && !Array.isArray(v) && v !== null) { + obj[key] ??= {} as any; + mergeDefaults(obj[key], v); + } else { + obj[key] ??= v; + } + } + return obj; +} diff --git a/src/main/utils/popout.ts b/src/main/utils/popout.ts index dd26896..fc81466 100644 --- a/src/main/utils/popout.ts +++ b/src/main/utils/popout.ts @@ -37,7 +37,7 @@ const DEFAULT_POPOUT_OPTIONS: BrowserWindowConstructorOptions = { backgroundColor: "#2f3136", minWidth: MIN_POPOUT_WIDTH, minHeight: MIN_POPOUT_HEIGHT, - frame: Settings.store.customTitleBar !== true, + frame: Settings.store.nativeTitleBar, titleBarStyle: process.platform === "darwin" ? "hidden" : undefined, trafficLightPosition: process.platform === "darwin" diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts index 25748b3..f02e00d 100644 --- a/src/main/utils/vencordLoader.ts +++ b/src/main/utils/vencordLoader.ts @@ -64,7 +64,7 @@ const existsAsync = (path: string) => .catch(() => false); export async function isValidVencordInstall(dir: string) { - const results = await Promise.all(["package.json", ...FILES_TO_DOWNLOAD].map(f => existsAsync(join(dir, f)))); + const results = await Promise.all(FILES_TO_DOWNLOAD.map(f => existsAsync(join(dir, f)))); return !results.includes(false); } diff --git a/src/main/venmic.ts b/src/main/venmic.ts index b6a0d08..80192c5 100644 --- a/src/main/venmic.ts +++ b/src/main/venmic.ts @@ -66,70 +66,60 @@ function getRendererAudioServicePid() { ); } +function buildLinkData({ include, exclude }: { include?: Node[]; exclude?: Node[] }) { + const pid = getRendererAudioServicePid(); + + const { mute, ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround, onlySpeakers, onlyDefaultSpeakers } = + Settings.store.audio ?? {}; + + const data: LinkData = { + mute: mute ?? true, + include: include ?? [], + exclude: exclude ?? [], + only_speakers: onlySpeakers, + ignore_devices: ignoreDevices, + only_default_speakers: onlyDefaultSpeakers + }; + + data.exclude.push({ "application.process.id": pid }); + + if (ignoreInputMedia ?? true) { + data.exclude.push({ "media.class": "Stream/Input/Audio" }); + } + + if (ignoreVirtual) { + data.exclude.push({ "node.virtual": "true" }); + } + + if (workaround) { + data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; + } + + return data; +} + ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => { const audioPid = getRendererAudioServicePid(); const { granularSelect } = Settings.store.audio ?? {}; const targets = obtainVenmic() - ?.list(granularSelect ? ["node.name"] : undefined) + ?.list(granularSelect ? [] : ["application.name", "node.name"]) .filter(s => s["application.process.id"] !== audioPid); return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated }; }); ipcMain.handle(IpcEvents.VIRT_MIC_START, (_, include: Node[]) => { - const pid = getRendererAudioServicePid(); - const { ignoreDevices, ignoreInputMedia, ignoreVirtual, workaround } = Settings.store.audio ?? {}; - - const data: LinkData = { - include, - exclude: [{ "application.process.id": pid }], - ignore_devices: ignoreDevices - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); + return obtainVenmic()?.link(buildLinkData({ include })); }); ipcMain.handle(IpcEvents.VIRT_MIC_START_SYSTEM, (_, exclude: Node[]) => { - const pid = getRendererAudioServicePid(); + return obtainVenmic()?.link(buildLinkData({ exclude })); +}); - const { workaround, ignoreDevices, ignoreInputMedia, ignoreVirtual, onlySpeakers, onlyDefaultSpeakers } = - Settings.store.audio ?? {}; - - const data: LinkData = { - include: [], - exclude: [{ "application.process.id": pid }, ...exclude], - only_speakers: onlySpeakers, - ignore_devices: ignoreDevices, - only_default_speakers: onlyDefaultSpeakers - }; - - if (ignoreInputMedia ?? true) { - data.exclude.push({ "media.class": "Stream/Input/Audio" }); - } - - if (ignoreVirtual) { - data.exclude.push({ "node.virtual": "true" }); - } - - if (workaround) { - data.workaround = [{ "application.process.id": pid, "media.name": "RecordStream" }]; - } - - return obtainVenmic()?.link(data); +ipcMain.handle(IpcEvents.VIRT_MIC_UNMUTE, () => { + return obtainVenmic()?.unmute(); }); ipcMain.handle(IpcEvents.VIRT_MIC_STOP, () => obtainVenmic()?.unlink()); diff --git a/src/main/vesktopProtocol.ts b/src/main/vesktopProtocol.ts index c05f5fe..7d18740 100644 --- a/src/main/vesktopProtocol.ts +++ b/src/main/vesktopProtocol.ts @@ -23,3 +23,16 @@ app.whenReady().then(() => { } }); }); + +protocol.registerSchemesAsPrivileged([ + { + scheme: "vesktop", + privileges: { + standard: true, + secure: true, + supportFetchAPI: true, + corsEnabled: true, + stream: true + } + } +]); diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index e11fae7..1dd6710 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -92,6 +92,7 @@ export const VesktopNative = { >(IpcEvents.VIRT_MIC_LIST), start: (include: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START, include), startSystem: (exclude: Node[]) => invoke<void>(IpcEvents.VIRT_MIC_START_SYSTEM, exclude), + unmute: () => invoke<void>(IpcEvents.VIRT_MIC_UNMUTE), stop: () => invoke<void>(IpcEvents.VIRT_MIC_STOP) }, clipboard: { diff --git a/src/renderer/appBadge.ts b/src/renderer/appBadge.ts index 97f3e36..bc9983f 100644 --- a/src/renderer/appBadge.ts +++ b/src/renderer/appBadge.ts @@ -14,7 +14,7 @@ let GuildReadStateStore: any; let NotificationSettingsStore: any; export function setBadge() { - if (Settings.store.appBadge === false) return; + if (!Settings.store.appBadge) return; try { const mentionCount = GuildReadStateStore.getTotalMentionCount(); diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index a5fb8a0..69d8d63 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -8,7 +8,6 @@ import "./screenSharePicker.css"; import { classNameFactory } from "@vencord/types/api/Styles"; import { - BaseText, Button, Card, CogWheel, @@ -20,18 +19,18 @@ import { RestartIcon, Span } from "@vencord/types/components"; +import { Logger, useAwaiter, useForceUpdater } from "@vencord/types/utils"; +import { onceReady } from "@vencord/types/webpack"; import { closeModal, - Logger, - ModalCloseButton, - Modals, - ModalSize, + FluxDispatcher, + MediaEngineStore, + Modal, openModal, - useAwaiter, - useForceUpdater -} from "@vencord/types/utils"; -import { onceReady } from "@vencord/types/webpack"; -import { FluxDispatcher, MediaEngineStore, Select, UserStore, useState } from "@vencord/types/webpack/common"; + Select, + UserStore, + useState +} from "@vencord/types/webpack/common"; import { Node } from "@vencord/venmic"; import type { Dispatch, SetStateAction } from "react"; import { addPatch } from "renderer/patches/shared"; @@ -122,15 +121,25 @@ addPatch({ if (isLinux) { onceReady.then(() => { - FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { - const owner = streamKey.split(":").at(-1); + const ownsStream = (streamKey: string) => { + return streamKey.split(":").at(-1) === UserStore.getCurrentUser().id; + }; - if (owner !== UserStore.getCurrentUser().id) { + FluxDispatcher.subscribe("STREAM_CLOSE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { return; } VesktopNative.virtmic.stop(); }); + + FluxDispatcher.subscribe("STREAM_UPDATE", ({ streamKey }: { streamKey: string }) => { + if (!ownsStream(streamKey)) { + return; + } + + VesktopNative.virtmic.unmute(); + }); }); } @@ -210,15 +219,20 @@ function AudioSettingsModal({ const Settings = useSettings(); return ( - <Modals.ModalRoot {...modalProps} size={ModalSize.MEDIUM}> - <Modals.ModalHeader className={cl("header")}> - <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> - Audio Settings - </BaseText> - <ModalCloseButton onClick={close} /> - </Modals.ModalHeader> - - <Modals.ModalContent className={cl("modal", "venmic-settings")}> + <Modal + {...modalProps} + size="lg" + title="Audio Settings" + actions={[{ text: "Back", variant: "secondary", onClick: close }]} + > + <div className={cl("venmic-settings")}> + <FormSwitch + title="Initial Mute" + description="Fix an initial audio spike caused by chromium." + hideBorder + onChange={v => (Settings.audio = { ...Settings.audio, mute: v })} + value={Settings.audio?.mute ?? true} + /> <FormSwitch title="Microphone Workaround" description="Work around an issue that causes the microphone to be shared instead of the correct audio. Only enable if you're experiencing this issue." @@ -302,13 +316,8 @@ function AudioSettingsModal({ value={Settings.audio?.deviceSelect ?? false} disabled={Settings.audio?.ignoreDevices} /> - </Modals.ModalContent> - <Modals.ModalFooter className={cl("footer")}> - <Button variant="secondary" onClick={close}> - Back - </Button> - </Modals.ModalFooter> - </Modals.ModalRoot> + </div> + </Modal> ); } @@ -455,78 +464,61 @@ function isSpecialSource(value?: AudioSource | AudioSources): value is SpecialSo return typeof value === "string"; } -function hasMatchingProps(value: Node, other: Node) { - return Object.keys(value).every(key => value[key] === other[key]); -} - function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] { if (isSpecialSource(node)) { return [{ name: node, value: node }]; } - const rtn: AudioItem[] = []; - const mediaClass = node["media.class"]; if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) { - return rtn; + return []; } if (!deviceSelect && node["device.id"]) { - return rtn; + return []; } - const name = node["application.name"]; + const preferred = ["application.name", "node.description", "node.name", "application.process.binary"] as const; + const prop = preferred.find(prop => node[prop]); - if (name) { - rtn.push({ name: name, value: { "application.name": name } }); + if (!prop) { + return []; } + const name = node[prop]!; + const items: AudioItem[] = [{ name: name, value: { [prop]: name } }]; + if (!granularSelect) { - return rtn; + return items; } - const rawName = node["node.name"]; + let granularName = name; + const granularProps: Node = { [prop]: name }; - if (!name) { - rtn.push({ name: rawName, value: { "node.name": rawName } }); - } + const append = (name: string, brackets: string) => { + const value = node[name]; - const binary = node["application.process.binary"]; + if (!value) { + return; + } - if (!name && binary) { - rtn.push({ name: binary, value: { "application.process.binary": binary } }); - } + granularName += ` ${brackets[0]}${value}${brackets[1]}`; + granularProps[name] = value; + }; - const pid = node["application.process.id"]; + append("application.process.id", "<>"); + append("application.process.binary", "()"); + append("media.name", "[]"); - const first = rtn[0]; - const firstValues = first.value as Node; + items.push({ name: granularName, value: granularProps }); - if (pid) { - rtn.push({ - name: `${first.name} (${pid})`, - value: { ...firstValues, "application.process.id": pid } - }); - } + return items; +} - const mediaName = node["media.name"]; - - if (mediaName) { - rtn.push({ - name: `${first.name} [${mediaName}]`, - value: { ...firstValues, "media.name": mediaName } - }); - } - - if (mediaClass) { - rtn.push({ - name: `${first.name} [${mediaClass}]`, - value: { ...firstValues, "media.class": mediaClass } - }); - } - - return rtn; +function hasMatchingProps(value: Node, other: Node) { + const keys = Object.keys(value); + return keys.length === Object.keys(other).length && keys.every(key => value[key] === other[key]); } function isItemSelected(sources?: AudioSources) { @@ -655,9 +647,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(includeSources)} select={updateItems(setIncludeSources, includeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> @@ -675,9 +668,10 @@ function AudioSourcePickerLinux({ }))} isSelected={isItemSelected(excludeSources)} select={updateItems(setExcludeSources, excludeSources)} - serialize={String} + serialize={JSON.stringify} popoutPosition="top" closeOnSelect={false} + renderOptionLabel={o => o.label} /> </SimpleErrorBoundary> </section> @@ -721,101 +715,91 @@ function ModalComponent({ frameRate: "30" }); + function handleGoLive() { + currentSettings = settings; + try { + const frameRate = Number(qualitySettings.frameRate); + const height = Number(qualitySettings.resolution); + const width = Math.round(height * (16 / 9)); + + const conn = [...MediaEngineStore.getMediaEngine().connections].find( + connection => connection.streamUserId === UserStore.getCurrentUser().id + ); + + if (conn) { + conn.videoStreamParameters[0].maxFrameRate = frameRate; + conn.videoStreamParameters[0].maxResolution ??= { width: 0, height: 0 }; + conn.videoStreamParameters[0].maxResolution.height = height; + conn.videoStreamParameters[0].maxResolution.width = width; + } + + submit({ + id: selected!, + ...settings + }); + + setTimeout(async () => { + const conn = [...MediaEngineStore.getMediaEngine().connections].find( + connection => connection.streamUserId === UserStore.getCurrentUser().id + ); + if (!conn) return; + + // @ts-expect-error incorrect type + const track = conn.input.stream.getVideoTracks()[0]; + + const constraints = { + ...track.getConstraints(), + frameRate: { min: frameRate, ideal: frameRate }, + width: { min: 640, ideal: width, max: width }, + height: { min: 480, ideal: height, max: height }, + advanced: [{ width: width, height: height }], + resizeMode: "none" + }; + + try { + await track.applyConstraints(constraints); + + logger.info("Applied constraints successfully. New constraints:", track.getConstraints()); + } catch (e) { + logger.error("Failed to apply constraints.", e); + } + }, 100); + } catch (error) { + logger.error("Error while submitting stream.", error); + } + + close(); + } + + const showGoBack = selected && !skipPicker; return ( - <Modals.ModalRoot {...modalProps} size={ModalSize.MEDIUM}> - <Modals.ModalHeader className={cl("header")}> - <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> - Screen Share Picker - </BaseText> - <ModalCloseButton onClick={close} /> - </Modals.ModalHeader> - <Modals.ModalContent className={cl("modal")}> - {!selected ? ( - <ScreenPicker screens={screens} chooseScreen={setSelected} /> - ) : ( - <StreamSettingsUi - source={screens.find(s => s.id === selected)!} - settings={settings} - setSettings={setSettings} - skipPicker={skipPicker} - /> - )} - </Modals.ModalContent> - <Modals.ModalFooter className={cl("footer")}> - <Button - disabled={!selected} - onClick={() => { - currentSettings = settings; - try { - const frameRate = Number(qualitySettings.frameRate); - const height = Number(qualitySettings.resolution); - const width = Math.round(height * (16 / 9)); - - const conn = [...MediaEngineStore.getMediaEngine().connections].find( - connection => connection.streamUserId === UserStore.getCurrentUser().id - ); - - if (conn) { - conn.videoStreamParameters[0].maxFrameRate = frameRate; - conn.videoStreamParameters[0].maxResolution ??= { width: 0, height: 0 }; - conn.videoStreamParameters[0].maxResolution.height = height; - conn.videoStreamParameters[0].maxResolution.width = width; - } - - submit({ - id: selected!, - ...settings - }); - - setTimeout(async () => { - const conn = [...MediaEngineStore.getMediaEngine().connections].find( - connection => connection.streamUserId === UserStore.getCurrentUser().id - ); - if (!conn) return; - - // @ts-expect-error incorrect type - const track = conn.input.stream.getVideoTracks()[0]; - - const constraints = { - ...track.getConstraints(), - frameRate: { min: frameRate, ideal: frameRate }, - width: { min: 640, ideal: width, max: width }, - height: { min: 480, ideal: height, max: height }, - advanced: [{ width: width, height: height }], - resizeMode: "none" - }; - - try { - await track.applyConstraints(constraints); - - logger.info( - "Applied constraints successfully. New constraints:", - track.getConstraints() - ); - } catch (e) { - logger.error("Failed to apply constraints.", e); - } - }, 100); - } catch (error) { - logger.error("Error while submitting stream.", error); - } - - close(); - }} - > - Go Live - </Button> - - {selected && !skipPicker ? ( - <Button variant="secondary" onClick={() => setSelected(void 0)}> - Back - </Button> - ) : ( - <Button variant="secondary" onClick={close}> - Cancel - </Button> - )} - </Modals.ModalFooter> - </Modals.ModalRoot> + <Modal + {...modalProps} + size="lg" + title="Screen Share Picker" + actions={[ + { + text: showGoBack ? "Back" : "Cancel", + variant: "secondary", + onClick: () => (showGoBack ? setSelected(void 0) : close()) + }, + { + text: "Go Live", + disabled: !selected, + onClick: handleGoLive + } + ]} + > + {!selected ? ( + <ScreenPicker screens={screens} chooseScreen={setSelected} /> + ) : ( + <StreamSettingsUi + source={screens.find(s => s.id === selected)!} + settings={settings} + setSettings={setSettings} + skipPicker={skipPicker} + /> + )} + </Modal> ); } diff --git a/src/renderer/components/screenSharePicker.css b/src/renderer/components/screenSharePicker.css index c00c622..d221c8d 100644 --- a/src/renderer/components/screenSharePicker.css +++ b/src/renderer/components/screenSharePicker.css @@ -1,7 +1,3 @@ -.vcd-screen-picker-modal { - padding: 1em; -} - .vcd-screen-picker-header-close-button { margin-left: auto; } diff --git a/src/renderer/components/settings/AutoStartToggle.tsx b/src/renderer/components/settings/AutoStartToggle.tsx index d99f2cd..a8ff5d9 100644 --- a/src/renderer/components/settings/AutoStartToggle.tsx +++ b/src/renderer/components/settings/AutoStartToggle.tsx @@ -27,7 +27,7 @@ export const AutoStartToggle: SettingsComponent = ({ settings }) => { <VesktopSettingsSwitch title="Auto Start Minimized" description={"Start Vesktop minimized when starting with system"} - value={settings.autoStartMinimized ?? false} + value={settings.autoStartMinimized} onChange={v => (settings.autoStartMinimized = v)} disabled={!autoStartEnabled} /> diff --git a/src/renderer/components/settings/DeveloperOptions.tsx b/src/renderer/components/settings/DeveloperOptions.tsx index 87c69a8..4ed5feb 100644 --- a/src/renderer/components/settings/DeveloperOptions.tsx +++ b/src/renderer/components/settings/DeveloperOptions.tsx @@ -4,18 +4,9 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { BaseText, Button, Heading, Paragraph, TextButton } from "@vencord/types/components"; -import { - Margins, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalRoot, - ModalSize, - openModal, - useForceUpdater -} from "@vencord/types/utils"; -import { Toasts } from "@vencord/types/webpack/common"; +import { Button, Heading, Paragraph, TextButton } from "@vencord/types/components"; +import { Margins, useForceUpdater } from "@vencord/types/utils"; +import { Modal, openModal, Toasts } from "@vencord/types/webpack/common"; import { Settings } from "shared/settings"; import { cl, SettingsComponent } from "./Settings"; @@ -26,31 +17,20 @@ export const DeveloperOptionsButton: SettingsComponent = ({ settings }) => { function openDeveloperOptionsModal(settings: Settings) { openModal(props => ( - <ModalRoot {...props} size={ModalSize.MEDIUM}> - <ModalHeader> - <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> - Vesktop Developer Options - </BaseText> - <ModalCloseButton onClick={props.onClose} /> - </ModalHeader> + <Modal {...props} size="lg" title="Vesktop Developer Options"> + <Heading tag="h4">Vencord Location</Heading> + <VencordLocationPicker settings={settings} /> - <ModalContent> - <div style={{ padding: "1em 0" }}> - <Heading tag="h5">Vencord Location</Heading> - <VencordLocationPicker settings={settings} /> - - <Heading tag="h5" className={Margins.top16}> - Debugging - </Heading> - <div className={cl("button-grid")}> - <Button onClick={() => VesktopNative.debug.launchGpu()}>Open chrome://gpu</Button> - <Button onClick={() => VesktopNative.debug.launchWebrtcInternals()}> - Open chrome://webrtc-internals - </Button> - </div> - </div> - </ModalContent> - </ModalRoot> + <Heading tag="h4" className={Margins.top16}> + Debugging + </Heading> + <div className={cl("button-grid")}> + <Button onClick={() => VesktopNative.debug.launchGpu()}>Open chrome://gpu</Button> + <Button onClick={() => VesktopNative.debug.launchWebrtcInternals()}> + Open chrome://webrtc-internals + </Button> + </div> + </Modal> )); } diff --git a/src/renderer/components/settings/NotificationBadgeToggle.tsx b/src/renderer/components/settings/NotificationBadgeToggle.tsx index 6e17e3d..bac9c38 100644 --- a/src/renderer/components/settings/NotificationBadgeToggle.tsx +++ b/src/renderer/components/settings/NotificationBadgeToggle.tsx @@ -14,7 +14,7 @@ export const NotificationBadgeToggle: SettingsComponent = ({ settings }) => { <VesktopSettingsSwitch title="Notification Badge" description="Show mention badge on the app icon" - value={settings.appBadge ?? true} + value={settings.appBadge} onChange={v => { settings.appBadge = v; if (v) setBadge(); diff --git a/src/renderer/components/settings/Settings.tsx b/src/renderer/components/settings/Settings.tsx index 423d8ee..556e4a8 100644 --- a/src/renderer/components/settings/Settings.tsx +++ b/src/renderer/components/settings/Settings.tsx @@ -11,8 +11,8 @@ import { BaseText, Divider, ErrorBoundary } from "@vencord/types/components"; import { ComponentType } from "react"; import { WebRTCIPHandlingPolicyPicker } from "renderer/components/settings/WebRTCIPHandlingPolicyPicker"; import { KeybindsButton } from "renderer/globalShortcuts/ShortcutSettings"; -import { Settings, useSettings } from "renderer/settings"; -import { isMac, isWindows } from "renderer/utils"; +import { getValueAndOnChange, Settings, useSettings } from "renderer/settings"; +import { isMac } from "renderer/utils"; import { AutoStartToggle } from "./AutoStartToggle"; import { DeveloperOptionsButton } from "./DeveloperOptions"; @@ -27,7 +27,6 @@ interface BooleanSetting { key: keyof typeof Settings.store; title: string; description: string; - defaultValue: boolean; disabled?(): boolean; invisible?(): boolean; } @@ -43,50 +42,55 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> { key: "hardwareAcceleration", title: "Hardware Acceleration", - description: "Enable hardware acceleration", - defaultValue: true + description: "Enable hardware acceleration" }, { key: "hardwareVideoAcceleration", title: "Video Hardware Acceleration", description: "Enable hardware video acceleration. This can improve performance of screenshare and video playback, but may cause graphical glitches and infinitely loading streams.", - defaultValue: false, - disabled: () => Settings.store.hardwareAcceleration === false + disabled: () => !Settings.store.hardwareAcceleration } ], "User Interface": [ { - key: "customTitleBar", - title: "Discord Titlebar", - description: "Use Discord's custom title bar instead of the native system one. Requires a full restart.", - defaultValue: isWindows + key: "nativeTitleBar", + title: "Native Titlebar", + description: "Enable the system titlebar in addition to Discord's custom one. Requires a full restart." }, { key: "staticTitle", title: "Static Title", - description: 'Makes the window title "Vesktop" instead of changing to the current page', - defaultValue: false + description: 'Makes the window title "Vesktop" instead of changing to the current page' }, { key: "enableMenu", title: "Enable Menu Bar", description: "Enables the application menu bar. Press ALT to toggle visibility.", - defaultValue: false, - disabled: () => Settings.store.customTitleBar ?? isWindows + disabled: () => !Settings.store.nativeTitleBar + }, + { + key: "enableShadow", + title: "Enable Window Shadow", + description: "Enables the window shadow. Requires a full restart.", + disabled: () => Settings.store.nativeTitleBar + }, + { + key: "enableRoundedCorners", + title: "Enable Rounded Corners", + description: "Enables rounded corners. Requires a full restart.", + disabled: () => Settings.store.nativeTitleBar }, { key: "enableSplashScreen", title: "Enable Splash Screen", description: - "Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading.", - defaultValue: true + "Shows a small splash screen while Vesktop is loading. Disabling this option will show the main window earlier while it's still loading." }, { key: "splashTheming", title: "Splash theming", - description: "Adapt the splash window colors to your custom theme", - defaultValue: true + description: "Adapt the splash window colors to your custom theme" }, WindowsTransparencyControls, UserAssetsButton @@ -96,34 +100,29 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> key: "tray", title: "Tray Icon", description: "Add a tray icon for Vesktop", - defaultValue: true, invisible: () => isMac }, { key: "minimizeToTray", title: "Minimize to tray", description: "Hitting X will make Vesktop minimize to the tray instead of closing", - defaultValue: true, invisible: () => isMac, - disabled: () => Settings.store.tray === false + disabled: () => !Settings.store.tray }, { key: "clickTrayToShowHide", title: "Hide/Show on tray click", - description: "Left clicking tray icon will toggle the vesktop window visibility.", - defaultValue: false + description: "Left clicking tray icon will toggle the vesktop window visibility." }, { key: "disableMinSize", title: "Disable minimum window size", - description: "Allows you to make the window as small as your heart desires", - defaultValue: false + description: "Allows you to make the window as small as your heart desires" }, { key: "disableSmoothScroll", title: "Disable smooth scrolling", - description: "Disables smooth scrolling", - defaultValue: false + description: "Disables smooth scrolling" }, KeybindsButton ], @@ -132,23 +131,20 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>> { key: "enableTaskbarFlashing", title: "Enable Taskbar Flashing", - description: "Flashes the app in your taskbar when you have new notifications.", - defaultValue: false + description: "Flashes the app in your taskbar when you have new notifications." } ], Miscellaneous: [ { key: "arRPC", title: "Rich Presence", - description: "Enables Rich Presence via arRPC", - defaultValue: false + description: "Enables Rich Presence via arRPC" }, { key: "openLinksWithElectron", title: "Open Links in app (experimental)", - description: "Opens links in a new Vesktop window instead of your web browser", - defaultValue: false + description: "Opens links in a new Vesktop window instead of your web browser" }, WebRTCIPHandlingPolicyPicker @@ -170,16 +166,15 @@ function SettingsSections() { {settings.map((Setting, i) => { if (typeof Setting === "function") return <Setting key={`Custom-${i}`} settings={Settings} />; - const { defaultValue, title, description, key, disabled, invisible } = Setting; + const { title, description, key, disabled, invisible } = Setting; if (invisible?.()) return null; return ( <VesktopSettingsSwitch title={title} description={description} - value={Settings[key as any] ?? defaultValue} - onChange={v => (Settings[key as any] = v)} disabled={disabled?.()} + {...getValueAndOnChange(key)} key={key} /> ); diff --git a/src/renderer/components/settings/UserAssets.tsx b/src/renderer/components/settings/UserAssets.tsx index 71033f3..04c174b 100644 --- a/src/renderer/components/settings/UserAssets.tsx +++ b/src/renderer/components/settings/UserAssets.tsx @@ -7,18 +7,8 @@ import "./UserAssets.css"; import { BaseText, Button, FormSwitch } from "@vencord/types/components"; -import { - Margins, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalRoot, - ModalSize, - openModal, - wordsFromCamel, - wordsToTitle -} from "@vencord/types/utils"; -import { showToast, useState } from "@vencord/types/webpack/common"; +import { Margins, wordsFromCamel, wordsToTitle } from "@vencord/types/utils"; +import { Modal, openModal, showToast, useState } from "@vencord/types/webpack/common"; import { UserAssetType } from "main/userAssets"; import { useSettings } from "renderer/settings"; @@ -32,22 +22,13 @@ export const UserAssetsButton: SettingsComponent = () => { function openAssetsModal() { openModal(props => ( - <ModalRoot {...props} size={ModalSize.MEDIUM}> - <ModalHeader> - <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> - User Assets - </BaseText> - <ModalCloseButton onClick={props.onClose} /> - </ModalHeader> - - <ModalContent> - <div className="vcd-user-assets"> - {CUSTOMIZABLE_ASSETS.map(asset => ( - <Asset key={asset} asset={asset} /> - ))} - </div> - </ModalContent> - </ModalRoot> + <Modal {...props} size="lg" title="User Assets"> + <div className="vcd-user-assets"> + {CUSTOMIZABLE_ASSETS.map(asset => ( + <Asset key={asset} asset={asset} /> + ))} + </div> + </Modal> )); } @@ -93,7 +74,7 @@ function Asset({ asset }: { asset: UserAssetType }) { {isSplash && ( <FormSwitch title="Nearest-Neighbor Scaling (for pixel art)" - value={settings.splashPixelated ?? false} + value={settings.splashPixelated} onChange={val => (settings.splashPixelated = val)} className={Margins.top16} hideBorder diff --git a/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx b/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx index 533dde0..f49621c 100644 --- a/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx +++ b/src/renderer/components/settings/WebRTCIPHandlingPolicyPicker.tsx @@ -33,7 +33,7 @@ export const WebRTCIPHandlingPolicyPicker: SettingsComponent = ({ settings }) => ]} closeOnSelect={true} select={v => (settings.webRTCIPHandlingPolicy = v)} - isSelected={v => v === (settings.webRTCIPHandlingPolicy ?? "default")} + isSelected={v => v === settings.webRTCIPHandlingPolicy} serialize={s => s} /> </div> diff --git a/src/renderer/globalShortcuts/ShortcutSettings.tsx b/src/renderer/globalShortcuts/ShortcutSettings.tsx index 29bb127..f724ab7 100644 --- a/src/renderer/globalShortcuts/ShortcutSettings.tsx +++ b/src/renderer/globalShortcuts/ShortcutSettings.tsx @@ -7,17 +7,8 @@ import "./ShortcutSettings.css"; import { BaseText, Button, Card, DeleteIcon, Switch } from "@vencord/types/components"; -import { - classNameFactory, - identity, - ModalCloseButton, - ModalContent, - ModalHeader, - ModalRoot, - ModalSize, - openModal -} from "@vencord/types/utils"; -import { React, Select, useState } from "@vencord/types/webpack/common"; +import { classNameFactory, identity, openModal } from "@vencord/types/utils"; +import { Modal, React, Select, useState } from "@vencord/types/webpack/common"; import { SettingsComponent } from "renderer/components/settings/Settings"; import { onIpcCommand } from "renderer/ipcCommands"; import { reactiveValue } from "renderer/reactiveState"; @@ -181,18 +172,9 @@ export function KeyBindSettings() { export function openKeybindsModal() { openModal(props => ( - <ModalRoot {...props} size={ModalSize.LARGE}> - <ModalHeader> - <BaseText size="lg" weight="semibold" tag="h3" style={{ flexGrow: 1 }}> - Keybinds - </BaseText> - <ModalCloseButton onClick={props.onClose} /> - </ModalHeader> - - <ModalContent> - <KeyBindSettings /> - </ModalContent> - </ModalRoot> + <Modal {...props} size="lg" title="Keybinds"> + <KeyBindSettings /> + </Modal> )); } diff --git a/src/renderer/patches/platformClass.tsx b/src/renderer/patches/platformClass.tsx index 3fdbd22..b220c01 100644 --- a/src/renderer/patches/platformClass.tsx +++ b/src/renderer/patches/platformClass.tsx @@ -21,8 +21,7 @@ addPatch({ ], getPlatformClass() { - if (Settings.store.customTitleBar) return "platform-win"; - if (isMac) return "platform-osx"; - return "platform-web"; + if (Settings.store.nativeTitleBar) return "platform-web"; + return isMac ? "platform-osx" : "platform-win"; } }); diff --git a/src/renderer/patches/windowsTitleBar.tsx b/src/renderer/patches/windowsTitleBar.tsx index 9ddba6b..505ca91 100644 --- a/src/renderer/patches/windowsTitleBar.tsx +++ b/src/renderer/patches/windowsTitleBar.tsx @@ -8,7 +8,7 @@ import { Settings } from "renderer/settings"; import { addPatch } from "./shared"; -if (Settings.store.customTitleBar) +if (!Settings.store.nativeTitleBar) addPatch({ patches: [ { diff --git a/src/renderer/settings.ts b/src/renderer/settings.ts index 0a5ba80..f21daa6 100644 --- a/src/renderer/settings.ts +++ b/src/renderer/settings.ts @@ -25,10 +25,12 @@ export function useSettings() { return Settings.store; } -export function getValueAndOnChange(key: keyof typeof Settings.store) { +export function getValueAndOnChange<K extends keyof typeof Settings.store, V extends (typeof Settings.store)[K]>( + key: K +) { return { - value: Settings.store[key] as any, - onChange: (value: any) => (Settings.store[key] = value) + value: Settings.store[key] as V, + onChange: (value: V) => (Settings.store[key] = value) }; } diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index ca32a7e..db5daba 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -49,6 +49,7 @@ export const enum IpcEvents { VIRT_MIC_LIST = "VCD_VIRT_MIC_LIST", VIRT_MIC_START = "VCD_VIRT_MIC_START", VIRT_MIC_START_SYSTEM = "VCD_VIRT_MIC_START_ALL", + VIRT_MIC_UNMUTE = "VCD_VIRT_MIC_UNMUTE", VIRT_MIC_STOP = "VCD_VIRT_MIC_STOP", CLIPBOARD_COPY_IMAGE = "VCD_CLIPBOARD_COPY_IMAGE", diff --git a/src/shared/defaultSettings.ts b/src/shared/defaultSettings.ts new file mode 100644 index 0000000..c2f160e --- /dev/null +++ b/src/shared/defaultSettings.ts @@ -0,0 +1,33 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2026 Vendicated and Vesktop contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Settings } from "./settings"; + +export const DefaultVesktopSettings: Settings = { + discordBranch: "stable", + hardwareAcceleration: true, + hardwareVideoAcceleration: false, + nativeTitleBar: false, + staticTitle: false, + enableMenu: false, + enableShadow: true, + enableRoundedCorners: true, + enableSplashScreen: true, + splashTheming: true, + tray: true, + minimizeToTray: true, + clickTrayToShowHide: false, + disableMinSize: false, + disableSmoothScroll: false, + enableTaskbarFlashing: false, + arRPC: true, + openLinksWithElectron: false, + autoStartMinimized: false, + splashPixelated: false, + webRTCIPHandlingPolicy: "default", + appBadge: true, + transparencyOption: "none" +}; diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index c911cd5..b5ae38c 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -8,34 +8,36 @@ import type { Rectangle } from "electron"; import { KeyBind } from "renderer/globalShortcuts/ShortcutSettings"; export interface Settings { - discordBranch?: "stable" | "canary" | "ptb"; - transparencyOption?: "none" | "mica" | "tabbed" | "acrylic"; - webRTCIPHandlingPolicy?: + discordBranch: "stable" | "canary" | "ptb"; + transparencyOption: "none" | "mica" | "tabbed" | "acrylic"; + webRTCIPHandlingPolicy: | "default" | "default_public_interface_only" | "default_public_and_private_interfaces" | "disable_non_proxied_udp"; - tray?: boolean; - minimizeToTray?: boolean; - autoStartMinimized?: boolean; - openLinksWithElectron?: boolean; - staticTitle?: boolean; - enableMenu?: boolean; - disableSmoothScroll?: boolean; - hardwareAcceleration?: boolean; - hardwareVideoAcceleration?: boolean; - arRPC?: boolean; - appBadge?: boolean; - enableTaskbarFlashing?: boolean; - disableMinSize?: boolean; - clickTrayToShowHide?: boolean; - customTitleBar?: boolean; + tray: boolean; + minimizeToTray: boolean; + autoStartMinimized: boolean; + openLinksWithElectron: boolean; + staticTitle: boolean; + enableMenu: boolean; + enableShadow: boolean; + enableRoundedCorners: boolean; + disableSmoothScroll: boolean; + hardwareAcceleration: boolean; + hardwareVideoAcceleration: boolean; + arRPC: boolean; + appBadge: boolean; + enableTaskbarFlashing: boolean; + disableMinSize: boolean; + clickTrayToShowHide: boolean; + nativeTitleBar: boolean; - enableSplashScreen?: boolean; - splashTheming?: boolean; + enableSplashScreen: boolean; + splashTheming: boolean; + splashPixelated: boolean; splashColor?: string; splashBackground?: string; - splashPixelated?: boolean; spellCheckLanguages?: string[]; @@ -49,6 +51,7 @@ export interface Settings { ignoreDevices?: boolean; ignoreInputMedia?: boolean; + mute?: boolean; onlySpeakers?: boolean; onlyDefaultSpeakers?: boolean; };