Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0761869b6 | ||
|
|
bb99b89228 | ||
|
|
7b88beb0b5 | ||
|
|
82c630bd0e | ||
|
|
bb4f11e1b8 | ||
|
|
3182d20b7c | ||
|
|
a6f15e2474 | ||
|
|
0c3f03680c | ||
|
|
a66e8dfc9f | ||
|
|
556232aac4 | ||
|
|
7fcfaadd91 | ||
|
|
18d388e1e2 | ||
|
|
7de6622d74 | ||
|
|
9af1f90990 | ||
|
|
15ab43963d | ||
|
|
6b7465a4b0 | ||
|
|
d64bdf02de | ||
|
|
4a2c94993a | ||
|
|
86c318d86b | ||
|
|
bffc1ad41d | ||
|
|
2a685c116f | ||
|
|
0e271d2924 | ||
|
|
7127c4d590 | ||
|
|
a82929996b | ||
|
|
3f01f52c7b | ||
|
|
9c94494622 | ||
|
|
c8a508f35c | ||
|
|
4ec73ef1c3 | ||
|
|
3465b79e5b | ||
|
|
726a0a33ae | ||
|
|
ba05810d80 | ||
|
|
10bb53e7de | ||
|
|
dd8a083546 | ||
|
|
84131a71c9 | ||
|
|
4909a11896 | ||
|
|
4069357b81 | ||
|
|
e6e87bcc40 | ||
|
|
7ba22045e8 | ||
|
|
d4040b61c4 | ||
|
|
7534f8fc37 | ||
|
|
7ced009e92 | ||
|
|
cc13c71e40 | ||
|
|
d2f09209a7 | ||
|
|
a241b04d99 | ||
|
|
4f35d907cb | ||
|
|
9e50d144a3 | ||
|
|
8514bb48c4 | ||
|
|
3ae633a2a1 | ||
|
|
2799cb9118 | ||
|
|
d20346b6ac | ||
|
|
2f00666a68 | ||
|
|
80f4570093 | ||
|
|
3f0a2ba48f |
@@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: "[BUG]"
|
|
||||||
labels: bug
|
|
||||||
assignees: ""
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Information**
|
|
||||||
|
|
||||||
- OS: [e.g. macOS]
|
|
||||||
- Clash Verge Version: [e.g. 1.3.4]
|
|
||||||
- Clash Core: [e.g. Clash or Clash Meta]
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us improve
|
||||||
|
title: "[BUG]"
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: To Reproduce
|
||||||
|
description: Steps to reproduce the behavior.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Platform
|
||||||
|
options:
|
||||||
|
- Windows
|
||||||
|
- Linux
|
||||||
|
- MacOS
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: System Version
|
||||||
|
placeholder: "e.g. macOS 10.15.7"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Software Version
|
||||||
|
placeholder: "e.g. 1.4.3"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Log
|
||||||
|
description: "Log file content or screenshot"
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional Information
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: "[Feature]"
|
|
||||||
labels: enhancement
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Suggest an idea for this project
|
||||||
|
title: "[Feature]"
|
||||||
|
labels: ["enhancement"]
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Is your feature request related to a problem? Please describe.
|
||||||
|
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe alternatives you've considered
|
||||||
|
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context or screenshots about the feature request here.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
FROM rust:buster
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod a+x /entrypoint.sh
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
name: "Build for Linux"
|
||||||
|
branding:
|
||||||
|
icon: user-check
|
||||||
|
color: gray-dark
|
||||||
|
inputs:
|
||||||
|
target:
|
||||||
|
required: true
|
||||||
|
description: "Rust Target"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "docker"
|
||||||
|
image: "Dockerfile"
|
||||||
|
args:
|
||||||
|
- ${{ inputs.target }}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# pnpm install --resolution-only
|
||||||
|
pnpm install
|
||||||
|
pnpm check $INPUT_TARGET
|
||||||
|
sed -i "s/#openssl/openssl={version=\"0.10\",features=[\"vendored\"]}/g" src-tauri/Cargo.toml
|
||||||
|
if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ] || [ "$INPUT_TARGET" = "i686-unknown-linux-gnu" ]; then
|
||||||
|
pnpm build --target $INPUT_TARGET
|
||||||
|
else
|
||||||
|
pnpm build --target $INPUT_TARGET -b deb
|
||||||
|
fi
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
wget https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz
|
||||||
|
tar -Jxvf ./node-v20.10.0-linux-x64.tar.xz
|
||||||
|
export PATH=$(pwd)/node-v20.10.0-linux-x64/bin:$PATH
|
||||||
|
npm install pnpm -g
|
||||||
|
|
||||||
|
rustup target add "$INPUT_TARGET"
|
||||||
|
|
||||||
|
if [ "$INPUT_TARGET" = "x86_64-unknown-linux-gnu" ]; then
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev patchelf
|
||||||
|
elif [ "$INPUT_TARGET" = "i686-unknown-linux-gnu" ]; then
|
||||||
|
dpkg --add-architecture i386
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y libstdc++6:i386 libgdk-pixbuf2.0-dev:i386 libatomic1:i386 gcc-multilib g++-multilib libwebkit2gtk-4.0-dev:i386 libssl-dev:i386 libgtk-3-dev:i386 librsvg2-dev:i386 patchelf:i386 libayatana-appindicator3-dev:i386
|
||||||
|
export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH
|
||||||
|
export PKG_CONFIG_SYSROOT_DIR=/
|
||||||
|
elif [ "$INPUT_TARGET" = "aarch64-unknown-linux-gnu" ]; then
|
||||||
|
sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | tee /etc/apt/sources.list.d/ports.list
|
||||||
|
sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
|
||||||
|
dpkg --add-architecture arm64
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y libncurses6:arm64 libtinfo6:arm64 linux-libc-dev:arm64 libncursesw6:arm64 libssl3:arm64 libcups2:arm64
|
||||||
|
apt-get install -y --no-install-recommends g++-aarch64-linux-gnu libc6-dev-arm64-cross libssl-dev:arm64 libwebkit2gtk-4.0-dev:arm64 libgtk-3-dev:arm64 patchelf:arm64 librsvg2-dev:arm64 libayatana-appindicator3-dev:arm64
|
||||||
|
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
|
||||||
|
export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
|
||||||
|
export CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
|
||||||
|
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
|
||||||
|
export PKG_CONFIG_ALLOW_CROSS=1
|
||||||
|
elif [ "$INPUT_TARGET" = "armv7-unknown-linux-gnueabihf" ]; then
|
||||||
|
sed 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch-=amd64,i386] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | tee /etc/apt/sources.list.d/ports.list
|
||||||
|
sed -i 's/http:\/\/\(.*\).ubuntu.com\/ubuntu\//[arch=amd64,i386] http:\/\/\1.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
|
||||||
|
dpkg --add-architecture armhf
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y libncurses6:armhf libtinfo6:armhf linux-libc-dev:armhf libncursesw6:armhf libssl3:armhf libcups2:armhf
|
||||||
|
apt-get install -y --no-install-recommends g++-arm-linux-gnueabihf libc6-dev-armhf-cross libssl-dev:armhf libwebkit2gtk-4.0-dev:armhf libgtk-3-dev:armhf patchelf:armhf librsvg2-dev:armhf libayatana-appindicator3-dev:armhf
|
||||||
|
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
|
||||||
|
export CC_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-gcc
|
||||||
|
export CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++
|
||||||
|
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig
|
||||||
|
export PKG_CONFIG_ALLOW_CROSS=1
|
||||||
|
else
|
||||||
|
echo "Unknown target: $INPUT_TARGET" && exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
bash .github/build-for-linux/build.sh
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
name: Compatible CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
# push:
|
|
||||||
# tags:
|
|
||||||
# - v**
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
RUST_BACKTRACE: short
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
targets:
|
|
||||||
- tag: macOS-10.15
|
|
||||||
os: macos-10.15
|
|
||||||
- tag: Ubuntu18
|
|
||||||
os: ubuntu-18.04
|
|
||||||
- tag: Ubuntu22
|
|
||||||
os: ubuntu-22.04
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.targets.os }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install Rust
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
profile: minimal
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: src-tauri
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
# - name: Install Dependencies (ubuntu18 only)
|
|
||||||
# if: matrix.targets.os == 'ubuntu-18.04'
|
|
||||||
# run: |
|
|
||||||
# sudo apt-get update
|
|
||||||
# sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev libayatana-appindicator3-dev
|
|
||||||
|
|
||||||
- name: Install Dependencies (ubuntu22 only)
|
|
||||||
if: startsWith(matrix.targets.os, 'ubuntu-')
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
|
|
||||||
|
|
||||||
- name: Get yarn cache dir path
|
|
||||||
id: yarn-cache-dir-path
|
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
|
||||||
|
|
||||||
- name: Yarn Cache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
id: yarn-cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-yarn-
|
|
||||||
|
|
||||||
- name: Yarn install and check
|
|
||||||
run: |
|
|
||||||
yarn install --network-timeout 1000000
|
|
||||||
yarn run check
|
|
||||||
|
|
||||||
- name: Tauri build
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
with:
|
|
||||||
tagName: ${{ matrix.targets.tag }}
|
|
||||||
releaseName: "Compatible For ${{ matrix.targets.tag }}"
|
|
||||||
releaseBody: "More new features are now supported."
|
|
||||||
releaseDraft: false
|
|
||||||
prerelease: false
|
|
||||||
|
|
||||||
# - name: Portable Bundle
|
|
||||||
# if: matrix.os == 'windows-latest'
|
|
||||||
# # rebuild with env settings
|
|
||||||
# run: |
|
|
||||||
# yarn build
|
|
||||||
# yarn run portable
|
|
||||||
# env:
|
|
||||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
# TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
# TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
# VITE_WIN_PORTABLE: 1
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
name: Dev Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- dev
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
RUST_BACKTRACE: short
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [windows-latest, ubuntu-latest, macos-latest]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: install Rust stable
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: src-tauri
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: "20"
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
|
||||||
name: Install pnpm
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
run_install: false
|
|
||||||
|
|
||||||
- name: Delete current release assets
|
|
||||||
if: startsWith(matrix.os, 'ubuntu-')
|
|
||||||
uses: mknejp/delete-release-assets@v1
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
tag: dev
|
|
||||||
fail-if-no-assets: false
|
|
||||||
fail-if-no-release: false
|
|
||||||
assets: |
|
|
||||||
*.zip
|
|
||||||
*.gz
|
|
||||||
*.AppImage
|
|
||||||
*.deb
|
|
||||||
*.dmg
|
|
||||||
*.msi
|
|
||||||
*.sig
|
|
||||||
*.exe
|
|
||||||
*.json
|
|
||||||
|
|
||||||
- name: Install Dependencies (Ubuntu Only)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu-')
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf openssl
|
|
||||||
|
|
||||||
- name: Pnpm install and check
|
|
||||||
run: |
|
|
||||||
pnpm i
|
|
||||||
pnpm check
|
|
||||||
|
|
||||||
- name: Tauri build
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
with:
|
|
||||||
tagName: dev
|
|
||||||
releaseName: "Clash Verge Dev"
|
|
||||||
releaseBody: "More new features are now supported."
|
|
||||||
releaseDraft: false
|
|
||||||
prerelease: true
|
|
||||||
tauriScript: pnpm
|
|
||||||
args: -f default-meta
|
|
||||||
|
|
||||||
- name: Portable Bundle
|
|
||||||
if: matrix.os == 'windows-latest'
|
|
||||||
run: |
|
|
||||||
pnpm portable
|
|
||||||
env:
|
|
||||||
TAG_NAME: dev
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
VITE_WIN_PORTABLE: 1
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
name: Meta CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v**
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
RUST_BACKTRACE: short
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [windows-latest, ubuntu-latest, macos-latest]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install Rust
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
profile: minimal
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: src-tauri
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
|
|
||||||
- name: Delete current release assets
|
|
||||||
if: matrix.os == 'ubuntu-latest'
|
|
||||||
uses: mknejp/delete-release-assets@v1
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
tag: meta
|
|
||||||
fail-if-no-assets: false
|
|
||||||
fail-if-no-release: false
|
|
||||||
assets: |
|
|
||||||
*.zip
|
|
||||||
*.gz
|
|
||||||
*.AppImage
|
|
||||||
*.deb
|
|
||||||
*.dmg
|
|
||||||
*.msi
|
|
||||||
*.sig
|
|
||||||
|
|
||||||
- name: Install Dependencies (ubuntu only)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu-')
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf openssl
|
|
||||||
|
|
||||||
- name: Get yarn cache dir path
|
|
||||||
id: yarn-cache-dir-path
|
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
|
||||||
|
|
||||||
- name: Yarn Cache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
id: yarn-cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-yarn-
|
|
||||||
|
|
||||||
- name: Yarn install and check
|
|
||||||
run: |
|
|
||||||
yarn install --network-timeout 1000000
|
|
||||||
yarn run check
|
|
||||||
|
|
||||||
- name: Tauri build
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
with:
|
|
||||||
tagName: meta
|
|
||||||
releaseName: "Clash Verge Meta"
|
|
||||||
releaseBody: ""
|
|
||||||
releaseDraft: false
|
|
||||||
prerelease: true
|
|
||||||
args: -f default-meta
|
|
||||||
|
|
||||||
- name: Portable Bundle
|
|
||||||
if: matrix.os == 'windows-latest'
|
|
||||||
run: |
|
|
||||||
yarn build -f default-meta
|
|
||||||
yarn run portable
|
|
||||||
env:
|
|
||||||
TAG_NAME: meta
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
VITE_WIN_PORTABLE: 1
|
|
||||||
@@ -20,30 +20,34 @@ jobs:
|
|||||||
target: x86_64-pc-windows-msvc
|
target: x86_64-pc-windows-msvc
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
target: i686-pc-windows-msvc
|
target: i686-pc-windows-msvc
|
||||||
# - os: windows-latest
|
- os: windows-latest
|
||||||
# target: aarch64-pc-windows-msvc
|
target: aarch64-pc-windows-msvc
|
||||||
- os: macos-latest
|
- os: macos-latest
|
||||||
target: aarch64-apple-darwin
|
target: aarch64-apple-darwin
|
||||||
- os: macos-latest
|
- os: macos-latest
|
||||||
target: x86_64-apple-darwin
|
target: x86_64-apple-darwin
|
||||||
- os: ubuntu-latest
|
|
||||||
target: x86_64-unknown-linux-gnu
|
|
||||||
- os: ubuntu-latest
|
|
||||||
target: aarch64-unknown-linux-gnu
|
|
||||||
# - os: ubuntu-latest
|
|
||||||
# target: armv7-unknown-linux-gnueabihf
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Apply Patch
|
||||||
|
if: matrix.target == 'aarch64-pc-windows-msvc'
|
||||||
|
run: |
|
||||||
|
git config --global user.email "clash-verge-rev@github.io"
|
||||||
|
git config --global user.name "clash-verge-rev"
|
||||||
|
git am patches/support-windows-aarch64.patch
|
||||||
|
|
||||||
|
- name: Init Submodule
|
||||||
|
if: matrix.target == 'aarch64-pc-windows-msvc'
|
||||||
|
run: git submodule update --init --recursive
|
||||||
|
|
||||||
- name: Install Rust Stable
|
- name: Install Rust Stable
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
|
||||||
- name: Add Rust Target
|
- name: Add Rust Target
|
||||||
run: |
|
run: rustup target add ${{ matrix.target }}
|
||||||
rustup target add ${{ matrix.target }}
|
|
||||||
|
|
||||||
- name: Rust Cache
|
- name: Rust Cache
|
||||||
uses: Swatinem/rust-cache@v2
|
uses: Swatinem/rust-cache@v2
|
||||||
@@ -61,43 +65,12 @@ jobs:
|
|||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
|
|
||||||
- name: Install Dependencies (Ubuntu Only)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'x86_64')
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libayatana-appindicator3-dev librsvg2-dev patchelf openssl
|
|
||||||
|
|
||||||
- name: Install Dependencies (Ubuntu Only)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'aarch64')
|
|
||||||
run: |
|
|
||||||
sed 's/mirror+file:\/etc\/apt\/apt-mirrors.txt/[arch-=amd64] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/ports.list
|
|
||||||
sudo sed -i 's/mirror+file/[arch=amd64] mirror+file/g' /etc/apt/sources.list
|
|
||||||
cat /etc/apt/sources.list
|
|
||||||
cat /etc/apt/sources.list.d/ports.list
|
|
||||||
sudo dpkg --add-architecture arm64
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libncurses6:arm64 libtinfo6:arm64 linux-libc-dev:arm64 libncursesw6:arm64 libssl3:arm64 libcups2:arm64
|
|
||||||
sudo apt-get install -y --no-install-recommends g++-aarch64-linux-gnu libc6-dev-arm64-cross libssl-dev:arm64 libwebkit2gtk-4.0-dev:arm64 libgtk-3-dev:arm64 patchelf:arm64 librsvg2-dev:arm64 libayatana-appindicator3-dev:arm64
|
|
||||||
|
|
||||||
- name: Install Dependencies (Ubuntu Only)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'armv7')
|
|
||||||
run: |
|
|
||||||
sed 's/mirror+file:\/etc\/apt\/apt-mirrors.txt/[arch-=amd64] http:\/\/ports.ubuntu.com\/ubuntu-ports\//g' /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/ports.list
|
|
||||||
sudo sed -i 's/mirror+file/[arch=amd64] mirror+file/g' /etc/apt/sources.list
|
|
||||||
cat /etc/apt/sources.list
|
|
||||||
cat /etc/apt/sources.list.d/ports.list
|
|
||||||
sudo dpkg --add-architecture armhf
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libncurses6:armhf libtinfo6:armhf linux-libc-dev:armhf libncursesw6:armhf libssl3:armhf libcups2:armhf
|
|
||||||
sudo apt-get install -y --no-install-recommends g++-arm-linux-gnueabihf libc6-dev-armhf-cross libssl-dev:armhf libwebkit2gtk-4.0-dev:armhf libgtk-3-dev:armhf patchelf:armhf librsvg2-dev:armhf libayatana-appindicator3-dev:armhf
|
|
||||||
|
|
||||||
- name: Pnpm install and check
|
- name: Pnpm install and check
|
||||||
run: |
|
run: |
|
||||||
pnpm i
|
pnpm i
|
||||||
pnpm check ${{ matrix.target }}
|
pnpm check ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Tauri build
|
- name: Tauri build
|
||||||
if: startsWith(matrix.os, 'windows') || startsWith(matrix.os,'macos') || startsWith(matrix.target,'x86_64')
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
uses: tauri-apps/tauri-action@v0
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -110,60 +83,65 @@ jobs:
|
|||||||
releaseDraft: false
|
releaseDraft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
tauriScript: pnpm
|
tauriScript: pnpm
|
||||||
args: -f default-meta --target ${{ matrix.target }}
|
args: --target ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Tauri build (Ubuntu Arm64)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'aarch64')
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
|
|
||||||
CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc
|
|
||||||
CXX_aarch64_unknown_linux_gnu: aarch64-linux-gnu-g++
|
|
||||||
PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig
|
|
||||||
PKG_CONFIG_ALLOW_CROSS: 1
|
|
||||||
with:
|
|
||||||
tagName: v__VERSION__
|
|
||||||
releaseName: "Clash Verge v__VERSION__"
|
|
||||||
releaseBody: "More new features are now supported."
|
|
||||||
releaseDraft: false
|
|
||||||
prerelease: false
|
|
||||||
tauriScript: pnpm
|
|
||||||
args: -f default-meta --target ${{ matrix.target }} -b deb,updater
|
|
||||||
|
|
||||||
- name: Tauri build (Ubuntu Armv7)
|
|
||||||
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.target,'armv7')
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc
|
|
||||||
CC_armv7_unknown_linux_gnueabihf: arm-linux-gnueabihf-gcc
|
|
||||||
CXX_armv7_unknown_linux_gnueabihf: arm-linux-gnueabihf-g++
|
|
||||||
PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig
|
|
||||||
PKG_CONFIG_ALLOW_CROSS: 1
|
|
||||||
with:
|
|
||||||
tagName: v__VERSION__
|
|
||||||
releaseName: "Clash Verge v__VERSION__"
|
|
||||||
releaseBody: "More new features are now supported."
|
|
||||||
releaseDraft: false
|
|
||||||
prerelease: false
|
|
||||||
tauriScript: pnpm
|
|
||||||
args: -f default-meta --target ${{ matrix.target }} -b deb,updater
|
|
||||||
|
|
||||||
- name: Portable Bundle
|
- name: Portable Bundle
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
run: |
|
run: pnpm portable ${{ matrix.target }}
|
||||||
pnpm portable
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
VITE_WIN_PORTABLE: 1
|
VITE_WIN_PORTABLE: 1
|
||||||
|
|
||||||
|
release-for-linux:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: ubuntu-latest
|
||||||
|
target: x86_64-unknown-linux-gnu
|
||||||
|
- os: ubuntu-latest
|
||||||
|
target: i686-unknown-linux-gnu
|
||||||
|
- os: ubuntu-latest
|
||||||
|
target: aarch64-unknown-linux-gnu
|
||||||
|
# - os: ubuntu-latest
|
||||||
|
# target: armv7-unknown-linux-gnueabihf
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build for Linux
|
||||||
|
uses: ./.github/build-for-linux
|
||||||
|
env:
|
||||||
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
|
with:
|
||||||
|
target: ${{ matrix.target }}
|
||||||
|
- name: Get Version
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install jq
|
||||||
|
echo "VERSION=$(cat package.json | jq '.version' | tr -d '"')" >> $GITHUB_ENV
|
||||||
|
- name: Upload Release
|
||||||
|
if: startsWith(matrix.target, 'x86_64') || startsWith(matrix.target, 'i686')
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
tag_name: v${{env.VERSION}}
|
||||||
|
name: "Clash Verge v${{env.VERSION}}"
|
||||||
|
body: "More new features are now supported."
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: src-tauri/target/${{ matrix.target }}/release/bundle/appimage/*.AppImage*
|
||||||
|
- name: Upload Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
tag_name: v${{env.VERSION}}
|
||||||
|
name: "Clash Verge v${{env.VERSION}}"
|
||||||
|
body: "More new features are now supported."
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
files: src-tauri/target/${{ matrix.target }}/release/bundle/deb/*.deb
|
||||||
|
|
||||||
release-update:
|
release-update:
|
||||||
needs: [release]
|
needs: [release]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -1,75 +0,0 @@
|
|||||||
name: Test CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
os:
|
|
||||||
description: "Runs on OS"
|
|
||||||
required: true
|
|
||||||
default: windows-latest
|
|
||||||
type: choice
|
|
||||||
options:
|
|
||||||
- windows-latest
|
|
||||||
- ubuntu-latest
|
|
||||||
- macos-latest
|
|
||||||
- ubuntu-18.04
|
|
||||||
- ubuntu-20.04
|
|
||||||
- ubuntu-22.04
|
|
||||||
- macos-10.15
|
|
||||||
- macos-11
|
|
||||||
- macos-12
|
|
||||||
- windows-2019
|
|
||||||
- windows-2022
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_INCREMENTAL: 0
|
|
||||||
RUST_BACKTRACE: short
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
runs-on: ${{ github.event.inputs.os }}
|
|
||||||
steps:
|
|
||||||
- name: System Version
|
|
||||||
run: |
|
|
||||||
echo ${{ github.event.inputs.os }}
|
|
||||||
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: install Rust stable
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
|
|
||||||
- name: Rust Cache
|
|
||||||
uses: Swatinem/rust-cache@v2
|
|
||||||
with:
|
|
||||||
workspaces: src-tauri
|
|
||||||
|
|
||||||
- name: Install Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: "16"
|
|
||||||
cache: "yarn"
|
|
||||||
|
|
||||||
- name: Install Dependencies (ubuntu only)
|
|
||||||
if: startsWith(github.event.inputs.os, 'ubuntu-')
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
|
|
||||||
|
|
||||||
- name: Yarn install and check
|
|
||||||
run: |
|
|
||||||
yarn install --network-timeout 1000000 --frozen-lockfile
|
|
||||||
yarn run check
|
|
||||||
|
|
||||||
- name: Tauri build
|
|
||||||
uses: tauri-apps/tauri-action@v0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
with:
|
|
||||||
tagName: alpha
|
|
||||||
releaseName: "Clash Verge Alpha"
|
|
||||||
releaseBody: "Alpha Version (include debug)"
|
|
||||||
releaseDraft: false
|
|
||||||
includeUpdaterJson: false
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
<img src="./src/assets/image/logo.png" alt="Clash" width="128" />
|
<img src="./src/assets/image/logo.png" alt="Clash" width="128" />
|
||||||
<br>
|
<br>
|
||||||
Continuation of Clash Verge
|
Continuation of <a href="https://github.com/zzzgydi/clash-verge">Clash Verge</a>
|
||||||
<br>
|
<br>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<h3 align="center">
|
<h3 align="center">
|
||||||
A Clash Meta GUI based on <a href="https://github.com/tauri-apps/tauri">tauri</a>.
|
A Clash Meta GUI based on <a href="https://github.com/tauri-apps/tauri">Tauri</a>.
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
@@ -14,7 +14,7 @@ A Clash Meta GUI based on <a href="https://github.com/tauri-apps/tauri">tauri</a
|
|||||||
- Since the clash core has been removed. The project no longer maintains the clash core, but only the Clash Meta core.
|
- Since the clash core has been removed. The project no longer maintains the clash core, but only the Clash Meta core.
|
||||||
- Profiles management and enhancement (by yaml and Javascript). [Doc](https://github.com/clash-verge-rev/clash-verge-rev/wiki/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97)
|
- Profiles management and enhancement (by yaml and Javascript). [Doc](https://github.com/clash-verge-rev/clash-verge-rev/wiki/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97)
|
||||||
- Simple UI and supports custom theme color.
|
- Simple UI and supports custom theme color.
|
||||||
- Built-in support [Clash.Meta](https://github.com/MetaCubeX/Clash.Meta) core.
|
- Built-in support [Clash.Meta(mihomo)](https://github.com/MetaCubeX/mihomo) core.
|
||||||
- System proxy setting and guard.
|
- System proxy setting and guard.
|
||||||
|
|
||||||
#### TG Group: [@clash_verge_rev](https://t.me/clash_verge_rev)
|
#### TG Group: [@clash_verge_rev](https://t.me/clash_verge_rev)
|
||||||
@@ -39,13 +39,20 @@ A Clash Meta GUI based on <a href="https://github.com/tauri-apps/tauri">tauri</a
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
Download from [release](https://github.com/clash-verge-rev/clash-verge-rev/releases). Supports Windows x64, Linux x86_64 and macOS 11+
|
Download from [release](https://github.com/clash-verge-rev/clash-verge-rev/releases). Supports Windows (x64/x86), Linux (x64/arm64) and macOS 10.15+ (intel/apple).
|
||||||
|
|
||||||
- [Windows x64](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.0/Clash.Verge_1.4.0_x64_zh-CN.msi)
|
- [Windows x64](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/Clash.Verge_1.4.4_x64-setup.exe)
|
||||||
- [macOS intel](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.0/Clash.Verge_1.4.0_x64.dmg)
|
- [Windows x86](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/Clash.Verge_1.4.4_x86-setup.exe)
|
||||||
- [macOS arm](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.0/Clash.Verge_1.4.0_aarch64.dmg)
|
- [Windows arm64](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/Clash.Verge_1.4.4_arm64-setup.exe)
|
||||||
- [Linux AppImage](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.0/clash-verge_1.4.0_amd64.AppImage)
|
|
||||||
- [Linux deb](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.0/clash-verge_1.4.0_amd64.deb)
|
- [macOS intel](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/Clash.Verge_1.4.4_x64.dmg)
|
||||||
|
- [macOS apple](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/Clash.Verge_1.4.4_aarch64.dmg)
|
||||||
|
|
||||||
|
- [Linux x64 AppImage](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/clash-verge_1.4.4_amd64.AppImage)
|
||||||
|
- [Linux x64 deb](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/clash-verge_1.4.4_amd64.deb)
|
||||||
|
- [Linux x86 AppImage](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/clash-verge_1.4.4_i386.AppImage)
|
||||||
|
- [Linux x86 deb](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/clash-verge_1.4.4_i386.deb)
|
||||||
|
- [Linux arm64 deb](https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v1.4.4/clash-verge_1.4.4_arm64.deb)
|
||||||
|
|
||||||
Or you can build it yourself. Supports Windows, Linux and macOS 10.15+
|
Or you can build it yourself. Supports Windows, Linux and macOS 10.15+
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,55 @@
|
|||||||
|
## v1.4.4
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- 支持 Windows aarch64(arm64) 版本
|
||||||
|
- 支持一键更新 GeoData
|
||||||
|
- 支持一键更新 Alpha 内核
|
||||||
|
- MacOS 支持在系统代理时显示不同的托盘图标
|
||||||
|
- Linux 支持在系统代理时显示不同的托盘图标
|
||||||
|
- 优化复制环境变量逻辑
|
||||||
|
|
||||||
|
### Bugs Fixes
|
||||||
|
|
||||||
|
- 修改 PID 文件的路径
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
|
||||||
|
- 优化创建窗口的速度
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## v1.4.3
|
||||||
|
|
||||||
|
### Break Changes
|
||||||
|
|
||||||
|
- 更改配置文件路径到标准目录(可以保证卸载时没有残留)
|
||||||
|
- 更改 appid 为 `io.github.clash-verge-rev.clash-verge-rev`
|
||||||
|
- 建议卸载旧版本后再安装新版本,该版本安装后不会使用旧版配置文件,你可以手动将旧版配置文件迁移到新版配置文件目录下
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
- 移除页面切换动画
|
||||||
|
- 更改 Tun 模式托盘图标颜色
|
||||||
|
- Portable 版本默认使用当前目录作为配置文件目录
|
||||||
|
- 禁用 Clash 字段过滤时隐藏 Clash 字段选项
|
||||||
|
- 优化拖拽时光标样式
|
||||||
|
|
||||||
|
### Bugs Fixes
|
||||||
|
|
||||||
|
- 修复 windows 下更新时没有关闭内核导致的更新失败的问题
|
||||||
|
- 修复打开文件报错的问题
|
||||||
|
- 修复 url 导入时无法获取中文配置名称的问题
|
||||||
|
- 修复 alpha 内核无法显示内存信息的问题
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v1.4.2
|
## v1.4.2
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- update clash meta core to mihomo 1.17.0
|
- update clash meta core to mihomo 1.17.0
|
||||||
|
- support both clash meta stable release and prerelease-alpha release
|
||||||
- fixed the problem of not being able to set the system proxy when there is a dial-up link on windows system [#833](https://github.com/zzzgydi/clash-verge/issues/833)
|
- fixed the problem of not being able to set the system proxy when there is a dial-up link on windows system [#833](https://github.com/zzzgydi/clash-verge/issues/833)
|
||||||
- support new clash field
|
- support new clash field
|
||||||
- support random mixed port
|
- support random mixed port
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.9 MiB After Width: | Height: | Size: 6.7 MiB |
@@ -1,19 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "clash-verge",
|
"name": "clash-verge",
|
||||||
"version": "1.4.2",
|
"version": "1.4.4",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "tauri dev -f default-meta",
|
"dev": "tauri dev",
|
||||||
"dev:diff": "tauri dev -f verge-dev",
|
"dev:diff": "tauri dev -f verge-dev",
|
||||||
"build": "tauri build -f default-meta",
|
"build": "tauri build",
|
||||||
"tauri": "tauri",
|
"tauri": "tauri",
|
||||||
"web:dev": "vite",
|
"web:dev": "vite",
|
||||||
"web:build": "tsc && vite build",
|
"web:build": "tsc && vite build",
|
||||||
"web:serve": "vite preview",
|
"web:serve": "vite preview",
|
||||||
"aarch": "node scripts/aarch.mjs",
|
|
||||||
"check": "node scripts/check.mjs",
|
"check": "node scripts/check.mjs",
|
||||||
"updater": "node scripts/updater.mjs",
|
"updater": "node scripts/updater.mjs",
|
||||||
"publish": "node scripts/publish.mjs",
|
|
||||||
"portable": "node scripts/portable.mjs",
|
"portable": "node scripts/portable.mjs",
|
||||||
"prepare": "husky install"
|
"prepare": "husky install"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,195 @@
|
|||||||
|
From 8b085aea2f11e64f433244eda092c178a2bb50bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: MystiPanda <mystipanda@proton.me>
|
||||||
|
Date: Sun, 10 Dec 2023 19:47:45 +0800
|
||||||
|
Subject: [PATCH] feat: Support windows aarch64
|
||||||
|
|
||||||
|
---
|
||||||
|
.gitmodules | 3 +
|
||||||
|
src-tauri/Cargo.toml | 2 +-
|
||||||
|
src-tauri/quick-rs | 1 +
|
||||||
|
src-tauri/src/enhance/script.rs | 130 +++++++++++++++++++-------------
|
||||||
|
4 files changed, 81 insertions(+), 55 deletions(-)
|
||||||
|
create mode 100644 .gitmodules
|
||||||
|
create mode 160000 src-tauri/quick-rs
|
||||||
|
|
||||||
|
diff --git a/.gitmodules b/.gitmodules
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..2eda7e4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/.gitmodules
|
||||||
|
@@ -0,0 +1,3 @@
|
||||||
|
+[submodule "src-tauri/quick-rs"]
|
||||||
|
+ path = src-tauri/quick-rs
|
||||||
|
+ url = https://github.com/clash-verge-rev/quick-rs.git
|
||||||
|
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
|
||||||
|
index 4c6dde5..5fd9ad8 100644
|
||||||
|
--- a/src-tauri/Cargo.toml
|
||||||
|
+++ b/src-tauri/Cargo.toml
|
||||||
|
@@ -25,7 +25,6 @@ log4rs = "1"
|
||||||
|
nanoid = "0.4"
|
||||||
|
chrono = "0.4"
|
||||||
|
sysinfo = "0.29"
|
||||||
|
-rquickjs = "0.3" # 高版本不支持 Linux aarch64
|
||||||
|
serde_json = "1.0"
|
||||||
|
serde_yaml = "0.9"
|
||||||
|
auto-launch = "0.5"
|
||||||
|
@@ -34,6 +33,7 @@ port_scanner = "0.1.5"
|
||||||
|
delay_timer = "0.11"
|
||||||
|
parking_lot = "0.12"
|
||||||
|
percent-encoding = "2.3.1"
|
||||||
|
+quick-rs = { path = "quick-rs" }
|
||||||
|
window-shadows = { version = "0.2" }
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
diff --git a/src-tauri/quick-rs b/src-tauri/quick-rs
|
||||||
|
new file mode 160000
|
||||||
|
index 0000000..78277c4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src-tauri/quick-rs
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+Subproject commit 78277c4509c64f18c0fc5c9f2b84671de7c83343
|
||||||
|
diff --git a/src-tauri/src/enhance/script.rs b/src-tauri/src/enhance/script.rs
|
||||||
|
index 6c207d9..d47dc33 100644
|
||||||
|
--- a/src-tauri/src/enhance/script.rs
|
||||||
|
+++ b/src-tauri/src/enhance/script.rs
|
||||||
|
@@ -3,61 +3,83 @@ use anyhow::Result;
|
||||||
|
use serde_yaml::Mapping;
|
||||||
|
|
||||||
|
pub fn use_script(script: String, config: Mapping) -> Result<(Mapping, Vec<(String, String)>)> {
|
||||||
|
- use rquickjs::{function::Func, Context, Runtime};
|
||||||
|
- use std::sync::{Arc, Mutex};
|
||||||
|
-
|
||||||
|
- let runtime = Runtime::new().unwrap();
|
||||||
|
- let context = Context::full(&runtime).unwrap();
|
||||||
|
- let outputs = Arc::new(Mutex::new(vec![]));
|
||||||
|
-
|
||||||
|
- let copy_outputs = outputs.clone();
|
||||||
|
- let result = context.with(|ctx| -> Result<Mapping> {
|
||||||
|
- ctx.globals().set(
|
||||||
|
- "__verge_log__",
|
||||||
|
- Func::from(move |level: String, data: String| {
|
||||||
|
- let mut out = copy_outputs.lock().unwrap();
|
||||||
|
- out.push((level, data));
|
||||||
|
- }),
|
||||||
|
- )?;
|
||||||
|
-
|
||||||
|
- ctx.eval(
|
||||||
|
- r#"var console = Object.freeze({
|
||||||
|
- log(data){__verge_log__("log",JSON.stringify(data))},
|
||||||
|
- info(data){__verge_log__("info",JSON.stringify(data))},
|
||||||
|
- error(data){__verge_log__("error",JSON.stringify(data))},
|
||||||
|
- debug(data){__verge_log__("debug",JSON.stringify(data))},
|
||||||
|
- });"#,
|
||||||
|
- )?;
|
||||||
|
-
|
||||||
|
- let config = use_lowercase(config.clone());
|
||||||
|
- let config_str = serde_json::to_string(&config)?;
|
||||||
|
-
|
||||||
|
- let code = format!(
|
||||||
|
- r#"try{{
|
||||||
|
+ use quick_rs::{context::Context, function::Function, module::Module, runtime::Runtime};
|
||||||
|
+
|
||||||
|
+ let config = use_lowercase(config.clone());
|
||||||
|
+ let config_str = serde_json::to_string(&config)?;
|
||||||
|
+
|
||||||
|
+ let runtime = Runtime::new();
|
||||||
|
+ let context = Context::from(&runtime);
|
||||||
|
+
|
||||||
|
+ let code = format!(
|
||||||
|
+ r#"
|
||||||
|
+ let output = [];
|
||||||
|
+
|
||||||
|
+ function __verge_log__(type, data) {{
|
||||||
|
+ output.push([type, data]);
|
||||||
|
+ }}
|
||||||
|
+
|
||||||
|
+ var console = Object.freeze({{
|
||||||
|
+ log(data) {{ __verge_log__("log", JSON.stringify(data)) }},
|
||||||
|
+ info(data) {{ __verge_log__("info", JSON.stringify(data)) }},
|
||||||
|
+ error(data) {{ __verge_log__("error", JSON.stringify(data)) }},
|
||||||
|
+ debug(data) {{ __verge_log__("debug", JSON.stringify(data)) }},
|
||||||
|
+ }});
|
||||||
|
+
|
||||||
|
{script};
|
||||||
|
- JSON.stringify(main({config_str})||'')
|
||||||
|
- }} catch(err) {{
|
||||||
|
- `__error_flag__ ${{err.toString()}}`
|
||||||
|
- }}"#
|
||||||
|
- );
|
||||||
|
- let result: String = ctx.eval(code.as_str())?;
|
||||||
|
- if result.starts_with("__error_flag__") {
|
||||||
|
- anyhow::bail!(result[15..].to_owned());
|
||||||
|
- }
|
||||||
|
- if result == "\"\"" {
|
||||||
|
- anyhow::bail!("main function should return object");
|
||||||
|
- }
|
||||||
|
- return Ok(serde_json::from_str::<Mapping>(result.as_str())?);
|
||||||
|
- });
|
||||||
|
-
|
||||||
|
- let mut out = outputs.lock().unwrap();
|
||||||
|
- match result {
|
||||||
|
- Ok(config) => Ok((use_lowercase(config), out.to_vec())),
|
||||||
|
- Err(err) => {
|
||||||
|
- out.push(("exception".into(), err.to_string()));
|
||||||
|
- Ok((config, out.to_vec()))
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
+ export function _main(){{
|
||||||
|
+ try{{
|
||||||
|
+ let result = JSON.stringify(main({config_str})||"");
|
||||||
|
+ return JSON.stringify({{result, output}});
|
||||||
|
+ }} catch(err) {{
|
||||||
|
+ output.push(["exception", err.toString()]);
|
||||||
|
+ return JSON.stringify({{result: "__error__", output}});
|
||||||
|
+ }}
|
||||||
|
+ }}
|
||||||
|
+ "#
|
||||||
|
+ );
|
||||||
|
+ let value = context.eval_module(&code, "_main")?;
|
||||||
|
+ let module = Module::new(value)?;
|
||||||
|
+ let value = module.get("_main")?;
|
||||||
|
+ let function = Function::new(value)?;
|
||||||
|
+ let value = function.call(vec![])?;
|
||||||
|
+ let result = serde_json::from_str::<serde_json::Value>(&value.to_string()?)?;
|
||||||
|
+ result
|
||||||
|
+ .as_object()
|
||||||
|
+ .map(|obj| {
|
||||||
|
+ let result = obj.get("result").unwrap().as_str().unwrap();
|
||||||
|
+ let output = obj.get("output").unwrap();
|
||||||
|
+
|
||||||
|
+ let mut out = output
|
||||||
|
+ .as_array()
|
||||||
|
+ .unwrap()
|
||||||
|
+ .iter()
|
||||||
|
+ .map(|item| {
|
||||||
|
+ let item = item.as_array().unwrap();
|
||||||
|
+ (
|
||||||
|
+ item[0].as_str().unwrap().into(),
|
||||||
|
+ item[1].as_str().unwrap().into(),
|
||||||
|
+ )
|
||||||
|
+ })
|
||||||
|
+ .collect::<Vec<_>>();
|
||||||
|
+ if result.is_empty() {
|
||||||
|
+ anyhow::bail!("main function should return object");
|
||||||
|
+ }
|
||||||
|
+ if result == "__error__" {
|
||||||
|
+ return Ok((config, out.to_vec()));
|
||||||
|
+ }
|
||||||
|
+ let result = serde_json::from_str::<Mapping>(result);
|
||||||
|
+
|
||||||
|
+ match result {
|
||||||
|
+ Ok(config) => Ok((use_lowercase(config), out.to_vec())),
|
||||||
|
+ Err(err) => {
|
||||||
|
+ out.push(("exception".into(), err.to_string()));
|
||||||
|
+ Ok((config, out.to_vec()))
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ })
|
||||||
|
+ .unwrap_or_else(|| anyhow::bail!("Unknown result"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
--
|
||||||
|
2.43.0.windows.1
|
||||||
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
/**
|
|
||||||
* Build and upload assets
|
|
||||||
* for macOS(aarch)
|
|
||||||
*/
|
|
||||||
import fs from "fs-extra";
|
|
||||||
import path from "path";
|
|
||||||
import { exit } from "process";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import { createRequire } from "module";
|
|
||||||
import { getOctokit, context } from "@actions/github";
|
|
||||||
|
|
||||||
// to `meta` tag
|
|
||||||
const META = process.argv.includes("--meta");
|
|
||||||
// to `alpha` tag
|
|
||||||
const ALPHA = process.argv.includes("--alpha");
|
|
||||||
|
|
||||||
const require = createRequire(import.meta.url);
|
|
||||||
|
|
||||||
async function resolve() {
|
|
||||||
if (!process.env.GITHUB_TOKEN) {
|
|
||||||
throw new Error("GITHUB_TOKEN is required");
|
|
||||||
}
|
|
||||||
if (!process.env.GITHUB_REPOSITORY) {
|
|
||||||
throw new Error("GITHUB_REPOSITORY is required");
|
|
||||||
}
|
|
||||||
if (!process.env.TAURI_PRIVATE_KEY) {
|
|
||||||
throw new Error("TAURI_PRIVATE_KEY is required");
|
|
||||||
}
|
|
||||||
if (!process.env.TAURI_KEY_PASSWORD) {
|
|
||||||
throw new Error("TAURI_KEY_PASSWORD is required");
|
|
||||||
}
|
|
||||||
|
|
||||||
const { version } = require("../package.json");
|
|
||||||
|
|
||||||
const tag = META ? "meta" : ALPHA ? "alpha" : `v${version}`;
|
|
||||||
const buildCmd = META ? `pnpm build -f default-meta` : `pnpm build`;
|
|
||||||
|
|
||||||
console.log(`[INFO]: Upload to tag "${tag}"`);
|
|
||||||
console.log(`[INFO]: Building app. "${buildCmd}"`);
|
|
||||||
|
|
||||||
execSync(buildCmd);
|
|
||||||
|
|
||||||
const cwd = process.cwd();
|
|
||||||
const bundlePath = path.join(cwd, "src-tauri/target/release/bundle");
|
|
||||||
const join = (p) => path.join(bundlePath, p);
|
|
||||||
|
|
||||||
const appPathList = [
|
|
||||||
join("macos/Clash Verge.aarch64.app.tar.gz"),
|
|
||||||
join("macos/Clash Verge.aarch64.app.tar.gz.sig"),
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const appPath of appPathList) {
|
|
||||||
if (fs.pathExistsSync(appPath)) {
|
|
||||||
fs.removeSync(appPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fs.copyFileSync(join("macos/Clash Verge.app.tar.gz"), appPathList[0]);
|
|
||||||
fs.copyFileSync(join("macos/Clash Verge.app.tar.gz.sig"), appPathList[1]);
|
|
||||||
|
|
||||||
const options = { owner: context.repo.owner, repo: context.repo.repo };
|
|
||||||
const github = getOctokit(process.env.GITHUB_TOKEN);
|
|
||||||
|
|
||||||
const { data: release } = await github.rest.repos.getReleaseByTag({
|
|
||||||
...options,
|
|
||||||
tag,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!release.id) throw new Error("failed to find the release");
|
|
||||||
|
|
||||||
await uploadAssets(release.id, [
|
|
||||||
join(`dmg/Clash Verge_${version}_aarch64.dmg`),
|
|
||||||
...appPathList,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// From tauri-apps/tauri-action
|
|
||||||
// https://github.com/tauri-apps/tauri-action/blob/dev/packages/action/src/upload-release-assets.ts
|
|
||||||
async function uploadAssets(releaseId, assets) {
|
|
||||||
const github = getOctokit(process.env.GITHUB_TOKEN);
|
|
||||||
|
|
||||||
// Determine content-length for header to upload asset
|
|
||||||
const contentLength = (filePath) => fs.statSync(filePath).size;
|
|
||||||
|
|
||||||
for (const assetPath of assets) {
|
|
||||||
const headers = {
|
|
||||||
"content-type": "application/zip",
|
|
||||||
"content-length": contentLength(assetPath),
|
|
||||||
};
|
|
||||||
|
|
||||||
const ext = path.extname(assetPath);
|
|
||||||
const filename = path.basename(assetPath).replace(ext, "");
|
|
||||||
const assetName = path.dirname(assetPath).includes(`target${path.sep}debug`)
|
|
||||||
? `${filename}-debug${ext}`
|
|
||||||
: `${filename}${ext}`;
|
|
||||||
|
|
||||||
console.log(`[INFO]: Uploading ${assetName}...`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
await github.rest.repos.uploadReleaseAsset({
|
|
||||||
headers,
|
|
||||||
name: assetName,
|
|
||||||
data: fs.readFileSync(assetPath),
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: releaseId,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.platform === "darwin" && process.arch === "arm64") {
|
|
||||||
resolve();
|
|
||||||
} else {
|
|
||||||
console.error("invalid");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
@@ -18,6 +18,7 @@ const PLATFORM_MAP = {
|
|||||||
"x86_64-apple-darwin": "darwin",
|
"x86_64-apple-darwin": "darwin",
|
||||||
"aarch64-apple-darwin": "darwin",
|
"aarch64-apple-darwin": "darwin",
|
||||||
"x86_64-unknown-linux-gnu": "linux",
|
"x86_64-unknown-linux-gnu": "linux",
|
||||||
|
"i686-unknown-linux-gnu": "linux",
|
||||||
"aarch64-unknown-linux-gnu": "linux",
|
"aarch64-unknown-linux-gnu": "linux",
|
||||||
"armv7-unknown-linux-gnueabihf": "linux",
|
"armv7-unknown-linux-gnueabihf": "linux",
|
||||||
};
|
};
|
||||||
@@ -28,6 +29,7 @@ const ARCH_MAP = {
|
|||||||
"x86_64-apple-darwin": "x64",
|
"x86_64-apple-darwin": "x64",
|
||||||
"aarch64-apple-darwin": "arm64",
|
"aarch64-apple-darwin": "arm64",
|
||||||
"x86_64-unknown-linux-gnu": "x64",
|
"x86_64-unknown-linux-gnu": "x64",
|
||||||
|
"i686-unknown-linux-gnu": "ia32",
|
||||||
"aarch64-unknown-linux-gnu": "arm64",
|
"aarch64-unknown-linux-gnu": "arm64",
|
||||||
"armv7-unknown-linux-gnueabihf": "arm",
|
"armv7-unknown-linux-gnueabihf": "arm",
|
||||||
};
|
};
|
||||||
@@ -52,12 +54,13 @@ const META_ALPHA_URL_PREFIX = `https://github.com/MetaCubeX/mihomo/releases/down
|
|||||||
let META_ALPHA_VERSION;
|
let META_ALPHA_VERSION;
|
||||||
|
|
||||||
const META_ALPHA_MAP = {
|
const META_ALPHA_MAP = {
|
||||||
"win32-x64": "mihomo-windows-amd64",
|
"win32-x64": "mihomo-windows-amd64-compatible",
|
||||||
"win32-ia32": "mihomo-windows-386",
|
"win32-ia32": "mihomo-windows-386",
|
||||||
"win32-arm64": "mihomo-windows-arm64",
|
"win32-arm64": "mihomo-windows-arm64",
|
||||||
"darwin-x64": "mihomo-darwin-amd64",
|
"darwin-x64": "mihomo-darwin-amd64",
|
||||||
"darwin-arm64": "mihomo-darwin-arm64",
|
"darwin-arm64": "mihomo-darwin-arm64",
|
||||||
"linux-x64": "mihomo-linux-amd64",
|
"linux-x64": "mihomo-linux-amd64-compatible",
|
||||||
|
"linux-ia32": "mihomo-linux-386",
|
||||||
"linux-arm64": "mihomo-linux-arm64",
|
"linux-arm64": "mihomo-linux-arm64",
|
||||||
"linux-arm": "mihomo-linux-armv7",
|
"linux-arm": "mihomo-linux-armv7",
|
||||||
};
|
};
|
||||||
@@ -80,12 +83,13 @@ const META_URL_PREFIX = `https://github.com/MetaCubeX/mihomo/releases/download`;
|
|||||||
let META_VERSION = "v1.17.0";
|
let META_VERSION = "v1.17.0";
|
||||||
|
|
||||||
const META_MAP = {
|
const META_MAP = {
|
||||||
"win32-x64": "mihomo-windows-amd64",
|
"win32-x64": "mihomo-windows-amd64-compatible",
|
||||||
"win32-ia32": "mihomo-windows-386",
|
"win32-ia32": "mihomo-windows-386",
|
||||||
"win32-arm64": "mihomo-windows-arm64",
|
"win32-arm64": "mihomo-windows-arm64",
|
||||||
"darwin-x64": "mihomo-darwin-amd64",
|
"darwin-x64": "mihomo-darwin-amd64",
|
||||||
"darwin-arm64": "mihomo-darwin-arm64",
|
"darwin-arm64": "mihomo-darwin-arm64",
|
||||||
"linux-x64": "mihomo-linux-amd64",
|
"linux-x64": "mihomo-linux-amd64-compatible",
|
||||||
|
"linux-ia32": "mihomo-linux-386",
|
||||||
"linux-arm64": "mihomo-linux-arm64",
|
"linux-arm64": "mihomo-linux-arm64",
|
||||||
"linux-arm": "mihomo-linux-armv7",
|
"linux-arm": "mihomo-linux-armv7",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,29 +4,44 @@ import AdmZip from "adm-zip";
|
|||||||
import { createRequire } from "module";
|
import { createRequire } from "module";
|
||||||
import { getOctokit, context } from "@actions/github";
|
import { getOctokit, context } from "@actions/github";
|
||||||
|
|
||||||
|
const target = process.argv.slice(2)[0];
|
||||||
|
|
||||||
|
const ARCH_MAP = {
|
||||||
|
"i686-pc-windows-msvc": "x86",
|
||||||
|
"x86_64-pc-windows-msvc": "x64",
|
||||||
|
"aarch64-pc-windows-msvc": "arm64",
|
||||||
|
};
|
||||||
|
|
||||||
/// Script for ci
|
/// Script for ci
|
||||||
/// 打包绿色版/便携版 (only Windows)
|
/// 打包绿色版/便携版 (only Windows)
|
||||||
async function resolvePortable() {
|
async function resolvePortable() {
|
||||||
if (process.platform !== "win32") return;
|
if (process.platform !== "win32") return;
|
||||||
|
|
||||||
const releaseDir = "./src-tauri/target/release";
|
const releaseDir = target
|
||||||
|
? `./src-tauri/target/${target}/release`
|
||||||
|
: `./src-tauri/target/release`;
|
||||||
|
const configDir = path.join(releaseDir, ".config");
|
||||||
|
|
||||||
if (!(await fs.pathExists(releaseDir))) {
|
if (!(await fs.pathExists(releaseDir))) {
|
||||||
throw new Error("could not found the release dir");
|
throw new Error("could not found the release dir");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await fs.mkdir(configDir);
|
||||||
|
await fs.createFile(path.join(configDir, "PORTABLE"));
|
||||||
|
|
||||||
const zip = new AdmZip();
|
const zip = new AdmZip();
|
||||||
|
|
||||||
zip.addLocalFile(path.join(releaseDir, "Clash Verge.exe"));
|
zip.addLocalFile(path.join(releaseDir, "Clash Verge.exe"));
|
||||||
// zip.addLocalFile(path.join(releaseDir, "clash.exe"));
|
|
||||||
zip.addLocalFile(path.join(releaseDir, "clash-meta.exe"));
|
zip.addLocalFile(path.join(releaseDir, "clash-meta.exe"));
|
||||||
|
zip.addLocalFile(path.join(releaseDir, "clash-meta-alpha.exe"));
|
||||||
zip.addLocalFolder(path.join(releaseDir, "resources"), "resources");
|
zip.addLocalFolder(path.join(releaseDir, "resources"), "resources");
|
||||||
|
zip.addLocalFolder(configDir, ".config");
|
||||||
|
|
||||||
const require = createRequire(import.meta.url);
|
const require = createRequire(import.meta.url);
|
||||||
const packageJson = require("../package.json");
|
const packageJson = require("../package.json");
|
||||||
const { version } = packageJson;
|
const { version } = packageJson;
|
||||||
|
|
||||||
const zipFile = `Clash.Verge_${version}_x64_portable.zip`;
|
const zipFile = `Clash.Verge_${version}_${ARCH_MAP[target]}_portable.zip`;
|
||||||
zip.writeZip(zipFile);
|
zip.writeZip(zipFile);
|
||||||
|
|
||||||
console.log("[INFO]: create portable zip successfully");
|
console.log("[INFO]: create portable zip successfully");
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
import fs from "fs-extra";
|
|
||||||
import { createRequire } from "module";
|
|
||||||
import { execSync } from "child_process";
|
|
||||||
import { resolveUpdateLog } from "./updatelog.mjs";
|
|
||||||
|
|
||||||
const require = createRequire(import.meta.url);
|
|
||||||
|
|
||||||
// publish
|
|
||||||
async function resolvePublish() {
|
|
||||||
const flag = process.argv[2] ?? "patch";
|
|
||||||
const packageJson = require("../package.json");
|
|
||||||
const tauriJson = require("../src-tauri/tauri.conf.json");
|
|
||||||
|
|
||||||
let [a, b, c] = packageJson.version.split(".").map(Number);
|
|
||||||
|
|
||||||
if (flag === "major") {
|
|
||||||
a += 1;
|
|
||||||
b = 0;
|
|
||||||
c = 0;
|
|
||||||
} else if (flag === "minor") {
|
|
||||||
b += 1;
|
|
||||||
c = 0;
|
|
||||||
} else if (flag === "patch") {
|
|
||||||
c += 1;
|
|
||||||
} else throw new Error(`invalid flag "${flag}"`);
|
|
||||||
|
|
||||||
const nextVersion = `${a}.${b}.${c}`;
|
|
||||||
packageJson.version = nextVersion;
|
|
||||||
tauriJson.package.version = nextVersion;
|
|
||||||
|
|
||||||
// 发布更新前先写更新日志
|
|
||||||
const nextTag = `v${nextVersion}`;
|
|
||||||
await resolveUpdateLog(nextTag);
|
|
||||||
|
|
||||||
await fs.writeFile(
|
|
||||||
"./package.json",
|
|
||||||
JSON.stringify(packageJson, undefined, 2)
|
|
||||||
);
|
|
||||||
await fs.writeFile(
|
|
||||||
"./src-tauri/tauri.conf.json",
|
|
||||||
JSON.stringify(tauriJson, undefined, 2)
|
|
||||||
);
|
|
||||||
|
|
||||||
execSync("git add ./package.json");
|
|
||||||
execSync("git add ./src-tauri/tauri.conf.json");
|
|
||||||
execSync(`git commit -m "v${nextVersion}"`);
|
|
||||||
execSync(`git tag -a v${nextVersion} -m "v${nextVersion}"`);
|
|
||||||
execSync(`git push`);
|
|
||||||
execSync(`git push origin v${nextVersion}`);
|
|
||||||
console.log(`Publish Successfully...`);
|
|
||||||
}
|
|
||||||
|
|
||||||
resolvePublish();
|
|
||||||
@@ -45,8 +45,12 @@ async function resolveUpdater() {
|
|||||||
"darwin-intel": { signature: "", url: "" },
|
"darwin-intel": { signature: "", url: "" },
|
||||||
"darwin-x86_64": { signature: "", url: "" },
|
"darwin-x86_64": { signature: "", url: "" },
|
||||||
"linux-x86_64": { signature: "", url: "" },
|
"linux-x86_64": { signature: "", url: "" },
|
||||||
|
"linux-i686": { signature: "", url: "" },
|
||||||
"linux-aarch64": { signature: "", url: "" },
|
"linux-aarch64": { signature: "", url: "" },
|
||||||
|
"linux-armv7": { signature: "", url: "" },
|
||||||
"windows-x86_64": { signature: "", url: "" },
|
"windows-x86_64": { signature: "", url: "" },
|
||||||
|
"windows-i686": { signature: "", url: "" },
|
||||||
|
"windows-aarch64": { signature: "", url: "" },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,43 +58,37 @@ async function resolveUpdater() {
|
|||||||
const { name, browser_download_url } = asset;
|
const { name, browser_download_url } = asset;
|
||||||
|
|
||||||
// win64 url
|
// win64 url
|
||||||
if (
|
if (name.endsWith("x64-setup.nsis.zip")) {
|
||||||
name.endsWith(".msi.zip") &&
|
|
||||||
name.includes("en-US") &&
|
|
||||||
name.includes("x64")
|
|
||||||
) {
|
|
||||||
updateData.platforms.win64.url = browser_download_url;
|
updateData.platforms.win64.url = browser_download_url;
|
||||||
updateData.platforms["windows-x86_64"].url = browser_download_url;
|
updateData.platforms["windows-x86_64"].url = browser_download_url;
|
||||||
}
|
}
|
||||||
// win64 signature
|
// win64 signature
|
||||||
if (
|
if (name.endsWith("x64-setup.nsis.zip.sig")) {
|
||||||
name.endsWith(".msi.zip.sig") &&
|
|
||||||
name.includes("en-US") &&
|
|
||||||
name.includes("x64")
|
|
||||||
) {
|
|
||||||
const sig = await getSignature(browser_download_url);
|
const sig = await getSignature(browser_download_url);
|
||||||
updateData.platforms.win64.signature = sig;
|
updateData.platforms.win64.signature = sig;
|
||||||
updateData.platforms["windows-x86_64"].signature = sig;
|
updateData.platforms["windows-x86_64"].signature = sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
// win32 url
|
// win32 url
|
||||||
if (
|
if (name.endsWith("x86-setup.nsis.zip")) {
|
||||||
name.endsWith(".msi.zip") &&
|
|
||||||
name.includes("en-US") &&
|
|
||||||
name.includes("x86")
|
|
||||||
) {
|
|
||||||
updateData.platforms["windows-i686"].url = browser_download_url;
|
updateData.platforms["windows-i686"].url = browser_download_url;
|
||||||
}
|
}
|
||||||
// win32 signature
|
// win32 signature
|
||||||
if (
|
if (name.endsWith("x86-setup.nsis.zip.sig")) {
|
||||||
name.endsWith(".msi.zip.sig") &&
|
|
||||||
name.includes("en-US") &&
|
|
||||||
name.includes("x86")
|
|
||||||
) {
|
|
||||||
const sig = await getSignature(browser_download_url);
|
const sig = await getSignature(browser_download_url);
|
||||||
updateData.platforms["windows-i686"].signature = sig;
|
updateData.platforms["windows-i686"].signature = sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// win arm url
|
||||||
|
if (name.endsWith("arm64-setup.nsis.zip")) {
|
||||||
|
updateData.platforms["windows-aarch64"].url = browser_download_url;
|
||||||
|
}
|
||||||
|
// win arm signature
|
||||||
|
if (name.endsWith("arm64-setup.nsis.zip.sig")) {
|
||||||
|
const sig = await getSignature(browser_download_url);
|
||||||
|
updateData.platforms["windows-aarch64"].signature = sig;
|
||||||
|
}
|
||||||
|
|
||||||
// darwin url (intel)
|
// darwin url (intel)
|
||||||
if (name.endsWith(".app.tar.gz") && !name.includes("aarch")) {
|
if (name.endsWith(".app.tar.gz") && !name.includes("aarch")) {
|
||||||
updateData.platforms.darwin.url = browser_download_url;
|
updateData.platforms.darwin.url = browser_download_url;
|
||||||
@@ -115,22 +113,32 @@ async function resolveUpdater() {
|
|||||||
updateData.platforms["darwin-aarch64"].signature = sig;
|
updateData.platforms["darwin-aarch64"].signature = sig;
|
||||||
}
|
}
|
||||||
|
|
||||||
// linux url
|
// linux x64 url
|
||||||
if (name.endsWith(".AppImage.tar.gz")) {
|
if (name.endsWith("amd64.AppImage.tar.gz")) {
|
||||||
updateData.platforms.linux.url = browser_download_url;
|
updateData.platforms.linux.url = browser_download_url;
|
||||||
updateData.platforms["linux-x86_64"].url = browser_download_url;
|
updateData.platforms["linux-x86_64"].url = browser_download_url;
|
||||||
// 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage
|
// 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage
|
||||||
updateData.platforms["linux-aarch64"].url = browser_download_url;
|
updateData.platforms["linux-aarch64"].url = browser_download_url;
|
||||||
// updateData.platforms["linux-armv7"].url = browser_download_url;
|
updateData.platforms["linux-armv7"].url = browser_download_url;
|
||||||
}
|
}
|
||||||
// linux signature
|
// linux x64 signature
|
||||||
if (name.endsWith(".AppImage.tar.gz.sig")) {
|
if (name.endsWith("amd64.AppImage.tar.gz.sig")) {
|
||||||
const sig = await getSignature(browser_download_url);
|
const sig = await getSignature(browser_download_url);
|
||||||
updateData.platforms.linux.signature = sig;
|
updateData.platforms.linux.signature = sig;
|
||||||
updateData.platforms["linux-x86_64"].signature = sig;
|
updateData.platforms["linux-x86_64"].signature = sig;
|
||||||
// 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage
|
// 暂时使用x64版本的url和sig,使得可以检查更新,但aarch64版本还不支持构建appimage
|
||||||
updateData.platforms["linux-aarch64"].signature = sig;
|
updateData.platforms["linux-aarch64"].signature = sig;
|
||||||
// updateData.platforms["linux-armv7"].signature = sig;
|
updateData.platforms["linux-armv7"].signature = sig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// linux x86 url
|
||||||
|
if (name.endsWith("i386.AppImage.tar.gz")) {
|
||||||
|
updateData.platforms["linux-i686"].url = browser_download_url;
|
||||||
|
}
|
||||||
|
// linux x86 signature
|
||||||
|
if (name.endsWith("i386.AppImage.tar.gz.sig")) {
|
||||||
|
const sig = await getSignature(browser_download_url);
|
||||||
|
updateData.platforms["linux-i686"].signature = sig;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -559,7 +559,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clash-verge"
|
name = "clash-verge"
|
||||||
version = "1.4.2"
|
version = "1.4.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"auto-launch",
|
"auto-launch",
|
||||||
@@ -575,6 +575,7 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"open 5.0.1",
|
"open 5.0.1",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
|
"percent-encoding",
|
||||||
"port_scanner",
|
"port_scanner",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rquickjs",
|
"rquickjs",
|
||||||
@@ -590,7 +591,6 @@ dependencies = [
|
|||||||
"warp",
|
"warp",
|
||||||
"which 5.0.0",
|
"which 5.0.0",
|
||||||
"window-shadows",
|
"window-shadows",
|
||||||
"window-vibrancy",
|
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
"winreg 0.52.0",
|
"winreg 0.52.0",
|
||||||
]
|
]
|
||||||
@@ -1954,20 +1954,6 @@ dependencies = [
|
|||||||
"want",
|
"want",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hyper-rustls"
|
|
||||||
version = "0.24.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
|
|
||||||
dependencies = [
|
|
||||||
"futures-util",
|
|
||||||
"http",
|
|
||||||
"hyper",
|
|
||||||
"rustls",
|
|
||||||
"tokio",
|
|
||||||
"tokio-rustls",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper-tls"
|
name = "hyper-tls"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
@@ -2916,15 +2902,6 @@ version = "0.1.5"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "openssl-src"
|
|
||||||
version = "300.1.6+3.1.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.9.96"
|
version = "0.9.96"
|
||||||
@@ -2933,7 +2910,6 @@ checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
"openssl-src",
|
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
"vcpkg",
|
"vcpkg",
|
||||||
]
|
]
|
||||||
@@ -3626,7 +3602,6 @@ dependencies = [
|
|||||||
"http",
|
"http",
|
||||||
"http-body",
|
"http-body",
|
||||||
"hyper",
|
"hyper",
|
||||||
"hyper-rustls",
|
|
||||||
"hyper-tls",
|
"hyper-tls",
|
||||||
"ipnet",
|
"ipnet",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
@@ -3636,15 +3611,12 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rustls",
|
|
||||||
"rustls-pemfile",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-native-tls",
|
"tokio-native-tls",
|
||||||
"tokio-rustls",
|
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"url",
|
"url",
|
||||||
@@ -3652,7 +3624,6 @@ dependencies = [
|
|||||||
"wasm-bindgen-futures",
|
"wasm-bindgen-futures",
|
||||||
"wasm-streams",
|
"wasm-streams",
|
||||||
"web-sys",
|
"web-sys",
|
||||||
"webpki-roots",
|
|
||||||
"winreg 0.50.0",
|
"winreg 0.50.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -3680,20 +3651,6 @@ dependencies = [
|
|||||||
"windows 0.37.0",
|
"windows 0.37.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ring"
|
|
||||||
version = "0.17.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
"getrandom 0.2.11",
|
|
||||||
"libc",
|
|
||||||
"spin",
|
|
||||||
"untrusted",
|
|
||||||
"windows-sys 0.48.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rquickjs"
|
name = "rquickjs"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
@@ -3729,14 +3686,12 @@ checksum = "e60ef3b82994702bbe4e134d98aadca4b49ed04440148985678d415c68127666"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "runas"
|
name = "runas"
|
||||||
version = "1.1.0"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "49535b7c73aec5596ae2c44a6d8a7a8f8592e5744564c327fd4846750413d921"
|
checksum = "ed87390fefd18965ff20baae5aeb9913bcf82d2b59dc04c0f6d8f17f7be56ff2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"cc",
|
||||||
"security-framework-sys",
|
|
||||||
"which 4.4.2",
|
"which 4.4.2",
|
||||||
"windows-sys 0.48.0",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3790,18 +3745,6 @@ dependencies = [
|
|||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustls"
|
|
||||||
version = "0.21.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9"
|
|
||||||
dependencies = [
|
|
||||||
"log 0.4.20",
|
|
||||||
"ring",
|
|
||||||
"rustls-webpki",
|
|
||||||
"sct",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustls-pemfile"
|
name = "rustls-pemfile"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
@@ -3811,16 +3754,6 @@ dependencies = [
|
|||||||
"base64 0.21.5",
|
"base64 0.21.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustls-webpki"
|
|
||||||
version = "0.101.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
|
|
||||||
dependencies = [
|
|
||||||
"ring",
|
|
||||||
"untrusted",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
@@ -3869,16 +3802,6 @@ version = "1.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sct"
|
|
||||||
version = "0.7.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
|
|
||||||
dependencies = [
|
|
||||||
"ring",
|
|
||||||
"untrusted",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "security-framework"
|
name = "security-framework"
|
||||||
version = "2.9.2"
|
version = "2.9.2"
|
||||||
@@ -4939,16 +4862,6 @@ dependencies = [
|
|||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tokio-rustls"
|
|
||||||
version = "0.24.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
|
||||||
dependencies = [
|
|
||||||
"rustls",
|
|
||||||
"tokio",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-stream"
|
name = "tokio-stream"
|
||||||
version = "0.1.14"
|
version = "0.1.14"
|
||||||
@@ -5234,12 +5147,6 @@ version = "0.2.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
|
checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "untrusted"
|
|
||||||
version = "0.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
@@ -5542,12 +5449,6 @@ dependencies = [
|
|||||||
"system-deps 6.2.0",
|
"system-deps 6.2.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "webpki-roots"
|
|
||||||
version = "0.25.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webview2-com"
|
name = "webview2-com"
|
||||||
version = "0.19.1"
|
version = "0.19.1"
|
||||||
@@ -5654,19 +5555,6 @@ dependencies = [
|
|||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "window-vibrancy"
|
|
||||||
version = "0.4.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "af6abc2b9c56bd95887825a1ce56cde49a2a97c07e28db465d541f5098a2656c"
|
|
||||||
dependencies = [
|
|
||||||
"cocoa 0.25.0",
|
|
||||||
"objc",
|
|
||||||
"raw-window-handle",
|
|
||||||
"windows-sys 0.52.0",
|
|
||||||
"windows-version",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows"
|
name = "windows"
|
||||||
version = "0.37.0"
|
version = "0.37.0"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "clash-verge"
|
name = "clash-verge"
|
||||||
version = "1.4.2"
|
version = "1.4.4"
|
||||||
description = "clash verge"
|
description = "clash verge"
|
||||||
authors = ["zzzgydi"]
|
authors = ["zzzgydi", "wonfen", "MystiPanda"]
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
repository = "https://github.com/clash-verge-rev/clash-verge-rev.git"
|
repository = "https://github.com/clash-verge-rev/clash-verge-rev.git"
|
||||||
default-run = "clash-verge"
|
default-run = "clash-verge"
|
||||||
@@ -25,8 +25,7 @@ log4rs = "1"
|
|||||||
nanoid = "0.4"
|
nanoid = "0.4"
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
sysinfo = "0.29"
|
sysinfo = "0.29"
|
||||||
sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" }
|
rquickjs = "0.3" # 高版本不支持 Linux aarch64
|
||||||
rquickjs = "0.3"
|
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde_yaml = "0.9"
|
serde_yaml = "0.9"
|
||||||
auto-launch = "0.5"
|
auto-launch = "0.5"
|
||||||
@@ -34,32 +33,27 @@ once_cell = "1.18"
|
|||||||
port_scanner = "0.1.5"
|
port_scanner = "0.1.5"
|
||||||
delay_timer = "0.11"
|
delay_timer = "0.11"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
|
percent-encoding = "2.3.1"
|
||||||
|
window-shadows = { version = "0.2" }
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
reqwest = { version = "0.11", features = ["json", "rustls-tls"] }
|
reqwest = { version = "0.11", features = ["json"] }
|
||||||
tauri = { version = "1.5", features = ["clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all"] }
|
sysproxy = { git="https://github.com/zzzgydi/sysproxy-rs", branch = "main" }
|
||||||
window-vibrancy = { version = "0.4.3" }
|
tauri = { version = "1.5", features = ["icon-png", "clipboard-all", "global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all"] }
|
||||||
window-shadows = { version = "0.2" }
|
|
||||||
|
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
runas = "=1.1.0"
|
runas = "=1.0.0" # 高版本会返回错误 Status
|
||||||
deelevate = "0.2.0"
|
deelevate = "0.2.0"
|
||||||
winreg = { version = "0.52", features = ["transactions"] }
|
winreg = { version = "0.52", features = ["transactions"] }
|
||||||
windows-sys = { version = "0.52", features = ["Win32_System_LibraryLoader", "Win32_System_SystemInformation"] }
|
windows-sys = { version = "0.52", features = ["Win32_System_LibraryLoader", "Win32_System_SystemInformation"] }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies.tauri]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
features = ["global-shortcut-all", "icon-png", "process-all", "shell-all", "system-tray", "updater", "window-all"]
|
#openssl
|
||||||
|
|
||||||
[target.'cfg(linux)'.dependencies.tauri]
|
|
||||||
features = ["global-shortcut-all", "process-all", "shell-all", "system-tray", "updater", "window-all", "native-tls-vendored", "reqwest-native-tls-vendored"]
|
|
||||||
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["custom-protocol"]
|
default = ["custom-protocol"]
|
||||||
custom-protocol = ["tauri/custom-protocol"]
|
custom-protocol = ["tauri/custom-protocol"]
|
||||||
verge-dev = []
|
verge-dev = []
|
||||||
default-meta = []
|
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
panic = "abort"
|
panic = "abort"
|
||||||
|
|||||||
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -85,7 +85,7 @@ pub fn patch_profile(index: String, profile: PrfItem) -> CmdResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub fn view_profile(index: String) -> CmdResult {
|
pub fn view_profile(app_handle: tauri::AppHandle, index: String) -> CmdResult {
|
||||||
let file = {
|
let file = {
|
||||||
wrap_err!(Config::profiles().latest().get_item(&index))?
|
wrap_err!(Config::profiles().latest().get_item(&index))?
|
||||||
.file
|
.file
|
||||||
@@ -98,7 +98,7 @@ pub fn view_profile(index: String) -> CmdResult {
|
|||||||
ret_err!("the file not found");
|
ret_err!("the file not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
wrap_err!(help::open_file(path))
|
wrap_err!(help::open_file(app_handle, path))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
|
|||||||
@@ -24,29 +24,12 @@ impl IClashTemp {
|
|||||||
pub fn template() -> Self {
|
pub fn template() -> Self {
|
||||||
let mut map = Mapping::new();
|
let mut map = Mapping::new();
|
||||||
|
|
||||||
map.insert(
|
map.insert("mixed-port".into(), 7897.into());
|
||||||
"mixed-port".into(),
|
|
||||||
match cfg!(feature = "default-meta") {
|
|
||||||
false => 7890.into(),
|
|
||||||
true => 7898.into(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
map.insert("log-level".into(), "info".into());
|
map.insert("log-level".into(), "info".into());
|
||||||
map.insert("allow-lan".into(), false.into());
|
map.insert("allow-lan".into(), false.into());
|
||||||
map.insert("mode".into(), "rule".into());
|
map.insert("mode".into(), "rule".into());
|
||||||
map.insert(
|
map.insert("external-controller".into(), "127.0.0.1:9097".into());
|
||||||
"external-controller".into(),
|
|
||||||
match cfg!(feature = "default-meta") {
|
|
||||||
false => "127.0.0.1:9090".into(),
|
|
||||||
true => "127.0.0.1:9098".into(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
map.insert("secret".into(), "".into());
|
map.insert("secret".into(), "".into());
|
||||||
#[cfg(feature = "default-meta")]
|
|
||||||
map.insert("unified-delay".into(), true.into());
|
|
||||||
#[cfg(feature = "default-meta")]
|
|
||||||
map.insert("tcp-concurrent".into(), true.into());
|
|
||||||
// map.insert("ipv6".into(), false.into());
|
|
||||||
|
|
||||||
Self(map)
|
Self(map)
|
||||||
}
|
}
|
||||||
@@ -101,9 +84,9 @@ impl IClashTemp {
|
|||||||
Value::Number(val_num) => val_num.as_u64().map(|u| u as u16),
|
Value::Number(val_num) => val_num.as_u64().map(|u| u as u16),
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
.unwrap_or(7890);
|
.unwrap_or(7897);
|
||||||
if port == 0 {
|
if port == 0 {
|
||||||
port = 7890;
|
port = 7897;
|
||||||
}
|
}
|
||||||
port
|
port
|
||||||
}
|
}
|
||||||
@@ -126,7 +109,7 @@ impl IClashTemp {
|
|||||||
}
|
}
|
||||||
None => None,
|
None => None,
|
||||||
})
|
})
|
||||||
.unwrap_or("127.0.0.1:9090".into())
|
.unwrap_or("127.0.0.1:9097".into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn guard_client_ctrl(config: &Mapping) -> String {
|
pub fn guard_client_ctrl(config: &Mapping) -> String {
|
||||||
@@ -138,7 +121,7 @@ impl IClashTemp {
|
|||||||
}
|
}
|
||||||
socket.to_string()
|
socket.to_string()
|
||||||
}
|
}
|
||||||
Err(_) => "127.0.0.1:9090".into(),
|
Err(_) => "127.0.0.1:9097".into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -173,12 +156,12 @@ fn test_clash_info() {
|
|||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
IClashTemp(IClashTemp::guard(Mapping::new())).get_client_info(),
|
IClashTemp(IClashTemp::guard(Mapping::new())).get_client_info(),
|
||||||
get_result(7890, "127.0.0.1:9090")
|
get_result(7897, "127.0.0.1:9097")
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(get_case("", ""), get_result(7890, "127.0.0.1:9090"));
|
assert_eq!(get_case("", ""), get_result(7897, "127.0.0.1:9097"));
|
||||||
|
|
||||||
assert_eq!(get_case(65537, ""), get_result(1, "127.0.0.1:9090"));
|
assert_eq!(get_case(65537, ""), get_result(1, "127.0.0.1:9097"));
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_case(8888, "127.0.0.1:8888"),
|
get_case(8888, "127.0.0.1:8888"),
|
||||||
@@ -187,7 +170,7 @@ fn test_clash_info() {
|
|||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_case(8888, " :98888 "),
|
get_case(8888, " :98888 "),
|
||||||
get_result(8888, "127.0.0.1:9090")
|
get_result(8888, "127.0.0.1:9097")
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@@ -212,7 +195,7 @@ fn test_clash_info() {
|
|||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
get_case(8888, "192.168.1.1:80800"),
|
get_case(8888, "192.168.1.1:80800"),
|
||||||
get_result(8888, "127.0.0.1:9090")
|
get_result(8888, "127.0.0.1:9097")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ impl PrfItem {
|
|||||||
let self_proxy = opt_ref.map_or(false, |o| o.self_proxy.unwrap_or(false));
|
let self_proxy = opt_ref.map_or(false, |o| o.self_proxy.unwrap_or(false));
|
||||||
let user_agent = opt_ref.map_or(None, |o| o.user_agent.clone());
|
let user_agent = opt_ref.map_or(None, |o| o.user_agent.clone());
|
||||||
|
|
||||||
let mut builder = reqwest::ClientBuilder::new().use_rustls_tls().no_proxy();
|
let mut builder = reqwest::ClientBuilder::new().no_proxy();
|
||||||
|
|
||||||
// 使用软件自己的代理
|
// 使用软件自己的代理
|
||||||
if self_proxy {
|
if self_proxy {
|
||||||
@@ -263,7 +263,17 @@ impl PrfItem {
|
|||||||
let filename = match header.get("Content-Disposition") {
|
let filename = match header.get("Content-Disposition") {
|
||||||
Some(value) => {
|
Some(value) => {
|
||||||
let filename = value.to_str().unwrap_or("");
|
let filename = value.to_str().unwrap_or("");
|
||||||
help::parse_str::<String>(filename, "filename=")
|
match help::parse_str::<String>(filename, "filename=") {
|
||||||
|
Some(filename) => Some(filename),
|
||||||
|
None => match help::parse_str::<String>(filename, "filename*=") {
|
||||||
|
Some(filename) => {
|
||||||
|
let iter = percent_encoding::percent_decode(filename.as_bytes());
|
||||||
|
let filename = iter.decode_utf8().unwrap_or_default();
|
||||||
|
filename.split("''").last().map(|s| s.to_string())
|
||||||
|
}
|
||||||
|
None => None,
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -55,12 +55,7 @@ impl IProfiles {
|
|||||||
|
|
||||||
pub fn template() -> Self {
|
pub fn template() -> Self {
|
||||||
Self {
|
Self {
|
||||||
valid: Some(vec![
|
valid: Some(vec!["dns".into()]),
|
||||||
"dns".into(),
|
|
||||||
"sub-rules".into(),
|
|
||||||
"unified-delay".into(),
|
|
||||||
"tcp-concurrent".into(),
|
|
||||||
]),
|
|
||||||
items: Some(vec![]),
|
items: Some(vec![]),
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ pub struct IVerge {
|
|||||||
/// tray click event
|
/// tray click event
|
||||||
pub tray_event: Option<String>,
|
pub tray_event: Option<String>,
|
||||||
|
|
||||||
|
/// copy env type
|
||||||
|
pub env_type: Option<String>,
|
||||||
|
|
||||||
/// enable traffic graph default is true
|
/// enable traffic graph default is true
|
||||||
pub traffic_graph: Option<bool>,
|
pub traffic_graph: Option<bool>,
|
||||||
|
|
||||||
@@ -77,7 +80,7 @@ pub struct IVerge {
|
|||||||
/// 默认的延迟测试连接
|
/// 默认的延迟测试连接
|
||||||
pub default_latency_test: Option<String>,
|
pub default_latency_test: Option<String>,
|
||||||
|
|
||||||
/// 支持关闭字段过滤,避免meta的新字段都被过滤掉,默认为真
|
/// 支持关闭字段过滤,避免meta的新字段都被过滤掉,默认为关闭
|
||||||
pub enable_clash_fields: Option<bool>,
|
pub enable_clash_fields: Option<bool>,
|
||||||
|
|
||||||
/// 是否使用内部的脚本支持,默认为真
|
/// 是否使用内部的脚本支持,默认为真
|
||||||
@@ -130,15 +133,13 @@ impl IVerge {
|
|||||||
|
|
||||||
pub fn template() -> Self {
|
pub fn template() -> Self {
|
||||||
Self {
|
Self {
|
||||||
clash_core: match cfg!(feature = "default-meta") {
|
clash_core: Some("clash-meta".into()),
|
||||||
false => Some("clash".into()),
|
language: Some("zh".into()),
|
||||||
true => Some("clash-meta".into()),
|
|
||||||
},
|
|
||||||
language: match cfg!(feature = "default-meta") {
|
|
||||||
false => Some("en".into()),
|
|
||||||
true => Some("zh".into()),
|
|
||||||
},
|
|
||||||
theme_mode: Some("system".into()),
|
theme_mode: Some("system".into()),
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
env_type: Some("bash".into()),
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
env_type: Some("powershell".into()),
|
||||||
theme_blur: Some(false),
|
theme_blur: Some(false),
|
||||||
traffic_graph: Some(true),
|
traffic_graph: Some(true),
|
||||||
enable_memory_usage: Some(true),
|
enable_memory_usage: Some(true),
|
||||||
@@ -146,12 +147,12 @@ impl IVerge {
|
|||||||
enable_silent_start: Some(false),
|
enable_silent_start: Some(false),
|
||||||
enable_system_proxy: Some(false),
|
enable_system_proxy: Some(false),
|
||||||
enable_random_port: Some(false),
|
enable_random_port: Some(false),
|
||||||
verge_mixed_port: Some(7890),
|
verge_mixed_port: Some(7897),
|
||||||
enable_proxy_guard: Some(false),
|
enable_proxy_guard: Some(false),
|
||||||
proxy_guard_duration: Some(30),
|
proxy_guard_duration: Some(30),
|
||||||
auto_close_connection: Some(true),
|
auto_close_connection: Some(true),
|
||||||
enable_builtin_enhanced: Some(true),
|
enable_builtin_enhanced: Some(true),
|
||||||
enable_clash_fields: Some(true),
|
enable_clash_fields: Some(false),
|
||||||
auto_log_clean: Some(3),
|
auto_log_clean: Some(3),
|
||||||
..Self::default()
|
..Self::default()
|
||||||
}
|
}
|
||||||
@@ -178,6 +179,7 @@ impl IVerge {
|
|||||||
patch!(theme_mode);
|
patch!(theme_mode);
|
||||||
patch!(theme_blur);
|
patch!(theme_blur);
|
||||||
patch!(tray_event);
|
patch!(tray_event);
|
||||||
|
patch!(env_type);
|
||||||
patch!(traffic_graph);
|
patch!(traffic_graph);
|
||||||
patch!(enable_memory_usage);
|
patch!(enable_memory_usage);
|
||||||
|
|
||||||
|
|||||||
@@ -41,10 +41,6 @@ impl Tray {
|
|||||||
"direct_mode",
|
"direct_mode",
|
||||||
t!("Direct Mode", "直连模式"),
|
t!("Direct Mode", "直连模式"),
|
||||||
))
|
))
|
||||||
.add_item(CustomMenuItem::new(
|
|
||||||
"script_mode",
|
|
||||||
t!("Script Mode", "脚本模式"),
|
|
||||||
))
|
|
||||||
.add_native_item(SystemTrayMenuItem::Separator)
|
.add_native_item(SystemTrayMenuItem::Separator)
|
||||||
.add_item(CustomMenuItem::new(
|
.add_item(CustomMenuItem::new(
|
||||||
"system_proxy",
|
"system_proxy",
|
||||||
@@ -52,16 +48,8 @@ impl Tray {
|
|||||||
))
|
))
|
||||||
.add_item(CustomMenuItem::new("tun_mode", t!("TUN Mode", "Tun 模式")))
|
.add_item(CustomMenuItem::new("tun_mode", t!("TUN Mode", "Tun 模式")))
|
||||||
.add_item(CustomMenuItem::new(
|
.add_item(CustomMenuItem::new(
|
||||||
"copy_env_sh",
|
"copy_env",
|
||||||
t!("Copy Env (sh)", "复制环境变量(sh)"),
|
t!("Copy Env", "复制环境变量"),
|
||||||
))
|
|
||||||
.add_item(CustomMenuItem::new(
|
|
||||||
"copy_env_cmd",
|
|
||||||
t!("Copy Env (CMD)", "复制环境变量(CMD)"),
|
|
||||||
))
|
|
||||||
.add_item(CustomMenuItem::new(
|
|
||||||
"copy_env_ps",
|
|
||||||
t!("Copy Env (PS)", "复制环境变量(PS)"),
|
|
||||||
))
|
))
|
||||||
.add_submenu(SystemTraySubmenu::new(
|
.add_submenu(SystemTraySubmenu::new(
|
||||||
t!("Open Dir", "打开目录"),
|
t!("Open Dir", "打开目录"),
|
||||||
@@ -136,28 +124,36 @@ impl Tray {
|
|||||||
let _ = tray.get_item("rule_mode").set_selected(mode == "rule");
|
let _ = tray.get_item("rule_mode").set_selected(mode == "rule");
|
||||||
let _ = tray.get_item("global_mode").set_selected(mode == "global");
|
let _ = tray.get_item("global_mode").set_selected(mode == "global");
|
||||||
let _ = tray.get_item("direct_mode").set_selected(mode == "direct");
|
let _ = tray.get_item("direct_mode").set_selected(mode == "direct");
|
||||||
let _ = tray.get_item("script_mode").set_selected(mode == "script");
|
|
||||||
|
|
||||||
let verge = Config::verge();
|
let verge = Config::verge();
|
||||||
let verge = verge.latest();
|
let verge = verge.latest();
|
||||||
let system_proxy = verge.enable_system_proxy.as_ref().unwrap_or(&false);
|
let system_proxy = verge.enable_system_proxy.as_ref().unwrap_or(&false);
|
||||||
let tun_mode = verge.enable_tun_mode.as_ref().unwrap_or(&false);
|
let tun_mode = verge.enable_tun_mode.as_ref().unwrap_or(&false);
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
let mut indication_icon = if *system_proxy {
|
||||||
{
|
#[cfg(not(target_os = "macos"))]
|
||||||
let mut indication_icon = if *system_proxy {
|
let icon = include_bytes!("../../icons/tray-icon-sys.png").to_vec();
|
||||||
include_bytes!("../../icons/win-tray-icon-activated.png").to_vec()
|
#[cfg(target_os = "macos")]
|
||||||
} else {
|
let icon = include_bytes!("../../icons/mac-tray-icon-sys.png").to_vec();
|
||||||
include_bytes!("../../icons/win-tray-icon.png").to_vec()
|
icon
|
||||||
};
|
} else {
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
let icon = include_bytes!("../../icons/tray-icon.png").to_vec();
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
let icon = include_bytes!("../../icons/icon.png").to_vec();
|
||||||
|
icon
|
||||||
|
};
|
||||||
|
|
||||||
if *tun_mode {
|
if *tun_mode {
|
||||||
indication_icon = include_bytes!("../../icons/win-tray-icon-tun.png").to_vec();
|
#[cfg(not(target_os = "macos"))]
|
||||||
}
|
let icon = include_bytes!("../../icons/tray-icon-tun.png").to_vec();
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
let _ = tray.set_icon(tauri::Icon::Raw(indication_icon));
|
let icon = include_bytes!("../../icons/mac-tray-icon-tun.png").to_vec();
|
||||||
|
indication_icon = icon
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _ = tray.set_icon(tauri::Icon::Raw(indication_icon));
|
||||||
|
|
||||||
let _ = tray.get_item("system_proxy").set_selected(*system_proxy);
|
let _ = tray.get_item("system_proxy").set_selected(*system_proxy);
|
||||||
let _ = tray.get_item("tun_mode").set_selected(*tun_mode);
|
let _ = tray.get_item("tun_mode").set_selected(*tun_mode);
|
||||||
|
|
||||||
@@ -168,7 +164,6 @@ impl Tray {
|
|||||||
map
|
map
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(not(target_os = "linux"))]
|
|
||||||
let _ = tray.set_tooltip(&format!(
|
let _ = tray.set_tooltip(&format!(
|
||||||
"Clash Verge {version}\n{}: {}\n{}: {}",
|
"Clash Verge {version}\n{}: {}\n{}: {}",
|
||||||
t!("System Proxy", "系统代理"),
|
t!("System Proxy", "系统代理"),
|
||||||
@@ -193,22 +188,16 @@ impl Tray {
|
|||||||
|
|
||||||
pub fn on_system_tray_event(app_handle: &AppHandle, event: SystemTrayEvent) {
|
pub fn on_system_tray_event(app_handle: &AppHandle, event: SystemTrayEvent) {
|
||||||
match event {
|
match event {
|
||||||
#[cfg(not(target_os = "linux"))]
|
|
||||||
SystemTrayEvent::LeftClick { .. } => Tray::on_left_click(app_handle),
|
SystemTrayEvent::LeftClick { .. } => Tray::on_left_click(app_handle),
|
||||||
SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {
|
SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {
|
||||||
mode @ ("rule_mode" | "global_mode" | "direct_mode" | "script_mode") => {
|
mode @ ("rule_mode" | "global_mode" | "direct_mode") => {
|
||||||
let mode = &mode[0..mode.len() - 5];
|
let mode = &mode[0..mode.len() - 5];
|
||||||
feat::change_clash_mode(mode.into());
|
feat::change_clash_mode(mode.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
"open_window" => resolve::create_window(app_handle),
|
"open_window" => resolve::create_window(app_handle),
|
||||||
"system_proxy" => feat::toggle_system_proxy(),
|
"system_proxy" => feat::toggle_system_proxy(),
|
||||||
"tun_mode" => feat::toggle_tun_mode(),
|
"tun_mode" => feat::toggle_tun_mode(),
|
||||||
"copy_env_sh" => feat::copy_clash_env(app_handle, "sh"),
|
"copy_env" => feat::copy_clash_env(app_handle),
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
"copy_env_cmd" => feat::copy_clash_env(app_handle, "cmd"),
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
"copy_env_ps" => feat::copy_clash_env(app_handle, "ps"),
|
|
||||||
"open_app_dir" => crate::log_err!(cmds::open_app_dir()),
|
"open_app_dir" => crate::log_err!(cmds::open_app_dir()),
|
||||||
"open_core_dir" => crate::log_err!(cmds::open_core_dir()),
|
"open_core_dir" => crate::log_err!(cmds::open_core_dir()),
|
||||||
"open_logs_dir" => crate::log_err!(cmds::open_logs_dir()),
|
"open_logs_dir" => crate::log_err!(cmds::open_logs_dir()),
|
||||||
|
|||||||
@@ -337,8 +337,8 @@ async fn update_core_config() -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// copy env variable
|
/// copy env variable
|
||||||
pub fn copy_clash_env(app_handle: &AppHandle, option: &str) {
|
pub fn copy_clash_env(app_handle: &AppHandle) {
|
||||||
let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7890) };
|
let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7897) };
|
||||||
let http_proxy = format!("http://127.0.0.1:{}", port);
|
let http_proxy = format!("http://127.0.0.1:{}", port);
|
||||||
let socks5_proxy = format!("socks5://127.0.0.1:{}", port);
|
let socks5_proxy = format!("socks5://127.0.0.1:{}", port);
|
||||||
|
|
||||||
@@ -346,12 +346,25 @@ pub fn copy_clash_env(app_handle: &AppHandle, option: &str) {
|
|||||||
format!("export https_proxy={http_proxy} http_proxy={http_proxy} all_proxy={socks5_proxy}");
|
format!("export https_proxy={http_proxy} http_proxy={http_proxy} all_proxy={socks5_proxy}");
|
||||||
let cmd: String = format!("set http_proxy={http_proxy} \n set https_proxy={http_proxy}");
|
let cmd: String = format!("set http_proxy={http_proxy} \n set https_proxy={http_proxy}");
|
||||||
let ps: String = format!("$env:HTTP_PROXY=\"{http_proxy}\"; $env:HTTPS_PROXY=\"{http_proxy}\"");
|
let ps: String = format!("$env:HTTP_PROXY=\"{http_proxy}\"; $env:HTTPS_PROXY=\"{http_proxy}\"");
|
||||||
|
|
||||||
let mut cliboard = app_handle.clipboard_manager();
|
let mut cliboard = app_handle.clipboard_manager();
|
||||||
|
|
||||||
match option {
|
let env_type = { Config::verge().latest().env_type.clone() };
|
||||||
"sh" => cliboard.write_text(sh).unwrap_or_default(),
|
let env_type = match env_type {
|
||||||
|
Some(env_type) => env_type,
|
||||||
|
None => {
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
let default = "bash";
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let default = "powershell";
|
||||||
|
|
||||||
|
default.to_string()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match env_type.as_str() {
|
||||||
|
"bash" => cliboard.write_text(sh).unwrap_or_default(),
|
||||||
"cmd" => cliboard.write_text(cmd).unwrap_or_default(),
|
"cmd" => cliboard.write_text(cmd).unwrap_or_default(),
|
||||||
"ps" => cliboard.write_text(ps).unwrap_or_default(),
|
"powershell" => cliboard.write_text(ps).unwrap_or_default(),
|
||||||
_ => log::error!(target: "app", "copy_clash_env: Invalid option! {option}"),
|
_ => log::error!(target: "app", "copy_clash_env: Invalid env type! {env_type}"),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,10 @@ fn main() -> std::io::Result<()> {
|
|||||||
api::process::kill_children();
|
api::process::kill_children();
|
||||||
app_handle.exit(0);
|
app_handle.exit(0);
|
||||||
}
|
}
|
||||||
|
tauri::RunEvent::Updater(tauri::UpdaterEvent::Downloaded) => {
|
||||||
|
resolve::resolve_reset();
|
||||||
|
api::process::kill_children();
|
||||||
|
}
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
tauri::RunEvent::WindowEvent { label, event, .. } => {
|
tauri::RunEvent::WindowEvent { label, event, .. } => {
|
||||||
use tauri::Manager;
|
use tauri::Manager;
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use tauri::{
|
use tauri::{
|
||||||
api::path::{home_dir, resource_dir},
|
api::path::{data_dir, resource_dir},
|
||||||
Env, PackageInfo,
|
Env, PackageInfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(not(feature = "verge-dev"))]
|
#[cfg(not(feature = "verge-dev"))]
|
||||||
static APP_DIR: &str = "clash-verge";
|
static APP_ID: &str = "io.github.clash-verge-rev.clash-verge-rev";
|
||||||
#[cfg(feature = "verge-dev")]
|
#[cfg(feature = "verge-dev")]
|
||||||
static APP_DIR: &str = "clash-verge-dev";
|
static APP_ID: &str = "io.github.clash-verge-rev.clash-verge-rev.dev";
|
||||||
|
|
||||||
static CLASH_CONFIG: &str = "config.yaml";
|
static CLASH_CONFIG: &str = "config.yaml";
|
||||||
static VERGE_CONFIG: &str = "verge.yaml";
|
static VERGE_CONFIG: &str = "verge.yaml";
|
||||||
static PROFILE_YAML: &str = "profiles.yaml";
|
static PROFILE_YAML: &str = "profiles.yaml";
|
||||||
|
|
||||||
static mut RESOURCE_DIR: Option<PathBuf> = None;
|
static mut RESOURCE_DIR: Option<PathBuf> = None;
|
||||||
|
static mut APP_HOME_DIR: Option<PathBuf> = None;
|
||||||
|
|
||||||
/// portable flag
|
/// portable flag
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
@@ -42,30 +43,27 @@ pub unsafe fn init_portable_flag() -> Result<()> {
|
|||||||
|
|
||||||
/// get the verge app home dir
|
/// get the verge app home dir
|
||||||
pub fn app_home_dir() -> Result<PathBuf> {
|
pub fn app_home_dir() -> Result<PathBuf> {
|
||||||
#[cfg(target_os = "windows")]
|
use tauri::utils::platform::current_exe;
|
||||||
unsafe {
|
let app_exe = current_exe()?;
|
||||||
use tauri::utils::platform::current_exe;
|
let app_exe = dunce::canonicalize(app_exe)?;
|
||||||
|
let app_dir = app_exe
|
||||||
|
.parent()
|
||||||
|
.ok_or(anyhow::anyhow!("failed to get the portable app dir"))?;
|
||||||
|
|
||||||
if !PORTABLE_FLAG {
|
let portable_home_dir = PathBuf::from(app_dir).join(".config").join(APP_ID);
|
||||||
Ok(home_dir()
|
let home_dir = data_dir()
|
||||||
.ok_or(anyhow::anyhow!("failed to get app home dir"))?
|
.ok_or(anyhow::anyhow!("failed to get app home dir"))?
|
||||||
.join(".config")
|
.join(APP_ID);
|
||||||
.join(APP_DIR))
|
|
||||||
|
unsafe {
|
||||||
|
if PORTABLE_FLAG {
|
||||||
|
APP_HOME_DIR = Some(portable_home_dir.clone());
|
||||||
|
Ok(portable_home_dir)
|
||||||
} else {
|
} else {
|
||||||
let app_exe = current_exe()?;
|
APP_HOME_DIR = Some(home_dir.clone());
|
||||||
let app_exe = dunce::canonicalize(app_exe)?;
|
Ok(home_dir)
|
||||||
let app_dir = app_exe
|
|
||||||
.parent()
|
|
||||||
.ok_or(anyhow::anyhow!("failed to get the portable app dir"))?;
|
|
||||||
Ok(PathBuf::from(app_dir).join(".config").join(APP_DIR))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(target_os = "windows"))]
|
|
||||||
Ok(home_dir()
|
|
||||||
.ok_or(anyhow::anyhow!("failed to get the app home dir"))?
|
|
||||||
.join(".config")
|
|
||||||
.join(APP_DIR))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// get the resources dir
|
/// get the resources dir
|
||||||
@@ -118,9 +116,9 @@ pub fn app_res_dir() -> Result<PathBuf> {
|
|||||||
|
|
||||||
pub fn clash_pid_path() -> Result<PathBuf> {
|
pub fn clash_pid_path() -> Result<PathBuf> {
|
||||||
unsafe {
|
unsafe {
|
||||||
Ok(RESOURCE_DIR
|
Ok(APP_HOME_DIR
|
||||||
.clone()
|
.clone()
|
||||||
.ok_or(anyhow::anyhow!("failed to get the resource dir"))?
|
.ok_or(anyhow::anyhow!("failed to get the app home dir"))?
|
||||||
.join("clash.pid"))
|
.join("clash.pid"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ use nanoid::nanoid;
|
|||||||
use serde::{de::DeserializeOwned, Serialize};
|
use serde::{de::DeserializeOwned, Serialize};
|
||||||
use serde_yaml::{Mapping, Value};
|
use serde_yaml::{Mapping, Value};
|
||||||
use std::{fs, path::PathBuf, str::FromStr};
|
use std::{fs, path::PathBuf, str::FromStr};
|
||||||
|
use tauri::{
|
||||||
|
api::shell::{open, Program},
|
||||||
|
Manager,
|
||||||
|
};
|
||||||
|
|
||||||
/// read data from yaml as struct T
|
/// read data from yaml as struct T
|
||||||
pub fn read_yaml<T: DeserializeOwned>(path: &PathBuf) -> Result<T> {
|
pub fn read_yaml<T: DeserializeOwned>(path: &PathBuf) -> Result<T> {
|
||||||
@@ -81,18 +85,20 @@ pub fn parse_str<T: FromStr>(target: &str, key: &str) -> Option<T> {
|
|||||||
|
|
||||||
/// open file
|
/// open file
|
||||||
/// use vscode by default
|
/// use vscode by default
|
||||||
pub fn open_file(path: PathBuf) -> Result<()> {
|
pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> {
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
let code = "Visual Studio Code";
|
let code = "Visual Studio Code";
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(not(target_os = "macos"))]
|
||||||
let code = "code";
|
let code = "code";
|
||||||
|
|
||||||
// use vscode first
|
let _ = match Program::from_str(code) {
|
||||||
if let Err(err) = open::with(&path, code) {
|
Ok(code) => open(&app.shell_scope(), &path.to_string_lossy(), Some(code)),
|
||||||
log::error!(target: "app", "failed to open file with VScode `{err}`");
|
Err(err) => {
|
||||||
// default open
|
log::error!(target: "app", "Can't find VScode `{err}`");
|
||||||
open::that(path)?;
|
// default open
|
||||||
}
|
open(&app.shell_scope(), &path.to_string_lossy(), None)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ pub fn create_window(app_handle: &AppHandle) {
|
|||||||
tauri::WindowUrl::App("index.html".into()),
|
tauri::WindowUrl::App("index.html".into()),
|
||||||
)
|
)
|
||||||
.title("Clash Verge")
|
.title("Clash Verge")
|
||||||
|
.visible(false)
|
||||||
.fullscreen(false)
|
.fullscreen(false)
|
||||||
.min_inner_size(600.0, 520.0);
|
.min_inner_size(600.0, 520.0);
|
||||||
|
|
||||||
@@ -138,8 +139,6 @@ pub fn create_window(app_handle: &AppHandle) {
|
|||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
{
|
{
|
||||||
use std::time::Duration;
|
|
||||||
use tokio::time::sleep;
|
|
||||||
use window_shadows::set_shadow;
|
use window_shadows::set_shadow;
|
||||||
|
|
||||||
match builder
|
match builder
|
||||||
@@ -173,19 +172,11 @@ pub fn create_window(app_handle: &AppHandle) {
|
|||||||
log::trace!("try to create window");
|
log::trace!("try to create window");
|
||||||
let app_handle = app_handle.clone();
|
let app_handle = app_handle.clone();
|
||||||
|
|
||||||
// 加点延迟避免界面闪一下
|
if let Some(window) = app_handle.get_window("main") {
|
||||||
tauri::async_runtime::spawn(async move {
|
trace_err!(set_shadow(&window, true), "set win shadow");
|
||||||
sleep(Duration::from_millis(888)).await;
|
} else {
|
||||||
|
log::error!(target: "app", "failed to create window, get_window is None")
|
||||||
if let Some(window) = app_handle.get_window("main") {
|
}
|
||||||
trace_err!(set_shadow(&window, true), "set win shadow");
|
|
||||||
trace_err!(window.show(), "set win visible");
|
|
||||||
trace_err!(window.unminimize(), "set win unminimize");
|
|
||||||
trace_err!(window.set_focus(), "set win focus");
|
|
||||||
} else {
|
|
||||||
log::error!(target: "app", "failed to create window, get_window is None")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
Err(err) => log::error!(target: "app", "failed to create window, {err}"),
|
Err(err) => log::error!(target: "app", "failed to create window, {err}"),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "Clash Verge",
|
"productName": "Clash Verge",
|
||||||
"version": "1.4.2"
|
"version": "1.4.4"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"distDir": "../dist",
|
"distDir": "../dist",
|
||||||
@@ -10,14 +10,9 @@
|
|||||||
"beforeBuildCommand": "pnpm run web:build"
|
"beforeBuildCommand": "pnpm run web:build"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"systemTray": {
|
|
||||||
"iconPath": "icons/tray-icon.ico",
|
|
||||||
"iconAsTemplate": true
|
|
||||||
},
|
|
||||||
"bundle": {
|
"bundle": {
|
||||||
"active": true,
|
"active": true,
|
||||||
"targets": "all",
|
"identifier": "io.github.clash-verge-rev.clash-verge-rev",
|
||||||
"identifier": "moe.elaina.clash.verge",
|
|
||||||
"icon": [
|
"icon": [
|
||||||
"icons/32x32.png",
|
"icons/32x32.png",
|
||||||
"icons/128x128.png",
|
"icons/128x128.png",
|
||||||
@@ -29,26 +24,8 @@
|
|||||||
"externalBin": ["sidecar/clash-meta", "sidecar/clash-meta-alpha"],
|
"externalBin": ["sidecar/clash-meta", "sidecar/clash-meta-alpha"],
|
||||||
"copyright": "© 2022 zzzgydi All Rights Reserved",
|
"copyright": "© 2022 zzzgydi All Rights Reserved",
|
||||||
"category": "DeveloperTool",
|
"category": "DeveloperTool",
|
||||||
"shortDescription": "A Clash GUI based on tauri.",
|
"shortDescription": "A Clash Meta GUI based on tauri.",
|
||||||
"longDescription": "A Clash GUI based on tauri.",
|
"longDescription": "A Clash Meta GUI based on tauri."
|
||||||
"deb": {
|
|
||||||
"depends": ["openssl"]
|
|
||||||
},
|
|
||||||
"macOS": {
|
|
||||||
"frameworks": [],
|
|
||||||
"minimumSystemVersion": "",
|
|
||||||
"exceptionDomain": "",
|
|
||||||
"signingIdentity": null,
|
|
||||||
"entitlements": null
|
|
||||||
},
|
|
||||||
"windows": {
|
|
||||||
"certificateThumbprint": null,
|
|
||||||
"digestAlgorithm": "sha256",
|
|
||||||
"timestampUrl": "",
|
|
||||||
"wix": {
|
|
||||||
"language": ["zh-CN", "en-US", "ru-RU"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"updater": {
|
"updater": {
|
||||||
"active": true,
|
"active": true,
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"tauri": {
|
||||||
|
"systemTray": {
|
||||||
|
"iconPath": "icons/tray-icon.png"
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"targets": ["deb", "appimage", "updater"],
|
||||||
|
"deb": {
|
||||||
|
"depends": ["openssl"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"tauri": {
|
||||||
|
"systemTray": {
|
||||||
|
"iconPath": "icons/icon.png",
|
||||||
|
"iconAsTemplate": true
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"targets": ["app", "dmg", "updater"],
|
||||||
|
"macOS": {
|
||||||
|
"frameworks": [],
|
||||||
|
"minimumSystemVersion": "",
|
||||||
|
"exceptionDomain": "",
|
||||||
|
"signingIdentity": null,
|
||||||
|
"entitlements": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"tauri": {
|
||||||
|
"systemTray": {
|
||||||
|
"iconPath": "icons/tray-icon.png"
|
||||||
|
},
|
||||||
|
"bundle": {
|
||||||
|
"targets": ["nsis", "updater"],
|
||||||
|
"windows": {
|
||||||
|
"certificateThumbprint": null,
|
||||||
|
"digestAlgorithm": "sha256",
|
||||||
|
"timestampUrl": "",
|
||||||
|
"webviewInstallMode": {
|
||||||
|
"type": "embedBootstrapper",
|
||||||
|
"silent": true
|
||||||
|
},
|
||||||
|
"nsis": {
|
||||||
|
"displayLanguageSelector": true,
|
||||||
|
"installerIcon": "icons/icon.ico",
|
||||||
|
"languages": ["SimpChinese", "English"],
|
||||||
|
"license": "../LICENSE"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
.page-enter {
|
|
||||||
opacity: 0;
|
|
||||||
clip-path: inset(0 100% 0 0); /* 完全隐藏内容 */
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-enter-active {
|
|
||||||
opacity: 1;
|
|
||||||
clip-path: inset(0 0 0 0); /* 逐渐显示整个内容 */
|
|
||||||
transition: opacity 300ms, clip-path 300ms ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-exit {
|
|
||||||
opacity: 1;
|
|
||||||
clip-path: inset(0 0 0 0); /* 完全显示内容 */
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-exit-active {
|
|
||||||
opacity: 0;
|
|
||||||
clip-path: inset(0 100% 0 0); /* 逐渐隐藏内容 */
|
|
||||||
transition: opacity 300ms, clip-path 300ms ease-in-out;
|
|
||||||
}
|
|
||||||
@@ -42,7 +42,6 @@ body {
|
|||||||
|
|
||||||
@import "./layout.scss";
|
@import "./layout.scss";
|
||||||
@import "./page.scss";
|
@import "./page.scss";
|
||||||
@import "./anime.scss";
|
|
||||||
@import "./font.scss";
|
@import "./font.scss";
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export const LayoutTraffic = () => {
|
|||||||
}, [clashInfo, pageVisible]);
|
}, [clashInfo, pageVisible]);
|
||||||
|
|
||||||
/* --------- meta memory information --------- */
|
/* --------- meta memory information --------- */
|
||||||
const isMetaCore = verge?.clash_core === "clash-meta";
|
const isMetaCore = verge?.clash_core?.includes("clash-meta");
|
||||||
const displayMemory = isMetaCore && (verge?.enable_memory_usage ?? true);
|
const displayMemory = isMetaCore && (verge?.enable_memory_usage ?? true);
|
||||||
|
|
||||||
const memoryWs = useWebsocket(
|
const memoryWs = useWebsocket(
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ export const ProfileItem = (props: Props) => {
|
|||||||
{...attributes}
|
{...attributes}
|
||||||
{...listeners}
|
{...listeners}
|
||||||
>
|
>
|
||||||
<DragIndicator sx={{ cursor: "grab" }} />
|
<DragIndicator sx={{ cursor: "move", marginLeft: "-6px" }} />
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Typography
|
<Typography
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {
|
|||||||
ListItemText,
|
ListItemText,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
import { changeClashCore, restartSidecar } from "@/services/cmds";
|
import { changeClashCore, restartSidecar } from "@/services/cmds";
|
||||||
import { closeAllConnections } from "@/services/api";
|
import { closeAllConnections, upgradeCore } from "@/services/api";
|
||||||
import { grantPermission } from "@/services/cmds";
|
import { grantPermission } from "@/services/cmds";
|
||||||
import getSystem from "@/utils/get-system";
|
import getSystem from "@/utils/get-system";
|
||||||
|
|
||||||
@@ -76,16 +76,36 @@ export const ClashCoreViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const onUpgrade = useLockFn(async () => {
|
||||||
|
try {
|
||||||
|
await upgradeCore();
|
||||||
|
Notice.success(`Successfully upgrade core`, 1000);
|
||||||
|
} catch (err: any) {
|
||||||
|
Notice.error(err?.response.data.message || err.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<BaseDialog
|
<BaseDialog
|
||||||
open={open}
|
open={open}
|
||||||
title={
|
title={
|
||||||
<Box display="flex" justifyContent="space-between">
|
<Box display="flex" justifyContent="space-between">
|
||||||
{t("Clash Core")}
|
{t("Clash Core")}
|
||||||
|
<Box>
|
||||||
<Button variant="contained" size="small" onClick={onRestart}>
|
{clash_core !== "clash-meta" && (
|
||||||
{t("Restart")}
|
<Button
|
||||||
</Button>
|
variant="contained"
|
||||||
|
size="small"
|
||||||
|
sx={{ marginRight: "8px" }}
|
||||||
|
onClick={onUpgrade}
|
||||||
|
>
|
||||||
|
{t("Upgrade")}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
<Button variant="contained" size="small" onClick={onRestart}>
|
||||||
|
{t("Restart")}
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
}
|
}
|
||||||
contentSx={{
|
contentSx={{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const ClashPortViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
|
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const [port, setPort] = useState(
|
const [port, setPort] = useState(
|
||||||
verge?.verge_mixed_port ?? clashInfo?.port ?? 7890
|
verge?.verge_mixed_port ?? clashInfo?.port ?? 7897
|
||||||
);
|
);
|
||||||
|
|
||||||
useImperativeHandle(ref, () => ({
|
useImperativeHandle(ref, () => ({
|
||||||
|
|||||||
@@ -75,14 +75,17 @@ export const UpdateViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
<BaseDialog
|
<BaseDialog
|
||||||
open={open}
|
open={open}
|
||||||
title={`New Version v${updateInfo?.manifest?.version}`}
|
title={`New Version v${updateInfo?.manifest?.version}`}
|
||||||
contentSx={{ minWidth: 360, maxWidth: 400, maxHeight: "50vh" }}
|
contentSx={{ minWidth: 360, maxWidth: 400, height: "50vh" }}
|
||||||
okBtn={t("Update")}
|
okBtn={t("Update")}
|
||||||
cancelBtn={t("Cancel")}
|
cancelBtn={t("Cancel")}
|
||||||
onClose={() => setOpen(false)}
|
onClose={() => setOpen(false)}
|
||||||
onCancel={() => setOpen(false)}
|
onCancel={() => setOpen(false)}
|
||||||
onOk={onUpdate}
|
onOk={onUpdate}
|
||||||
>
|
>
|
||||||
<UpdateLog dangerouslySetInnerHTML={{ __html: parseContent }} />
|
<UpdateLog
|
||||||
|
dangerouslySetInnerHTML={{ __html: parseContent }}
|
||||||
|
sx={{ height: "calc(100% - 10px)", overflow: "auto" }}
|
||||||
|
/>
|
||||||
{updateState && (
|
{updateState && (
|
||||||
<LinearProgress
|
<LinearProgress
|
||||||
variant="buffer"
|
variant="buffer"
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ export const WebUIViewer = forwardRef<DialogRef>((props, ref) => {
|
|||||||
.slice(clashInfo.server.indexOf(":") + 1)
|
.slice(clashInfo.server.indexOf(":") + 1)
|
||||||
.trim();
|
.trim();
|
||||||
|
|
||||||
url = url.replaceAll("%port", port || "9090");
|
url = url.replaceAll("%port", port || "9097");
|
||||||
url = url.replaceAll(
|
url = url.replaceAll(
|
||||||
"%secret",
|
"%secret",
|
||||||
encodeURIComponent(clashInfo.secret || "")
|
encodeURIComponent(clashInfo.secret || "")
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useRef } from "react";
|
import { useRef } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useLockFn } from "ahooks";
|
||||||
import {
|
import {
|
||||||
TextField,
|
TextField,
|
||||||
Switch,
|
Switch,
|
||||||
@@ -22,6 +23,7 @@ import { ClashCoreViewer } from "./mods/clash-core-viewer";
|
|||||||
import { invoke_uwp_tool } from "@/services/cmds";
|
import { invoke_uwp_tool } from "@/services/cmds";
|
||||||
import getSystem from "@/utils/get-system";
|
import getSystem from "@/utils/get-system";
|
||||||
import { useVerge } from "@/hooks/use-verge";
|
import { useVerge } from "@/hooks/use-verge";
|
||||||
|
import { updateGeoData } from "@/services/api";
|
||||||
|
|
||||||
const isWIN = getSystem() === "windows";
|
const isWIN = getSystem() === "windows";
|
||||||
|
|
||||||
@@ -33,12 +35,15 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { clash, version, mutateClash, patchClash } = useClash();
|
const { clash, version, mutateClash, patchClash } = useClash();
|
||||||
|
|
||||||
const { verge, mutateVerge, patchVerge } = useVerge();
|
const { verge, mutateVerge, patchVerge } = useVerge();
|
||||||
|
|
||||||
const { ipv6, "allow-lan": allowLan, "log-level": logLevel } = clash ?? {};
|
const { ipv6, "allow-lan": allowLan, "log-level": logLevel } = clash ?? {};
|
||||||
|
|
||||||
const { enable_random_port = false, verge_mixed_port } = verge ?? {};
|
const {
|
||||||
|
enable_random_port = false,
|
||||||
|
verge_mixed_port,
|
||||||
|
enable_clash_fields = false,
|
||||||
|
} = verge ?? {};
|
||||||
|
|
||||||
const webRef = useRef<DialogRef>(null);
|
const webRef = useRef<DialogRef>(null);
|
||||||
const fieldRef = useRef<DialogRef>(null);
|
const fieldRef = useRef<DialogRef>(null);
|
||||||
@@ -53,6 +58,15 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
const onChangeVerge = (patch: Partial<IVergeConfig>) => {
|
const onChangeVerge = (patch: Partial<IVergeConfig>) => {
|
||||||
mutateVerge({ ...verge, ...patch }, false);
|
mutateVerge({ ...verge, ...patch }, false);
|
||||||
};
|
};
|
||||||
|
const onUpdateGeo = useLockFn(async () => {
|
||||||
|
try {
|
||||||
|
await updateGeoData();
|
||||||
|
Notice.success("Start update geodata");
|
||||||
|
} catch (err: any) {
|
||||||
|
Notice.error(err?.response.data.message || err.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SettingList title={t("Clash Setting")}>
|
<SettingList title={t("Clash Setting")}>
|
||||||
<WebUIViewer ref={webRef} />
|
<WebUIViewer ref={webRef} />
|
||||||
@@ -112,7 +126,7 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
<Tooltip title={t("Random Port")}>
|
<Tooltip title={t("Random Port")}>
|
||||||
<IconButton
|
<IconButton
|
||||||
color={enable_random_port ? "success" : "inherit"}
|
color={enable_random_port ? "success" : "inherit"}
|
||||||
size="medium"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
Notice.success(t("After restart to take effect"), 1000);
|
Notice.success(t("After restart to take effect"), 1000);
|
||||||
onChangeVerge({ enable_random_port: !enable_random_port });
|
onChangeVerge({ enable_random_port: !enable_random_port });
|
||||||
@@ -131,7 +145,7 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
disabled={enable_random_port}
|
disabled={enable_random_port}
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
size="small"
|
size="small"
|
||||||
value={verge_mixed_port ?? 7890}
|
value={verge_mixed_port ?? 7897}
|
||||||
sx={{ width: 100, input: { py: "7.5px", cursor: "pointer" } }}
|
sx={{ width: 100, input: { py: "7.5px", cursor: "pointer" } }}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
portRef.current?.open();
|
portRef.current?.open();
|
||||||
@@ -162,16 +176,18 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
|
|
||||||
<SettingItem label={t("Clash Field")}>
|
{enable_clash_fields && (
|
||||||
<IconButton
|
<SettingItem label={t("Clash Field")}>
|
||||||
color="inherit"
|
<IconButton
|
||||||
size="small"
|
color="inherit"
|
||||||
sx={{ my: "2px" }}
|
size="small"
|
||||||
onClick={() => fieldRef.current?.open()}
|
sx={{ my: "2px" }}
|
||||||
>
|
onClick={() => fieldRef.current?.open()}
|
||||||
<ArrowForward />
|
>
|
||||||
</IconButton>
|
<ArrowForward />
|
||||||
</SettingItem>
|
</IconButton>
|
||||||
|
</SettingItem>
|
||||||
|
)}
|
||||||
|
|
||||||
<SettingItem
|
<SettingItem
|
||||||
label={t("Clash Core")}
|
label={t("Clash Core")}
|
||||||
@@ -203,6 +219,17 @@ const SettingClash = ({ onError }: Props) => {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<SettingItem label={t("Update GeoData")}>
|
||||||
|
<IconButton
|
||||||
|
color="inherit"
|
||||||
|
size="small"
|
||||||
|
sx={{ my: "2px" }}
|
||||||
|
onClick={onUpdateGeo}
|
||||||
|
>
|
||||||
|
<ArrowForward />
|
||||||
|
</IconButton>
|
||||||
|
</SettingItem>
|
||||||
</SettingList>
|
</SettingList>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ const SettingVerge = ({ onError }: Props) => {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { verge, patchVerge, mutateVerge } = useVerge();
|
const { verge, patchVerge, mutateVerge } = useVerge();
|
||||||
const { theme_mode, language, tray_event } = verge ?? {};
|
const { theme_mode, language, tray_event, env_type } = verge ?? {};
|
||||||
const configRef = useRef<DialogRef>(null);
|
const configRef = useRef<DialogRef>(null);
|
||||||
const hotkeyRef = useRef<DialogRef>(null);
|
const hotkeyRef = useRef<DialogRef>(null);
|
||||||
const miscRef = useRef<DialogRef>(null);
|
const miscRef = useRef<DialogRef>(null);
|
||||||
@@ -109,6 +109,22 @@ const SettingVerge = ({ onError }: Props) => {
|
|||||||
</SettingItem>
|
</SettingItem>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<SettingItem label={t("Copy Env Type")}>
|
||||||
|
<GuardState
|
||||||
|
value={env_type ?? OS === "windows" ? "powershell" : "bash"}
|
||||||
|
onCatch={onError}
|
||||||
|
onFormat={(e: any) => e.target.value}
|
||||||
|
onChange={(e) => onChangeData({ env_type: e })}
|
||||||
|
onGuard={(e) => patchVerge({ env_type: e })}
|
||||||
|
>
|
||||||
|
<Select size="small" sx={{ width: 140, "> div": { py: "7.5px" } }}>
|
||||||
|
<MenuItem value="bash">Bash</MenuItem>
|
||||||
|
<MenuItem value="cmd">CMD</MenuItem>
|
||||||
|
<MenuItem value="powershell">PowerShell</MenuItem>
|
||||||
|
</Select>
|
||||||
|
</GuardState>
|
||||||
|
</SettingItem>
|
||||||
|
|
||||||
<SettingItem label={t("Theme Setting")}>
|
<SettingItem label={t("Theme Setting")}>
|
||||||
<IconButton
|
<IconButton
|
||||||
color="inherit"
|
color="inherit"
|
||||||
|
|||||||
@@ -80,6 +80,7 @@
|
|||||||
"System Proxy": "System Proxy",
|
"System Proxy": "System Proxy",
|
||||||
"System Proxy Setting": "System Proxy Setting",
|
"System Proxy Setting": "System Proxy Setting",
|
||||||
"Open UWP tool": "Open UWP tool",
|
"Open UWP tool": "Open UWP tool",
|
||||||
|
"Update GeoData": "Update GeoData",
|
||||||
"Proxy Guard": "Proxy Guard",
|
"Proxy Guard": "Proxy Guard",
|
||||||
"Guard Duration": "Guard Duration",
|
"Guard Duration": "Guard Duration",
|
||||||
"Proxy Bypass": "Proxy Bypass",
|
"Proxy Bypass": "Proxy Bypass",
|
||||||
@@ -90,6 +91,7 @@
|
|||||||
"Theme Mode": "Theme Mode",
|
"Theme Mode": "Theme Mode",
|
||||||
"Theme Blur": "Theme Blur",
|
"Theme Blur": "Theme Blur",
|
||||||
"Tray Click Event": "Tray Click Event",
|
"Tray Click Event": "Tray Click Event",
|
||||||
|
"Copy Env Type": "Copy Env Type",
|
||||||
"Show Main Window": "Show Main Window",
|
"Show Main Window": "Show Main Window",
|
||||||
"Theme Setting": "Theme Setting",
|
"Theme Setting": "Theme Setting",
|
||||||
"Layout Setting": "Layout Setting",
|
"Layout Setting": "Layout Setting",
|
||||||
@@ -110,6 +112,7 @@
|
|||||||
"Runtime Config": "Runtime Config",
|
"Runtime Config": "Runtime Config",
|
||||||
"ReadOnly": "ReadOnly",
|
"ReadOnly": "ReadOnly",
|
||||||
"Restart": "Restart",
|
"Restart": "Restart",
|
||||||
|
"Upgrade": "Upgrade",
|
||||||
|
|
||||||
"Back": "Back",
|
"Back": "Back",
|
||||||
"Save": "Save",
|
"Save": "Save",
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
"System Proxy": "Системный прокси",
|
"System Proxy": "Системный прокси",
|
||||||
"System Proxy Setting": "Настройка системного прокси",
|
"System Proxy Setting": "Настройка системного прокси",
|
||||||
"Open UWP tool": "Открыть UWP инструмент",
|
"Open UWP tool": "Открыть UWP инструмент",
|
||||||
|
"Update GeoData": "Обновление GeoData",
|
||||||
"Proxy Guard": "Защита прокси",
|
"Proxy Guard": "Защита прокси",
|
||||||
"Guard Duration": "Период защиты",
|
"Guard Duration": "Период защиты",
|
||||||
"Proxy Bypass": "Игнорирование прокси",
|
"Proxy Bypass": "Игнорирование прокси",
|
||||||
@@ -81,6 +82,7 @@
|
|||||||
"Theme Mode": "Режим темы",
|
"Theme Mode": "Режим темы",
|
||||||
"Theme Blur": "Размытие темы",
|
"Theme Blur": "Размытие темы",
|
||||||
"Tray Click Event": "Событие щелчка в лотке",
|
"Tray Click Event": "Событие щелчка в лотке",
|
||||||
|
"Copy Env Type": "Скопировать тип Env",
|
||||||
"Show Main Window": "Показать главное окно",
|
"Show Main Window": "Показать главное окно",
|
||||||
"Theme Setting": "Настройка темы",
|
"Theme Setting": "Настройка темы",
|
||||||
"Hotkey Setting": "Настройка клавиатурных сокращений",
|
"Hotkey Setting": "Настройка клавиатурных сокращений",
|
||||||
@@ -97,6 +99,7 @@
|
|||||||
"Runtime Config": "Используемый конфиг",
|
"Runtime Config": "Используемый конфиг",
|
||||||
"ReadOnly": "Только для чтения",
|
"ReadOnly": "Только для чтения",
|
||||||
"Restart": "Перезапуск",
|
"Restart": "Перезапуск",
|
||||||
|
"Upgrade": "Обновлять",
|
||||||
|
|
||||||
"Back": "Назад",
|
"Back": "Назад",
|
||||||
"Save": "Сохранить",
|
"Save": "Сохранить",
|
||||||
|
|||||||
@@ -80,6 +80,7 @@
|
|||||||
"System Proxy": "系统代理",
|
"System Proxy": "系统代理",
|
||||||
"System Proxy Setting": "系统代理设置",
|
"System Proxy Setting": "系统代理设置",
|
||||||
"Open UWP tool": "UWP工具",
|
"Open UWP tool": "UWP工具",
|
||||||
|
"Update GeoData": "更新 GeoData",
|
||||||
"Proxy Guard": "系统代理守卫",
|
"Proxy Guard": "系统代理守卫",
|
||||||
"Guard Duration": "代理守卫间隔",
|
"Guard Duration": "代理守卫间隔",
|
||||||
"Proxy Bypass": "代理绕过",
|
"Proxy Bypass": "代理绕过",
|
||||||
@@ -90,6 +91,7 @@
|
|||||||
"Theme Mode": "主题模式",
|
"Theme Mode": "主题模式",
|
||||||
"Theme Blur": "背景模糊",
|
"Theme Blur": "背景模糊",
|
||||||
"Tray Click Event": "托盘点击事件",
|
"Tray Click Event": "托盘点击事件",
|
||||||
|
"Copy Env Type": "复制环境变量类型",
|
||||||
"Show Main Window": "显示主窗口",
|
"Show Main Window": "显示主窗口",
|
||||||
"Theme Setting": "主题设置",
|
"Theme Setting": "主题设置",
|
||||||
"Layout Setting": "界面设置",
|
"Layout Setting": "界面设置",
|
||||||
@@ -110,6 +112,7 @@
|
|||||||
"Runtime Config": "当前配置",
|
"Runtime Config": "当前配置",
|
||||||
"ReadOnly": "只读",
|
"ReadOnly": "只读",
|
||||||
"Restart": "重启内核",
|
"Restart": "重启内核",
|
||||||
|
"Upgrade": "升级内核",
|
||||||
|
|
||||||
"Back": "返回",
|
"Back": "返回",
|
||||||
"Save": "保存",
|
"Save": "保存",
|
||||||
|
|||||||
@@ -71,6 +71,11 @@ const Layout = () => {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
void appWindow.unminimize();
|
||||||
|
void appWindow.show();
|
||||||
|
void appWindow.setFocus();
|
||||||
|
}, 50);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const ProxyPage = () => {
|
|||||||
const { verge } = useVerge();
|
const { verge } = useVerge();
|
||||||
|
|
||||||
const modeList = useMemo(() => {
|
const modeList = useMemo(() => {
|
||||||
if (verge?.clash_core === "clash-meta") {
|
if (verge?.clash_core?.includes("clash-meta")) {
|
||||||
return ["rule", "global", "direct"];
|
return ["rule", "global", "direct"];
|
||||||
}
|
}
|
||||||
return ["rule", "global", "direct", "script"];
|
return ["rule", "global", "direct", "script"];
|
||||||
|
|||||||
@@ -55,6 +55,18 @@ export const updateConfigs = async (config: Partial<IConfigData>) => {
|
|||||||
return instance.patch("/configs", config);
|
return instance.patch("/configs", config);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Update geo data
|
||||||
|
export const updateGeoData = async () => {
|
||||||
|
const instance = await getAxios();
|
||||||
|
return instance.post("/configs/geo");
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Upgrade clash core
|
||||||
|
export const upgradeCore = async () => {
|
||||||
|
const instance = await getAxios();
|
||||||
|
return instance.post("/upgrade");
|
||||||
|
};
|
||||||
|
|
||||||
/// Get current rules
|
/// Get current rules
|
||||||
export const getRules = async () => {
|
export const getRules = async () => {
|
||||||
const instance = await getAxios();
|
const instance = await getAxios();
|
||||||
|
|||||||
@@ -156,6 +156,7 @@ interface IVergeConfig {
|
|||||||
app_log_level?: "trace" | "debug" | "info" | "warn" | "error" | string;
|
app_log_level?: "trace" | "debug" | "info" | "warn" | "error" | string;
|
||||||
language?: string;
|
language?: string;
|
||||||
tray_event?: "main_window" | "system_proxy" | "tun_mode" | string;
|
tray_event?: "main_window" | "system_proxy" | "tun_mode" | string;
|
||||||
|
env_type?: "bash" | "cmd" | "powershell" | string;
|
||||||
clash_core?: string;
|
clash_core?: string;
|
||||||
theme_mode?: "light" | "dark" | "system";
|
theme_mode?: "light" | "dark" | "system";
|
||||||
theme_blur?: boolean;
|
theme_blur?: boolean;
|
||||||
|
|||||||