From 775b612ecca9b9cc6d69e73d5e5c6e4f46f43323 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Tue, 17 Mar 2026 20:16:44 +0100 Subject: [PATCH] Update On Tue Mar 17 20:16:43 CET 2026 --- .github/update.log | 1 + clash-nyanpasu/.github/workflows/ci.yml | 6 +- clash-nyanpasu/.github/workflows/daily.yml | 4 +- .../.github/workflows/deps-build-linux.yaml | 2 +- .../.github/workflows/deps-build-macos.yaml | 2 +- .../workflows/deps-build-windows-nsis.yaml | 2 +- .../workflows/deps-create-updater.yaml | 2 +- .../.github/workflows/macos-aarch64.yaml | 2 +- clash-nyanpasu/.github/workflows/publish.yml | 2 +- .../frontend/nyanpasu/messages/en.json | 9 + .../frontend/nyanpasu/messages/ru.json | 9 + .../frontend/nyanpasu/messages/zh-cn.json | 9 + .../frontend/nyanpasu/messages/zh-tw.json | 9 + clash-nyanpasu/frontend/nyanpasu/package.json | 10 +- .../providers/_modules/providers-title.tsx | 101 ++++ .../_modules/use-proxies-provider-update.tsx | 25 + .../_modules/use-proxies-subscription.tsx | 38 ++ .../_modules/use-rules-provider-update.tsx | 23 + .../src/pages/(main)/main/providers/index.tsx | 321 ++++++++++++ .../(main)/main/providers/proxies/$key.tsx | 33 ++ .../providers/proxies/_modules/info-card.tsx | 55 ++ .../proxies/_modules/subscription-card.tsx | 37 ++ .../src/pages/(main)/main/providers/route.tsx | 163 +++++- .../(main)/main/providers/rules/$key.tsx | 30 ++ .../providers/rules/_modules/info-card.tsx | 55 ++ .../frontend/nyanpasu/src/route-tree.gen.ts | 131 ++++- clash-nyanpasu/frontend/ui/package.json | 2 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/pnpm-lock.yaml | 121 ++--- dns-over-https/doh-client/client.go | 163 +++++- dns-over-https/doh-client/config/config.go | 1 + dns-over-https/doh-client/doh-client.conf | 5 + .../luci-app-argone-config/README.md | 39 +- openwrt-packages/luci-theme-argone/README.md | 141 +---- .../luci-theme-argone/README_ZH.md | 131 ----- .../luasrc/view/themes/argone/footer.htm | 4 +- .../luasrc/view/themes/argone/header.htm | 2 +- .../view/themes/argone/header_login.htm | 2 +- .../luasrc/view/themes/argone/sysauth.htm | 2 +- .../root/usr/libexec/argone/online_wallpaper | 4 +- openwrt-packages/luci-theme-design/README.md | 2 +- .../.github/workflows/build-docker-image.yml | 8 +- shadowsocks-rust/Cargo.lock | 76 +-- shadowsocks-rust/Dockerfile | 2 +- small/pdnsd-alt/Makefile | 2 +- small/redsocks2/Makefile | 8 +- small/shadowsocksr-libev/Makefile | 27 +- .../0001-Add-ss-server-and-ss-check.patch | 397 -------------- ...Revert-verify_simple-and-auth_simple.patch | 20 +- .../patches/100-fix-gcc-10.patch | 20 - ...-Fix-Werror-sizeof-pointer-memaccess.patch | 11 - .../102-Read-listening-mode-from-config.patch | 34 -- ...Add-TPROXY-support-for-TCP-ssr-redir.patch | 36 +- .../patches/105-Upgrade-PCRE-to-PCRE2.patch | 494 ------------------ small/simple-obfs/Makefile | 4 +- small/v2dat/Makefile | 4 +- v2ray-core/go.mod | 2 +- v2ray-core/go.sum | 4 +- v2ray-core/infra/conf/v4/gun.go | 23 +- v2ray-core/proxy/http/client.go | 1 - .../proxy/shadowsocks2022/client_session.go | 4 +- .../transport/internet/grpc/config.pb.go | 56 +- .../transport/internet/grpc/config.proto | 4 + v2ray-core/transport/internet/grpc/dial.go | 86 +-- yt-dlp/.github/workflows/build.yml | 14 +- yt-dlp/.github/workflows/challenge-tests.yml | 4 +- yt-dlp/.github/workflows/codeql.yml | 4 +- yt-dlp/.github/workflows/release-master.yml | 2 +- yt-dlp/.github/workflows/release-nightly.yml | 4 +- yt-dlp/.github/workflows/release.yml | 4 +- yt-dlp/.github/workflows/test-workflows.yml | 8 +- yt-dlp/.github/zizmor.yml | 4 + 72 files changed, 1601 insertions(+), 1470 deletions(-) create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/providers-title.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-provider-update.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-subscription.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-rules-provider-update.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/index.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/$key.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/info-card.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/subscription-card.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/rules/$key.tsx create mode 100644 clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/rules/_modules/info-card.tsx delete mode 100644 openwrt-packages/luci-theme-argone/README_ZH.md delete mode 100644 small/shadowsocksr-libev/patches/0001-Add-ss-server-and-ss-check.patch delete mode 100644 small/shadowsocksr-libev/patches/100-fix-gcc-10.patch delete mode 100644 small/shadowsocksr-libev/patches/101-Fix-Werror-sizeof-pointer-memaccess.patch delete mode 100644 small/shadowsocksr-libev/patches/102-Read-listening-mode-from-config.patch delete mode 100644 small/shadowsocksr-libev/patches/105-Upgrade-PCRE-to-PCRE2.patch diff --git a/.github/update.log b/.github/update.log index 7ed644696c..5b62f568d5 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1301,3 +1301,4 @@ Update On Fri Mar 13 19:57:31 CET 2026 Update On Sat Mar 14 19:52:58 CET 2026 Update On Sun Mar 15 19:54:13 CET 2026 Update On Mon Mar 16 20:17:53 CET 2026 +Update On Tue Mar 17 20:16:34 CET 2026 diff --git a/clash-nyanpasu/.github/workflows/ci.yml b/clash-nyanpasu/.github/workflows/ci.yml index 859c4c1423..842d8e6dab 100644 --- a/clash-nyanpasu/.github/workflows/ci.yml +++ b/clash-nyanpasu/.github/workflows/ci.yml @@ -63,7 +63,7 @@ jobs: workspaces: 'backend' save-if: ${{ github.event_name == 'push' }} - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false @@ -155,7 +155,7 @@ jobs: workspaces: 'backend' save-if: ${{ github.event_name == 'push' }} - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false @@ -247,7 +247,7 @@ jobs: workspaces: 'backend' save-if: ${{ github.event_name == 'push' }} - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/daily.yml b/clash-nyanpasu/.github/workflows/daily.yml index 1d5f6c7cd8..0350d3d0bd 100644 --- a/clash-nyanpasu/.github/workflows/daily.yml +++ b/clash-nyanpasu/.github/workflows/daily.yml @@ -18,7 +18,7 @@ jobs: with: node-version: '24' - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false @@ -63,7 +63,7 @@ jobs: with: node-version: '24' - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml index d65c3002a0..bf4eb80282 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml @@ -84,7 +84,7 @@ jobs: with: node-version: 24 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/deps-build-macos.yaml b/clash-nyanpasu/.github/workflows/deps-build-macos.yaml index 233533e677..6f9dfd1942 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-macos.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-macos.yaml @@ -73,7 +73,7 @@ jobs: with: deno-version: v2.x - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml b/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml index 5be9f47319..82cddb7b57 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml @@ -90,7 +90,7 @@ jobs: with: node-version: 24 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/deps-create-updater.yaml b/clash-nyanpasu/.github/workflows/deps-create-updater.yaml index 65bf954e8f..c6c5c9da0e 100644 --- a/clash-nyanpasu/.github/workflows/deps-create-updater.yaml +++ b/clash-nyanpasu/.github/workflows/deps-create-updater.yaml @@ -47,7 +47,7 @@ jobs: with: node-version: 24 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/macos-aarch64.yaml b/clash-nyanpasu/.github/workflows/macos-aarch64.yaml index 656d6095d7..d3fb4e8cdb 100644 --- a/clash-nyanpasu/.github/workflows/macos-aarch64.yaml +++ b/clash-nyanpasu/.github/workflows/macos-aarch64.yaml @@ -36,7 +36,7 @@ jobs: with: node-version: '24' - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/.github/workflows/publish.yml b/clash-nyanpasu/.github/workflows/publish.yml index 07b530d0f6..bc3b9129ec 100644 --- a/clash-nyanpasu/.github/workflows/publish.yml +++ b/clash-nyanpasu/.github/workflows/publish.yml @@ -32,7 +32,7 @@ jobs: uses: actions/setup-node@v6 with: node-version: 24 - - uses: pnpm/action-setup@v4 + - uses: pnpm/action-setup@v5 name: Install pnpm with: run_install: false diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/en.json b/clash-nyanpasu/frontend/nyanpasu/messages/en.json index adc4daf008..2d4d0a2a42 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/en.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/en.json @@ -194,6 +194,15 @@ "connections_empty_message": "No connections found", "connections_close_connection": "Close Connection", "connections_view_details": "Details", + "providers_proxies_title": "Proxy Groups", + "providers_rules_title": "Rule Sets", + "providers_no_proxies_message": "Current profile does not have any proxy groups", + "providers_no_rules_message": "Current profile does not have any rule sets", + "providers_proxies_proxy_count_label": "{count} Proxies", + "providers_rules_rule_count_label": "{count} Rules", + "providers_info_title": "Resource Info", + "providers_subscription_title": "Subscription Info", + "providers_update_provider": "Update", "editor_before_close_message": "You have not saved the edited content, are you sure you want to close the editor?", "editor_validate_error_message": "Please fix the error before saving content", "editor_read_only_chip": "Read Only", diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/ru.json b/clash-nyanpasu/frontend/nyanpasu/messages/ru.json index 7fdaa05ce0..83f2b17257 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/ru.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/ru.json @@ -194,6 +194,15 @@ "connections_empty_message": "Не найдено ни одного соединения", "connections_close_connection": "Закрыть соединение", "connections_view_details": "Просмотреть детали", + "providers_proxies_title": "Группы прокси", + "providers_rules_title": "Наборы правил", + "providers_no_proxies_message": "Текущий профиль не имеет групп прокси", + "providers_no_rules_message": "Текущий профиль не имеет наборов правил", + "providers_proxies_proxy_count_label": "{count} прокси", + "providers_rules_rule_count_label": "{count} правил", + "providers_info_title": "Информация о ресурсах", + "providers_subscription_title": "Информация о подписке", + "providers_update_provider": "Обновить ресурсы", "editor_before_close_message": "Вы не сохранили измененное содержимое, вы уверены, что хотите закрыть редактор?", "editor_validate_error_message": "Пожалуйста, исправьте ошибки перед сохранением содержимого", "editor_read_only_chip": "Только для чтения", diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json b/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json index 5d2cb12636..380a48e30a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/zh-cn.json @@ -194,6 +194,15 @@ "connections_empty_message": "没有找到任何连接", "connections_close_connection": "关闭连接", "connections_view_details": "查看详情", + "providers_proxies_title": "代理集", + "providers_rules_title": "规则集", + "providers_no_proxies_message": "当前配置没有任何代理集", + "providers_no_rules_message": "当前配置没有任何规则集", + "providers_proxies_proxy_count_label": "{count}个节点", + "providers_rules_rule_count_label": "{count}个规则", + "providers_info_title": "资源信息", + "providers_subscription_title": "订阅信息", + "providers_update_provider": "更新资源", "editor_before_close_message": "你尚未保存编辑的内容,确定要关闭编辑器吗?", "editor_validate_error_message": "请修复错误后再保存内容", "editor_read_only_chip": "只读", diff --git a/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json b/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json index d667713eda..60b86f9b42 100644 --- a/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json +++ b/clash-nyanpasu/frontend/nyanpasu/messages/zh-tw.json @@ -194,6 +194,15 @@ "connections_empty_message": "沒有找到任何連接", "connections_close_connection": "關閉連接", "connections_view_details": "查看詳情", + "providers_proxies_title": "代理集", + "providers_rules_title": "規則集", + "providers_no_proxies_message": "當前配置沒有任何代理集", + "providers_no_rules_message": "當前配置沒有任何規則集", + "providers_proxies_proxy_count_label": "{count}個節點", + "providers_rules_rule_count_label": "{count}個規則", + "providers_info_title": "資源信息", + "providers_subscription_title": "訂閱信息", + "providers_update_provider": "更新資源", "editor_before_close_message": "你尚未儲存編輯的內容,確定要關閉編輯器嗎?", "editor_validate_error_message": "請修正錯誤後再儲存內容", "editor_read_only_chip": "只讀", diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index ff9cbccf82..70eb5d8c45 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -42,7 +42,7 @@ "country-code-emoji": "2.3.0", "country-emoji": "1.5.6", "dayjs": "1.11.20", - "framer-motion": "12.36.0", + "framer-motion": "12.38.0", "i18next": "25.8.18", "jotai": "2.18.1", "json-schema": "0.4.0", @@ -69,12 +69,12 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.13.5", "@emotion/react": "11.14.0", - "@iconify/json": "2.2.450", + "@iconify/json": "2.2.451", "@monaco-editor/react": "4.7.0", "@tanstack/react-query": "5.90.21", - "@tanstack/react-router": "1.167.3", + "@tanstack/react-router": "1.167.4", "@tanstack/react-router-devtools": "1.166.9", - "@tanstack/router-plugin": "1.166.12", + "@tanstack/router-plugin": "1.166.13", "@tauri-apps/plugin-clipboard-manager": "2.3.2", "@tauri-apps/plugin-dialog": "2.6.0", "@tauri-apps/plugin-fs": "2.4.5", @@ -91,7 +91,7 @@ "@vitejs/plugin-react-swc": "4.3.0", "change-case": "5.4.4", "clsx": "2.1.1", - "core-js": "3.48.0", + "core-js": "3.49.0", "filesize": "11.0.13", "meta-json-schema": "1.19.21", "monaco-yaml": "5.4.1", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/providers-title.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/providers-title.tsx new file mode 100644 index 0000000000..5d74b29c48 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/providers-title.tsx @@ -0,0 +1,101 @@ +import ArrowBackIosNewRounded from '~icons/material-symbols/arrow-back-ios-new-rounded' +import { AnimatePresence, motion } from 'framer-motion' +import { ComponentProps, useId } from 'react' +import { Button } from '@/components/ui/button' +import { useScrollArea } from '@/components/ui/scroll-area' +import { cn } from '@nyanpasu/ui' +import { Link } from '@tanstack/react-router' + +const BackButton = () => { + return ( + + ) +} + +const Title = (props: ComponentProps) => { + return ( + + ) +} + +export function ProvidersTitle({ + className, + children, + ...props +}: ComponentProps<'div'>) { + const { offset } = useScrollArea() + + const id = useId() + + const showTopTitle = offset.top > 40 + + return ( + <> +
+ + + + {showTopTitle && ( + + {children} + + )} + +
+ +
+ + {!showTopTitle && ( + + {children} + + )} + +
+ + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-provider-update.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-provider-update.tsx new file mode 100644 index 0000000000..22325aa99e --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-provider-update.tsx @@ -0,0 +1,25 @@ +import { useBlockTask } from '@/components/providers/block-task-provider' +import { formatError } from '@/utils' +import { message } from '@/utils/notification' +import { ClashProxiesProviderQueryItem } from '@nyanpasu/interface' + +export const useProxiesProviderUpdate = ( + data: ClashProxiesProviderQueryItem, +) => { + const blockTask = useBlockTask( + `update-proxies-provider-${data.name}`, + async () => { + try { + await data.mutate() + } catch (error) { + console.error('Failed to update proxies provider', error) + message(`Update provider failed: \n ${formatError(error)}`, { + title: 'Error', + kind: 'error', + }) + } + }, + ) + + return blockTask +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-subscription.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-subscription.tsx new file mode 100644 index 0000000000..0194e0c413 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-proxies-subscription.tsx @@ -0,0 +1,38 @@ +import { useMemo } from 'react' +import { ClashProviderProxies } from '@nyanpasu/interface' + +export const useProxiesSubscription = (data: ClashProviderProxies) => { + return useMemo(() => { + let progress = 0 + let total = 0 + let used = 0 + + const hasSubscriptionInfo = + 'subscriptionInfo' in data && data.subscriptionInfo !== undefined + + if (hasSubscriptionInfo) { + const subscriptionInfo = data.subscriptionInfo as Record< + string, + number | undefined + > + + const download = + subscriptionInfo.download ?? subscriptionInfo.Download ?? 0 + const upload = subscriptionInfo.upload ?? subscriptionInfo.Upload ?? 0 + const t = subscriptionInfo.total ?? subscriptionInfo.Total ?? 0 + + total = t + + used = download + upload + + progress = (used / (total || 1)) * 100 + } + + return { + progress, + total, + used, + hasSubscriptionInfo, + } + }, [data]) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-rules-provider-update.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-rules-provider-update.tsx new file mode 100644 index 0000000000..b1eef211c9 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/_modules/use-rules-provider-update.tsx @@ -0,0 +1,23 @@ +import { useBlockTask } from '@/components/providers/block-task-provider' +import { formatError } from '@/utils' +import { message } from '@/utils/notification' +import { ClashRulesProviderQueryItem } from '@nyanpasu/interface' + +export const useRulesProviderUpdate = (data: ClashRulesProviderQueryItem) => { + const blockTask = useBlockTask( + `update-rules-provider-${data.name}`, + async () => { + try { + await data.mutate() + } catch (error) { + console.error('Failed to update rules provider', error) + message(`Update provider failed: \n ${formatError(error)}`, { + title: 'Error', + kind: 'error', + }) + } + }, + ) + + return blockTask +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/index.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/index.tsx new file mode 100644 index 0000000000..d682e6ae87 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/index.tsx @@ -0,0 +1,321 @@ +import AllInboxRounded from '~icons/material-symbols/all-inbox-outline-rounded' +import RefreshRounded from '~icons/material-symbols/refresh-rounded' +import dayjs from 'dayjs' +import { filesize } from 'filesize' +import { ComponentProps, PropsWithChildren } from 'react' +import { useBlockTask } from '@/components/providers/block-task-provider' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { LinearProgress } from '@/components/ui/progress' +import TextMarquee from '@/components/ui/text-marquee' +import { useLockFn } from '@/hooks/use-lock-fn' +import { m } from '@/paraglide/messages' +import { formatError } from '@/utils' +import { message } from '@/utils/notification' +import { + ClashProxiesProviderQueryItem, + ClashRulesProviderQueryItem, + useClashProxiesProvider, + useClashRulesProvider, +} from '@nyanpasu/interface' +import { cn } from '@nyanpasu/ui' +import { createFileRoute, Link } from '@tanstack/react-router' +import { useProxiesProviderUpdate } from './_modules/use-proxies-provider-update' +import { useProxiesSubscription } from './_modules/use-proxies-subscription' +import { useRulesProviderUpdate } from './_modules/use-rules-provider-update' + +export const Route = createFileRoute('/(main)/main/providers/')({ + component: RouteComponent, +}) + +const NavigateButton = ({ + className, + ...props +}: ComponentProps) => { + return ( + + + + + ) +} + +const Rules = ({ data }: { data: ClashRulesProviderQueryItem }) => { + const blockTask = useRulesProviderUpdate(data) + + const handleClick = useLockFn(blockTask.execute) + + return ( + + +
+ {data.name} + +
+ {dayjs(data.updatedAt).fromNow()} +
+
+ +
+ {data.vehicleType}/{data.type} +
+ +
+
+ {m.providers_rules_rule_count_label({ + count: data.ruleCount, + })} +
+ + +
+ +
+ ) +} + +function RouteComponent() { + const proxiesProvider = useClashProxiesProvider() + + const proxies = proxiesProvider.data + ? Object.entries(proxiesProvider.data) + : null + + const proxiesBlockTask = useBlockTask('update-proxies-provider', async () => { + if (!proxies) { + return + } + + try { + await Promise.all(proxies.map(([_, data]) => data.mutate())) + } catch (error) { + console.error('Failed to update proxies provider', error) + message(`Update provider failed: \n ${formatError(error)}`, { + title: 'Error', + kind: 'error', + }) + } + }) + + const handleUpdateProxies = useLockFn(proxiesBlockTask.execute) + + const rulesProvider = useClashRulesProvider() + + const rules = rulesProvider.data ? Object.entries(rulesProvider.data) : null + + const rulesBlockTask = useBlockTask('update-rules-provider', async () => { + if (!rules) { + return + } + + try { + await Promise.all(rules.map(([_, data]) => data.mutate())) + } catch (error) { + console.error('Failed to update rules provider', error) + message(`Update provider failed: \n ${formatError(error)}`, { + title: 'Error', + kind: 'error', + }) + } + }) + + const handleUpdateRules = useLockFn(rulesBlockTask.execute) + + return ( +
+ + + {m.providers_proxies_title()} + + + + + {proxies && proxies.length ? ( + + {proxies.map(([key, data]) => ( + + ))} + + ) : ( + +

{m.providers_no_proxies_message()}

+
+ )} +
+ + + + {m.providers_rules_title()} + + + + + {rules && rules.length ? ( + + {rules.map(([key, data]) => ( + + ))} + + ) : ( + +

{m.providers_no_rules_message()}

+
+ )} +
+
+ ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/$key.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/$key.tsx new file mode 100644 index 0000000000..becf15e4c4 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/$key.tsx @@ -0,0 +1,33 @@ +import { useClashProxiesProvider } from '@nyanpasu/interface' +import { createFileRoute } from '@tanstack/react-router' +import { ProvidersTitle } from '../_modules/providers-title' +import { InfoCard } from './_modules/info-card' +import { SubscriptionCard } from './_modules/subscription-card' + +export const Route = createFileRoute('/(main)/main/providers/proxies/$key')({ + component: RouteComponent, +}) + +function RouteComponent() { + const { key } = Route.useParams() + + const proxiesProvider = useClashProxiesProvider() + + const currentProxy = proxiesProvider.data?.[key] + + if (!currentProxy) { + return null + } + + return ( + <> + {key} + +
+ + + +
+ + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/info-card.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/info-card.tsx new file mode 100644 index 0000000000..245188cc54 --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/info-card.tsx @@ -0,0 +1,55 @@ +import RefreshRounded from '~icons/material-symbols/refresh-rounded' +import dayjs from 'dayjs' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card' +import { useLockFn } from '@/hooks/use-lock-fn' +import { m } from '@/paraglide/messages' +import { ClashProxiesProviderQueryItem } from '@nyanpasu/interface' +import { useProxiesProviderUpdate } from '../../_modules/use-proxies-provider-update' + +export const InfoCard = ({ data }: { data: ClashProxiesProviderQueryItem }) => { + const blockTask = useProxiesProviderUpdate(data) + + const handleRefreshClick = useLockFn(async () => { + await blockTask.execute() + }) + + return ( + + {m.providers_info_title()} + + +
+
+ {m.providers_proxies_proxy_count_label({ + count: data.proxies.length, + })} +
+ +
+ {data.vehicleType}/{data.type} +
+
+
+ + + + +
+ +
+ {m.profile_subscription_updated_at({ + updated: dayjs(data.updatedAt).fromNow(), + })} +
+ + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/subscription-card.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/subscription-card.tsx new file mode 100644 index 0000000000..5e6398454d --- /dev/null +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/proxies/_modules/subscription-card.tsx @@ -0,0 +1,37 @@ +import { filesize } from 'filesize' +import { Card, CardContent, CardHeader } from '@/components/ui/card' +import { LinearProgress } from '@/components/ui/progress' +import { m } from '@/paraglide/messages' +import { ClashProxiesProviderQueryItem } from '@nyanpasu/interface' +import { useProxiesSubscription } from '../../_modules/use-proxies-subscription' + +export const SubscriptionCard = ({ + data, +}: { + data: ClashProxiesProviderQueryItem +}) => { + const { progress, total, used, hasSubscriptionInfo } = + useProxiesSubscription(data) + + if (!hasSubscriptionInfo) { + return null + } + + return ( + + {m.providers_subscription_title()} + + + + +
+
{progress.toFixed(2)}%
+ +
+ {filesize(used)} / {filesize(total)} +
+
+
+
+ ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/route.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/route.tsx index 2a42e7fa77..44c7971a14 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/route.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/(main)/main/providers/route.tsx @@ -1,9 +1,166 @@ -import { createFileRoute } from '@tanstack/react-router' +import { motion } from 'framer-motion' +import { ComponentProps } from 'react' +import { AnimatedOutletPreset } from '@/components/router/animated-outlet' +import { Button } from '@/components/ui/button' +import { AppContentScrollArea } from '@/components/ui/scroll-area' +import { Separator } from '@/components/ui/separator' +import { Sidebar, SidebarContent } from '@/components/ui/sidebar' +import TextMarquee from '@/components/ui/text-marquee' +import useIsMobile from '@/hooks/use-is-moblie' +import { + useClashProxiesProvider, + useClashRulesProvider, +} from '@nyanpasu/interface' +import { cn } from '@nyanpasu/ui' +import { createFileRoute, Link, useLocation } from '@tanstack/react-router' export const Route = createFileRoute('/(main)/main/providers')({ component: RouteComponent, }) -function RouteComponent() { - return
Hello "/(main)/main/providers"!
+const NavigateButton = ({ + className, + ...props +}: ComponentProps) => { + return ( + + +
+ +
+ {m.profile_subscription_updated_at({ + updated: dayjs(data.updatedAt).fromNow(), + })} +
+ + + ) +} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts b/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts index d8b6bed480..9a7e4d1329 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/route-tree.gen.ts @@ -34,8 +34,10 @@ import { Route as mainMainConnectionsRouteRouteImport } from './pages/(main)/mai import { Route as mainMainSettingsIndexRouteImport } from './pages/(main)/main/settings/index' import { Route as mainMainRulesIndexRouteImport } from './pages/(main)/main/rules/index' import { Route as mainMainProxiesIndexRouteImport } from './pages/(main)/main/proxies/index' +import { Route as mainMainProvidersIndexRouteImport } from './pages/(main)/main/providers/index' import { Route as mainMainProfilesIndexRouteImport } from './pages/(main)/main/profiles/index' import { Route as mainMainLogsIndexRouteImport } from './pages/(main)/main/logs/index' +import { Route as mainMainConnectionsIndexRouteImport } from './pages/(main)/main/connections/index' import { Route as mainMainSettingsWebUiRouteRouteImport } from './pages/(main)/main/settings/web-ui/route' import { Route as mainMainSettingsUserInterfaceRouteRouteImport } from './pages/(main)/main/settings/user-interface/route' import { Route as mainMainSettingsSystemRouteRouteImport } from './pages/(main)/main/settings/system/route' @@ -47,6 +49,8 @@ import { Route as mainMainProfilesInspectRouteRouteImport } from './pages/(main) import { Route as mainMainSettingsDebugIndexRouteImport } from './pages/(main)/main/settings/debug/index' import { Route as mainMainProfilesTypeIndexRouteImport } from './pages/(main)/main/profiles/$type/index' import { Route as mainMainProxiesGroupNameRouteImport } from './pages/(main)/main/proxies/group/$name' +import { Route as mainMainProvidersRulesKeyRouteImport } from './pages/(main)/main/providers/rules/$key' +import { Route as mainMainProvidersProxiesKeyRouteImport } from './pages/(main)/main/providers/proxies/$key' import { Route as mainMainProfilesTypeDetailUidRouteImport } from './pages/(main)/main/profiles/$type/detail/$uid' const mainRouteRoute = mainRouteRouteImport.update({ @@ -173,6 +177,11 @@ const mainMainProxiesIndexRoute = mainMainProxiesIndexRouteImport.update({ path: '/', getParentRoute: () => mainMainProxiesRouteRoute, } as any) +const mainMainProvidersIndexRoute = mainMainProvidersIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => mainMainProvidersRouteRoute, +} as any) const mainMainProfilesIndexRoute = mainMainProfilesIndexRouteImport.update({ id: '/', path: '/', @@ -183,6 +192,12 @@ const mainMainLogsIndexRoute = mainMainLogsIndexRouteImport.update({ path: '/', getParentRoute: () => mainMainLogsRouteRoute, } as any) +const mainMainConnectionsIndexRoute = + mainMainConnectionsIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => mainMainConnectionsRouteRoute, + } as any) const mainMainSettingsWebUiRouteRoute = mainMainSettingsWebUiRouteRouteImport.update({ id: '/web-ui', @@ -249,6 +264,18 @@ const mainMainProxiesGroupNameRoute = path: '/group/$name', getParentRoute: () => mainMainProxiesRouteRoute, } as any) +const mainMainProvidersRulesKeyRoute = + mainMainProvidersRulesKeyRouteImport.update({ + id: '/rules/$key', + path: '/rules/$key', + getParentRoute: () => mainMainProvidersRouteRoute, + } as any) +const mainMainProvidersProxiesKeyRoute = + mainMainProvidersProxiesKeyRouteImport.update({ + id: '/proxies/$key', + path: '/proxies/$key', + getParentRoute: () => mainMainProvidersRouteRoute, + } as any) const mainMainProfilesTypeDetailUidRoute = mainMainProfilesTypeDetailUidRouteImport.update({ id: '/$type/detail/$uid', @@ -267,11 +294,11 @@ export interface FileRoutesByFullPath { '/rules': typeof legacyRulesRoute '/settings': typeof legacySettingsRoute '/': typeof legacyIndexRoute - '/main/connections': typeof mainMainConnectionsRouteRoute + '/main/connections': typeof mainMainConnectionsRouteRouteWithChildren '/main/dashboard': typeof mainMainDashboardRouteRoute '/main/logs': typeof mainMainLogsRouteRouteWithChildren '/main/profiles': typeof mainMainProfilesRouteRouteWithChildren - '/main/providers': typeof mainMainProvidersRouteRoute + '/main/providers': typeof mainMainProvidersRouteRouteWithChildren '/main/proxies': typeof mainMainProxiesRouteRouteWithChildren '/main/rules': typeof mainMainRulesRouteRouteWithChildren '/main/settings': typeof mainMainSettingsRouteRouteWithChildren @@ -285,11 +312,15 @@ export interface FileRoutesByFullPath { '/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute + '/main/connections/': typeof mainMainConnectionsIndexRoute '/main/logs/': typeof mainMainLogsIndexRoute '/main/profiles/': typeof mainMainProfilesIndexRoute + '/main/providers/': typeof mainMainProvidersIndexRoute '/main/proxies/': typeof mainMainProxiesIndexRoute '/main/rules/': typeof mainMainRulesIndexRoute '/main/settings/': typeof mainMainSettingsIndexRoute + '/main/providers/proxies/$key': typeof mainMainProvidersProxiesKeyRoute + '/main/providers/rules/$key': typeof mainMainProvidersRulesKeyRoute '/main/proxies/group/$name': typeof mainMainProxiesGroupNameRoute '/main/profiles/$type/': typeof mainMainProfilesTypeIndexRoute '/main/settings/debug/': typeof mainMainSettingsDebugIndexRoute @@ -305,9 +336,7 @@ export interface FileRoutesByTo { '/rules': typeof legacyRulesRoute '/settings': typeof legacySettingsRoute '/': typeof legacyIndexRoute - '/main/connections': typeof mainMainConnectionsRouteRoute '/main/dashboard': typeof mainMainDashboardRouteRoute - '/main/providers': typeof mainMainProvidersRouteRoute '/editor': typeof editorEditorIndexRoute '/main': typeof mainMainIndexRoute '/main/profiles/inspect': typeof mainMainProfilesInspectRouteRoute @@ -317,11 +346,15 @@ export interface FileRoutesByTo { '/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute + '/main/connections': typeof mainMainConnectionsIndexRoute '/main/logs': typeof mainMainLogsIndexRoute '/main/profiles': typeof mainMainProfilesIndexRoute + '/main/providers': typeof mainMainProvidersIndexRoute '/main/proxies': typeof mainMainProxiesIndexRoute '/main/rules': typeof mainMainRulesIndexRoute '/main/settings': typeof mainMainSettingsIndexRoute + '/main/providers/proxies/$key': typeof mainMainProvidersProxiesKeyRoute + '/main/providers/rules/$key': typeof mainMainProvidersRulesKeyRoute '/main/proxies/group/$name': typeof mainMainProxiesGroupNameRoute '/main/profiles/$type': typeof mainMainProfilesTypeIndexRoute '/main/settings/debug': typeof mainMainSettingsDebugIndexRoute @@ -341,11 +374,11 @@ export interface FileRoutesById { '/(legacy)/rules': typeof legacyRulesRoute '/(legacy)/settings': typeof legacySettingsRoute '/(legacy)/': typeof legacyIndexRoute - '/(main)/main/connections': typeof mainMainConnectionsRouteRoute + '/(main)/main/connections': typeof mainMainConnectionsRouteRouteWithChildren '/(main)/main/dashboard': typeof mainMainDashboardRouteRoute '/(main)/main/logs': typeof mainMainLogsRouteRouteWithChildren '/(main)/main/profiles': typeof mainMainProfilesRouteRouteWithChildren - '/(main)/main/providers': typeof mainMainProvidersRouteRoute + '/(main)/main/providers': typeof mainMainProvidersRouteRouteWithChildren '/(main)/main/proxies': typeof mainMainProxiesRouteRouteWithChildren '/(main)/main/rules': typeof mainMainRulesRouteRouteWithChildren '/(main)/main/settings': typeof mainMainSettingsRouteRouteWithChildren @@ -359,11 +392,15 @@ export interface FileRoutesById { '/(main)/main/settings/system': typeof mainMainSettingsSystemRouteRoute '/(main)/main/settings/user-interface': typeof mainMainSettingsUserInterfaceRouteRoute '/(main)/main/settings/web-ui': typeof mainMainSettingsWebUiRouteRoute + '/(main)/main/connections/': typeof mainMainConnectionsIndexRoute '/(main)/main/logs/': typeof mainMainLogsIndexRoute '/(main)/main/profiles/': typeof mainMainProfilesIndexRoute + '/(main)/main/providers/': typeof mainMainProvidersIndexRoute '/(main)/main/proxies/': typeof mainMainProxiesIndexRoute '/(main)/main/rules/': typeof mainMainRulesIndexRoute '/(main)/main/settings/': typeof mainMainSettingsIndexRoute + '/(main)/main/providers/proxies/$key': typeof mainMainProvidersProxiesKeyRoute + '/(main)/main/providers/rules/$key': typeof mainMainProvidersRulesKeyRoute '/(main)/main/proxies/group/$name': typeof mainMainProxiesGroupNameRoute '/(main)/main/profiles/$type/': typeof mainMainProfilesTypeIndexRoute '/(main)/main/settings/debug/': typeof mainMainSettingsDebugIndexRoute @@ -400,11 +437,15 @@ export interface FileRouteTypes { | '/main/settings/system' | '/main/settings/user-interface' | '/main/settings/web-ui' + | '/main/connections/' | '/main/logs/' | '/main/profiles/' + | '/main/providers/' | '/main/proxies/' | '/main/rules/' | '/main/settings/' + | '/main/providers/proxies/$key' + | '/main/providers/rules/$key' | '/main/proxies/group/$name' | '/main/profiles/$type/' | '/main/settings/debug/' @@ -420,9 +461,7 @@ export interface FileRouteTypes { | '/rules' | '/settings' | '/' - | '/main/connections' | '/main/dashboard' - | '/main/providers' | '/editor' | '/main' | '/main/profiles/inspect' @@ -432,11 +471,15 @@ export interface FileRouteTypes { | '/main/settings/system' | '/main/settings/user-interface' | '/main/settings/web-ui' + | '/main/connections' | '/main/logs' | '/main/profiles' + | '/main/providers' | '/main/proxies' | '/main/rules' | '/main/settings' + | '/main/providers/proxies/$key' + | '/main/providers/rules/$key' | '/main/proxies/group/$name' | '/main/profiles/$type' | '/main/settings/debug' @@ -473,11 +516,15 @@ export interface FileRouteTypes { | '/(main)/main/settings/system' | '/(main)/main/settings/user-interface' | '/(main)/main/settings/web-ui' + | '/(main)/main/connections/' | '/(main)/main/logs/' | '/(main)/main/profiles/' + | '/(main)/main/providers/' | '/(main)/main/proxies/' | '/(main)/main/rules/' | '/(main)/main/settings/' + | '/(main)/main/providers/proxies/$key' + | '/(main)/main/providers/rules/$key' | '/(main)/main/proxies/group/$name' | '/(main)/main/profiles/$type/' | '/(main)/main/settings/debug/' @@ -667,6 +714,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof mainMainProxiesIndexRouteImport parentRoute: typeof mainMainProxiesRouteRoute } + '/(main)/main/providers/': { + id: '/(main)/main/providers/' + path: '/' + fullPath: '/main/providers/' + preLoaderRoute: typeof mainMainProvidersIndexRouteImport + parentRoute: typeof mainMainProvidersRouteRoute + } '/(main)/main/profiles/': { id: '/(main)/main/profiles/' path: '/' @@ -681,6 +735,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof mainMainLogsIndexRouteImport parentRoute: typeof mainMainLogsRouteRoute } + '/(main)/main/connections/': { + id: '/(main)/main/connections/' + path: '/' + fullPath: '/main/connections/' + preLoaderRoute: typeof mainMainConnectionsIndexRouteImport + parentRoute: typeof mainMainConnectionsRouteRoute + } '/(main)/main/settings/web-ui': { id: '/(main)/main/settings/web-ui' path: '/web-ui' @@ -758,6 +819,20 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof mainMainProxiesGroupNameRouteImport parentRoute: typeof mainMainProxiesRouteRoute } + '/(main)/main/providers/rules/$key': { + id: '/(main)/main/providers/rules/$key' + path: '/rules/$key' + fullPath: '/main/providers/rules/$key' + preLoaderRoute: typeof mainMainProvidersRulesKeyRouteImport + parentRoute: typeof mainMainProvidersRouteRoute + } + '/(main)/main/providers/proxies/$key': { + id: '/(main)/main/providers/proxies/$key' + path: '/proxies/$key' + fullPath: '/main/providers/proxies/$key' + preLoaderRoute: typeof mainMainProvidersProxiesKeyRouteImport + parentRoute: typeof mainMainProvidersRouteRoute + } '/(main)/main/profiles/$type/detail/$uid': { id: '/(main)/main/profiles/$type/detail/$uid' path: '/$type/detail/$uid' @@ -796,6 +871,20 @@ const legacyRouteRouteWithChildren = legacyRouteRoute._addFileChildren( legacyRouteRouteChildren, ) +interface mainMainConnectionsRouteRouteChildren { + mainMainConnectionsIndexRoute: typeof mainMainConnectionsIndexRoute +} + +const mainMainConnectionsRouteRouteChildren: mainMainConnectionsRouteRouteChildren = + { + mainMainConnectionsIndexRoute: mainMainConnectionsIndexRoute, + } + +const mainMainConnectionsRouteRouteWithChildren = + mainMainConnectionsRouteRoute._addFileChildren( + mainMainConnectionsRouteRouteChildren, + ) + interface mainMainLogsRouteRouteChildren { mainMainLogsIndexRoute: typeof mainMainLogsIndexRoute } @@ -826,6 +915,24 @@ const mainMainProfilesRouteRouteWithChildren = mainMainProfilesRouteRouteChildren, ) +interface mainMainProvidersRouteRouteChildren { + mainMainProvidersIndexRoute: typeof mainMainProvidersIndexRoute + mainMainProvidersProxiesKeyRoute: typeof mainMainProvidersProxiesKeyRoute + mainMainProvidersRulesKeyRoute: typeof mainMainProvidersRulesKeyRoute +} + +const mainMainProvidersRouteRouteChildren: mainMainProvidersRouteRouteChildren = + { + mainMainProvidersIndexRoute: mainMainProvidersIndexRoute, + mainMainProvidersProxiesKeyRoute: mainMainProvidersProxiesKeyRoute, + mainMainProvidersRulesKeyRoute: mainMainProvidersRulesKeyRoute, + } + +const mainMainProvidersRouteRouteWithChildren = + mainMainProvidersRouteRoute._addFileChildren( + mainMainProvidersRouteRouteChildren, + ) + interface mainMainProxiesRouteRouteChildren { mainMainProxiesIndexRoute: typeof mainMainProxiesIndexRoute mainMainProxiesGroupNameRoute: typeof mainMainProxiesGroupNameRoute @@ -893,11 +1000,11 @@ const mainMainSettingsRouteRouteWithChildren = ) interface mainRouteRouteChildren { - mainMainConnectionsRouteRoute: typeof mainMainConnectionsRouteRoute + mainMainConnectionsRouteRoute: typeof mainMainConnectionsRouteRouteWithChildren mainMainDashboardRouteRoute: typeof mainMainDashboardRouteRoute mainMainLogsRouteRoute: typeof mainMainLogsRouteRouteWithChildren mainMainProfilesRouteRoute: typeof mainMainProfilesRouteRouteWithChildren - mainMainProvidersRouteRoute: typeof mainMainProvidersRouteRoute + mainMainProvidersRouteRoute: typeof mainMainProvidersRouteRouteWithChildren mainMainProxiesRouteRoute: typeof mainMainProxiesRouteRouteWithChildren mainMainRulesRouteRoute: typeof mainMainRulesRouteRouteWithChildren mainMainSettingsRouteRoute: typeof mainMainSettingsRouteRouteWithChildren @@ -905,11 +1012,11 @@ interface mainRouteRouteChildren { } const mainRouteRouteChildren: mainRouteRouteChildren = { - mainMainConnectionsRouteRoute: mainMainConnectionsRouteRoute, + mainMainConnectionsRouteRoute: mainMainConnectionsRouteRouteWithChildren, mainMainDashboardRouteRoute: mainMainDashboardRouteRoute, mainMainLogsRouteRoute: mainMainLogsRouteRouteWithChildren, mainMainProfilesRouteRoute: mainMainProfilesRouteRouteWithChildren, - mainMainProvidersRouteRoute: mainMainProvidersRouteRoute, + mainMainProvidersRouteRoute: mainMainProvidersRouteRouteWithChildren, mainMainProxiesRouteRoute: mainMainProxiesRouteRouteWithChildren, mainMainRulesRouteRoute: mainMainRulesRouteRouteWithChildren, mainMainSettingsRouteRoute: mainMainSettingsRouteRouteWithChildren, diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index 252f7683bf..e663183aaa 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -23,7 +23,7 @@ "@vitejs/plugin-react": "5.2.0", "ahooks": "3.9.6", "d3": "7.9.0", - "framer-motion": "12.36.0", + "framer-motion": "12.38.0", "react": "19.2.4", "react-dom": "19.2.4", "react-error-boundary": "6.0.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index 278d2c5976..deb24a2daa 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -5,7 +5,7 @@ "mihomo_alpha": "alpha-dd4eb63", "clash_rs": "v0.9.6", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.9.6-alpha+sha.301cd95" + "clash_rs_alpha": "0.9.6-alpha+sha.c5a0da5" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-rs-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2026-03-15T17:40:58.103Z" + "updated_at": "2026-03-16T22:28:20.426Z" } diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index aa07251318..aedc0ca61d 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -226,7 +226,7 @@ importers: version: 3.13.23(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-zod-adapter': specifier: 1.81.5 - version: 1.81.5(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6) + version: 1.81.5(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6) '@tauri-apps/api': specifier: 2.10.1 version: 2.10.1 @@ -258,8 +258,8 @@ importers: specifier: 1.11.20 version: 1.11.20 framer-motion: - specifier: 12.36.0 - version: 12.36.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 12.38.0 + version: 12.38.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) i18next: specifier: 25.8.18 version: 25.8.18(typescript@5.9.3) @@ -334,8 +334,8 @@ importers: specifier: 11.14.0 version: 11.14.0(@types/react@19.2.14)(react@19.2.4) '@iconify/json': - specifier: 2.2.450 - version: 2.2.450 + specifier: 2.2.451 + version: 2.2.451 '@monaco-editor/react': specifier: 4.7.0 version: 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -343,14 +343,14 @@ importers: specifier: 5.90.21 version: 5.90.21(react@19.2.4) '@tanstack/react-router': - specifier: 1.167.3 - version: 1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 1.167.4 + version: 1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-router-devtools': specifier: 1.166.9 - version: 1.166.9(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.167.3)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.166.9(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.167.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': - specifier: 1.166.12 - version: 1.166.12(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(sass-embedded@1.98.0)(sass@1.98.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.2)) + specifier: 1.166.13 + version: 1.166.13(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(sass-embedded@1.98.0)(sass@1.98.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.2)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.2 version: 2.3.2 @@ -400,8 +400,8 @@ importers: specifier: 2.1.1 version: 2.1.1 core-js: - specifier: 3.48.0 - version: 3.48.0 + specifier: 3.49.0 + version: 3.49.0 filesize: specifier: 11.0.13 version: 11.0.13 @@ -487,8 +487,8 @@ importers: specifier: 7.9.0 version: 7.9.0 framer-motion: - specifier: 12.36.0 - version: 12.36.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: 12.38.0 + version: 12.38.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: 19.2.4 version: 19.2.4 @@ -1704,8 +1704,8 @@ packages: prettier-plugin-ember-template-tag: optional: true - '@iconify/json@2.2.450': - resolution: {integrity: sha512-dltwhGrVC1guhfqIiFJ+jH21aO1C9RRvIOsAYdmsqKOr3vfMkKnwji4pYpxPEEEg3YQCvVDFpyKCKbfI8Gl/ow==} + '@iconify/json@2.2.451': + resolution: {integrity: sha512-dDAPVdlpXdjtqYReacSWtwa3Mix0Cg4ezZ5SORLjLqyPSQttaHn03sjndnqgXfeY1zckOuLUgYUMLiZfIoD2oQ==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -3869,8 +3869,8 @@ packages: '@tanstack/router-core': optional: true - '@tanstack/react-router@1.167.3': - resolution: {integrity: sha512-1qbSy4r+O7IBdmPLlcKsjB041Gq2MMnIEAYSGIjaMZIL4duUIQnOWLw4jTfjKil/IJz/9rO5JcvrbxOG5UTSdg==} + '@tanstack/react-router@1.167.4': + resolution: {integrity: sha512-VpbZh382zX3WF4+X2Z+EUyd8eJhJyjg9C6ByYwrVZiWbhgbMK4+zQQIG2+lCAlIlDi7SV8fDcGL09NA8Z2kpGQ==} engines: {node: '>=20.19'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -3901,9 +3901,10 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.167.3': - resolution: {integrity: sha512-M/CxrTGKk1fsySJjd+Pzpbi3YLDz+cJSutDjSTMy12owWlOgHV/I6kzR0UxyaBlHraM6XgMHNA0XdgsS1fa4Nw==} + '@tanstack/router-core@1.167.4': + resolution: {integrity: sha512-Gk5V9Zr5JFJ4SbLyCheQLJ3MnXddccENPA+DJRz+9g3QxtN8DJB8w8KCUCgDeYlWp4LvmO4nX3fy3tupqVP2Pw==} engines: {node: '>=20.19'} + hasBin: true '@tanstack/router-devtools-core@1.166.9': resolution: {integrity: sha512-PNlA7GmOUX9wY7LUG709Pk3Lg33dfHBztQwzjzrOiOsuf4ggp2R6bwarF8nYGNjG79z/MaB5PN+5yvkCVk8jGw==} @@ -3915,16 +3916,17 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.166.11': - resolution: {integrity: sha512-Q/49wxURbft1oNOvo/eVAWZq/lNLK3nBGlavqhLToAYXY6LCzfMtRlE/y3XPHzYC9pZc09u5jvBR1k1E4hyGDQ==} + '@tanstack/router-generator@1.166.12': + resolution: {integrity: sha512-2HdxSTbCkbU9JeYogKVigIlXoLtIJE1x5rbEov+ZLTPjGCO9kicNQuljqg9Js+u2/ahtWewNrE5u1QCAyxmpIg==} engines: {node: '>=20.19'} - '@tanstack/router-plugin@1.166.12': - resolution: {integrity: sha512-PYsnN6goK6zBaVo63UVKjofv69+HHMKRQXymwN55JYKguNnNR8OZ6E12icPb0Olc5uIpPiGz1YI2+rbpmNKGHA==} + '@tanstack/router-plugin@1.166.13': + resolution: {integrity: sha512-xG3ND3AlMe6DN9PihJAYUbQJevqJvVdzN1QpZbfU1/jkHurL97ynP2yXfmMTh8Qgi1K+SWRko4bi7iZlYP9SUw==} engines: {node: '>=20.19'} + hasBin: true peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.167.3 + '@tanstack/react-router': ^1.167.4 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -3964,9 +3966,10 @@ packages: '@tanstack/virtual-core@3.13.9': resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==} - '@tanstack/virtual-file-routes@1.161.6': - resolution: {integrity: sha512-EGWs9yvJA821pUkwkiZLQW89CzUumHyJy8NKq229BubyoWXfDw1oWnTJYSS/hhbLiwP9+KpopjeF5wWwnCCyeQ==} + '@tanstack/virtual-file-routes@1.161.7': + resolution: {integrity: sha512-olW33+Cn+bsCsZKPwEGhlkqS6w3M2slFv11JIobdnCFKMLG97oAI2kWKdx5/zsywTL8flpnoIgaZZPlQTFYhdQ==} engines: {node: '>=20.19'} + hasBin: true '@taplo/core@0.2.0': resolution: {integrity: sha512-r8bl54Zj1In3QLkiW/ex694bVzpPJ9EhwqT9xkcUVODnVUGirdB1JTsmiIv0o1uwqZiwhi8xNnTOQBRQCpizrQ==} @@ -4929,8 +4932,8 @@ packages: core-js-compat@3.44.0: resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} - core-js@3.48.0: - resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5476,8 +5479,8 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.36.0: - resolution: {integrity: sha512-4PqYHAT7gev0ke0wos+PyrcFxI0HScjm3asgU8nSYa8YzJFuwgIvdj3/s3ZaxLq0bUSboIn19A2WS/MHwLCvfw==} + framer-motion@12.38.0: + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6320,8 +6323,8 @@ packages: peerDependencies: monaco-editor: '>=0.36' - motion-dom@12.36.0: - resolution: {integrity: sha512-Ep1pq8P88rGJ75om8lTCA13zqd7ywPGwCqwuWwin6BKc0hMLkVfcS6qKlRqEo2+t0DwoUcgGJfXwaiFn4AOcQA==} + motion-dom@12.38.0: + resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} motion-utils@12.36.0: resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} @@ -9339,7 +9342,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.450': + '@iconify/json@2.2.451': dependencies: '@iconify/types': 2.0.0 pathe: 2.0.3 @@ -11364,22 +11367,22 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.4 - '@tanstack/react-router-devtools@1.166.9(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.167.3)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router-devtools@1.166.9(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.167.4)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tanstack/react-router': 1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-devtools-core': 1.166.9(@tanstack/router-core@1.167.3)(csstype@3.2.3) + '@tanstack/react-router': 1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/router-devtools-core': 1.166.9(@tanstack/router-core@1.167.4)(csstype@3.2.3) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: - '@tanstack/router-core': 1.167.3 + '@tanstack/router-core': 1.167.4 transitivePeerDependencies: - csstype - '@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@tanstack/history': 1.161.6 '@tanstack/react-store': 0.9.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tanstack/router-core': 1.167.3 + '@tanstack/router-core': 1.167.4 isbot: 5.1.28 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -11411,7 +11414,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tanstack/router-core@1.167.3': + '@tanstack/router-core@1.167.4': dependencies: '@tanstack/history': 1.161.6 '@tanstack/store': 0.9.1 @@ -11421,20 +11424,20 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.166.9(@tanstack/router-core@1.167.3)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.166.9(@tanstack/router-core@1.167.4)(csstype@3.2.3)': dependencies: - '@tanstack/router-core': 1.167.3 + '@tanstack/router-core': 1.167.4 clsx: 2.1.1 goober: 2.1.16(csstype@3.2.3) tiny-invariant: 1.3.3 optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.166.11': + '@tanstack/router-generator@1.166.12': dependencies: - '@tanstack/router-core': 1.167.3 + '@tanstack/router-core': 1.167.4 '@tanstack/router-utils': 1.161.6 - '@tanstack/virtual-file-routes': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 prettier: 3.8.1 recast: 0.23.11 source-map: 0.7.4 @@ -11443,7 +11446,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.166.12(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(sass-embedded@1.98.0)(sass@1.98.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/router-plugin@1.166.13(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(sass-embedded@1.98.0)(sass@1.98.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) @@ -11451,15 +11454,15 @@ snapshots: '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 - '@tanstack/router-core': 1.167.3 - '@tanstack/router-generator': 1.166.11 + '@tanstack/router-core': 1.167.4 + '@tanstack/router-generator': 1.166.12 '@tanstack/router-utils': 1.161.6 - '@tanstack/virtual-file-routes': 1.161.6 + '@tanstack/virtual-file-routes': 1.161.7 chokidar: 3.6.0 unplugin: 2.3.11 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-router': 1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(sass-embedded@1.98.0)(sass@1.98.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -11478,9 +11481,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6)': + '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(zod@4.3.6)': dependencies: - '@tanstack/react-router': 1.167.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-router': 1.167.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) zod: 4.3.6 '@tanstack/store@0.9.1': {} @@ -11491,7 +11494,7 @@ snapshots: '@tanstack/virtual-core@3.13.9': {} - '@tanstack/virtual-file-routes@1.161.6': {} + '@tanstack/virtual-file-routes@1.161.7': {} '@taplo/core@0.2.0': {} @@ -12053,7 +12056,7 @@ snapshots: babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) browserslist: 4.25.1 browserslist-to-esbuild: 2.1.1(browserslist@4.25.1) - core-js: 3.48.0 + core-js: 3.49.0 magic-string: 0.30.17 regenerator-runtime: 0.14.1 systemjs: 6.15.1 @@ -12534,7 +12537,7 @@ snapshots: dependencies: browserslist: 4.28.1 - core-js@3.48.0: {} + core-js@3.49.0: {} core-util-is@1.0.3: {} @@ -13094,9 +13097,9 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.36.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@12.38.0(@emotion/is-prop-valid@1.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - motion-dom: 12.36.0 + motion-dom: 12.38.0 motion-utils: 12.36.0 tslib: 2.8.1 optionalDependencies: @@ -14013,7 +14016,7 @@ snapshots: vscode-uri: 3.0.8 yaml: 2.8.1 - motion-dom@12.36.0: + motion-dom@12.38.0: dependencies: motion-utils: 12.36.0 diff --git a/dns-over-https/doh-client/client.go b/dns-over-https/doh-client/client.go index e306d2ec24..f6e15810bd 100644 --- a/dns-over-https/doh-client/client.go +++ b/dns-over-https/doh-client/client.go @@ -90,6 +90,29 @@ func NewClient(conf *config.Config) (c *Client, err error) { Net: "tcp", Timeout: time.Duration(conf.Other.Timeout) * time.Second, } + + if c.conf.Other.Interface != "" { + localV4, localV6, err := c.getInterfaceIPs() + if err != nil { + return nil, fmt.Errorf("failed to get interface IPs for %s: %v", c.conf.Other.Interface, err) + } + var localAddr net.IP + if localV4 != nil { + localAddr = localV4 + } else { + localAddr = localV6 + } + + c.udpClient.Dialer = &net.Dialer{ + Timeout: time.Duration(conf.Other.Timeout) * time.Second, + LocalAddr: &net.UDPAddr{IP: localAddr}, + } + c.tcpClient.Dialer = &net.Dialer{ + Timeout: time.Duration(conf.Other.Timeout) * time.Second, + LocalAddr: &net.TCPAddr{IP: localAddr}, + } + } + for _, addr := range conf.Listen { c.udpServers = append(c.udpServers, &dns.Server{ Addr: addr, @@ -120,6 +143,38 @@ func NewClient(conf *config.Config) (c *Client, err error) { PreferGo: true, Dial: func(ctx context.Context, network, address string) (net.Conn, error) { var d net.Dialer + if c.conf.Other.Interface != "" { + localV4, localV6, err := c.getInterfaceIPs() + if err != nil { + log.Printf("Bootstrap dial warning: %v", err) + } else { + numServers := len(c.bootstrap) + bootstrap := c.bootstrap[rand.Intn(numServers)] + host, _, _ := net.SplitHostPort(bootstrap) + ip := net.ParseIP(host) + if ip != nil { + if ip.To4() != nil { + if localV4 != nil { + if strings.HasPrefix(network, "udp") { + d.LocalAddr = &net.UDPAddr{IP: localV4} + } else { + d.LocalAddr = &net.TCPAddr{IP: localV4} + } + } + } else { + if localV6 != nil { + if strings.HasPrefix(network, "udp") { + d.LocalAddr = &net.UDPAddr{IP: localV6} + } else { + d.LocalAddr = &net.TCPAddr{IP: localV6} + } + } + } + } + conn, err := d.DialContext(ctx, network, bootstrap) + return conn, err + } + } numServers := len(c.bootstrap) bootstrap := c.bootstrap[rand.Intn(numServers)] conn, err := d.DialContext(ctx, network, bootstrap) @@ -235,14 +290,72 @@ func (c *Client) newHTTPClient() error { if c.httpTransport != nil { c.httpTransport.CloseIdleConnections() } - dialer := &net.Dialer{ + + localV4, localV6, err := c.getInterfaceIPs() + if err != nil { + log.Printf("Interface binding error: %v", err) + return err + } + + baseDialer := &net.Dialer{ Timeout: time.Duration(c.conf.Other.Timeout) * time.Second, KeepAlive: 30 * time.Second, - // DualStack: true, - Resolver: c.bootstrapResolver, + Resolver: c.bootstrapResolver, } + c.httpTransport = &http.Transport{ - DialContext: dialer.DialContext, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + if c.conf.Other.Interface == "" { + return baseDialer.DialContext(ctx, network, addr) + } + + if network == "tcp4" && localV4 != nil { + d := *baseDialer + d.LocalAddr = &net.TCPAddr{IP: localV4} + return d.DialContext(ctx, network, addr) + } + if network == "tcp6" && localV6 != nil { + d := *baseDialer + d.LocalAddr = &net.TCPAddr{IP: localV6} + return d.DialContext(ctx, network, addr) + } + + // Manual Dual-Stack: Resolve host and try compatible families sequentially + host, port, _ := net.SplitHostPort(addr) + ips, err := c.bootstrapResolver.LookupIPAddr(ctx, host) + if err != nil { + return nil, err + } + + var lastErr error + for _, ip := range ips { + d := *baseDialer + targetAddr := net.JoinHostPort(ip.String(), port) + + if ip.IP.To4() != nil { + if localV4 == nil { + continue + } + d.LocalAddr = &net.TCPAddr{IP: localV4} + } else { + if localV6 == nil { + continue + } + d.LocalAddr = &net.TCPAddr{IP: localV6} + } + + conn, err := d.DialContext(ctx, "tcp", targetAddr) + if err == nil { + return conn, nil + } + lastErr = err + } + + if lastErr != nil { + return nil, lastErr + } + return nil, fmt.Errorf("connection to %s failed: no matching local/remote IP families on interface %s", addr, c.conf.Other.Interface) + }, ExpectContinueTimeout: 1 * time.Second, IdleConnTimeout: 90 * time.Second, MaxIdleConns: 100, @@ -251,15 +364,18 @@ func (c *Client) newHTTPClient() error { TLSHandshakeTimeout: time.Duration(c.conf.Other.Timeout) * time.Second, TLSClientConfig: &tls.Config{InsecureSkipVerify: c.conf.Other.TLSInsecureSkipVerify}, } + if c.conf.Other.NoIPv6 { + originalDial := c.httpTransport.DialContext c.httpTransport.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) { if strings.HasPrefix(network, "tcp") { network = "tcp4" } - return dialer.DialContext(ctx, network, address) + return originalDial(ctx, network, address) } } - err := http2.ConfigureTransport(c.httpTransport) + + err = http2.ConfigureTransport(c.httpTransport) if err != nil { return err } @@ -485,3 +601,38 @@ func (c *Client) findClientIP(w dns.ResponseWriter, r *dns.Msg) (ednsClientAddre } return } + +// getInterfaceIPs returns the first valid IPv4 and IPv6 addresses found on the interface +func (c *Client) getInterfaceIPs() (v4, v6 net.IP, err error) { + if c.conf.Other.Interface == "" { + return nil, nil, nil + } + ifi, err := net.InterfaceByName(c.conf.Other.Interface) + if err != nil { + return nil, nil, err + } + addrs, err := ifi.Addrs() + if err != nil { + return nil, nil, err + } + + for _, addr := range addrs { + ip, _, err := net.ParseCIDR(addr.String()) + if err != nil { + continue + } + if ip4 := ip.To4(); ip4 != nil { + if v4 == nil { + v4 = ip4 + } + } else { + if v6 == nil && !c.conf.Other.NoIPv6 { + v6 = ip + } + } + } + if v4 == nil && v6 == nil { + return nil, nil, fmt.Errorf("no valid IP addresses found on interface %s", c.conf.Other.Interface) + } + return v4, v6, nil +} diff --git a/dns-over-https/doh-client/config/config.go b/dns-over-https/doh-client/config/config.go index e57e22b3e0..78207a3e68 100644 --- a/dns-over-https/doh-client/config/config.go +++ b/dns-over-https/doh-client/config/config.go @@ -50,6 +50,7 @@ type others struct { Bootstrap []string `toml:"bootstrap"` Passthrough []string `toml:"passthrough"` Timeout uint `toml:"timeout"` + Interface string `toml:"interface"` NoCookies bool `toml:"no_cookies"` NoECS bool `toml:"no_ecs"` NoIPv6 bool `toml:"no_ipv6"` diff --git a/dns-over-https/doh-client/doh-client.conf b/dns-over-https/doh-client/doh-client.conf index 01d129126b..20b2f41e6e 100644 --- a/dns-over-https/doh-client/doh-client.conf +++ b/dns-over-https/doh-client/doh-client.conf @@ -97,6 +97,11 @@ passthrough = [ # Timeout for upstream request in seconds timeout = 30 +# Interface to bind to for outgoing connections. +# If empty, the system default route is used (usually eth0 or wlan0). +# Example: "eth1", "wlan0" +interface = "" + # Disable HTTP Cookies # # Cookies may be useful if your upstream resolver is protected by some diff --git a/openwrt-packages/luci-app-argone-config/README.md b/openwrt-packages/luci-app-argone-config/README.md index 7a44fbdd00..ed7e13ce3b 100644 --- a/openwrt-packages/luci-app-argone-config/README.md +++ b/openwrt-packages/luci-app-argone-config/README.md @@ -1,4 +1,39 @@ # luci-app-argone-config -Argon Theme Config Plugin -You can set the blur and transparency of the login page of argon theme, and manage the background pictures and videos. \ No newline at end of file +> argon 原作者是jerry;改argone是为了编译方便 + +Argon Theme Config Plugin for OpenWrt LuCI + +### Install (18.06 / main) + +```sh +wget --no-check-certificate -O luci-app-argone-config_0.9_all.ipk \ + https://github.com/kenzok78/luci-app-argone-config/releases/download/v0.9/luci-app-argone-config_0.9_all.ipk +opkg install luci-app-argone-config_0.9_all.ipk +``` + +Optional Chinese translation: +```sh +wget --no-check-certificate -O luci-i18n-argone-config-zh-cn.ipk \ + https://github.com/kenzok78/luci-app-argone-config/releases/download/v0.9/luci-i18n-argone-config-zh-cn_git-22.114.24542-d1474ba_all.ipk +opkg install luci-i18n-argone-config-zh-cn.ipk +``` + +### Install (23 branch / latest luci) + +```sh +wget --no-check-certificate -O luci-app-argone-config_1.0_all.ipk \ + https://github.com/kenzok78/luci-app-argone-config/releases/download/v1.0/luci-app-argone-config_1.0_all.ipk +opkg install luci-app-argone-config_1.0_all.ipk +``` + +### Source + +- main 分支\uff08luci-18.06\uff09\uff1a + ``` + git clone https://github.com/kenzok78/luci-app-argone-config + ``` +- 23 分支\uff08最新 luci\uff09\uff1a + ``` + git clone -b 23 https://github.com/kenzok78/luci-app-argone-config + ``` diff --git a/openwrt-packages/luci-theme-argone/README.md b/openwrt-packages/luci-theme-argone/README.md index 5c8922dcd7..b07fee280e 100644 --- a/openwrt-packages/luci-theme-argone/README.md +++ b/openwrt-packages/luci-theme-argone/README.md @@ -1,128 +1,27 @@ - +#### argon 原作者是jerrykuku +#### 改argone是为了编译方便 -[license]: /LICENSE -[license-badge]: https://img.shields.io/github/license/jerrykuku/luci-theme-argon?style=flat-square&a=1 -[prs]: https://github.com/jerrykuku/luci-theme-argone/pulls -[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square -[issues]: https://github.com/jerrykuku/luci-theme-argone/issues/new -[issues-badge]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg?style=flat-square -[release]: https://github.com/jerrykuku/luci-theme-argone/releases -[release-badge]: https://img.shields.io/badge/release-v1.8.4-blue.svg? -[download]: https://github.com/jerrykuku/luci-theme-argone/releases -[download-badge]: https://img.shields.io/github/downloads/jerrykuku/luci-theme-argone/total?style=flat-square -[contact]: https://t.me/jerryk6 -[contact-badge]: https://img.shields.io/badge/Contact-telegram-blue?style=flat-square -[en-us-link]: /README.md -[zh-cn-link]: /README_ZH.md -[en-us-release-log]: /RELEASE.md -[zh-cn-release-log]: /RELEASE_ZH.md -[config-link]: https://github.com/jerrykuku/luci-app-argone-config/releases -[lede]: https://github.com/coolsnowwolf/lede -[official-luci-18.06]: https://github.com/openwrt/luci/tree/openwrt-18.06 -[immortalwrt]: https://github.com/immortalwrt/immortalwrt ++ main 分支支持 luci-18.06 + ```bash + git clone https://github.com/kenzok78/luci-theme-argone + ``` ++ 23 分支支持最新 luci + ```bash + git clone -b 23 https://github.com/kenzok78/luci-theme-argone + ``` -
- +### 一键安装 (18.06 / main) -# A brand new OpenWrt LuCI theme -### • This branch only matches [Lean's LEDE ( LuCI 18.06 )][lede] / [OpenWrt LuCI 18.06][official-luci-18.06] • - -Argon is **a clean and tidy OpenWrt LuCI theme** that allows
-users to customize their login interface with images or videos. -It also supports automatic and manual switching between light and dark modes. - -[![license][license-badge]][license] -[![prs][prs-badge]][prs] -[![issues][issues-badge]][issues] -[![release][release-badge]][release] -[![download][download-badge]][download] -[![contact][contact-badge]][contact] - -**English** | -[简体中文][zh-cn-link] - -[Key Features](#key-features) • -[Getting started](#getting-started) • -[Screenshots](#screenshots) • -[Contributors](#contributors) • -[Credits](#credits) - - -
- -## Key Features - -- Clean Layout. -- Adapted to mobile display. -- Customizable theme colors. -- Support for using Bing images as login background. -- Support for custom uploading of images or videos as login background. -- Automatically switch between light 和 dark modes with the system, 和 can also be set to a fixed mode. -- Settings plugin with extensions [luci-app-argone-config][config-link] - -## Notice -- Chrome & Edge browser is highly recommended. There are some new css3 features used in this theme, currently only Chrome & Edge has the best compatibility. -- FireFox does not enable the backdrop-filter by default, [see here](https://developer.mozilla.org/zh-CN/docs/Web/CSS/backdrop-filter) for the opening method. -- __LEDE has upgraded LuCI to 23.05 since 10/17/2024. The 18.06 branch of this repository is no longer compatible with it. If you still need to compile or install the theme for the 18.06 branch, please modify the [feeds.conf.default](https://github.com/coolsnowwolf/lede/blob/master/feeds.conf.default) file in the LEDE before compiling the firmware. Revert it back to the previous 18.06 LuCI.__ - -## Getting started - -### Build for Lean's LEDE ( LuCI 18.06 ) - -```bash -cd lede -sed -i '/^#src-git luci https:\/\/github.com\/coolsnowwolf\/luci$/s/^#//' feeds.conf.default && sed -i '/^src-git luci https:\/\/github.com\/coolsnowwolf\/luci\.git;openwrt-23\.05$/s/^/#/' feeds.conf.default -./scripts/feeds clean -./scripts/feeds update -a -rm -rf feeds/luci/themes/luci-theme-argone -git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/downloads/luci-theme-argone -./scripts/feeds install -a -make menuconfig #choose LuCI->Themes->luci-theme-argone -make -j1 V=s +```sh +wget --no-check-certificate -O luci-theme-argone_1.8.4_all.ipk \ + https://github.com/kenzok78/luci-theme-argone/releases/download/v1.8.4/luci-theme-argone_1.8.4_all.ipk +opkg install luci-theme-argone_1.8.4_all.ipk ``` -### Install for LuCI 18.06 ( Lean's LEDE ) +### 一键安装 (23 branch / 最新 luci) -```bash -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argone/releases/download/v1.8.4/luci-theme-argon_1.8.4-20241221_all.ipk -opkg install luci-theme-argon*.ipk +```sh +wget --no-check-certificate -O luci-theme-argone_2.4.3_all.ipk \ + https://github.com/kenzok78/luci-theme-argone/releases/download/v2.4.3/luci-theme-argone_2.4.3_all.ipk +opkg install luci-theme-argone_2.4.3_all.ipk ``` - -### Install the settings plugin with extensions - luci-app-argone-config - -```bash -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argone/releases/download/v1.8.3/luci-app-argone-config_0.9-20220424_all.ipk -opkg install luci-app-argone-config*.ipk -``` - -## Screenshots - -![desktop](/Screenshots/screenshot_pc.jpg) -![mobile](/Screenshots/screenshot_phone.jpg) - -## Contributors - - - - - -Made with [contrib.rocks](https://contrib.rocks). - -## Related Projects - -- [luci-app-argone-config](https://github.com/jerrykuku/luci-app-argone-config): Argon theme config plugin -- [luci-app-vssr](https://github.com/jerrykuku/luci-app-vssr): An OpenWrt internet surfing plugin -- [openwrt-package](https://github.com/jerrykuku/openwrt-package): My OpenWrt package -- [CasaOS](https://github.com/IceWhaleTech/CasaOS): A simple, easy-to-use, elegant open-source Personal Cloud system (My current main project) - -## Credits - -[luci-theme-material](https://github.com/LuttyYang/luci-theme-material/) diff --git a/openwrt-packages/luci-theme-argone/README_ZH.md b/openwrt-packages/luci-theme-argone/README_ZH.md deleted file mode 100644 index e0a36c4552..0000000000 --- a/openwrt-packages/luci-theme-argone/README_ZH.md +++ /dev/null @@ -1,131 +0,0 @@ - - -[license]: /LICENSE -[license-badge]: https://img.shields.io/github/license/jerrykuku/luci-theme-argon?style=flat-square&a=1 -[prs]: https://github.com/jerrykuku/luci-theme-argone/pulls -[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square -[issues]: https://github.com/jerrykuku/luci-theme-argone/issues/new -[issues-badge]: https://img.shields.io/badge/Issues-welcome-brightgreen.svg?style=flat-square -[release]: https://github.com/jerrykuku/luci-theme-argone/releases -[release-badge]: https://img.shields.io/badge/release-v1.8.4-blue.svg? -[download]: https://github.com/jerrykuku/luci-theme-argone/releases -[download-badge]: https://img.shields.io/github/downloads/jerrykuku/luci-theme-argone/total?style=flat-square -[contact]: https://t.me/jerryk6 -[contact-badge]: https://img.shields.io/badge/Contact-telegram-blue?style=flat-square -[en-us-link]: /README.md -[zh-cn-link]: /README_ZH.md -[en-us-release-log]: /RELEASE.md -[zh-cn-release-log]: /RELEASE_ZH.md -[config-link]: https://github.com/jerrykuku/luci-app-argone-config/releases -[lede]: https://github.com/coolsnowwolf/lede -[official-luci-18.06]: https://github.com/openwrt/luci/tree/openwrt-18.06 -[immortalwrt]: https://github.com/immortalwrt/immortalwrt - -
- - -# 一个全新的 OpenWrt 主题 -### • 该分支只适配 [Lean's LEDE ( LuCI 18.06 )][lede] / [OpenWrt LuCI 18.06][official-luci-18.06] • - -Argon 是**一款干净整洁的 OpenWrt LuCI 主题**, -允许用户使用图片或视频自定义其登录界面。 -它还支持在浅色模式和深色模式之间自动或手动切换。 - -[![license][license-badge]][license] -[![prs][prs-badge]][prs] -[![issues][issues-badge]][issues] -[![release][release-badge]][release] -[![download][download-badge]][download] -[![contact][contact-badge]][contact] - -[English][en-us-link] | -**简体中文** - -[特色](#特色) • -[快速开始](#快速开始) • -[屏幕截图](#屏幕截图) • -[贡献者](#贡献者) • -[鸣谢](#鸣谢) - - -
- -## 特色 - -- 干净整洁的布局。 -- 适配移动端显示。 -- 可自定义主题颜色。 -- 支持使用 Bing 图片作为登录背景。 -- 支持自定义上传图片或视频作为登录背景。 -- 通过系统自动在明暗模式之间切换,也可设置为固定模式。 -- 带有扩展功能的设置插件 [luci-app-argone-config][config-link] - -## 注意 - -- 强烈建议使用 Chrome 和 Edge 浏览器。该主题中使用了一些新的 css3 功能,目前只有 Chrome 和 Edge 浏览器有最好的兼容性。 -- FireFox 默认不启用 backdrop-filter,[见这里](https://developer.mozilla.org/zh-CN/docs/Web/CSS/backdrop-filter)的打开方法。 -- __LEDE 自 2024-10-17,已将LuCI升级为23.05,本项目18.06分支的主题已不再兼容;如果你还需要继续编译或安装18.06分支的主题,请在编译LEDE固件前修改LEDE源码中的[feeds.conf.default](https://github.com/coolsnowwolf/lede/blob/master/feeds.conf.default),将其更改回以前的18.06 LuCI,详见:[#428 (comment)](https://github.com/jerrykuku/luci-theme-argone/issues/428#issuecomment-2425167489)__ - -## 快速开始 - -### 使用 Lean's LEDE ( LuCI 18.06 ) 构建 - -```bash -cd lede -sed -i '/^#src-git luci https:\/\/github.com\/coolsnowwolf\/luci$/s/^#//' feeds.conf.default && sed -i '/^src-git luci https:\/\/github.com\/coolsnowwolf\/luci\.git;openwrt-23\.05$/s/^/#/' feeds.conf.default -./scripts/feeds clean -./scripts/feeds update -a -rm -rf feeds/luci/themes/luci-theme-argone -git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/downloads/luci-theme-argone -./scripts/feeds install -a -make menuconfig #选择 LuCI->Themes->luci-theme-argone -make -j1 V=s -``` - -### 在 18.06 的 LuCI 上安装 ( Lean's LEDE ) - -```bash -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argone/releases/download/v1.8.4/luci-theme-argon_1.8.4-20241221_all.ipk -opkg install luci-theme-argon*.ipk -``` - -### 安装扩展功能的设置插件 - luci-app-argone-config - -```bash -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argone/releases/download/v1.8.3/luci-app-argone-config_0.9-20220424_all.ipk -wget --no-check-certificate https://github.com/jerrykuku/luci-theme-argone/releases/download/v1.8.3/luci-i18n-argon-config-zh-cn_0.9-20220424_all.ipk -opkg install luci-app-argone-config*.ipk -opkg install luci-i18n-argon-config*.ipk -``` - -## 屏幕截图 - -![desktop](/Screenshots/screenshot_pc.jpg) -![mobile](/Screenshots/screenshot_phone.jpg) - -## 贡献者 - - - - - -Made with [contrib.rocks](https://contrib.rocks). - -## 相关项目 - -- [luci-app-argone-config](https://github.com/jerrykuku/luci-app-argone-config): Argon 主题的设置插件 -- [luci-app-vssr](https://github.com/jerrykuku/luci-app-vssr): 一个 OpenWrt 的互联网冲浪插件 -- [openwrt-package](https://github.com/jerrykuku/openwrt-package): 我的 OpenWrt Package -- [CasaOS](https://github.com/IceWhaleTech/CasaOS): 一个简单、易用且优雅的开源个人家庭云系统(我目前主要开发的项目) - -## 鸣谢 - -[luci-theme-material](https://github.com/LuttyYang/luci-theme-material/) diff --git a/openwrt-packages/luci-theme-argone/luasrc/view/themes/argone/footer.htm b/openwrt-packages/luci-theme-argone/luasrc/view/themes/argone/footer.htm index cb81aecca5..26a8b5e957 100644 --- a/openwrt-packages/luci-theme-argone/luasrc/view/themes/argone/footer.htm +++ b/openwrt-packages/luci-theme-argone/luasrc/view/themes/argone/footer.htm @@ -5,7 +5,7 @@ Copyright 2020 Jerrykuku Have a bug? Please create an issue here on GitHub! - https://github.com/jerrykuku/luci-theme-argone/issues + https://github.com/kenzok78/luci-theme-argone/issues luci-theme-bootstrap: Copyright 2008 Steven Barth @@ -43,7 +43,7 @@
Powered by <%= ver.luciname %> (<%= ver.luciversion %>) / - ArgonTheme <%# vPKG_VERSION %> / + ArgonTheme <%# vPKG_VERSION %> / <%= ver.distversion %> <% if #categories > 1 then %>