Compare commits

..
3 Commits
Author SHA1 Message Date
0498ba3e4f fix(proxies): render configured groups in global mode (#8402)
* fix(proxies): render configured groups in global mode

Global mode previously only rendered the synthetic GLOBAL group and
sliced off its header, which flattened every user-defined group into
a non-expandable proxy row. Configured groups could no longer be
opened or inspected. Render the same group list as rule/script mode
so every group keeps its own header and expand toggle.

Fixes #8376

* style: keep useRule assignment on one line

* fix & changelog

* fix: hover when global proxy

---------

Co-authored-by: susu-Sugar <214122492+susu-Sugar@users.noreply.github.com>
Co-authored-by: Tunglies <77394545+Tunglies@users.noreply.github.com>
2026-10-27 01:41:19 +00:00
Tunglies f39644ee6b chore(typecheck): replace tsc with tsrs as the typecheck gate (#8428)
tsrs (Rust port of the TypeScript 7 checker) replaces tsc --noEmit in
the typecheck script, web:build, and CI. Measured on this repository:
~0.4s vs ~3.5s wall time and ~280 MB vs ~750 MB peak RSS, with
identical zero-diagnostic results on the current tree. The typescript
package stays installed: typescript-eslint projectService and
scripts/cleanup-unused-i18n.mjs consume its compiler API.
2026-10-27 01:34:29 +00:00
488f022c05 feat(media-unlock): add Muse AI (muse.ai) detection (#8411)
* feat(media-unlock): add Muse AI detection

muse.ai redirects every region to Meta's aymh anti-bot gateway before the app loads, and a plain HTTP client cannot finish the JavaScript challenge. Report the result as a new Risky status (exit reachable, availability unverifiable) together with the exit region instead of a misleading Yes/No.

Signed-off-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>

* style(media-unlock): apply rustfmt and biome formatting

Signed-off-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>

* docs(changelog): Update changelog

Signed-off-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>

---------

Signed-off-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>
Co-authored-by: susu-Sugar <214122492+susu-Sugar@users.noreply.github.com>
Co-authored-by: ❤是纱雾酱哟~ <49941141+Dragon1573@users.noreply.github.com>
2026-10-26 17:17:09 +00:00
27 changed files with 258 additions and 86 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ jobs:
if: steps.check_frontend.outputs.frontend == 'true' if: steps.check_frontend.outputs.frontend == 'true'
run: pnpm lint run: pnpm lint
- name: Run TypeScript typecheck - name: Run tsrs typecheck
if: steps.check_frontend.outputs.frontend == 'true' if: steps.check_frontend.outputs.frontend == 'true'
run: pnpm typecheck run: pnpm typecheck
+1 -1
View File
@@ -61,7 +61,7 @@ tracing-estuary = { git = "https://github.com/Tunglies/tracing-estuary.git", bra
tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" } tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" }
tracing = "0.1.44" tracing = "0.1.44"
tauri = { version = "2.12.5" } tauri = { version = "2.12.4" }
tauri-plugin-clipboard-manager = "2.5.0" tauri-plugin-clipboard-manager = "2.5.0"
parking_lot = { version = "0.12.5", features = ["hardware-lock-elision"] } parking_lot = { version = "0.12.5", features = ["hardware-lock-elision"] }
anyhow = "1.0.104" anyhow = "1.0.104"
+2
View File
@@ -7,6 +7,7 @@
- 修复通过 URL 导入订阅时,即使导入的订阅并非当前使用的订阅,也会重新加载当前配置 - 修复通过 URL 导入订阅时,即使导入的订阅并非当前使用的订阅,也会重新加载当前配置
- 修复 首页 网站测速失败后卡片一直显示测试中 - 修复 首页 网站测速失败后卡片一直显示测试中
- 修复 代理 页展开分组后不显示最新测速结果,需切换节点才刷新 - 修复 代理 页展开分组后不显示最新测速结果,需切换节点才刷新
- 修复 代理 在全局模式下无法展开节点组
**🐧 Linux** **🐧 Linux**
@@ -19,6 +20,7 @@
- 新增虚拟网卡设置的「DNS 模式」选项,支持配置 mihomo 系统 DNS 行为 - 新增虚拟网卡设置的「DNS 模式」选项,支持配置 mihomo 系统 DNS 行为
- 新增「IP 信息」自动刷新开关,关闭后仍可手动刷新 - 新增「IP 信息」自动刷新开关,关闭后仍可手动刷新
- 新增 Muse AI 解锁检测,针对 Muse AI 特有的 Cloudflare 人机验证增加「Risky」状态标记
</details> </details>
@@ -11,6 +11,7 @@ mod chatgpt;
mod claude; mod claude;
mod disney_plus; mod disney_plus;
mod gemini; mod gemini;
mod muse;
mod netflix; mod netflix;
mod prime_video; mod prime_video;
mod spotify; mod spotify;
@@ -30,6 +31,7 @@ enum UnlockCheck {
ChatGptWeb, ChatGptWeb,
Claude, Claude,
Gemini, Gemini,
MuseAi,
YouTubePremium, YouTubePremium,
BahamutAnime, BahamutAnime,
Netflix, Netflix,
@@ -46,6 +48,7 @@ impl UnlockCheck {
Self::ChatGptWeb, Self::ChatGptWeb,
Self::Claude, Self::Claude,
Self::Gemini, Self::Gemini,
Self::MuseAi,
Self::YouTubePremium, Self::YouTubePremium,
Self::BahamutAnime, Self::BahamutAnime,
Self::Netflix, Self::Netflix,
@@ -66,6 +69,7 @@ impl UnlockCheck {
Self::ChatGptWeb => chatgpt::CHATGPT_WEB_NAME, Self::ChatGptWeb => chatgpt::CHATGPT_WEB_NAME,
Self::Claude => claude::CLAUDE_NAME, Self::Claude => claude::CLAUDE_NAME,
Self::Gemini => gemini::GEMINI_NAME, Self::Gemini => gemini::GEMINI_NAME,
Self::MuseAi => muse::MUSE_AI_NAME,
Self::YouTubePremium => youtube::YOUTUBE_PREMIUM_NAME, Self::YouTubePremium => youtube::YOUTUBE_PREMIUM_NAME,
Self::BahamutAnime => bahamut::BAHAMUT_ANIME_NAME, Self::BahamutAnime => bahamut::BAHAMUT_ANIME_NAME,
Self::Netflix => netflix::NETFLIX_NAME, Self::Netflix => netflix::NETFLIX_NAME,
@@ -83,6 +87,7 @@ impl UnlockCheck {
Self::ChatGptWeb => chatgpt::check_chatgpt(client).await, Self::ChatGptWeb => chatgpt::check_chatgpt(client).await,
Self::Claude => claude::check_claude(client).await, Self::Claude => claude::check_claude(client).await,
Self::Gemini => gemini::check_gemini(client).await, Self::Gemini => gemini::check_gemini(client).await,
Self::MuseAi => muse::check_muse_ai(client).await,
Self::YouTubePremium => youtube::check_youtube_premium(client).await, Self::YouTubePremium => youtube::check_youtube_premium(client).await,
Self::BahamutAnime => bahamut::check_bahamut_anime(client).await, Self::BahamutAnime => bahamut::check_bahamut_anime(client).await,
Self::Netflix => netflix::check_netflix(client).await, Self::Netflix => netflix::check_netflix(client).await,
@@ -0,0 +1,48 @@
use reqwest::Client;
use crate::utils::{classify_restricted_status, get_trace_location};
use super::UnlockItem;
pub(crate) const MUSE_AI_NAME: &str = "Muse AI";
const MUSE_URL: &str = "https://muse.ai";
const CLOUDFLARE_TRACE_URL: &str = "https://www.cloudflare.com/cdn-cgi/trace";
// The aymh ("Are You a Human") gateway answers plain HTTP requests with a
// generic Meta error page that always contains the Facebook logo asset.
const AYMH_ERROR_MARKERS: &[&str] = &["Sorry, something went wrong", "static.facebook.com/images/logos"];
pub(super) async fn check_muse_ai(client: &Client) -> UnlockItem {
// muse.ai itself is served by Vercel, so resolve the exit region through
// the generic Cloudflare trace endpoint instead of a service-specific one.
let region = get_trace_location(client, CLOUDFLARE_TRACE_URL)
.await
.map(|code| code.trim().to_ascii_uppercase())
.map(|code| UnlockItem::region_label(&code));
let Ok(response) = client.get(MUSE_URL).send().await else {
return UnlockItem::checked(MUSE_AI_NAME, "Failed (Network Connection)", region);
};
let status = response.status();
let landed_on_aymh = response.url().host_str() == Some("auth.muse.ai");
let body = response.text().await.unwrap_or_default();
// Every region is redirected to the aymh anti-bot gateway before the app
// loads, and a non-browser HTTP client cannot finish the JavaScript
// challenge. It returns the Meta error page, so reaching this point only
// proves the exit can connect to Muse's auth infrastructure; availability
// cannot be verified over plain HTTP and is reported as `Risky`.
let behind_anti_bot = landed_on_aymh || AYMH_ERROR_MARKERS.iter().any(|marker| body.contains(marker));
let result = if behind_anti_bot {
"Risky"
} else if status.is_success() {
"Yes"
} else {
classify_restricted_status(status).unwrap_or("Failed")
};
UnlockItem::checked(MUSE_AI_NAME, result, region)
}
+5 -4
View File
@@ -14,7 +14,7 @@
"build:fast": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build -- --profile fast-release", "build:fast": "cross-env NODE_OPTIONS='--max-old-space-size=4096' tauri build -- --profile fast-release",
"tauri": "tauri", "tauri": "tauri",
"web:dev": "vite", "web:dev": "vite",
"web:build": "tsc --noEmit && vite build", "web:build": "tsrs -p . --noEmit && vite build",
"web:serve": "vite preview", "web:serve": "vite preview",
"prebuild": "node scripts/prebuild.mjs", "prebuild": "node scripts/prebuild.mjs",
"updater": "node scripts/updater.mjs", "updater": "node scripts/updater.mjs",
@@ -32,7 +32,7 @@
"i18n:types": "node scripts/generate-i18n-keys.mjs", "i18n:types": "node scripts/generate-i18n-keys.mjs",
"gen:contract": "node scripts/gen-contract.mjs", "gen:contract": "node scripts/gen-contract.mjs",
"arch:check": "node scripts/check-architecture.mjs listen emit invoke", "arch:check": "node scripts/check-architecture.mjs listen emit invoke",
"typecheck": "tsc --noEmit", "typecheck": "tsrs -p . --noEmit",
"test": "vitest run", "test": "vitest run",
"test:watch": "vitest", "test:watch": "vitest",
"knip:check": "knip", "knip:check": "knip",
@@ -95,7 +95,7 @@
"@biomejs/biome": "^2.5.14", "@biomejs/biome": "^2.5.14",
"@eslint-react/eslint-plugin": "^5.20.5", "@eslint-react/eslint-plugin": "^5.20.5",
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@tauri-apps/cli": "2.12.4", "@tauri-apps/cli": "2.12.3",
"@types/lodash-es": "^4.17.12", "@types/lodash-es": "^4.17.12",
"@types/node": "^24.13.6", "@types/node": "^24.13.6",
"@types/react": "19.3.0", "@types/react": "19.3.0",
@@ -103,7 +103,7 @@
"@types/validator": "^13.15.10", "@types/validator": "^13.15.10",
"@vitejs/plugin-legacy": "^8.2.3", "@vitejs/plugin-legacy": "^8.2.3",
"@vitejs/plugin-react": "^6.1.1", "@vitejs/plugin-react": "^6.1.1",
"@wdio/tauri-service": "1.5.1", "@wdio/tauri-service": "1.5.0",
"adm-zip": "^0.6.1", "adm-zip": "^0.6.1",
"axios": "^1.20.0", "axios": "^1.20.0",
"cli-color": "^2.0.4", "cli-color": "^2.0.4",
@@ -128,6 +128,7 @@
"sass": "^1.104.1", "sass": "^1.104.1",
"tar": "^7.5.22", "tar": "^7.5.22",
"terser": "^5.51.2", "terser": "^5.51.2",
"tsrs": "0.20.0-ts7.1.0-beta",
"typescript": "^6.0.3", "typescript": "^6.0.3",
"typescript-eslint": "^8.70.0", "typescript-eslint": "^8.70.0",
"vite": "^8.3.0", "vite": "^8.3.0",
+157 -72
View File
@@ -318,8 +318,8 @@ importers:
specifier: ^10.0.1 specifier: ^10.0.1
version: 10.0.1(eslint@10.11.0(jiti@2.7.0)(supports-color@7.2.0)) version: 10.0.1(eslint@10.11.0(jiti@2.7.0)(supports-color@7.2.0))
'@tauri-apps/cli': '@tauri-apps/cli':
specifier: 2.12.4 specifier: 2.12.3
version: 2.12.4 version: 2.12.3
'@types/lodash-es': '@types/lodash-es':
specifier: ^4.17.12 specifier: ^4.17.12
version: 4.17.12 version: 4.17.12
@@ -342,8 +342,8 @@ importers:
specifier: ^6.1.1 specifier: ^6.1.1
version: 6.1.1(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.104.1)(terser@5.51.2)(yaml@2.9.1)) version: 6.1.1(vite@8.3.0(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(sass@1.104.1)(terser@5.51.2)(yaml@2.9.1))
'@wdio/tauri-service': '@wdio/tauri-service':
specifier: 1.5.1 specifier: 1.5.0
version: 1.5.1(expect-webdriverio@6.1.0)(supports-color@7.2.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0)) version: 1.5.0(expect-webdriverio@6.1.0)(supports-color@7.2.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0))
adm-zip: adm-zip:
specifier: ^0.6.1 specifier: ^0.6.1
version: 0.6.1 version: 0.6.1
@@ -416,6 +416,9 @@ importers:
terser: terser:
specifier: ^5.51.2 specifier: ^5.51.2
version: 5.51.2 version: 5.51.2
tsrs:
specifier: 0.20.0-ts7.1.0-beta
version: 0.20.0-ts7.1.0-beta
typescript: typescript:
specifier: ^6.0.3 specifier: ^6.0.3
version: 6.0.3 version: 6.0.3
@@ -2124,79 +2127,79 @@ packages:
'@tauri-apps/api@2.12.4': '@tauri-apps/api@2.12.4':
resolution: {integrity: sha512-pVmfis+4zT8H0Qhp3xPZx9Ju7kpzvA6rr/PSJPyuwfvucTQ8sVt61NYU9KMkK703UFlYadFmjKA4HhybOtN0gg==} resolution: {integrity: sha512-pVmfis+4zT8H0Qhp3xPZx9Ju7kpzvA6rr/PSJPyuwfvucTQ8sVt61NYU9KMkK703UFlYadFmjKA4HhybOtN0gg==}
'@tauri-apps/cli-darwin-arm64@2.12.4': '@tauri-apps/cli-darwin-arm64@2.12.3':
resolution: {integrity: sha512-OxqKSckIkoJ6vX2AjifIJpTasFC0Hbdoo7gEiCmAjauABO3U8m2MRsLWe+QTiBwDx1mIrvgA+rvI7tvDnbnHVg==} resolution: {integrity: sha512-xmVNoJOOKzKLj7GLHXmXLimRby9M42aBIJa0sB80N7o24eKV5JiVmToKTRLVH9yhL05GZ/B6rSSOmbzNFJwBAA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@tauri-apps/cli-darwin-x64@2.12.4': '@tauri-apps/cli-darwin-x64@2.12.3':
resolution: {integrity: sha512-fz76/77wMMJOaaUN6n3CybRG0P/MTEjjqYk81mGPyhi9m6Ue5T+LWBnJP/AkPooNatBPI2vtulGqomyMJ44lCQ==} resolution: {integrity: sha512-URd+0usfmUQQyb5kNPiKt2OT8gp7oGU7QR+qOppB6e35mpVBFFVNhWc9oWb3p0u71fDJ09DpF4T6m9xYxoIB8g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@tauri-apps/cli-linux-arm-gnueabihf@2.12.4': '@tauri-apps/cli-linux-arm-gnueabihf@2.12.3':
resolution: {integrity: sha512-K0w8Bof6Lt8QKLAYhRy0yy36ZH5iA/35VuSOvnxyjvCUZ+A3JKsUTlALviH/sVgAlisaPzzmeJSH8XOn4Q2HBA==} resolution: {integrity: sha512-0kwUVx2LbmOoTRlwF1oDww7th4/NSluv4ZBQ6KRZsFKg4g0TlTcIiJ0VehqkQYUeC9xIT1Mk6XtF52mI155VSQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@tauri-apps/cli-linux-arm64-gnu@2.12.4': '@tauri-apps/cli-linux-arm64-gnu@2.12.3':
resolution: {integrity: sha512-j5rOnjmRUwWrm1oosf0zBYl4D+fqydgUROFCk0hvKZxvbTT8SOERes0QB7rBV/XWNy+kM6pCKzb3oSm2sRglzg==} resolution: {integrity: sha512-gKSGDx6fx+HBLQmG6guChFdisbrCSdx9Yli+j5teOa64gm1CeM+C6NLru5Pj3ZkkEep05BmCFjxvX+cjqAycZQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@tauri-apps/cli-linux-arm64-musl@2.12.4': '@tauri-apps/cli-linux-arm64-musl@2.12.3':
resolution: {integrity: sha512-aOue3Fy6Jb7+oWcfAVUsVHfeTybSCt2CZoU06aO4jv4d2Ks/KnaTPwMAK3CLEduGOvBLY1lbBBrIyomqLLH5Sg==} resolution: {integrity: sha512-Yr59qMy/gcvAfBuFdCGlAmGiLsYWMFDbsP4bAI6iNBzcJTGrYWZGeiQhGDo29MQwfF/NUBqyM2qljXu5tZ6wjQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@tauri-apps/cli-linux-riscv64-gnu@2.12.4': '@tauri-apps/cli-linux-riscv64-gnu@2.12.3':
resolution: {integrity: sha512-Fx6GShY/RvST+t6LMlTHAwd66+1tEaAAGrnU7cysVfaiRP1BKng5Vl6rVmO6rSLOA1Sp1dRzNYM4f0OWQGb7qA==} resolution: {integrity: sha512-jKr0/REBMnLKC0OwPQZkyge0mKDaNZ0b/AbfGwVyCgFfwS730EVLfVDo3nt7MUu6jJaytRq08+xSj5qfy+U1+Q==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@tauri-apps/cli-linux-x64-gnu@2.12.4': '@tauri-apps/cli-linux-x64-gnu@2.12.3':
resolution: {integrity: sha512-tNzZSa79Z1nRpHxEpQ38lsAFpKlFlYvoXzjTV+lRRn/zSf3wrdUC3wnLcq2XEadchPu4ttK0zivhYzr+XGD19Q==} resolution: {integrity: sha512-gTkEqJAGCMROGanxHnzaJzQ+/rXl39HWVg0/hDODS1wDWBGqoceqGC6Qm1+mQbyT11xnsB8mKu/gyVID/YpFIw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@tauri-apps/cli-linux-x64-musl@2.12.4': '@tauri-apps/cli-linux-x64-musl@2.12.3':
resolution: {integrity: sha512-jmZ1pr0xEqUhuEusWtt9Yt+GF6lCnGHUmIL+KIknpbjK/XQ2qkhDBhaxK/JMHM2A8dAacVXCxXJk2EXpwhQUfA==} resolution: {integrity: sha512-T2dTxL1svRym71fZtaW4pZYXbthbfFsEJr1NeOUg/p7laWXZbUt/8DMSZf8recu9f7+1F/Lv00HtzsEu6vDO9w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@tauri-apps/cli-win32-arm64-msvc@2.12.4': '@tauri-apps/cli-win32-arm64-msvc@2.12.3':
resolution: {integrity: sha512-fGo8pgEHZxdSYgZ/J98m1usJ7NHKmKbq7k6uT0x1rpOq6Bg2YVzzpaAblWk710f5LHYBJIL5QIFS5IrD+4gmTg==} resolution: {integrity: sha512-eoiQwpEZWbpsVHcM9BAzqqe4TCHszvr3rsM7pUQ4ofLK0lF1i1d/jX0Qo5DYMqcrUtwQuDdDuOCbcT0Izf1VwQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@tauri-apps/cli-win32-ia32-msvc@2.12.4': '@tauri-apps/cli-win32-ia32-msvc@2.12.3':
resolution: {integrity: sha512-ezl8sQIcjYsye3TUnTH5VcWmWzccZASlQm7hlZt0dYyj1XD0qpVW47u2xYVrIKui0F8uQv/7QGZixdWiClBsbg==} resolution: {integrity: sha512-kE+KUg6Dbbkgvcw0m99wJVIToFQzJqpMBAXah74WqxaLzssNwSTUccrHp6+QVzMhjQP330tvekFmnQF+0NbE6Q==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@tauri-apps/cli-win32-x64-msvc@2.12.4': '@tauri-apps/cli-win32-x64-msvc@2.12.3':
resolution: {integrity: sha512-DJhDeCqjLDNMWYFy7ZS8cfeAHX2RK0RbQMLiA3bMVVkXRDJ4NBYiHriGqsUhsr9iG41aTb+dJGkFPmPw1gWwVw==} resolution: {integrity: sha512-L7wndWAgX2mLW7alswpL3d1R0P9FN2WYBgHaQkAYEBxHHGkY4vFX9CjcRQ1LAxDAMIJxrY7/aDziFJeChS84NQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@tauri-apps/cli@2.12.4': '@tauri-apps/cli@2.12.3':
resolution: {integrity: sha512-JI9bHfudSRJikGOrjbXEm6RjzzvmKuLc+JixB1NE8hNzQkNlCCIC3pTES3uypkR9lxHrsbxzcnSwhI2IxBQphw==} resolution: {integrity: sha512-f7/LsY74SVb1ChmOPw1ajOpxii0GSzDAgmWHRci8JUYuuai04rXsSbFobpmB0sP2DdlvMD/B5ZotEn8GOGMRUg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
hasBin: true hasBin: true
@@ -2218,6 +2221,52 @@ packages:
'@tauri-apps/plugin-updater@2.14.0': '@tauri-apps/plugin-updater@2.14.0':
resolution: {integrity: sha512-gdylJ9tger4hkyOn24QZd6MNOKVo2Eh53iw5th2Qj1vKTR/+u4PIwJWuiis5hohYvobn6iOvlnALfrqIPSzh7Q==} resolution: {integrity: sha512-gdylJ9tger4hkyOn24QZd6MNOKVo2Eh53iw5th2Qj1vKTR/+u4PIwJWuiis5hohYvobn6iOvlnALfrqIPSzh7Q==}
'@tsrs/darwin-arm64@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-mhHj8QGUmdJDBvJEnMXx5P/jvAKXYU3hy/z3qxrWBo8XHlbLES32PgC0ZpTRbJA960ReTpVqqvCOYaC6EL32/Q==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [darwin]
'@tsrs/darwin-x64@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-CsRUnyYRLrhmChS7ol7LgmdqMXTu+mVlDU+7JgbW8RpkJRGLZ/zgEDEOeD8qrndt8rpP9oW1T1SJ36HSzB3/sg==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [darwin]
'@tsrs/linux-arm64-gnu@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-VNwpdI/iICwQMMlS/MoSZCvKFByEn2+g7D0HREWG+3r3GRayXgbLv8iaNSHKT3QGcu8pXr3lH9170ghJQi2zRg==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@tsrs/linux-arm64-musl@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-cXnqPpmj5gzeGi4u1OV0ctd5df5t4ivwyeToCa4pBrKtjYodu0EeAo5Y76SHbJwggbiA1gzEJVj1vvuciQm5mQ==}
engines: {node: '>=16.20.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@tsrs/linux-x64-gnu@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-jlhJSrO9lxNh0TF5EU1i+Frok5sRWsBvCuQhmdqMZKIN2pSHsDZl3CSmKUsJ4tNr50np9USCPpkkxwby2Eiqhg==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tsrs/linux-x64-musl@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-pestGEPplhEPzIERc7zwuQ5zhh9ZwMSvAPNQy5TM0je/QuaizmM1zKoPYJ4NiaPzLh2M25HtP4HcpumTqmF3KQ==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [linux]
libc: [musl]
'@tsrs/win32-x64@0.20.0-ts7.1.0-beta':
resolution: {integrity: sha512-sstxBfhjjOSYvSHFfSmROau2oGAVNLwAnj+H0h+ywLo7N7ueFKIDk14HAkIYa/F9iVboiICCpHDY/pmBO71sSg==}
engines: {node: '>=16.20.0'}
cpu: [x64]
os: [win32]
'@tybys/wasm-util@0.10.4': '@tybys/wasm-util@0.10.4':
resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==}
@@ -2574,20 +2623,20 @@ packages:
resolution: {integrity: sha512-0ZAEIo6PNyMIJPlOGkIgyOJUjcd0pC8/QHlVAAe1c91/IcjZ1X+k0yidXHaboJdN7dq1XPUacmhRdtua0U5EZg==} resolution: {integrity: sha512-0ZAEIo6PNyMIJPlOGkIgyOJUjcd0pC8/QHlVAAe1c91/IcjZ1X+k0yidXHaboJdN7dq1XPUacmhRdtua0U5EZg==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
'@wdio/native-core@1.3.1': '@wdio/native-core@1.3.0':
resolution: {integrity: sha512-fdGk2lEr2vS+bClJXuZEnsG30cLzQv+B9W+dAt/Yte/fE33s/vDBn7hHwFx8aZLTOS0pPExErUxYiZEMXX+04g==} resolution: {integrity: sha512-wUwc0QTdvhD0LwH4YcRaN9JWLX/yac8sovddUR5/4sqHMNJr3yaN11bpIfYoD/bEk+1nTLjWuDCFpe5l5wUgLQ==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
'@wdio/native-spy@1.4.1': '@wdio/native-spy@1.4.0':
resolution: {integrity: sha512-KGOmgaicHqDkqj+s2bxXsRsb27IzW6carlyTu1xcrJI34yUbC0v14F8mbhuZcewW+mt2xhmC17yITwAbNa8PKw==} resolution: {integrity: sha512-unsC2Vgu5T9atD478Zj/p2N+rVSK4i/NibIaaEw4rZF/T5u5bmAHChFntEiBEfyMzd62VwbhKhzwwOSKjzrfJA==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
'@wdio/native-types@2.6.1': '@wdio/native-types@2.6.0':
resolution: {integrity: sha512-Rm5chX+MrRhVgJYcYdcX/yyTZaLjxvi0w/fnSgPaDT16gMIntXlk22K2x3hwEdaUonOKepZyhh4jr9ZgRz7UaQ==} resolution: {integrity: sha512-MVMVpZTH+UY6nUtLClCzY4BQSIs/nCCHo81i4ClLR+b2NehyBvwccttXDAGPgf0icyHUhd+PgIPXaLgRcm4M9A==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
'@wdio/native-utils@2.8.1': '@wdio/native-utils@2.8.0':
resolution: {integrity: sha512-QbmZjGkLUC2bmUJSzyqsHM11HND1D7tkxHFssUV1Kmx43+oPAeHHVR0NSZu2hMzSNrDZMBAmNYycR+3X8rqWcA==} resolution: {integrity: sha512-TmIkPAd19FkJ747AdFVEtawbakVV3HHCh8zk3Kl/FLc6B2bbea7hn90jtLxqBZgCVqUuJIBcMNFg/nV/hgBFOw==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
peerDependencies: peerDependencies:
tsx: ^4.22.4 tsx: ^4.22.4
@@ -2611,8 +2660,8 @@ packages:
resolution: {integrity: sha512-lNLLPUk4y1Yp5pWwBFF+tjZIy7bOv0TPTk4HDWV4LnnHnkc24abI0nN+kb2y5/JV8ZgwLCCVKUFRdRUxfKsAaQ==} resolution: {integrity: sha512-lNLLPUk4y1Yp5pWwBFF+tjZIy7bOv0TPTk4HDWV4LnnHnkc24abI0nN+kb2y5/JV8ZgwLCCVKUFRdRUxfKsAaQ==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
'@wdio/tauri-service@1.5.1': '@wdio/tauri-service@1.5.0':
resolution: {integrity: sha512-nfzJU2x7bxvIXtYo+yvrX4Xwuba8h5hXOlJ0IyHanGg0ELavY/2UfyxygJDTcSGO+pCQMdC9JJEyMvaS50AtZQ==} resolution: {integrity: sha512-S3fs8T+jgNOFi4x/X2z69unS/1K3ZB28+owBouhHtVnrMKeBWAKP46IHnp8c8AZXppn6fiPNC4M1jfRZbLKeKw==}
engines: {node: '>=18.20.0'} engines: {node: '>=18.20.0'}
peerDependencies: peerDependencies:
webdriverio: ^9.0.0 webdriverio: ^9.0.0
@@ -4770,6 +4819,11 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsrs@0.20.0-ts7.1.0-beta:
resolution: {integrity: sha512-8NifAn2tcna3t/nluu1yFvp0fYE28vElDpnD4jiWik69+MDjiHgxdjH8sUYUEFmf/2hl6QIE5ExVGpJzQbBDPw==}
engines: {node: '>=16.20.0'}
hasBin: true
tunnel@0.0.6: tunnel@0.0.6:
resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
@@ -6811,52 +6865,52 @@ snapshots:
'@tauri-apps/api@2.12.4': {} '@tauri-apps/api@2.12.4': {}
'@tauri-apps/cli-darwin-arm64@2.12.4': '@tauri-apps/cli-darwin-arm64@2.12.3':
optional: true optional: true
'@tauri-apps/cli-darwin-x64@2.12.4': '@tauri-apps/cli-darwin-x64@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-arm-gnueabihf@2.12.4': '@tauri-apps/cli-linux-arm-gnueabihf@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-arm64-gnu@2.12.4': '@tauri-apps/cli-linux-arm64-gnu@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-arm64-musl@2.12.4': '@tauri-apps/cli-linux-arm64-musl@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-riscv64-gnu@2.12.4': '@tauri-apps/cli-linux-riscv64-gnu@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-x64-gnu@2.12.4': '@tauri-apps/cli-linux-x64-gnu@2.12.3':
optional: true optional: true
'@tauri-apps/cli-linux-x64-musl@2.12.4': '@tauri-apps/cli-linux-x64-musl@2.12.3':
optional: true optional: true
'@tauri-apps/cli-win32-arm64-msvc@2.12.4': '@tauri-apps/cli-win32-arm64-msvc@2.12.3':
optional: true optional: true
'@tauri-apps/cli-win32-ia32-msvc@2.12.4': '@tauri-apps/cli-win32-ia32-msvc@2.12.3':
optional: true optional: true
'@tauri-apps/cli-win32-x64-msvc@2.12.4': '@tauri-apps/cli-win32-x64-msvc@2.12.3':
optional: true optional: true
'@tauri-apps/cli@2.12.4': '@tauri-apps/cli@2.12.3':
optionalDependencies: optionalDependencies:
'@tauri-apps/cli-darwin-arm64': 2.12.4 '@tauri-apps/cli-darwin-arm64': 2.12.3
'@tauri-apps/cli-darwin-x64': 2.12.4 '@tauri-apps/cli-darwin-x64': 2.12.3
'@tauri-apps/cli-linux-arm-gnueabihf': 2.12.4 '@tauri-apps/cli-linux-arm-gnueabihf': 2.12.3
'@tauri-apps/cli-linux-arm64-gnu': 2.12.4 '@tauri-apps/cli-linux-arm64-gnu': 2.12.3
'@tauri-apps/cli-linux-arm64-musl': 2.12.4 '@tauri-apps/cli-linux-arm64-musl': 2.12.3
'@tauri-apps/cli-linux-riscv64-gnu': 2.12.4 '@tauri-apps/cli-linux-riscv64-gnu': 2.12.3
'@tauri-apps/cli-linux-x64-gnu': 2.12.4 '@tauri-apps/cli-linux-x64-gnu': 2.12.3
'@tauri-apps/cli-linux-x64-musl': 2.12.4 '@tauri-apps/cli-linux-x64-musl': 2.12.3
'@tauri-apps/cli-win32-arm64-msvc': 2.12.4 '@tauri-apps/cli-win32-arm64-msvc': 2.12.3
'@tauri-apps/cli-win32-ia32-msvc': 2.12.4 '@tauri-apps/cli-win32-ia32-msvc': 2.12.3
'@tauri-apps/cli-win32-x64-msvc': 2.12.4 '@tauri-apps/cli-win32-x64-msvc': 2.12.3
'@tauri-apps/plugin-clipboard-manager@2.5.0': '@tauri-apps/plugin-clipboard-manager@2.5.0':
dependencies: dependencies:
@@ -6882,6 +6936,27 @@ snapshots:
dependencies: dependencies:
'@tauri-apps/api': 2.12.4 '@tauri-apps/api': 2.12.4
'@tsrs/darwin-arm64@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/darwin-x64@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/linux-arm64-gnu@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/linux-arm64-musl@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/linux-x64-gnu@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/linux-x64-musl@0.20.0-ts7.1.0-beta':
optional: true
'@tsrs/win32-x64@0.20.0-ts7.1.0-beta':
optional: true
'@tybys/wasm-util@0.10.4': '@tybys/wasm-util@0.10.4':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -7241,11 +7316,11 @@ snapshots:
safe-regex2: 5.1.1 safe-regex2: 5.1.1
strip-ansi: 7.2.0 strip-ansi: 7.2.0
'@wdio/native-core@1.3.1(supports-color@7.2.0)': '@wdio/native-core@1.3.0(supports-color@7.2.0)':
dependencies: dependencies:
'@wdio/logger': 9.29.1 '@wdio/logger': 9.29.1
'@wdio/native-types': 2.6.1 '@wdio/native-types': 2.6.0
'@wdio/native-utils': 2.8.1(supports-color@7.2.0) '@wdio/native-utils': 2.8.0(supports-color@7.2.0)
debug: 4.4.3(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0)
get-port: 7.2.0 get-port: 7.2.0
tslib: 2.8.1 tslib: 2.8.1
@@ -7253,11 +7328,11 @@ snapshots:
- supports-color - supports-color
- tsx - tsx
'@wdio/native-spy@1.4.1': {} '@wdio/native-spy@1.4.0': {}
'@wdio/native-types@2.6.1': {} '@wdio/native-types@2.6.0': {}
'@wdio/native-utils@2.8.1(supports-color@7.2.0)': '@wdio/native-utils@2.8.0(supports-color@7.2.0)':
dependencies: dependencies:
'@wdio/logger': 9.29.1 '@wdio/logger': 9.29.1
debug: 4.4.3(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0)
@@ -7291,14 +7366,14 @@ snapshots:
easy-table: 1.2.0 easy-table: 1.2.0
pretty-ms: 9.3.1 pretty-ms: 9.3.1
'@wdio/tauri-service@1.5.1(expect-webdriverio@6.1.0)(supports-color@7.2.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0))': '@wdio/tauri-service@1.5.0(expect-webdriverio@6.1.0)(supports-color@7.2.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0))':
dependencies: dependencies:
'@wdio/globals': 9.31.3(expect-webdriverio@6.1.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0)) '@wdio/globals': 9.31.3(expect-webdriverio@6.1.0)(webdriverio@10.1.0(supports-color@7.2.0)(yauzl@2.10.0))
'@wdio/logger': 9.29.1 '@wdio/logger': 9.29.1
'@wdio/native-core': 1.3.1(supports-color@7.2.0) '@wdio/native-core': 1.3.0(supports-color@7.2.0)
'@wdio/native-spy': 1.4.1 '@wdio/native-spy': 1.4.0
'@wdio/native-types': 2.6.1 '@wdio/native-types': 2.6.0
'@wdio/native-utils': 2.8.1(supports-color@7.2.0) '@wdio/native-utils': 2.8.0(supports-color@7.2.0)
'@wdio/spec-reporter': 9.31.2 '@wdio/spec-reporter': 9.31.2
'@wdio/types': 9.31.2 '@wdio/types': 9.31.2
debug: 4.4.3(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0)
@@ -9865,6 +9940,16 @@ snapshots:
tslib@2.8.1: {} tslib@2.8.1: {}
tsrs@0.20.0-ts7.1.0-beta:
optionalDependencies:
'@tsrs/darwin-arm64': 0.20.0-ts7.1.0-beta
'@tsrs/darwin-x64': 0.20.0-ts7.1.0-beta
'@tsrs/linux-arm64-gnu': 0.20.0-ts7.1.0-beta
'@tsrs/linux-arm64-musl': 0.20.0-ts7.1.0-beta
'@tsrs/linux-x64-gnu': 0.20.0-ts7.1.0-beta
'@tsrs/linux-x64-musl': 0.20.0-ts7.1.0-beta
'@tsrs/win32-x64': 0.20.0-ts7.1.0-beta
tunnel@0.0.6: {} tunnel@0.0.6: {}
type-check@0.4.0: type-check@0.4.0:
+8
View File
@@ -10,3 +10,11 @@ allowBuilds:
unrs-resolver: true unrs-resolver: true
minimumReleaseAgeExclude: minimumReleaseAgeExclude:
- dayjs@1.11.21 - dayjs@1.11.21
- "@tsrs/darwin-arm64@0.20.0-ts7.1.0-beta"
- "@tsrs/darwin-x64@0.20.0-ts7.1.0-beta"
- "@tsrs/linux-arm64-gnu@0.20.0-ts7.1.0-beta"
- "@tsrs/linux-arm64-musl@0.20.0-ts7.1.0-beta"
- "@tsrs/linux-x64-gnu@0.20.0-ts7.1.0-beta"
- "@tsrs/linux-x64-musl@0.20.0-ts7.1.0-beta"
- "@tsrs/win32-x64@0.20.0-ts7.1.0-beta"
- tsrs@0.20.0-ts7.1.0-beta
+7
View File
@@ -79,6 +79,13 @@
"matchPackageNames": ["typescript"], "matchPackageNames": ["typescript"],
"allowedVersions": "<7.0.0 || >=7.1.0" "allowedVersions": "<7.0.0 || >=7.1.0"
}, },
{
"description": "Review tsrs bumps alone; the version encodes the pinned TypeScript release",
"matchPackageNames": ["tsrs", "/^@tsrs//"],
"groupName": "tsrs",
"rangeStrategy": "pin",
"automerge": false
},
{ {
"description": "Prevent project from supply chain attack", "description": "Prevent project from supply chain attack",
"matchDatasources": ["npm"], "matchDatasources": ["npm"],
+3 -3
View File
@@ -29,7 +29,7 @@ perf-harness = ["dep:tauri-plugin-wdio-webdriver"]
identifier = "io.github.clash-verge-rev.clash-verge-rev" identifier = "io.github.clash-verge-rev.clash-verge-rev"
[build-dependencies] [build-dependencies]
tauri-build = { version = "2.7.4", features = [] } tauri-build = { version = "2.7.3", features = [] }
[dependencies] [dependencies]
clash-verge-draft = { workspace = true } clash-verge-draft = { workspace = true }
@@ -109,7 +109,7 @@ dark-light = "3.0.0"
bytes = "1.12.1" bytes = "1.12.1"
tokio-util = { version = "0.7.20", features = ["time"] } tokio-util = { version = "0.7.20", features = ["time"] }
specta = { version = "=2.0.0-rc.25", features = ["derive", "function", "serde_json"] } specta = { version = "=2.0.0-rc.25", features = ["derive", "function", "serde_json"] }
tauri-specta = { version = "=2.0.0-rc.26", features = ["derive", "typescript"] } tauri-specta = { version = "=2.0.0-rc.25", features = ["derive", "typescript"] }
specta-typescript = "=0.0.12" specta-typescript = "=0.0.12"
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
@@ -120,7 +120,7 @@ libc = "0.2.191"
clash-verge-signal = { workspace = true } clash-verge-signal = { workspace = true }
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
tauri-plugin-wdio-webdriver = { version = "=1.5.1", optional = true } tauri-plugin-wdio-webdriver = { version = "=1.5.0", optional = true }
objc2 = "0.6.5" objc2 = "0.6.5"
objc2-foundation = { version = "0.3.2", features = [ objc2-foundation = { version = "0.3.2", features = [
"NSString", "NSString",
+1 -1
View File
@@ -608,7 +608,7 @@ function NormalProxyGroups(props: { mode: string }) {
/> />
</DragDropProvider> </DragDropProvider>
{mode === 'rule' && ( {(mode === 'rule' || mode === 'global') && (
<ProxyGroupNavigator <ProxyGroupNavigator
proxyGroupNames={proxyGroupNames} proxyGroupNames={proxyGroupNames}
onGroupLocation={handleGroupLocationByName} onGroupLocation={handleGroupLocationByName}
+2 -2
View File
@@ -211,7 +211,7 @@ export const useRenderList = (
if (!proxyView) return [] if (!proxyView) return []
if (isChainMode) if (isChainMode)
return selectedGroup ? [selectedGroup] : [CHAIN_DELAY_GROUP] return selectedGroup ? [selectedGroup] : [CHAIN_DELAY_GROUP]
return mode === 'rule' || mode === 'script' return mode === 'rule' || mode === 'global'
? proxyView.groups.map(({ name }) => name) ? proxyView.groups.map(({ name }) => name)
: proxyView.global : proxyView.global
? [proxyView.global.name] ? [proxyView.global.name]
@@ -257,7 +257,7 @@ export const useRenderList = (
})) }))
} }
const useRule = mode === 'rule' || mode === 'script' const useRule = mode === 'rule' || mode === 'global'
const renderGroups = useRule const renderGroups = useRule
? proxyView.groups ? proxyView.groups
: proxyView.global === null : proxyView.global === null
+1
View File
@@ -36,6 +36,7 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"failed": "Failed", "failed": "Failed",
"risky": "غير مؤكد",
"completed": "Completed", "completed": "Completed",
"disallowedIsp": "Disallowed ISP", "disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only", "originalsOnly": "Originals Only",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Unterstützt", "yes": "Unterstützt",
"no": "Nicht unterstützt", "no": "Nicht unterstützt",
"failed": "Test fehlgeschlagen", "failed": "Test fehlgeschlagen",
"risky": "Ungewiss",
"completed": "Prüfung abgeschlossen", "completed": "Prüfung abgeschlossen",
"disallowedIsp": "Nicht zugelassener Internetdienstanbieter", "disallowedIsp": "Nicht zugelassener Internetdienstanbieter",
"originalsOnly": "Nur Original", "originalsOnly": "Nur Original",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"failed": "Failed", "failed": "Failed",
"risky": "Risky",
"completed": "Completed", "completed": "Completed",
"disallowedIsp": "Disallowed ISP", "disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only", "originalsOnly": "Originals Only",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Soportado", "yes": "Soportado",
"no": "No soportado", "no": "No soportado",
"failed": "Prueba fallida", "failed": "Prueba fallida",
"risky": "Dudoso",
"completed": "Detección completada", "completed": "Detección completada",
"disallowedIsp": "Proveedor de servicios de Internet no permitido", "disallowedIsp": "Proveedor de servicios de Internet no permitido",
"originalsOnly": "Solo originales", "originalsOnly": "Solo originales",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"failed": "Failed", "failed": "Failed",
"risky": "نامشخص",
"completed": "Completed", "completed": "Completed",
"disallowedIsp": "Disallowed ISP", "disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only", "originalsOnly": "Originals Only",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"failed": "Failed", "failed": "Failed",
"risky": "Tidak pasti",
"completed": "Completed", "completed": "Completed",
"disallowedIsp": "Disallowed ISP", "disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only", "originalsOnly": "Originals Only",
+1
View File
@@ -36,6 +36,7 @@
"yes": "サポートする", "yes": "サポートする",
"no": "サポートしない", "no": "サポートしない",
"failed": "テストに失敗しました。", "failed": "テストに失敗しました。",
"risky": "要確認",
"completed": "検査完了", "completed": "検査完了",
"disallowedIsp": "許可されていないインターネットサービスプロバイダー", "disallowedIsp": "許可されていないインターネットサービスプロバイダー",
"originalsOnly": "オリジナルのみ", "originalsOnly": "オリジナルのみ",
+1
View File
@@ -36,6 +36,7 @@
"yes": "예", "yes": "예",
"no": "아니오", "no": "아니오",
"failed": "실패", "failed": "실패",
"risky": "확인 필요",
"completed": "완료", "completed": "완료",
"disallowedIsp": "허용되지 않는 ISP", "disallowedIsp": "허용되지 않는 ISP",
"originalsOnly": "오리지널만", "originalsOnly": "오리지널만",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Sim", "yes": "Sim",
"no": "Não", "no": "Não",
"failed": "Falhou", "failed": "Falhou",
"risky": "Incerto",
"completed": "Concluído", "completed": "Concluído",
"disallowedIsp": "ISP não permitido", "disallowedIsp": "ISP não permitido",
"originalsOnly": "Somente originais", "originalsOnly": "Somente originais",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Да", "yes": "Да",
"no": "Нет", "no": "Нет",
"failed": "Ошибка", "failed": "Ошибка",
"risky": "Неясно",
"completed": "Завершено", "completed": "Завершено",
"disallowedIsp": "Провайдер заблокирован", "disallowedIsp": "Провайдер заблокирован",
"originalsOnly": "Только Originals", "originalsOnly": "Только Originals",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Evet", "yes": "Evet",
"no": "Hayır", "no": "Hayır",
"failed": "Başarısız", "failed": "Başarısız",
"risky": "Belirsiz",
"completed": "Tamamlandı", "completed": "Tamamlandı",
"disallowedIsp": "İzin Verilmeyen ISP", "disallowedIsp": "İzin Verilmeyen ISP",
"originalsOnly": "Yalnızca Orijinaller", "originalsOnly": "Yalnızca Orijinaller",
+1
View File
@@ -36,6 +36,7 @@
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"failed": "Failed", "failed": "Failed",
"risky": "Билгесез",
"completed": "Completed", "completed": "Completed",
"disallowedIsp": "Disallowed ISP", "disallowedIsp": "Disallowed ISP",
"originalsOnly": "Originals Only", "originalsOnly": "Originals Only",
+1
View File
@@ -36,6 +36,7 @@
"yes": "支持", "yes": "支持",
"no": "不支持", "no": "不支持",
"failed": "测试失败", "failed": "测试失败",
"risky": "存疑",
"completed": "检测完成", "completed": "检测完成",
"disallowedIsp": "不允许的 ISP", "disallowedIsp": "不允许的 ISP",
"originalsOnly": "仅限原创", "originalsOnly": "仅限原创",
+1
View File
@@ -36,6 +36,7 @@
"yes": "支援", "yes": "支援",
"no": "不支援", "no": "不支援",
"failed": "測試失敗", "failed": "測試失敗",
"risky": "存疑",
"completed": "檢測完成", "completed": "檢測完成",
"disallowedIsp": "不允許的網際網路服務供應商", "disallowedIsp": "不允許的網際網路服務供應商",
"originalsOnly": "僅限原創", "originalsOnly": "僅限原創",
+4 -2
View File
@@ -40,6 +40,7 @@ const STATUS_LABEL_KEYS: Record<string, string> = {
Yes: 'tests.statuses.test.yes', Yes: 'tests.statuses.test.yes',
No: 'tests.statuses.test.no', No: 'tests.statuses.test.no',
Failed: 'tests.statuses.test.failed', Failed: 'tests.statuses.test.failed',
Risky: 'tests.statuses.test.risky',
Completed: 'tests.statuses.test.completed', Completed: 'tests.statuses.test.completed',
'Disallowed ISP': 'tests.statuses.test.disallowedIsp', 'Disallowed ISP': 'tests.statuses.test.disallowedIsp',
'Originals Only': 'tests.statuses.test.originalsOnly', 'Originals Only': 'tests.statuses.test.originalsOnly',
@@ -196,7 +197,7 @@ const UnlockPage = () => {
if (status === 'Pending') return 'default' if (status === 'Pending') return 'default'
if (status === 'Yes') return 'success' if (status === 'Yes') return 'success'
if (status === 'No') return 'error' if (status === 'No') return 'error'
if (status === 'Soon') return 'warning' if (status === 'Soon' || status === 'Risky') return 'warning'
if (status.includes('Failed')) return 'error' if (status.includes('Failed')) return 'error'
if (status === 'Completed') return 'info' if (status === 'Completed') return 'info'
if ( if (
@@ -222,7 +223,8 @@ const UnlockPage = () => {
const getStatusBorderColor = (status: string) => { const getStatusBorderColor = (status: string) => {
if (status === 'Yes') return theme.palette.success.main if (status === 'Yes') return theme.palette.success.main
if (status === 'No') return theme.palette.error.main if (status === 'No') return theme.palette.error.main
if (status === 'Soon') return theme.palette.warning.main if (status === 'Soon' || status === 'Risky')
return theme.palette.warning.main
if (status.includes('Failed')) return theme.palette.error.main if (status.includes('Failed')) return theme.palette.error.main
if (status === 'Completed') return theme.palette.info.main if (status === 'Completed') return theme.palette.info.main
return theme.palette.divider return theme.palette.divider