diff --git a/.github/update.log b/.github/update.log
index 049e459977..dae274939f 100644
--- a/.github/update.log
+++ b/.github/update.log
@@ -1054,3 +1054,4 @@ Update On Mon Jul 7 20:39:12 CEST 2025
Update On Tue Jul 8 20:39:34 CEST 2025
Update On Wed Jul 9 20:39:55 CEST 2025
Update On Thu Jul 10 20:38:34 CEST 2025
+Update On Fri Jul 11 20:40:18 CEST 2025
diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json
index c2b357519c..f1f85aeba8 100644
--- a/clash-nyanpasu/frontend/nyanpasu/package.json
+++ b/clash-nyanpasu/frontend/nyanpasu/package.json
@@ -58,9 +58,9 @@
"@iconify/json": "2.2.357",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.82.0",
- "@tanstack/react-router": "1.125.6",
- "@tanstack/react-router-devtools": "1.125.6",
- "@tanstack/router-plugin": "1.125.6",
+ "@tanstack/react-router": "1.127.0",
+ "@tanstack/react-router-devtools": "1.127.0",
+ "@tanstack/router-plugin": "1.127.0",
"@tauri-apps/plugin-clipboard-manager": "2.2.2",
"@tauri-apps/plugin-dialog": "2.2.2",
"@tauri-apps/plugin-fs": "2.3.0",
@@ -87,7 +87,7 @@
"unplugin-auto-import": "19.3.0",
"unplugin-icons": "22.1.0",
"validator": "13.15.15",
- "vite": "7.0.3",
+ "vite": "7.0.4",
"vite-plugin-html": "3.2.2",
"vite-plugin-sass-dts": "1.3.31",
"vite-plugin-svgr": "4.3.0",
diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json
index 258ce22077..c9579af1a0 100644
--- a/clash-nyanpasu/frontend/ui/package.json
+++ b/clash-nyanpasu/frontend/ui/package.json
@@ -30,7 +30,7 @@
"react-i18next": "15.6.0",
"react-use": "17.6.0",
"tailwindcss": "4.1.11",
- "vite": "7.0.3",
+ "vite": "7.0.4",
"vite-tsconfig-paths": "5.1.4"
},
"devDependencies": {
diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json
index b9f3ffe546..e5f834a306 100644
--- a/clash-nyanpasu/manifest/version.json
+++ b/clash-nyanpasu/manifest/version.json
@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.11",
- "mihomo_alpha": "alpha-ce2675a",
+ "mihomo_alpha": "alpha-fb464bb",
"clash_rs": "v0.8.1",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.8.1-alpha+sha.86171e1"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
- "updated_at": "2025-07-08T22:21:31.499Z"
+ "updated_at": "2025-07-10T22:21:15.443Z"
}
diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json
index 0f4df8b384..e53fd4a393 100644
--- a/clash-nyanpasu/package.json
+++ b/clash-nyanpasu/package.json
@@ -65,11 +65,11 @@
"@tauri-apps/cli": "2.5.0",
"@types/fs-extra": "11.0.4",
"@types/lodash-es": "4.17.12",
- "@types/node": "22.15.33",
+ "@types/node": "22.16.3",
"@typescript-eslint/eslint-plugin": "8.36.0",
"@typescript-eslint/parser": "8.36.0",
"autoprefixer": "10.4.21",
- "conventional-changelog-conventionalcommits": "9.0.0",
+ "conventional-changelog-conventionalcommits": "9.1.0",
"cross-env": "7.0.3",
"dedent": "1.6.0",
"eslint": "9.30.1",
diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml
index 5ef36e9ce3..67b5b00e9d 100644
--- a/clash-nyanpasu/pnpm-lock.yaml
+++ b/clash-nyanpasu/pnpm-lock.yaml
@@ -21,7 +21,7 @@ importers:
devDependencies:
'@commitlint/cli':
specifier: 19.8.1
- version: 19.8.1(@types/node@22.15.33)(typescript@5.8.3)
+ version: 19.8.1(@types/node@22.16.3)(typescript@5.8.3)
'@commitlint/config-conventional':
specifier: 19.8.1
version: 19.8.1
@@ -44,8 +44,8 @@ importers:
specifier: 4.17.12
version: 4.17.12
'@types/node':
- specifier: 22.15.33
- version: 22.15.33
+ specifier: 22.16.3
+ version: 22.16.3
'@typescript-eslint/eslint-plugin':
specifier: 8.36.0
version: 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)
@@ -56,8 +56,8 @@ importers:
specifier: 10.4.21
version: 10.4.21(postcss@8.5.6)
conventional-changelog-conventionalcommits:
- specifier: 9.0.0
- version: 9.0.0
+ specifier: 9.1.0
+ version: 9.1.0
cross-env:
specifier: 7.0.3
version: 7.0.3
@@ -102,7 +102,7 @@ importers:
version: 16.3.0
knip:
specifier: 5.61.3
- version: 5.61.3(@types/node@22.15.33)(typescript@5.8.3)
+ version: 5.61.3(@types/node@22.16.3)(typescript@5.8.3)
lint-staged:
specifier: 16.1.2
version: 16.1.2
@@ -247,7 +247,7 @@ importers:
version: 4.1.11
'@tanstack/router-zod-adapter':
specifier: 1.81.5
- version: 1.81.5(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@3.25.76)
+ version: 1.81.5(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@3.25.76)
'@tauri-apps/api':
specifier: 2.5.0
version: 2.5.0
@@ -346,14 +346,14 @@ importers:
specifier: 5.82.0
version: 5.82.0(react@19.1.0)
'@tanstack/react-router':
- specifier: 1.125.6
- version: 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ specifier: 1.127.0
+ version: 1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tanstack/react-router-devtools':
- specifier: 1.125.6
- version: 1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.125.4)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)
+ specifier: 1.127.0
+ version: 1.127.0(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.127.0)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)
'@tanstack/router-plugin':
- specifier: 1.125.6
- version: 1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ specifier: 1.127.0
+ version: 1.127.0(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.2.2
version: 2.2.2
@@ -389,13 +389,13 @@ importers:
version: 13.15.2
'@vitejs/plugin-legacy':
specifier: 7.0.0
- version: 7.0.0(terser@5.36.0)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 7.0.0(terser@5.36.0)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@vitejs/plugin-react':
specifier: 4.6.0
- version: 4.6.0(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 4.6.0(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
'@vitejs/plugin-react-swc':
specifier: 3.10.2
- version: 3.10.2(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 3.10.2(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
change-case:
specifier: 5.4.4
version: 5.4.4
@@ -433,20 +433,20 @@ importers:
specifier: 13.15.15
version: 13.15.15
vite:
- specifier: 7.0.3
- version: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ specifier: 7.0.4
+ version: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-plugin-html:
specifier: 3.2.2
- version: 3.2.2(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 3.2.2(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-plugin-sass-dts:
specifier: 1.3.31
- version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-plugin-svgr:
specifier: 4.3.0
- version: 4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
vite-tsconfig-paths:
specifier: 5.1.4
- version: 5.1.4(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 5.1.4(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
zod:
specifier: 3.25.76
version: 3.25.76
@@ -482,7 +482,7 @@ importers:
version: 19.1.8
'@vitejs/plugin-react':
specifier: 4.6.0
- version: 4.6.0(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 4.6.0(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
ahooks:
specifier: 3.9.0
version: 3.9.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -511,11 +511,11 @@ importers:
specifier: 4.1.11
version: 4.1.11
vite:
- specifier: 7.0.3
- version: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ specifier: 7.0.4
+ version: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
vite-tsconfig-paths:
specifier: 5.1.4
- version: 5.1.4(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 5.1.4(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
devDependencies:
'@emotion/react':
specifier: 11.14.0
@@ -540,7 +540,7 @@ importers:
version: 5.1.0(typescript@5.8.3)
vite-plugin-dts:
specifier: 4.5.4
- version: 4.5.4(@types/node@22.15.33)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
+ version: 4.5.4(@types/node@22.16.3)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))
scripts:
dependencies:
@@ -2933,16 +2933,16 @@ packages:
peerDependencies:
react: ^18 || ^19
- '@tanstack/react-router-devtools@1.125.6':
- resolution: {integrity: sha512-3+Np/HPQ1jpdai58xY6fScnjJz08iIG6aKhCVVy8tfPC76jTyXc+ygqM9wtUt3kJYy9/Lf7j3dAJlbtxF+TIXg==}
+ '@tanstack/react-router-devtools@1.127.0':
+ resolution: {integrity: sha512-43TNDJqgEDiLhzWkn4XW8oDItp4pod6USWX1gkqCX/8g3uCkzM+VXwRKMjWk2pouNrTMwp7H/WiWp/nn2vfC0w==}
engines: {node: '>=12'}
peerDependencies:
- '@tanstack/react-router': ^1.125.6
+ '@tanstack/react-router': ^1.127.0
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
- '@tanstack/react-router@1.125.6':
- resolution: {integrity: sha512-znyUGTq+WRhXwToNTYiluUBLjMdQVxz+ZQ9Ep2PBuS9O+3Qm3kaM7n64hA84ISoCtLqMwTo7Ofw0W4WeLdjpYg==}
+ '@tanstack/react-router@1.127.0':
+ resolution: {integrity: sha512-MxGpMfM7swT8b+7Y9S8bmRbzOQXiTcPhXKwETQuDrctqOVyl2m9OTqGCJpFCVUn7oD+RqmQ7KBS+N0zgENStJg==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -2967,15 +2967,15 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- '@tanstack/router-core@1.125.4':
- resolution: {integrity: sha512-tdgGI0Kwt3Lgs9ceLbG32NPh4I2H1T9t2TKjcS+I78sifm5rjTWV8lfqVRNrvMPk5ek60vXPOL2AHAUg6ohwsA==}
+ '@tanstack/router-core@1.127.0':
+ resolution: {integrity: sha512-hHgbtLOAnN61LFqBrE2bq3mctRLfXvJefBlTFakZJavSoMEniX6bMQ5ZMDwMtpo57Hbyzx2rTD4yZfYu74Eydg==}
engines: {node: '>=12'}
- '@tanstack/router-devtools-core@1.125.4':
- resolution: {integrity: sha512-5QbCQCcJcN/M0NF2TARKqauJ8QeRuk7kyHQMCqOoSJWWGUVcDHEmcbg1ZCJevfPVZPgnUjV9mqDfCPTYWT8/+w==}
+ '@tanstack/router-devtools-core@1.127.0':
+ resolution: {integrity: sha512-K/UFaru0sVonaRoqQFUoNiqDt4AvXLxcRd2+9HjbGSC1xckAUNEEAcVl7jwQfERg89e9IVfHiPOIuDdQFjFBtA==}
engines: {node: '>=12'}
peerDependencies:
- '@tanstack/router-core': ^1.125.4
+ '@tanstack/router-core': ^1.127.0
csstype: ^3.0.10
solid-js: '>=1.9.5'
tiny-invariant: ^1.3.3
@@ -2983,16 +2983,16 @@ packages:
csstype:
optional: true
- '@tanstack/router-generator@1.125.4':
- resolution: {integrity: sha512-jF71znMvpZxmkQF0MxfjKKyvXtft9NWRCVcLhb+6d/8nrVGNiEw+dsXn/CLpeRQLk7Mg/fsp/WipBql1dd3Qaw==}
+ '@tanstack/router-generator@1.127.0':
+ resolution: {integrity: sha512-k6f2Ekkoe4MB8lEeMfefQ4031yVf+3BIArsQqFB3HOzJaIRzPo8w8Boq7XqwZ2/r1lwSpK0z/xrNLcF2EMmeaw==}
engines: {node: '>=12'}
- '@tanstack/router-plugin@1.125.6':
- resolution: {integrity: sha512-SWfp++tkjb0grVqa/Xdvi9QAs93e9/fZMBZ6q0fvvQruMyciCmjWyE/qV3tS/Qh0WZdzIRP6yl8Gha2Lin4q1w==}
+ '@tanstack/router-plugin@1.127.0':
+ resolution: {integrity: sha512-PphNi7PVf1PGLFD5fkrFQBLfknJNsug0jVJ7Mr4ChkhRsPSKs0hJtUPr9FxENSgY9TGbDTJaWw+42e5xfC2vUw==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
- '@tanstack/react-router': ^1.125.6
+ '@tanstack/react-router': ^1.127.0
vite: '>=5.0.0 || >=6.0.0'
vite-plugin-solid: ^2.11.2
webpack: '>=5.92.0'
@@ -3326,8 +3326,8 @@ packages:
'@types/node@16.18.108':
resolution: {integrity: sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A==}
- '@types/node@22.15.33':
- resolution: {integrity: sha512-wzoocdnnpSxZ+6CjW4ADCK1jVmd1S/J3ArNWfn8FDDQtRm8dkDg7TA+mvek2wNrfCgwuZxqEOiB9B1XCJ6+dbw==}
+ '@types/node@22.16.3':
+ resolution: {integrity: sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@@ -4166,8 +4166,8 @@ packages:
resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
engines: {node: '>=16'}
- conventional-changelog-conventionalcommits@9.0.0:
- resolution: {integrity: sha512-5e48V0+DsWvQBEnnbBFhYQwYDzFPXVrakGPP1uSxekDkr5d7YWrmaWsgJpKFR0SkXmxK6qQr9O42uuLb9wpKxA==}
+ conventional-changelog-conventionalcommits@9.1.0:
+ resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==}
engines: {node: '>=18'}
conventional-commits-parser@5.0.0:
@@ -7500,10 +7500,20 @@ packages:
peerDependencies:
seroval: ^1.0
+ seroval-plugins@1.3.2:
+ resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
seroval@1.2.1:
resolution: {integrity: sha512-yBxFFs3zmkvKNmR0pFSU//rIsYjuX418TnlDmc2weaq5XFDqDIV/NOMPBoLrbxjLH42p4UzRuXHryXh9dYcKcw==}
engines: {node: '>=10'}
+ seroval@1.3.2:
+ resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==}
+ engines: {node: '>=10'}
+
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -8330,8 +8340,8 @@ packages:
vite:
optional: true
- vite@7.0.3:
- resolution: {integrity: sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==}
+ vite@7.0.4:
+ resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -9591,11 +9601,11 @@ snapshots:
'@bufbuild/protobuf@2.5.2': {}
- '@commitlint/cli@19.8.1(@types/node@22.15.33)(typescript@5.8.3)':
+ '@commitlint/cli@19.8.1(@types/node@22.16.3)(typescript@5.8.3)':
dependencies:
'@commitlint/format': 19.8.1
'@commitlint/lint': 19.8.1
- '@commitlint/load': 19.8.1(@types/node@22.15.33)(typescript@5.8.3)
+ '@commitlint/load': 19.8.1(@types/node@22.16.3)(typescript@5.8.3)
'@commitlint/read': 19.8.1
'@commitlint/types': 19.8.1
tinyexec: 1.0.1
@@ -9642,7 +9652,7 @@ snapshots:
'@commitlint/rules': 19.8.1
'@commitlint/types': 19.8.1
- '@commitlint/load@19.8.1(@types/node@22.15.33)(typescript@5.8.3)':
+ '@commitlint/load@19.8.1(@types/node@22.16.3)(typescript@5.8.3)':
dependencies:
'@commitlint/config-validator': 19.8.1
'@commitlint/execute-rule': 19.8.1
@@ -9650,7 +9660,7 @@ snapshots:
'@commitlint/types': 19.8.1
chalk: 5.4.1
cosmiconfig: 9.0.0(typescript@5.8.3)
- cosmiconfig-typescript-loader: 6.1.0(@types/node@22.15.33)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3)
+ cosmiconfig-typescript-loader: 6.1.0(@types/node@22.16.3)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3)
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
lodash.uniq: 4.5.0
@@ -10095,23 +10105,23 @@ snapshots:
'@material/material-color-utilities@0.3.0': {}
- '@microsoft/api-extractor-model@7.30.3(@types/node@22.15.33)':
+ '@microsoft/api-extractor-model@7.30.3(@types/node@22.16.3)':
dependencies:
'@microsoft/tsdoc': 0.15.1
'@microsoft/tsdoc-config': 0.17.1
- '@rushstack/node-core-library': 5.11.0(@types/node@22.15.33)
+ '@rushstack/node-core-library': 5.11.0(@types/node@22.16.3)
transitivePeerDependencies:
- '@types/node'
- '@microsoft/api-extractor@7.51.0(@types/node@22.15.33)':
+ '@microsoft/api-extractor@7.51.0(@types/node@22.16.3)':
dependencies:
- '@microsoft/api-extractor-model': 7.30.3(@types/node@22.15.33)
+ '@microsoft/api-extractor-model': 7.30.3(@types/node@22.16.3)
'@microsoft/tsdoc': 0.15.1
'@microsoft/tsdoc-config': 0.17.1
- '@rushstack/node-core-library': 5.11.0(@types/node@22.15.33)
+ '@rushstack/node-core-library': 5.11.0(@types/node@22.16.3)
'@rushstack/rig-package': 0.5.3
- '@rushstack/terminal': 0.15.0(@types/node@22.15.33)
- '@rushstack/ts-command-line': 4.23.5(@types/node@22.15.33)
+ '@rushstack/terminal': 0.15.0(@types/node@22.16.3)
+ '@rushstack/ts-command-line': 4.23.5(@types/node@22.16.3)
lodash: 4.17.21
minimatch: 3.0.8
resolve: 1.22.8
@@ -10842,7 +10852,7 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@rushstack/node-core-library@5.11.0(@types/node@22.15.33)':
+ '@rushstack/node-core-library@5.11.0(@types/node@22.16.3)':
dependencies:
ajv: 8.13.0
ajv-draft-04: 1.0.0(ajv@8.13.0)
@@ -10853,23 +10863,23 @@ snapshots:
resolve: 1.22.8
semver: 7.5.4
optionalDependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@rushstack/rig-package@0.5.3':
dependencies:
resolve: 1.22.8
strip-json-comments: 3.1.1
- '@rushstack/terminal@0.15.0(@types/node@22.15.33)':
+ '@rushstack/terminal@0.15.0(@types/node@22.16.3)':
dependencies:
- '@rushstack/node-core-library': 5.11.0(@types/node@22.15.33)
+ '@rushstack/node-core-library': 5.11.0(@types/node@22.16.3)
supports-color: 8.1.1
optionalDependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
- '@rushstack/ts-command-line@4.23.5(@types/node@22.15.33)':
+ '@rushstack/ts-command-line@4.23.5(@types/node@22.16.3)':
dependencies:
- '@rushstack/terminal': 0.15.0(@types/node@22.15.33)
+ '@rushstack/terminal': 0.15.0(@types/node@22.16.3)
'@types/argparse': 1.0.38
argparse: 1.0.10
string-argv: 0.3.2
@@ -11136,10 +11146,10 @@ snapshots:
'@tanstack/query-core': 5.82.0
react: 19.1.0
- '@tanstack/react-router-devtools@1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.125.4)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
+ '@tanstack/react-router-devtools@1.127.0(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.127.0)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
- '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- '@tanstack/router-devtools-core': 1.125.4(@tanstack/router-core@1.125.4)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
+ '@tanstack/react-router': 1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@tanstack/router-devtools-core': 1.127.0(@tanstack/router-core@1.127.0)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
transitivePeerDependencies:
@@ -11148,11 +11158,11 @@ snapshots:
- solid-js
- tiny-invariant
- '@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@tanstack/history': 1.121.34
'@tanstack/react-store': 0.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- '@tanstack/router-core': 1.125.4
+ '@tanstack/router-core': 1.127.0
isbot: 5.1.28
jsesc: 3.1.0
react: 19.1.0
@@ -11179,18 +11189,20 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
- '@tanstack/router-core@1.125.4':
+ '@tanstack/router-core@1.127.0':
dependencies:
'@tanstack/history': 1.121.34
'@tanstack/store': 0.7.0
cookie-es: 1.2.2
jsesc: 3.1.0
+ seroval: 1.3.2
+ seroval-plugins: 1.3.2(seroval@1.3.2)
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
- '@tanstack/router-devtools-core@1.125.4(@tanstack/router-core@1.125.4)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
+ '@tanstack/router-devtools-core@1.127.0(@tanstack/router-core@1.127.0)(csstype@3.1.3)(solid-js@1.9.5)(tiny-invariant@1.3.3)':
dependencies:
- '@tanstack/router-core': 1.125.4
+ '@tanstack/router-core': 1.127.0
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
solid-js: 1.9.5
@@ -11198,9 +11210,9 @@ snapshots:
optionalDependencies:
csstype: 3.1.3
- '@tanstack/router-generator@1.125.4':
+ '@tanstack/router-generator@1.127.0':
dependencies:
- '@tanstack/router-core': 1.125.4
+ '@tanstack/router-core': 1.127.0
'@tanstack/router-utils': 1.121.21
'@tanstack/virtual-file-routes': 1.121.21
prettier: 3.6.2
@@ -11211,7 +11223,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@tanstack/router-plugin@1.125.6(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
+ '@tanstack/router-plugin@1.127.0(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.27.7
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7)
@@ -11219,8 +11231,8 @@ snapshots:
'@babel/template': 7.27.2
'@babel/traverse': 7.27.7
'@babel/types': 7.27.7
- '@tanstack/router-core': 1.125.4
- '@tanstack/router-generator': 1.125.4
+ '@tanstack/router-core': 1.127.0
+ '@tanstack/router-generator': 1.127.0
'@tanstack/router-utils': 1.121.21
'@tanstack/virtual-file-routes': 1.121.21
babel-dead-code-elimination: 1.0.10
@@ -11228,8 +11240,8 @@ snapshots:
unplugin: 2.3.5
zod: 3.25.76
optionalDependencies:
- '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ '@tanstack/react-router': 1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
@@ -11244,9 +11256,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@3.25.76)':
+ '@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(zod@3.25.76)':
dependencies:
- '@tanstack/react-router': 1.125.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@tanstack/react-router': 1.127.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
zod: 3.25.76
'@tanstack/store@0.7.0': {}
@@ -11364,7 +11376,7 @@ snapshots:
'@types/adm-zip@0.5.7':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/argparse@1.0.38': {}
@@ -11395,12 +11407,12 @@ snapshots:
dependencies:
'@types/http-cache-semantics': 4.0.4
'@types/keyv': 3.1.4
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/responselike': 1.0.3
'@types/conventional-commits-parser@5.0.0':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/d3-array@3.2.1': {}
@@ -11536,7 +11548,7 @@ snapshots:
'@types/fs-extra@11.0.4':
dependencies:
'@types/jsonfile': 6.1.4
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/geojson@7946.0.14': {}
@@ -11554,11 +11566,11 @@ snapshots:
'@types/jsonfile@6.1.4':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/lodash-es@4.17.12':
dependencies:
@@ -11574,7 +11586,7 @@ snapshots:
'@types/node@16.18.108': {}
- '@types/node@22.15.33':
+ '@types/node@22.16.3':
dependencies:
undici-types: 6.21.0
@@ -11606,7 +11618,7 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
'@types/retry@0.12.2': {}
@@ -11626,7 +11638,7 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
optional: true
'@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)':
@@ -11834,7 +11846,7 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.10.1':
optional: true
- '@vitejs/plugin-legacy@7.0.0(terser@5.36.0)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
+ '@vitejs/plugin-legacy@7.0.0(terser@5.36.0)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.27.4
'@babel/preset-env': 7.27.2(@babel/core@7.27.4)
@@ -11845,19 +11857,19 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.36.0
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-react-swc@3.10.2(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
+ '@vitejs/plugin-react-swc@3.10.2(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@rolldown/pluginutils': 1.0.0-beta.11
'@swc/core': 1.12.1
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@swc/helpers'
- '@vitejs/plugin-react@4.6.0(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
+ '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.27.4
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4)
@@ -11865,7 +11877,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.19
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
@@ -12512,7 +12524,7 @@ snapshots:
dependencies:
compare-func: 2.0.0
- conventional-changelog-conventionalcommits@9.0.0:
+ conventional-changelog-conventionalcommits@9.1.0:
dependencies:
compare-func: 2.0.0
@@ -12543,9 +12555,9 @@ snapshots:
core-js@3.44.0: {}
- cosmiconfig-typescript-loader@6.1.0(@types/node@22.15.33)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3):
+ cosmiconfig-typescript-loader@6.1.0(@types/node@22.16.3)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3):
dependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
cosmiconfig: 9.0.0(typescript@5.8.3)
jiti: 2.4.2
typescript: 5.8.3
@@ -14633,10 +14645,10 @@ snapshots:
kind-of@6.0.3: {}
- knip@5.61.3(@types/node@22.15.33)(typescript@5.8.3):
+ knip@5.61.3(@types/node@22.16.3)(typescript@5.8.3):
dependencies:
'@nodelib/fs.walk': 1.2.8
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
fast-glob: 3.3.3
formatly: 0.2.4
jiti: 2.4.2
@@ -16259,8 +16271,14 @@ snapshots:
dependencies:
seroval: 1.2.1
+ seroval-plugins@1.3.2(seroval@1.3.2):
+ dependencies:
+ seroval: 1.3.2
+
seroval@1.2.1: {}
+ seroval@1.3.2: {}
+
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -17202,9 +17220,9 @@ snapshots:
- rollup
- supports-color
- vite-plugin-dts@4.5.4(@types/node@22.15.33)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
+ vite-plugin-dts@4.5.4(@types/node@22.16.3)(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
- '@microsoft/api-extractor': 7.51.0(@types/node@22.15.33)
+ '@microsoft/api-extractor': 7.51.0(@types/node@22.16.3)
'@rollup/pluginutils': 5.1.4(rollup@4.40.0)
'@volar/typescript': 2.4.11
'@vue/language-core': 2.2.0(typescript@5.8.3)
@@ -17215,13 +17233,13 @@ snapshots:
magic-string: 0.30.17
typescript: 5.8.3
optionalDependencies:
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@types/node'
- rollup
- supports-color
- vite-plugin-html@3.2.2(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
+ vite-plugin-html@3.2.2(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 4.2.1
colorette: 2.0.20
@@ -17235,39 +17253,39 @@ snapshots:
html-minifier-terser: 6.1.0
node-html-parser: 5.4.2
pathe: 0.2.0
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
- vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
+ vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.89.2)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
postcss: 8.5.6
postcss-js: 4.0.1(postcss@8.5.6)
prettier: 3.6.2
sass-embedded: 1.89.2
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
- vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
+ vite-plugin-svgr@4.3.0(rollup@4.40.0)(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.40.0)
'@svgr/core': 8.1.0(typescript@5.8.3)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
- vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
+ vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
debug: 4.3.7
globrex: 0.1.2
tsconfck: 3.0.3(typescript@5.8.3)
optionalDependencies:
- vite: 7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
+ vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
- typescript
- vite@7.0.3(@types/node@22.15.33)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0):
+ vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.89.2)(sass@1.83.0)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
esbuild: 0.25.0
fdir: 6.4.6(picomatch@4.0.2)
@@ -17276,7 +17294,7 @@ snapshots:
rollup: 4.40.0
tinyglobby: 0.2.14
optionalDependencies:
- '@types/node': 22.15.33
+ '@types/node': 22.16.3
fsevents: 2.3.3
jiti: 2.4.2
less: 4.2.0
diff --git a/clash-verge-rev/package.json b/clash-verge-rev/package.json
index b28affdf51..9e415e1079 100644
--- a/clash-verge-rev/package.json
+++ b/clash-verge-rev/package.json
@@ -34,7 +34,7 @@
"@mui/icons-material": "^7.2.0",
"@mui/lab": "7.0.0-beta.14",
"@mui/material": "^7.2.0",
- "@mui/x-data-grid": "^8.7.0",
+ "@mui/x-data-grid": "^8.8.0",
"@tauri-apps/api": "2.6.0",
"@tauri-apps/plugin-clipboard-manager": "^2.3.0",
"@tauri-apps/plugin-dialog": "^2.3.0",
@@ -53,7 +53,7 @@
"dayjs": "1.11.13",
"foxact": "^0.2.49",
"glob": "^11.0.3",
- "i18next": "^25.3.1",
+ "i18next": "^25.3.2",
"js-yaml": "^4.1.0",
"json-schema": "^0.4.0",
"lodash-es": "^4.17.21",
@@ -96,7 +96,7 @@
"sass": "^1.89.2",
"terser": "^5.43.1",
"typescript": "^5.8.3",
- "vite": "^7.0.2",
+ "vite": "^7.0.4",
"vite-plugin-monaco-editor": "^1.1.0",
"vite-plugin-svgr": "^4.3.0"
},
diff --git a/clash-verge-rev/pnpm-lock.yaml b/clash-verge-rev/pnpm-lock.yaml
index e63ab01160..798365aa79 100644
--- a/clash-verge-rev/pnpm-lock.yaml
+++ b/clash-verge-rev/pnpm-lock.yaml
@@ -36,8 +36,8 @@ importers:
specifier: ^7.2.0
version: 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/x-data-grid':
- specifier: ^8.7.0
- version: 8.7.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ specifier: ^8.8.0
+ version: 8.8.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@tauri-apps/api':
specifier: 2.6.0
version: 2.6.0
@@ -93,8 +93,8 @@ importers:
specifier: ^11.0.3
version: 11.0.3
i18next:
- specifier: ^25.3.1
- version: 25.3.1(typescript@5.8.3)
+ specifier: ^25.3.2
+ version: 25.3.2(typescript@5.8.3)
js-yaml:
specifier: ^4.1.0
version: 4.1.0
@@ -130,7 +130,7 @@ importers:
version: 7.60.0(react@19.1.0)
react-i18next:
specifier: 15.6.0
- version: 15.6.0(i18next@25.3.1(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)
+ version: 15.6.0(i18next@25.3.2(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)
react-markdown:
specifier: 10.1.0
version: 10.1.0(@types/react@19.1.8)(react@19.1.0)
@@ -179,10 +179,10 @@ importers:
version: 19.1.6(@types/react@19.1.8)
'@vitejs/plugin-legacy':
specifier: ^7.0.0
- version: 7.0.0(terser@5.43.1)(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
+ version: 7.0.0(terser@5.43.1)(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
'@vitejs/plugin-react':
specifier: 4.6.0
- version: 4.6.0(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
+ version: 4.6.0(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
adm-zip:
specifier: ^0.5.16
version: 0.5.16
@@ -217,14 +217,14 @@ importers:
specifier: ^5.8.3
version: 5.8.3
vite:
- specifier: ^7.0.2
- version: 7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
+ specifier: ^7.0.4
+ version: 7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
vite-plugin-monaco-editor:
specifier: ^1.1.0
version: 1.1.0(monaco-editor@0.52.2)
vite-plugin-svgr:
specifier: ^4.3.0
- version: 4.3.0(rollup@4.40.2)(typescript@5.8.3)(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
+ version: 4.3.0(rollup@4.40.2)(typescript@5.8.3)(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))
packages:
@@ -1120,8 +1120,8 @@ packages:
'@types/react':
optional: true
- '@mui/x-data-grid@8.7.0':
- resolution: {integrity: sha512-3hVjnADSBXEd/7f+CHlxTNhqJrnRL0XkTbvI+yfttPuqLHYQJwNUR7p7d/VtyRcR6QlaK19+Bu8Q6u0Ygmw/PQ==}
+ '@mui/x-data-grid@8.8.0':
+ resolution: {integrity: sha512-xWoBmxHi5JvT0QvAYGYJYNy4DEi+Lez+lrsqw3YV7z0jEYyJoV9vjFCiFE4QmG6IPg62B1gZHYE5AkDLFCvPkw==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@emotion/react': ^11.9.0
@@ -1136,8 +1136,8 @@ packages:
'@emotion/styled':
optional: true
- '@mui/x-internals@8.7.0':
- resolution: {integrity: sha512-1aduds7L2i6t0HIFNlqG4UB07SVEg+wcnJ9GGu8B/X8EVwO72Rt+rc8ZlqK10ooscq1AlTwi2dd0q+hz+aWk+Q==}
+ '@mui/x-internals@8.8.0':
+ resolution: {integrity: sha512-qTRK5oINkAjZ7sIHpSnESLNq1xtQUmmfmGscYUSEP0uHoYh6pKkNWH9+7yzggRHuTv+4011VBwN9s+efrk+xZg==}
engines: {node: '>=14.0.0'}
peerDependencies:
'@mui/system': ^5.15.14 || ^6.0.0 || ^7.0.0
@@ -2093,8 +2093,8 @@ packages:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
- i18next@25.3.1:
- resolution: {integrity: sha512-S4CPAx8LfMOnURnnJa8jFWvur+UX/LWcl6+61p9VV7SK2m0445JeBJ6tLD0D5SR0H29G4PYfWkEhivKG5p4RDg==}
+ i18next@25.3.2:
+ resolution: {integrity: sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==}
peerDependencies:
typescript: ^5
peerDependenciesMeta:
@@ -2861,8 +2861,8 @@ packages:
peerDependencies:
vite: '>=2.6.0'
- vite@7.0.2:
- resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==}
+ vite@7.0.4:
+ resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -3980,13 +3980,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.1.8
- '@mui/x-data-grid@8.7.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@mui/x-data-grid@8.8.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@mui/material@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.27.6
'@mui/material': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)
'@mui/utils': 7.2.0(@types/react@19.1.8)(react@19.1.0)
- '@mui/x-internals': 8.7.0(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)
+ '@mui/x-internals': 8.8.0(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)
clsx: 2.1.1
prop-types: 15.8.1
react: 19.1.0
@@ -3998,7 +3998,7 @@ snapshots:
transitivePeerDependencies:
- '@types/react'
- '@mui/x-internals@8.7.0(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)':
+ '@mui/x-internals@8.8.0(@mui/system@7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)':
dependencies:
'@babel/runtime': 7.27.6
'@mui/system': 7.2.0(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0))(@types/react@19.1.8)(react@19.1.0)
@@ -4427,7 +4427,7 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
- '@vitejs/plugin-legacy@7.0.0(terser@5.43.1)(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))':
+ '@vitejs/plugin-legacy@7.0.0(terser@5.43.1)(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))':
dependencies:
'@babel/core': 7.27.4
'@babel/preset-env': 7.27.2(@babel/core@7.27.4)
@@ -4438,11 +4438,11 @@ snapshots:
regenerator-runtime: 0.14.1
systemjs: 6.15.1
terser: 5.43.1
- vite: 7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
+ vite: 7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
transitivePeerDependencies:
- supports-color
- '@vitejs/plugin-react@4.6.0(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))':
+ '@vitejs/plugin-react@4.6.0(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1))':
dependencies:
'@babel/core': 7.27.4
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4)
@@ -4450,7 +4450,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.19
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
- vite: 7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
+ vite: 7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
transitivePeerDependencies:
- supports-color
@@ -4935,7 +4935,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- i18next@25.3.1(typescript@5.8.3):
+ i18next@25.3.2(typescript@5.8.3):
dependencies:
'@babel/runtime': 7.27.6
optionalDependencies:
@@ -5459,11 +5459,11 @@ snapshots:
dependencies:
react: 19.1.0
- react-i18next@15.6.0(i18next@25.3.1(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3):
+ react-i18next@15.6.0(i18next@25.3.2(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3):
dependencies:
'@babel/runtime': 7.27.6
html-parse-stringify: 3.0.1
- i18next: 25.3.1(typescript@5.8.3)
+ i18next: 25.3.2(typescript@5.8.3)
react: 19.1.0
optionalDependencies:
react-dom: 19.1.0(react@19.1.0)
@@ -5821,18 +5821,18 @@ snapshots:
dependencies:
monaco-editor: 0.52.2
- vite-plugin-svgr@4.3.0(rollup@4.40.2)(typescript@5.8.3)(vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)):
+ vite-plugin-svgr@4.3.0(rollup@4.40.2)(typescript@5.8.3)(vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)):
dependencies:
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
'@svgr/core': 8.1.0(typescript@5.8.3)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))
- vite: 7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
+ vite: 7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
- vite@7.0.2(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1):
+ vite@7.0.4(sass@1.89.2)(terser@5.43.1)(yaml@2.7.1):
dependencies:
esbuild: 0.25.4
fdir: 6.4.6(picomatch@4.0.2)
diff --git a/clash-verge-rev/src-tauri/Cargo.lock b/clash-verge-rev/src-tauri/Cargo.lock
index 39bfa0e568..b4bce4dee3 100644
--- a/clash-verge-rev/src-tauri/Cargo.lock
+++ b/clash-verge-rev/src-tauri/Cargo.lock
@@ -887,21 +887,11 @@ dependencies = [
[[package]]
name = "bzip2"
-version = "0.5.2"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47"
+checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff"
dependencies = [
- "bzip2-sys",
-]
-
-[[package]]
-name = "bzip2-sys"
-version = "0.1.13+1.0.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14"
-dependencies = [
- "cc",
- "pkg-config",
+ "libbz2-rs-sys",
]
[[package]]
@@ -3759,6 +3749,12 @@ dependencies = [
"once_cell",
]
+[[package]]
+name = "libbz2-rs-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb"
+
[[package]]
name = "libc"
version = "0.2.174"
@@ -5322,6 +5318,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+[[package]]
+name = "ppmd-rust"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c834641d8ad1b348c9ee86dec3b9840d805acd5f24daa5f90c788951a52ff59b"
+
[[package]]
name = "ppv-lite86"
version = "0.2.21"
@@ -6848,9 +6850,9 @@ dependencies = [
[[package]]
name = "sysinfo"
-version = "0.35.2"
+version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e"
+checksum = "aab138f5c1bb35231de19049060a87977ad23e04f2303e953bc5c2947ac7dec4"
dependencies = [
"libc",
"memchr",
@@ -9705,9 +9707,9 @@ dependencies = [
[[package]]
name = "zip"
-version = "4.2.0"
+version = "4.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95ab361742de920c5535880f89bbd611ee62002bf11341d16a5f057bb8ba6899"
+checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b"
dependencies = [
"aes",
"arbitrary",
@@ -9722,6 +9724,7 @@ dependencies = [
"liblzma",
"memchr",
"pbkdf2",
+ "ppmd-rust",
"sha1",
"time",
"zeroize",
diff --git a/clash-verge-rev/src-tauri/Cargo.toml b/clash-verge-rev/src-tauri/Cargo.toml
index cfca33fcec..de3fa31764 100755
--- a/clash-verge-rev/src-tauri/Cargo.toml
+++ b/clash-verge-rev/src-tauri/Cargo.toml
@@ -25,7 +25,7 @@ dunce = "1.0.5"
log4rs = "1.3.0"
nanoid = "0.4"
chrono = "0.4.41"
-sysinfo = "0.35.2"
+sysinfo = "0.36.0"
boa_engine = "0.20.0"
serde_json = "1.0.140"
serde_yaml = "0.9.34"
@@ -62,7 +62,7 @@ tauri-plugin-clipboard-manager = "2.3.0"
tauri-plugin-deep-link = "2.4.0"
tauri-plugin-devtools = "2.0.0"
tauri-plugin-window-state = "2.3.0"
-zip = "4.2.0"
+zip = "4.3.0"
reqwest_dav = "0.2.1"
aes-gcm = { version = "0.10.3", features = ["std"] }
base64 = "0.22.1"
diff --git a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh
index 7a435ac2e7..2f14ea2b5c 100755
--- a/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh
+++ b/openwrt-passwall/luci-app-passwall/root/usr/share/passwall/app.sh
@@ -2080,7 +2080,7 @@ acl_app() {
}
start() {
- mkdir -p /tmp/etc $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_PATH2
+ mkdir -p /tmp/etc /tmp/log $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_PATH2
get_config
export V2RAY_LOCATION_ASSET=$(config_t_get global_rules v2ray_location_asset "/usr/share/v2ray/")
export XRAY_LOCATION_ASSET=$V2RAY_LOCATION_ASSET
diff --git a/openwrt-passwall2/luci-app-passwall2/Makefile b/openwrt-passwall2/luci-app-passwall2/Makefile
index b1e2039f7e..525ddf5dac 100644
--- a/openwrt-passwall2/luci-app-passwall2/Makefile
+++ b/openwrt-passwall2/luci-app-passwall2/Makefile
@@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2
-PKG_VERSION:=25.6.21
+PKG_VERSION:=25.7.11
PKG_RELEASE:=1
PKG_CONFIG_DEPENDS:= \
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua
index e621626729..d3ec9b29b1 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/controller/passwall2.lua
@@ -8,6 +8,7 @@ local http = require "luci.http"
local util = require "luci.util"
local i18n = require "luci.i18n"
local fs = api.fs
+local jsonStringify = luci.jsonc.stringify
function index()
if not nixio.fs.access("/etc/config/passwall2") then
@@ -40,13 +41,14 @@ function index()
end
entry({"admin", "services", appname, "app_update"}, cbi(appname .. "/client/app_update"), _("App Update"), 95).leaf = true
entry({"admin", "services", appname, "rule"}, cbi(appname .. "/client/rule"), _("Rule Manage"), 96).leaf = true
+ entry({"admin", "services", appname, "geoview"}, form(appname .. "/client/geoview"), _("Geo View"), 97).leaf = true
entry({"admin", "services", appname, "node_subscribe_config"}, cbi(appname .. "/client/node_subscribe_config")).leaf = true
entry({"admin", "services", appname, "node_config"}, cbi(appname .. "/client/node_config")).leaf = true
entry({"admin", "services", appname, "shunt_rules"}, cbi(appname .. "/client/shunt_rules")).leaf = true
entry({"admin", "services", appname, "socks_config"}, cbi(appname .. "/client/socks_config")).leaf = true
entry({"admin", "services", appname, "acl"}, cbi(appname .. "/client/acl"), _("Access control"), 98).leaf = true
entry({"admin", "services", appname, "acl_config"}, cbi(appname .. "/client/acl_config")).leaf = true
- entry({"admin", "services", appname, "log"}, form(appname .. "/client/log"), _("Log Maint"), 999).leaf = true
+ entry({"admin", "services", appname, "log"}, form(appname .. "/client/log"), _("Watch Logs"), 999).leaf = true
--[[ Server ]]
entry({"admin", "services", appname, "server"}, cbi(appname .. "/server/index"), _("Server-Side"), 99).leaf = true
@@ -90,40 +92,44 @@ function index()
end
--[[Backup]]
- entry({"admin", "services", appname, "backup"}, call("create_backup")).leaf = true
+ entry({"admin", "services", appname, "create_backup"}, call("create_backup")).leaf = true
+ entry({"admin", "services", appname, "restore_backup"}, call("restore_backup")).leaf = true
+
+ --[[geoview]]
+ entry({"admin", "services", appname, "geo_view"}, call("geo_view")).leaf = true
end
local function http_write_json(content)
http.prepare_content("application/json")
- http.write_json(content or {code = 1})
+ http.write(jsonStringify(content or {code = 1}))
end
function reset_config()
luci.sys.call('/etc/init.d/passwall2 stop')
luci.sys.call('[ -f "/usr/share/passwall2/0_default_config" ] && cp -f /usr/share/passwall2/0_default_config /etc/config/passwall2')
- luci.http.redirect(api.url())
+ http.redirect(api.url())
end
function show_menu()
api.sh_uci_del(appname, "@global[0]", "hide_from_luci", true)
luci.sys.call("rm -rf /tmp/luci-*")
luci.sys.call("/etc/init.d/rpcd restart >/dev/null")
- luci.http.redirect(api.url())
+ http.redirect(api.url())
end
function hide_menu()
api.sh_uci_set(appname, "@global[0]", "hide_from_luci", "1", true)
luci.sys.call("rm -rf /tmp/luci-*")
luci.sys.call("/etc/init.d/rpcd restart >/dev/null")
- luci.http.redirect(luci.dispatcher.build_url("admin", "status", "overview"))
+ http.redirect(luci.dispatcher.build_url("admin", "status", "overview"))
end
function link_add_node()
-- 分片接收以突破uhttpd的限制
local tmp_file = "/tmp/links.conf"
- local chunk = luci.http.formvalue("chunk")
- local chunk_index = tonumber(luci.http.formvalue("chunk_index"))
- local total_chunks = tonumber(luci.http.formvalue("total_chunks"))
+ local chunk = http.formvalue("chunk")
+ local chunk_index = tonumber(http.formvalue("chunk_index"))
+ local total_chunks = tonumber(http.formvalue("total_chunks"))
if chunk and chunk_index ~= nil and total_chunks ~= nil then
-- 按顺序拼接到文件
@@ -144,8 +150,8 @@ function link_add_node()
end
function socks_autoswitch_add_node()
- local id = luci.http.formvalue("id")
- local key = luci.http.formvalue("key")
+ local id = http.formvalue("id")
+ local key = http.formvalue("key")
if id and id ~= "" and key and key ~= "" then
uci:set(appname, id, "enable_autoswitch", "1")
local new_list = uci:get(appname, id, "autoswitch_backup_node") or {}
@@ -162,12 +168,12 @@ function socks_autoswitch_add_node()
uci:set_list(appname, id, "autoswitch_backup_node", new_list)
api.uci_save(uci, appname)
end
- luci.http.redirect(api.url("socks_config", id))
+ http.redirect(api.url("socks_config", id))
end
function socks_autoswitch_remove_node()
- local id = luci.http.formvalue("id")
- local key = luci.http.formvalue("key")
+ local id = http.formvalue("id")
+ local key = http.formvalue("key")
if id and id ~= "" and key and key ~= "" then
uci:set(appname, id, "enable_autoswitch", "1")
local new_list = uci:get(appname, id, "autoswitch_backup_node") or {}
@@ -179,19 +185,19 @@ function socks_autoswitch_remove_node()
uci:set_list(appname, id, "autoswitch_backup_node", new_list)
api.uci_save(uci, appname)
end
- luci.http.redirect(api.url("socks_config", id))
+ http.redirect(api.url("socks_config", id))
end
function gen_client_config()
- local id = luci.http.formvalue("id")
+ local id = http.formvalue("id")
local config_file = api.TMP_PATH .. "/config_" .. id
luci.sys.call(string.format("/usr/share/passwall2/app.sh run_socks flag=config_%s node=%s bind=127.0.0.1 socks_port=1080 config_file=%s no_run=1", id, id, config_file))
if nixio.fs.access(config_file) then
- luci.http.prepare_content("application/json")
- luci.http.write(luci.sys.exec("cat " .. config_file))
+ http.prepare_content("application/json")
+ http.write(luci.sys.exec("cat " .. config_file))
luci.sys.call("rm -f " .. config_file)
else
- luci.http.redirect(api.url("node_list"))
+ http.redirect(api.url("node_list"))
end
end
@@ -201,38 +207,37 @@ function get_now_use_node()
if node then
e["global"] = node
end
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function get_redir_log()
- local id = luci.http.formvalue("id")
- local name = luci.http.formvalue("name")
+ local id = http.formvalue("id")
+ local name = http.formvalue("name")
local file_path = "/tmp/etc/passwall2/acl/" .. id .. "/" .. name .. ".log"
if nixio.fs.access(file_path) then
local content = luci.sys.exec("tail -n 19999 '" .. file_path .. "'")
content = content:gsub("\n", "
")
- luci.http.write(content)
+ http.write(content)
else
- luci.http.write(string.format("", i18n.translate("Not enabled log")))
+ http.write(string.format("", i18n.translate("Not enabled log")))
end
end
function get_socks_log()
- local name = luci.http.formvalue("name")
+ local name = http.formvalue("name")
local path = "/tmp/etc/passwall2/SOCKS_" .. name .. ".log"
if nixio.fs.access(path) then
local content = luci.sys.exec("tail -n 5000 ".. path)
content = content:gsub("\n", "
")
- luci.http.write(content)
+ http.write(content)
else
- luci.http.write(string.format("", i18n.translate("Not enabled log")))
+ http.write(string.format("", i18n.translate("Not enabled log")))
end
end
function get_log()
-- luci.sys.exec("[ -f /tmp/log/passwall2.log ] && sed '1!G;h;$!d' /tmp/log/passwall2.log > /tmp/log/passwall2_show.log")
- luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall2.log' ] && cat /tmp/log/passwall2.log"))
+ http.write(luci.sys.exec("[ -f '/tmp/log/passwall2.log' ] && cat /tmp/log/passwall2.log"))
end
function clear_log()
@@ -242,20 +247,18 @@ end
function index_status()
local e = {}
e["global_status"] = luci.sys.call("/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep 'default' | grep 'global' >/dev/null") == 0
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function haproxy_status()
local e = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null", appname)) == 0
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function socks_status()
local e = {}
- local index = luci.http.formvalue("index")
- local id = luci.http.formvalue("id")
+ local index = http.formvalue("index")
+ local id = http.formvalue("id")
e.index = index
e.socks_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep 'SOCKS_' > /dev/null", appname, id)) == 0
local use_http = uci:get(appname, id, "http_port") or 0
@@ -264,14 +267,13 @@ function socks_status()
e.use_http = 1
e.http_status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null", appname, id)) == 0
end
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function connect_status()
local e = {}
e.use_time = ""
- local url = luci.http.formvalue("url")
+ local url = http.formvalue("url")
local result = luci.sys.exec('curl --connect-timeout 3 -o /dev/null -I -sk -w "%{http_code}:%{time_appconnect}" ' .. url)
local code = tonumber(luci.sys.exec("echo -n '" .. result .. "' | awk -F ':' '{print $1}'") or "0")
if code ~= 0 then
@@ -283,15 +285,14 @@ function connect_status()
end
e.ping_type = "curl"
end
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function ping_node()
- local index = luci.http.formvalue("index")
- local address = luci.http.formvalue("address")
- local port = luci.http.formvalue("port")
- local type = luci.http.formvalue("type") or "icmp"
+ local index = http.formvalue("index")
+ local address = http.formvalue("address")
+ local port = http.formvalue("port")
+ local type = http.formvalue("type") or "icmp"
local e = {}
e.index = index
if type == "tcping" and luci.sys.exec("echo -n $(command -v tcping)") ~= "" then
@@ -302,13 +303,12 @@ function ping_node()
else
e.ping = luci.sys.exec("echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null" % address)
end
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function urltest_node()
- local index = luci.http.formvalue("index")
- local id = luci.http.formvalue("id")
+ local index = http.formvalue("index")
+ local id = http.formvalue("id")
local e = {}
e.index = index
local result = luci.sys.exec(string.format("/usr/share/passwall2/test.sh url_test_node %s %s", id, "urltest_node"))
@@ -321,21 +321,20 @@ function urltest_node()
e.use_time = string.format("%.2f", use_time / 1000)
end
end
- luci.http.prepare_content("application/json")
- luci.http.write_json(e)
+ http_write_json(e)
end
function set_node()
- local type = luci.http.formvalue("type")
- local config = luci.http.formvalue("config")
- local section = luci.http.formvalue("section")
+ local type = http.formvalue("type")
+ local config = http.formvalue("config")
+ local section = http.formvalue("section")
uci:set(appname, type, config, section)
api.uci_save(uci, appname, true, true)
- luci.http.redirect(api.url("log"))
+ http.redirect(api.url("log"))
end
function copy_node()
- local section = luci.http.formvalue("section")
+ local section = http.formvalue("section")
local uuid = api.gen_short_uuid()
uci:section(appname, "nodes", uuid)
for k, v in pairs(uci:get_all(appname, section)) do
@@ -352,11 +351,13 @@ function copy_node()
uci:delete(appname, uuid, "add_from")
uci:set(appname, uuid, "add_mode", 1)
api.uci_save(uci, appname)
- luci.http.redirect(api.url("node_config", uuid))
+ http.redirect(api.url("node_config", uuid))
end
function clear_all_nodes()
uci:set(appname, '@global[0]', "enabled", "0")
+ uci:set(appname, '@global[0]', "socks_enabled", "0")
+ uci:set(appname, '@haproxy_config[0]', "balancing_enable", "0")
uci:delete(appname, '@global[0]', "node")
uci:foreach(appname, "socks", function(t)
uci:delete(appname, t[".name"])
@@ -371,12 +372,15 @@ function clear_all_nodes()
uci:foreach(appname, "nodes", function(node)
uci:delete(appname, node['.name'])
end)
- api.uci_save(uci, appname, true)
- luci.sys.call("/etc/init.d/" .. appname .. " stop")
+ uci:foreach(appname, "subscribe_list", function(t)
+ uci:delete(appname, t[".name"], "md5")
+ end)
+
+ api.uci_save(uci, appname, true, true)
end
function delete_select_nodes()
- local ids = luci.http.formvalue("ids")
+ local ids = http.formvalue("ids")
string.gsub(ids, '[^' .. "," .. ']+', function(w)
if (uci:get(appname, "@global[0]", "node") or "") == w then
uci:delete(appname, '@global[0]', "node")
@@ -413,38 +417,47 @@ function delete_select_nodes()
uci:delete(appname, t[".name"], "chain_proxy")
end
end)
+ if (uci:get(appname, w, "add_mode") or "0") == "2" then
+ local add_from = uci:get(appname, w, "add_from") or ""
+ if add_from ~= "" then
+ uci:foreach(appname, "subscribe_list", function(t)
+ if t["remark"] == add_from then
+ uci:delete(appname, t[".name"], "md5")
+ end
+ end)
+ end
+ end
uci:delete(appname, w)
end)
- api.uci_save(uci, appname, true)
- luci.sys.call("/etc/init.d/" .. appname .. " restart > /dev/null 2>&1 &")
+ api.uci_save(uci, appname, true, true)
end
function update_rules()
- local update = luci.http.formvalue("update")
+ local update = http.formvalue("update")
luci.sys.call("lua /usr/share/passwall2/rule_update.lua log '" .. update .. "' > /dev/null 2>&1 &")
http_write_json()
end
function server_user_status()
local e = {}
- e.index = luci.http.formvalue("index")
- e.status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null", appname .. "_server", luci.http.formvalue("id"))) == 0
+ e.index = http.formvalue("index")
+ e.status = luci.sys.call(string.format("/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null", appname .. "_server", http.formvalue("id"))) == 0
http_write_json(e)
end
function server_user_log()
- local id = luci.http.formvalue("id")
+ local id = http.formvalue("id")
if nixio.fs.access("/tmp/etc/passwall2_server/" .. id .. ".log") then
local content = luci.sys.exec("cat /tmp/etc/passwall2_server/" .. id .. ".log")
content = content:gsub("\n", "
")
- luci.http.write(content)
+ http.write(content)
else
- luci.http.write(string.format("", i18n.translate("Not enabled log")))
+ http.write(string.format("", i18n.translate("Not enabled log")))
end
end
function server_get_log()
- luci.http.write(luci.sys.exec("[ -f '/tmp/log/passwall2_server.log' ] && cat /tmp/log/passwall2_server.log"))
+ http.write(luci.sys.exec("[ -f '/tmp/log/passwall2_server.log' ] && cat /tmp/log/passwall2_server.log"))
end
function server_clear_log()
@@ -475,12 +488,13 @@ function com_update(comname)
http_write_json(json)
end
+local backup_files = {
+ "/etc/config/passwall2",
+ "/etc/config/passwall2_server",
+ "/usr/share/passwall2/domains_excluded"
+}
+
function create_backup()
- local backup_files = {
- "/etc/config/passwall2",
- "/etc/config/passwall2_server",
- "/usr/share/passwall2/domains_excluded"
- }
local date = os.date("%y%m%d%H%M")
local tar_file = "/tmp/passwall2-" .. date .. "-backup.tar.gz"
fs.remove(tar_file)
@@ -493,15 +507,115 @@ function create_backup()
fs.remove(tar_file)
end
+function restore_backup()
+ local ok, err = pcall(function()
+ local filename = http.formvalue("filename")
+ local chunk = http.formvalue("chunk")
+ local chunk_index = tonumber(http.formvalue("chunk_index") or "-1")
+ local total_chunks = tonumber(http.formvalue("total_chunks") or "-1")
+ if not filename or not chunk then
+ http_write_json({ status = "error", message = "Missing filename or chunk" })
+ return
+ end
+ local file_path = "/tmp/" .. filename
+ local decoded = nixio.bin.b64decode(chunk)
+ local fp = io.open(file_path, "a+")
+ if not fp then
+ http_write_json({ status = "error", message = "Failed to open file for writing: " .. file_path })
+ return
+ end
+ fp:write(decoded)
+ fp:close()
+ if chunk_index + 1 == total_chunks then
+ api.sys.call("echo '' > /tmp/log/passwall2.log")
+ api.log(" * PassWall2 配置文件上传成功…")
+ local temp_dir = '/tmp/passwall_bak'
+ api.sys.call("mkdir -p " .. temp_dir)
+ if api.sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then
+ for _, backup_file in ipairs(backup_files) do
+ local temp_file = temp_dir .. backup_file
+ if fs.access(temp_file) then
+ api.sys.call("cp -f " .. temp_file .. " " .. backup_file)
+ end
+ end
+ api.log(" * PassWall2 配置还原成功…")
+ api.log(" * 重启 PassWall2 服务中…\n")
+ api.sys.call('/etc/init.d/passwall2 restart > /dev/null 2>&1 &')
+ api.sys.call('/etc/init.d/passwall2_server restart > /dev/null 2>&1 &')
+ else
+ api.log(" * PassWall2 配置文件解压失败,请重试!")
+ end
+ api.sys.call("rm -rf " .. temp_dir)
+ fs.remove(file_path)
+ http_write_json({ status = "success", message = "Upload completed", path = file_path })
+ else
+ http_write_json({ status = "success", message = "Chunk received" })
+ end
+ end)
+ if not ok then
+ http_write_json({ status = "error", message = tostring(err) })
+ end
+end
+
+function geo_view()
+ local action = luci.http.formvalue("action")
+ local value = luci.http.formvalue("value")
+ if not value or value == "" then
+ http.prepare_content("text/plain")
+ http.write(i18n.translate("Please enter query content!"))
+ return
+ end
+ local geo_dir = (uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
+ local geosite_path = geo_dir .. "/geosite.dat"
+ local geoip_path = geo_dir .. "/geoip.dat"
+ local geo_type, file_path, cmd
+ local geo_string = ""
+ if action == "lookup" then
+ if api.datatypes.ipaddr(value) or api.datatypes.ip6addr(value) then
+ geo_type, file_path = "geoip", geoip_path
+ else
+ geo_type, file_path = "geosite", geosite_path
+ end
+ cmd = string.format("geoview -type %s -action lookup -input '%s' -value '%s' -lowmem=true", geo_type, file_path, value)
+ geo_string = luci.sys.exec(cmd):lower()
+ if geo_string ~= "" then
+ local lines = {}
+ for line in geo_string:gmatch("([^\n]*)\n?") do
+ if line ~= "" then
+ table.insert(lines, geo_type .. ":" .. line)
+ end
+ end
+ geo_string = table.concat(lines, "\n")
+ end
+ elseif action == "extract" then
+ local prefix, list = value:match("^(geoip:)(.*)$")
+ if not prefix then
+ prefix, list = value:match("^(geosite:)(.*)$")
+ end
+ if prefix and list and list ~= "" then
+ geo_type = prefix:sub(1, -2)
+ file_path = (geo_type == "geoip") and geoip_path or geosite_path
+ cmd = string.format("geoview -type %s -action extract -input '%s' -list '%s' -lowmem=true", geo_type, file_path, list)
+ geo_string = luci.sys.exec(cmd)
+ end
+ end
+ http.prepare_content("text/plain")
+ if geo_string and geo_string ~="" then
+ http.write(geo_string)
+ else
+ http.write(i18n.translate("No results were found!"))
+ end
+end
+
function subscribe_del_node()
- local remark = luci.http.formvalue("remark")
+ local remark = http.formvalue("remark")
if remark and remark ~= "" then
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate " .. luci.util.shellquote(remark) .. " > /dev/null 2>&1")
end
- luci.http.status(200, "OK")
+ http.status(200, "OK")
end
function subscribe_del_all()
luci.sys.call("lua /usr/share/" .. appname .. "/subscribe.lua truncate > /dev/null 2>&1")
- luci.http.status(200, "OK")
+ http.status(200, "OK")
end
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua
new file mode 100644
index 0000000000..071d8e80a2
--- /dev/null
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua
@@ -0,0 +1,16 @@
+local api = require "luci.passwall2.api"
+local appname = "passwall2"
+local fs = api.fs
+local uci = api.uci
+
+local geo_dir = (uci:get(appname, "@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"):match("^(.*)/")
+local geosite_path = geo_dir .. "/geosite.dat"
+local geoip_path = geo_dir .. "/geoip.dat"
+if fs.access(geosite_path) and fs.access(geoip_path) then
+ f = SimpleForm(appname)
+ f.reset = false
+ f.submit = false
+ f:append(Template(appname .. "/rule/geoview"))
+end
+
+return f
\ No newline at end of file
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua
index 3ffe45e19b..4d69d1d1ba 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua
@@ -386,6 +386,10 @@ s:tab("faq", "FAQ")
o = s:taboption("faq", DummyValue, "")
o.template = appname .. "/global/faq"
+s:tab("maintain", translate("Maintain"))
+o = s:taboption("maintain", DummyValue, "")
+o.template = appname .. "/global/backup"
+
-- [[ Socks Server ]]--
o = s:taboption("Main", Flag, "socks_enabled", "Socks " .. translate("Main switch"))
o.rmempty = false
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/log.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/log.lua
index 384cf1b315..a9102b6918 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/log.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/log.lua
@@ -1,70 +1,8 @@
-local api = require "luci.passwall2.api"
local appname = "passwall2"
-local http = require "luci.http"
-local fs = api.fs
-local sys = api.sys
f = SimpleForm(appname)
f.reset = false
f.submit = false
f:append(Template(appname .. "/log/log"))
-fb = SimpleForm('backup-restore')
-fb.reset = false
-fb.submit = false
-s = fb:section(SimpleSection, translate("Backup and Restore"), translate("Backup or Restore Client and Server Configurations.") ..
- "
" ..
- translate("Note: Restoring configurations across different versions may cause compatibility issues.") ..
- "")
-
-s.anonymous = true
-s:append(Template(appname .. "/log/backup_restore"))
-
-local backup_files = {
- "/etc/config/passwall2",
- "/etc/config/passwall2_server",
- "/usr/share/passwall2/domains_excluded"
-}
-
-local file_path = '/tmp/passwall2_upload.tar.gz'
-local temp_dir = '/tmp/passwall2_bak'
-local fd
-http.setfilehandler(function(meta, chunk, eof)
- if not fd and meta and meta.name == "ulfile" and chunk then
- sys.call("rm -rf " .. temp_dir)
- fs.remove(file_path)
- fd = nixio.open(file_path, "w")
- sys.call("echo '' > /tmp/log/passwall2.log")
- end
- if fd and chunk then
- fd:write(chunk)
- end
- if eof and fd then
- fd:close()
- fd = nil
- if fs.access(file_path) then
- api.log(" * PassWall2 配置文件上传成功…")
- sys.call("mkdir -p " .. temp_dir)
- if sys.call("tar -xzf " .. file_path .. " -C " .. temp_dir) == 0 then
- for _, backup_file in ipairs(backup_files) do
- local temp_file = temp_dir .. backup_file
- if fs.access(temp_file) then
- sys.call("cp -f " .. temp_file .. " " .. backup_file)
- end
- end
- api.log(" * PassWall2 配置还原成功…")
- api.log(" * 重启 PassWall2 服务中…\n")
- sys.call('/etc/init.d/passwall2 restart > /dev/null 2>&1 &')
- sys.call('/etc/init.d/passwall2_server restart > /dev/null 2>&1 &')
- else
- api.log(" * PassWall2 配置文件解压失败,请重试!")
- end
- else
- api.log(" * PassWall2 配置文件上传失败,请重试!")
- end
- sys.call("rm -rf " .. temp_dir)
- fs.remove(file_path)
- end
-end)
-
-return f, fb
+return f
\ No newline at end of file
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_list.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_list.lua
index e633f3fcfd..96b88eb315 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_list.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_list.lua
@@ -53,6 +53,16 @@ function s.remove(e, t)
m:set(s[".name"], "node", "default")
end
end)
+ if (m:get(t, "add_mode") or "0") == "2" then
+ local add_from = m:get(t, "add_from") or ""
+ if add_from ~= "" then
+ m.uci:foreach(appname, "subscribe_list", function(s)
+ if s["remark"] == add_from then
+ m:del(s[".name"], "md5")
+ end
+ end)
+ end
+ end
TypedSection.remove(e, t)
local new_node
local node0 = m:get("@nodes[0]") or nil
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
index 54b8b6784f..154fe5e9e1 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
@@ -155,7 +155,10 @@ local pi = s:option(Value, _n("probeInterval"), translate("Probe Interval"))
pi:depends({ [_n("balancingStrategy")] = "leastPing" })
pi:depends({ [_n("balancingStrategy")] = "leastLoad" })
pi.default = "1m"
-pi.description = translate("The interval between initiating probes. The time format is numbers + units, such as '10s', '2h45m', and the supported time units are ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively.")
+pi.placeholder = "1m"
+pi.description = translate("The interval between initiating probes.") .. "
" ..
+ translate("The time format is numbers + units, such as '10s', '2h45m', and the supported time units are s, m, h, which correspond to seconds, minutes, and hours, respectively.") .. "
" ..
+ translate("When the unit is not filled in, it defaults to seconds.")
if api.compare_versions(xray_version, ">=", "1.8.12") then
ucpu:depends({ [_n("protocol")] = "_balancing" })
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
index 73d9e0973f..998e689c72 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
@@ -126,20 +126,26 @@ o.description = translate("The URL used to detect the connection status.")
o = s:option(Value, _n("urltest_interval"), translate("Test interval"))
o:depends({ [_n("protocol")] = "_urltest" })
-o.datatype = "uinteger"
-o.default = "180"
-o.description = translate("The test interval in seconds.") .. "
" ..
+o.default = "3m"
+o.placeholder = "3m"
+o.description = translate("The interval between initiating probes.") .. "
" ..
+ translate("The time format is numbers + units, such as '10s', '2h45m', and the supported time units are s, m, h, which correspond to seconds, minutes, and hours, respectively.") .. "
" ..
+ translate("When the unit is not filled in, it defaults to seconds.") .. "
" ..
translate("Test interval must be less or equal than idle timeout.")
o = s:option(Value, _n("urltest_tolerance"), translate("Test tolerance"), translate("The test tolerance in milliseconds."))
o:depends({ [_n("protocol")] = "_urltest" })
o.datatype = "uinteger"
+o.placeholder = "50"
o.default = "50"
-o = s:option(Value, _n("urltest_idle_timeout"), translate("Idle timeout"), translate("The idle timeout in seconds."))
+o = s:option(Value, _n("urltest_idle_timeout"), translate("Idle timeout"))
o:depends({ [_n("protocol")] = "_urltest" })
-o.datatype = "uinteger"
-o.default = "1800"
+o.placeholder = "30m"
+o.default = "30m"
+o.description = translate("The idle timeout.") .. "
" ..
+ translate("The time format is numbers + units, such as '10s', '2h45m', and the supported time units are s, m, h, which correspond to seconds, minutes, and hours, respectively.") .. "
" ..
+ translate("When the unit is not filled in, it defaults to seconds.")
o = s:option(Flag, _n("urltest_interrupt_exist_connections"), translate("Interrupt existing connections"))
o:depends({ [_n("protocol")] = "_urltest" })
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss-rust.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss-rust.lua
index 12ee72fdaf..fea94a1efc 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss-rust.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss-rust.lua
@@ -48,10 +48,12 @@ o:value("none", translate("none"))
if api.is_finded("xray-plugin") then o:value("xray-plugin") end
if api.is_finded("v2ray-plugin") then o:value("v2ray-plugin") end
if api.is_finded("obfs-local") then o:value("obfs-local") end
+if api.is_finded("shadow-tls") then o:value("shadow-tls") end
o = s:option(Value, _n("plugin_opts"), translate("opts"))
o:depends({ [_n("plugin")] = "xray-plugin"})
o:depends({ [_n("plugin")] = "v2ray-plugin"})
o:depends({ [_n("plugin")] = "obfs-local"})
+o:depends({ [_n("plugin")] = "shadow-tls"})
api.luci_types(arg[1], m, s, type_name, option_prefix)
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/api.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/api.lua
index e514161d9e..f0de7e6328 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/api.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/api.lua
@@ -1285,3 +1285,32 @@ function luci_types(id, m, s, type_name, option_prefix)
end
end
end
+function format_go_time(input)
+ input = input and trim(input)
+ local N = 0
+ if input and input:match("^%d+$") then
+ N = tonumber(input)
+ elseif input and input ~= "" then
+ for value, unit in input:gmatch("(%d+)%s*([hms])") do
+ value = tonumber(value)
+ if unit == "h" then
+ N = N + value * 3600
+ elseif unit == "m" then
+ N = N + value * 60
+ elseif unit == "s" then
+ N = N + value
+ end
+ end
+ end
+ if N <= 0 then
+ return "0s"
+ end
+ local result = ""
+ local h = math.floor(N / 3600)
+ local m = math.floor(N % 3600 / 60)
+ local s = N % 60
+ if h > 0 then result = result .. h .. "h" end
+ if m > 0 then result = result .. m .. "m" end
+ if s > 0 or result == "" then result = result .. s .. "s" end
+ return result
+end
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
index 576e34e3e4..85558f5e73 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
@@ -442,6 +442,7 @@ function gen_config_server(node)
if node.tls == "1" and node.reality == "1" then
tls.certificate_path = nil
tls.key_path = nil
+ tls.server_name = node.reality_handshake_server
tls.reality = {
enabled = true,
private_key = node.reality_private_key,
@@ -991,9 +992,9 @@ function gen_config(var)
tag = urltest_tag,
outbounds = valid_nodes,
url = _node.urltest_url or "https://www.gstatic.com/generate_204",
- interval = _node.urltest_interval and tonumber(_node.urltest_interval) and string.format("%dm", tonumber(_node.urltest_interval) / 60) or "3m",
- tolerance = _node.urltest_tolerance and tonumber(_node.urltest_tolerance) and tonumber(_node.urltest_tolerance) or 50,
- idle_timeout = _node.urltest_idle_timeout and tonumber(_node.urltest_idle_timeout) and string.format("%dm", tonumber(_node.urltest_idle_timeout) / 60) or "30m",
+ interval = (api.format_go_time(_node.urltest_interval) ~= "0s") and api.format_go_time(_node.urltest_interval) or "3m",
+ tolerance = (_node.urltest_tolerance and tonumber(_node.urltest_tolerance) > 0) and tonumber(_node.urltest_tolerance) or 50,
+ idle_timeout = (api.format_go_time(_node.urltest_idle_timeout) ~= "0s") and api.format_go_time(_node.urltest_idle_timeout) or "30m",
interrupt_exist_connections = (_node.urltest_interrupt_exist_connections == "true" or _node.urltest_interrupt_exist_connections == "1") and true or false
}
table.insert(outbounds, outbound)
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_xray.lua
index 1effe25603..a8570ef036 100644
--- a/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_xray.lua
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/passwall2/util_xray.lua
@@ -787,7 +787,7 @@ function gen_config(var)
subjectSelector = { "blc-" },
pingConfig = {
destination = _node.useCustomProbeUrl and _node.probeUrl or nil,
- interval = _node.probeInterval or "1m",
+ interval = (api.format_go_time(_node.probeInterval) ~= "0s") and api.format_go_time(_node.probeInterval) or "1m",
sampling = 3,
timeout = "5s"
}
diff --git a/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm
new file mode 100644
index 0000000000..67aca2b92d
--- /dev/null
+++ b/openwrt-passwall2/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm
@@ -0,0 +1,223 @@
+<%
+local api = require "luci.passwall2.api"
+-%>
+
+
ns, us, ms, s, m, h, which correspond to nanoseconds, microseconds, milliseconds, seconds, minutes, and hours, respectively."
-msgstr "发起探测的间隔。时间格式为数字+单位,比如"10s", "2h45m",支持的时间单位有 ns,us,ms,s,m,h,分别对应纳秒、微秒、毫秒、秒、分、时。"
+msgid "The interval between initiating probes."
+msgstr "发起探测的间隔。"
+
+msgid "The time format is numbers + units, such as '10s', '2h45m', and the supported time units are s, m, h, which correspond to seconds, minutes, and hours, respectively."
+msgstr "时间格式为数字+单位,比如"10s", "2h45m",支持的时间单位有 s,m,h,分别对应秒、分、时。"
+
+msgid "When the unit is not filled in, it defaults to seconds."
+msgstr "未填写单位时,默认为秒。"
msgid "Preferred Node Count"
msgstr "优选节点数量"
@@ -1615,8 +1624,8 @@ msgstr "仅 IPv4"
msgid "IPv6 Only"
msgstr "仅 IPv6"
-msgid "Log Maint"
-msgstr "日志维护"
+msgid "Maintain"
+msgstr "维护"
msgid "Backup and Restore"
msgstr "备份还原"
@@ -1651,6 +1660,15 @@ msgstr "恢复默认配置"
msgid "Do Reset"
msgstr "执行重置"
+msgid "Please select a file first."
+msgstr "请先选择一个文件。"
+
+msgid "Invalid file type. Please upload a .tar.gz file."
+msgstr "文件类型无效,请上传一个 .tar.gz 文件。"
+
+msgid "File size exceeds 10MB limit."
+msgstr "文件大小超过 10MB 限制。"
+
msgid "Do you want to restore the client to default settings?"
msgstr "是否要恢复客户端默认配置?"
@@ -1669,9 +1687,6 @@ msgstr "要测试的节点列表,/dev/null 2>&1
unset V2RAY_LOCATION_ASSET
diff --git a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
index d3f241a150..f69c22e2b4 100755
--- a/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
+++ b/openwrt-passwall2/luci-app-passwall2/root/usr/share/passwall2/subscribe.lua
@@ -400,18 +400,16 @@ do
end
end
--- urlencode
--- local function get_urlencode(c) return sformat("%%%02X", sbyte(c)) end
+local function UrlEncode(szText)
+ return szText:gsub("([^%w%-_%.%~])", function(c)
+ return string.format("%%%02X", string.byte(c))
+ end)
+end
--- local function urlEncode(szText)
--- local str = szText:gsub("([^0-9a-zA-Z ])", get_urlencode)
--- str = str:gsub(" ", "+")
--- return str
--- end
-
-local function get_urldecode(h) return schar(tonumber(h, 16)) end
local function UrlDecode(szText)
- return (szText and szText:gsub("+", " "):gsub("%%(%x%x)", get_urldecode)) or nil
+ return szText and szText:gsub("+", " "):gsub("%%(%x%x)", function(h)
+ return string.char(tonumber(h, 16))
+ end) or nil
end
-- trim
@@ -611,10 +609,9 @@ local function processData(szType, content, add_mode, add_from)
--ss://2022-blake3-aes-256-gcm:YctPZ6U7xPPcU%2Bgp3u%2B0tx%2FtRizJN9K8y%2BuKlW2qjlI%3D@192.168.100.1:8888/?plugin=v2ray-plugin%3Bserver#Example3
--ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTp0ZXN0@xxxxxx.com:443?type=ws&path=%2Ftestpath&host=xxxxxx.com&security=tls&fp=&alpn=h3%2Ch2%2Chttp%2F1.1&sni=xxxxxx.com#test-1%40ss
- local idx_sp = 0
+ local idx_sp = content:find("#") or 0
local alias = ""
- if content:find("#") then
- idx_sp = content:find("#")
+ if idx_sp > 0 then
alias = content:sub(idx_sp + 1, -1)
end
result.remarks = UrlDecode(alias)
@@ -625,7 +622,7 @@ local function processData(szType, content, add_mode, add_from)
local query = split(info, "%?")
for _, v in pairs(split(query[2], '&')) do
local t = split(v, '=')
- params[t[1]] = UrlDecode(t[2])
+ if #t >= 2 then params[t[1]] = UrlDecode(t[2]) end
end
if params.plugin then
local plugin_info = params.plugin
@@ -671,9 +668,22 @@ local function processData(szType, content, add_mode, add_from)
else
userinfo = base64Decode(hostInfo[1])
end
-
local method = userinfo:sub(1, userinfo:find(":") - 1)
local password = userinfo:sub(userinfo:find(":") + 1, #userinfo)
+
+ -- 判断密码是否经过url编码
+ local function isURLEncodedPassword(pwd)
+ if not pwd:find("%%[0-9A-Fa-f][0-9A-Fa-f]") then
+ return false
+ end
+ local ok, decoded = pcall(UrlDecode, pwd)
+ return ok and UrlEncode(decoded) == pwd
+ end
+
+ local decoded = UrlDecode(password)
+ if isURLEncodedPassword(password) and decoded then
+ password = decoded
+ end
result.method = method
result.password = password
@@ -835,6 +845,48 @@ local function processData(szType, content, add_mode, add_from)
result.error_msg = "请更换Xray或Sing-Box来支持SS更多的传输方式."
end
end
+
+ if params["shadow-tls"] then
+ if result.type ~= "sing-box" and result.type ~= "SS-Rust" then
+ result.error_msg = ss_type_default .. " 不支持 shadow-tls 插件."
+ else
+ -- 解析SS Shadow-TLS 插件参数
+ local function parseShadowTLSParams(b64str, out)
+ local ok, data = pcall(jsonParse, base64Decode(b64str))
+ if not ok or type(data) ~= "table" then return "" end
+ if type(out) == "table" then
+ for k, v in pairs(data) do out[k] = v end
+ end
+ local t = {}
+ if data.version then t[#t+1] = "v" .. data.version .. "=1" end
+ if data.password then t[#t+1] = "passwd=" .. data.password end
+ for k, v in pairs(data) do
+ if k ~= "version" and k ~= "password" then
+ t[#t+1] = k .. "=" .. tostring(v)
+ end
+ end
+ return table.concat(t, ";")
+ end
+
+ if result.type == "SS-Rust" then
+ result.plugin = "shadow-tls"
+ result.plugin_opts = parseShadowTLSParams(params["shadow-tls"])
+ elseif result.type == "sing-box" then
+ local shadowtlsOpt = {}
+ parseShadowTLSParams(params["shadow-tls"], shadowtlsOpt)
+ if next(shadowtlsOpt) then
+ result.shadowtls = "1"
+ result.shadowtls_version = shadowtlsOpt.version or "1"
+ result.shadowtls_password = shadowtlsOpt.password
+ result.shadowtls_serverName = shadowtlsOpt.host
+ if shadowtlsOpt.fingerprint then
+ result.shadowtls_utls = "1"
+ result.shadowtls_fingerprint = shadowtlsOpt.fingerprint or "chrome"
+ end
+ end
+ end
+ end
+ end
end
elseif szType == "trojan" then
if trojan_type_default == "sing-box" and has_singbox then
@@ -1275,14 +1327,14 @@ local function processData(szType, content, add_mode, add_from)
if hysteria2_type_default == "sing-box" and has_singbox then
result.type = 'sing-box'
result.protocol = "hysteria2"
- if params["obfs-password"] then
+ if params["obfs-password"] or params["obfs_password"] then
result.hysteria2_obfs_type = "salamander"
- result.hysteria2_obfs_password = params["obfs-password"]
+ result.hysteria2_obfs_password = params["obfs-password"] or params["obfs_password"]
end
elseif has_hysteria2 then
result.type = "Hysteria2"
- if params["obfs-password"] then
- result.hysteria2_obfs = params["obfs-password"]
+ if params["obfs-password"] or params["obfs_password"] then
+ result.hysteria2_obfs = params["obfs-password"] or params["obfs_password"]
end
end
elseif szType == 'tuic' then
diff --git a/small/luci-app-bypass/Makefile b/small/luci-app-bypass/Makefile
index 4dad863fc7..98ba96401d 100644
--- a/small/luci-app-bypass/Makefile
+++ b/small/luci-app-bypass/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-bypass
PKG_VERSION:=1.2
-PKG_RELEASE:=20
+PKG_RELEASE:=21
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server \
diff --git a/small/luci-app-bypass/root/etc/uci-defaults/luci-bypass b/small/luci-app-bypass/root/etc/uci-defaults/luci-bypass
index 2303198ed6..df5db43c33 100644
--- a/small/luci-app-bypass/root/etc/uci-defaults/luci-bypass
+++ b/small/luci-app-bypass/root/etc/uci-defaults/luci-bypass
@@ -1,4 +1,3 @@
-uci batch <