Update On Thu Sep 25 20:42:16 CEST 2025

This commit is contained in:
github-action[bot]
2025-09-25 20:42:17 +02:00
parent c419341558
commit f39050f25e
98 changed files with 2493 additions and 1892 deletions
+1
View File
@@ -1131,3 +1131,4 @@ Update On Sun Sep 21 20:36:55 CEST 2025
Update On Mon Sep 22 20:36:16 CEST 2025
Update On Tue Sep 23 20:37:30 CEST 2025
Update On Wed Sep 24 20:34:28 CEST 2025
Update On Thu Sep 25 20:42:08 CEST 2025
+20 -6
View File
@@ -103,7 +103,12 @@ where
pub fn latest(&self) -> MappedRwLockReadGuard<'_, T> {
if self.is_dirty() {
let draft = self.draft.read();
RwLockReadGuard::map(draft, |guard| guard.as_ref().unwrap())
if draft.is_some() {
RwLockReadGuard::map(draft, |guard| guard.as_ref().unwrap())
} else {
let state = self.inner.read();
RwLockReadGuard::map(state, |guard| guard)
}
} else {
let state = self.inner.read();
RwLockReadGuard::map(state, |guard| guard)
@@ -118,7 +123,10 @@ where
/// You can modify the draft state, and then commit it
pub fn draft(&self) -> MappedRwLockWriteGuard<'_, T> {
if self.is_dirty() {
return RwLockWriteGuard::map(self.draft.write(), |guard| guard.as_mut().unwrap());
let guard = self.draft.write();
if guard.is_some() {
return RwLockWriteGuard::map(guard, |g| g.as_mut().unwrap());
}
}
let state = self.inner.read().clone();
@@ -140,10 +148,16 @@ where
let mut draft = self.draft.write();
let mut inner = self.inner.write();
let old_value = inner.to_owned();
*inner = draft.take().unwrap();
self.is_dirty
.store(false, std::sync::atomic::Ordering::Release);
Some(old_value)
if let Some(draft_value) = draft.take() {
*inner = draft_value;
self.is_dirty
.store(false, std::sync::atomic::Ordering::Release);
Some(old_value)
} else {
self.is_dirty
.store(false, std::sync::atomic::Ordering::Release);
None
}
}
/// discard the draft state
@@ -85,7 +85,7 @@
"nanoid": "5.1.6",
"sass-embedded": "1.93.2",
"shiki": "2.5.0",
"unplugin-auto-import": "20.1.0",
"unplugin-auto-import": "20.2.0",
"unplugin-icons": "22.3.0",
"validator": "13.15.15",
"vite": "7.1.7",
@@ -105,16 +105,15 @@ export const ProfileItem = memo(function ProfileItem({
await deleteConnections.mutateAsync(undefined)
} catch (err) {
// This FetchError was triggered by the `DELETE /connections` API
const isFetchError = err instanceof Error && err.name === 'FetchError'
message(
isFetchError
? t('FetchError', {
content: t('Subscription'),
})
? `Failed to delete connections: \n ${err instanceof Error ? err.message : String(err)}`
: `Error setting profile: \n ${err instanceof Error ? err.message : String(err)}`,
{
title: t('Error'),
kind: 'error',
title: isFetchError ? t('DeleteConnectionsError') : t('Error'),
kind: isFetchError ? 'warning' : 'error',
},
)
} finally {
@@ -70,7 +70,9 @@ export const message = async (
if (typeof options === 'object') {
await tauriMessage(value, {
...options,
title: `Clash Nyanpasu - ${options.title}`,
title: options.title
? `Clash Nyanpasu - ${options.title}`
: 'Clash Nyanpasu',
})
} else {
await tauriMessage(value, options)
+3 -3
View File
@@ -1,8 +1,8 @@
{
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.13",
"mihomo_alpha": "alpha-57b527d",
"mihomo": "v1.19.14",
"mihomo_alpha": "alpha-fdc46f0",
"clash_rs": "v0.9.0",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.9.0-alpha+sha.2784d7a"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-09-23T22:20:51.447Z"
"updated_at": "2025-09-24T22:21:01.034Z"
}
+6 -6
View File
@@ -60,15 +60,15 @@
"devDependencies": {
"@commitlint/cli": "19.8.1",
"@commitlint/config-conventional": "19.8.1",
"@eslint/compat": "1.3.2",
"@eslint/compat": "1.4.0",
"@eslint/eslintrc": "3.3.1",
"@ianvs/prettier-plugin-sort-imports": "4.7.0",
"@tauri-apps/cli": "2.8.4",
"@types/fs-extra": "11.0.4",
"@types/lodash-es": "4.17.12",
"@types/node": "24.3.1",
"@typescript-eslint/eslint-plugin": "8.44.0",
"@typescript-eslint/parser": "8.44.0",
"@typescript-eslint/eslint-plugin": "8.44.1",
"@typescript-eslint/parser": "8.44.1",
"autoprefixer": "10.4.21",
"conventional-changelog-conventionalcommits": "9.1.0",
"cross-env": "10.0.0",
@@ -86,7 +86,7 @@
"eslint-plugin-react-hooks": "5.2.0",
"globals": "16.4.0",
"knip": "5.64.0",
"lint-staged": "16.1.6",
"lint-staged": "16.2.0",
"neostandard": "0.12.2",
"npm-run-all2": "8.0.4",
"postcss": "8.5.6",
@@ -108,11 +108,11 @@
"tailwindcss": "4.1.13",
"tsx": "4.20.5",
"typescript": "5.9.2",
"typescript-eslint": "8.44.0"
"typescript-eslint": "8.44.1"
},
"packageManager": "pnpm@10.17.1",
"engines": {
"node": "22.19.0"
"node": "22.20.0"
},
"pnpm": {
"overrides": {
+200 -208
View File
@@ -29,8 +29,8 @@ importers:
specifier: 19.8.1
version: 19.8.1
'@eslint/compat':
specifier: 1.3.2
version: 1.3.2(eslint@9.36.0(jiti@2.5.1))
specifier: 1.4.0
version: 1.4.0(eslint@9.36.0(jiti@2.5.1))
'@eslint/eslintrc':
specifier: 3.3.1
version: 3.3.1
@@ -50,11 +50,11 @@ importers:
specifier: 24.3.1
version: 24.3.1
'@typescript-eslint/eslint-plugin':
specifier: 8.44.0
version: 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
specifier: 8.44.1
version: 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/parser':
specifier: 8.44.0
version: 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
specifier: 8.44.1
version: 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
autoprefixer:
specifier: 10.4.21
version: 10.4.21(postcss@8.5.6)
@@ -75,13 +75,13 @@ importers:
version: 10.1.8(eslint@9.36.0(jiti@2.5.1))
eslint-import-resolver-alias:
specifier: 1.1.2
version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))
version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))
eslint-plugin-html:
specifier: 8.1.3
version: 8.1.3
eslint-plugin-import:
specifier: 2.32.0
version: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
version: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-n:
specifier: 17.23.1
version: 17.23.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
@@ -107,11 +107,11 @@ importers:
specifier: 5.64.0
version: 5.64.0(@types/node@24.3.1)(typescript@5.9.2)
lint-staged:
specifier: 16.1.6
version: 16.1.6
specifier: 16.2.0
version: 16.2.0
neostandard:
specifier: 0.12.2
version: 0.12.2(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
version: 0.12.2(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
npm-run-all2:
specifier: 8.0.4
version: 8.0.4
@@ -173,8 +173,8 @@ importers:
specifier: 5.9.2
version: 5.9.2
typescript-eslint:
specifier: 8.44.0
version: 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
specifier: 8.44.1
version: 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
frontend/interface:
dependencies:
@@ -433,8 +433,8 @@ importers:
specifier: 2.5.0
version: 2.5.0
unplugin-auto-import:
specifier: 20.1.0
version: 20.1.0
specifier: 20.2.0
version: 20.2.0
unplugin-icons:
specifier: 22.3.0
version: 22.3.0(@svgr/core@8.1.0(typescript@5.9.2))
@@ -606,8 +606,8 @@ importers:
specifier: 1.1.1
version: 1.1.1
tar:
specifier: 7.4.4
version: 7.4.4
specifier: 7.5.1
version: 7.5.1
telegram:
specifier: 2.26.22
version: 2.26.22
@@ -1727,8 +1727,8 @@ packages:
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/compat@1.3.2':
resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==}
'@eslint/compat@1.4.0':
resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.40 || 9
@@ -1748,6 +1748,10 @@ packages:
resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/core@0.16.0':
resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3489,16 +3493,16 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
'@typescript-eslint/eslint-plugin@8.44.0':
resolution: {integrity: sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ==}
'@typescript-eslint/eslint-plugin@8.44.1':
resolution: {integrity: sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.44.0
'@typescript-eslint/parser': ^8.44.1
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.44.0':
resolution: {integrity: sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==}
'@typescript-eslint/parser@8.44.1':
resolution: {integrity: sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -3510,8 +3514,8 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.44.0':
resolution: {integrity: sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==}
'@typescript-eslint/project-service@8.44.1':
resolution: {integrity: sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
@@ -3520,8 +3524,8 @@ packages:
resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.44.0':
resolution: {integrity: sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==}
'@typescript-eslint/scope-manager@8.44.1':
resolution: {integrity: sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.41.0':
@@ -3530,20 +3534,20 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/tsconfig-utils@8.43.0':
resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/tsconfig-utils@8.44.0':
resolution: {integrity: sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.44.0':
resolution: {integrity: sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg==}
'@typescript-eslint/tsconfig-utils@8.44.1':
resolution: {integrity: sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.44.1':
resolution: {integrity: sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -3553,22 +3557,22 @@ packages:
resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.43.0':
resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.44.0':
resolution: {integrity: sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.44.1':
resolution: {integrity: sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.41.0':
resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/typescript-estree@8.44.0':
resolution: {integrity: sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==}
'@typescript-eslint/typescript-estree@8.44.1':
resolution: {integrity: sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
@@ -3580,8 +3584,8 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.44.0':
resolution: {integrity: sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg==}
'@typescript-eslint/utils@8.44.1':
resolution: {integrity: sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -3591,8 +3595,8 @@ packages:
resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.44.0':
resolution: {integrity: sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==}
'@typescript-eslint/visitor-keys@8.44.1':
resolution: {integrity: sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.2.0':
@@ -4124,10 +4128,6 @@ packages:
resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
chalk@5.6.0:
resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
change-case@5.4.4:
resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
@@ -4173,9 +4173,9 @@ packages:
resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
engines: {node: '>=18'}
cli-truncate@4.0.0:
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
engines: {node: '>=18'}
cli-truncate@5.1.0:
resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==}
engines: {node: '>=20'}
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
@@ -4224,6 +4224,10 @@ packages:
resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
engines: {node: '>=20'}
commander@14.0.1:
resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==}
engines: {node: '>=20'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -5315,6 +5319,10 @@ packages:
resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
engines: {node: '>=18'}
get-east-asian-width@1.4.0:
resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
engines: {node: '>=18'}
get-intrinsic@1.2.4:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
@@ -5770,10 +5778,6 @@ packages:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
is-fullwidth-code-point@4.0.0:
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
engines: {node: '>=12'}
is-fullwidth-code-point@5.0.0:
resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
engines: {node: '>=18'}
@@ -6183,20 +6187,16 @@ packages:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'}
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
lint-staged@16.1.6:
resolution: {integrity: sha512-U4kuulU3CKIytlkLlaHcGgKscNfJPNTiDF2avIUGFCv7K95/DCYQ7Ra62ydeRWmgQGg9zJYw2dzdbztwJlqrow==}
lint-staged@16.2.0:
resolution: {integrity: sha512-spdYSOCQ2MdZ9CM1/bu/kDmaYGsrpNOeu1InFFV8uhv14x6YIubGxbCpSmGILFoxkiheNQPDXSg5Sbb5ZuVnug==}
engines: {node: '>=20.17'}
hasBin: true
listr2@9.0.3:
resolution: {integrity: sha512-0aeh5HHHgmq1KRdMMDHfhMWQmIT/m7nRDTlxlFqni2Sp0had9baqsjJRvDGdlvgd6NmPE0nPloOipiQJGFtTHQ==}
listr2@9.0.4:
resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==}
engines: {node: '>=20.0.0'}
local-pkg@1.1.1:
@@ -6299,6 +6299,9 @@ packages:
magic-string@0.30.18:
resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==}
magic-string@0.30.19:
resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
make-dir@1.3.0:
resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
engines: {node: '>=4'}
@@ -6495,6 +6498,9 @@ packages:
mlly@1.7.4:
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
monaco-editor@0.52.2:
resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
@@ -6551,8 +6557,8 @@ packages:
react: '*'
react-dom: '*'
nano-spawn@1.0.2:
resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==}
nano-spawn@1.0.3:
resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==}
engines: {node: '>=20.17'}
nanoid@3.3.11:
@@ -6881,9 +6887,6 @@ packages:
pkg-types@2.1.0:
resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
pkg-types@2.2.0:
resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==}
pkg-types@2.3.0:
resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
@@ -7663,10 +7666,6 @@ packages:
resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
engines: {node: '>=10'}
slice-ansi@5.0.0:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
slice-ansi@7.1.0:
resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
engines: {node: '>=18'}
@@ -7776,6 +7775,10 @@ packages:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
string-width@8.1.0:
resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==}
engines: {node: '>=20'}
string.prototype.matchall@4.0.12:
resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
engines: {node: '>= 0.4'}
@@ -7966,8 +7969,8 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
tar@7.4.4:
resolution: {integrity: sha512-O1z7ajPkjTgEgmTGz0v9X4eqeEXTDREPTO77pVC1Nbs86feBU1Zhdg+edzavPmYW1olxkwsqA2v4uOw6E8LeDg==}
tar@7.5.1:
resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
engines: {node: '>=18'}
telegram@2.26.22:
@@ -8135,8 +8138,8 @@ packages:
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
typescript-eslint@8.44.0:
resolution: {integrity: sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw==}
typescript-eslint@8.44.1:
resolution: {integrity: sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -8160,6 +8163,9 @@ packages:
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
ufo@1.6.1:
resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
@@ -8201,8 +8207,8 @@ packages:
unified@11.0.4:
resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==}
unimport@5.2.0:
resolution: {integrity: sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==}
unimport@5.4.0:
resolution: {integrity: sha512-g/OLFZR2mEfqbC6NC9b2225eCJGvufxq34mj6kM3OmI5gdSL0qyqtnv+9qmsGpAmnzSl6x0IWZj4W+8j2hLkMA==}
engines: {node: '>=18.12.0'}
unique-string@1.0.0:
@@ -8244,8 +8250,8 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
unplugin-auto-import@20.1.0:
resolution: {integrity: sha512-Wa7/y3DwpbxhjyXCbuliuATCPa0/e47tstWkytJGAr55ooSNwIvbkrq0rlduqYGiCNMsZcD+C6vsN+W3AX96eA==}
unplugin-auto-import@20.2.0:
resolution: {integrity: sha512-vfBI/SvD9hJqYNinipVOAj5n8dS8DJXFlCKFR5iLDp2SaQwsfdnfLXgZ+34Kd3YY3YEY9omk8XQg0bwos3Q8ug==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': ^4.0.0
@@ -8279,10 +8285,6 @@ packages:
vue-template-es2015-compiler:
optional: true
unplugin-utils@0.2.4:
resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==}
engines: {node: '>=18.12.0'}
unplugin-utils@0.3.0:
resolution: {integrity: sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==}
engines: {node: '>=20.19.0'}
@@ -8291,10 +8293,6 @@ packages:
resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==}
engines: {node: '>=18.12.0'}
unplugin@2.3.9:
resolution: {integrity: sha512-2dcbZq6aprwXTkzptq3k5qm5B8cvpjG9ynPd5fyM2wDJuuF7PeUK64Sxf0d+X1ZyDOeGydbNzMqBSIVlH8GIfA==}
engines: {node: '>=18.12.0'}
unrs-resolver@1.10.1:
resolution: {integrity: sha512-EFrL7Hw4kmhZdwWO3dwwFJo6hO3FXuQ6Bg8BK/faHZ9m1YxqBS31BNSTxklIQkxK/4LlV8zTYnPsIRLBzTzjCA==}
@@ -10103,7 +10101,9 @@ snapshots:
'@eslint-community/regexpp@4.12.1': {}
'@eslint/compat@1.3.2(eslint@9.36.0(jiti@2.5.1))':
'@eslint/compat@1.4.0(eslint@9.36.0(jiti@2.5.1))':
dependencies:
'@eslint/core': 0.16.0
optionalDependencies:
eslint: 9.36.0(jiti@2.5.1)
@@ -10121,6 +10121,10 @@ snapshots:
dependencies:
'@types/json-schema': 7.0.15
'@eslint/core@0.16.0':
dependencies:
'@types/json-schema': 7.0.15
'@eslint/eslintrc@3.3.1':
dependencies:
ajv: 6.12.6
@@ -11261,7 +11265,7 @@ snapshots:
'@tailwindcss/oxide@4.1.13':
dependencies:
detect-libc: 2.0.4
tar: 7.4.4
tar: 7.5.1
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.1.13
'@tailwindcss/oxide-darwin-arm64': 4.1.13
@@ -11793,14 +11797,14 @@ snapshots:
'@types/node': 24.3.1
optional: true
'@typescript-eslint/eslint-plugin@8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
'@typescript-eslint/eslint-plugin@8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/scope-manager': 8.44.0
'@typescript-eslint/type-utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/scope-manager': 8.44.1
'@typescript-eslint/type-utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.44.1
eslint: 9.36.0(jiti@2.5.1)
graphemer: 1.4.0
ignore: 7.0.5
@@ -11810,12 +11814,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
'@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/scope-manager': 8.44.0
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/scope-manager': 8.44.1
'@typescript-eslint/types': 8.44.1
'@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.44.1
debug: 4.4.1
eslint: 9.36.0(jiti@2.5.1)
typescript: 5.9.2
@@ -11824,17 +11828,17 @@ snapshots:
'@typescript-eslint/project-service@8.41.0(typescript@5.9.2)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.9.2)
'@typescript-eslint/types': 8.43.0
'@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2)
'@typescript-eslint/types': 8.44.0
debug: 4.4.1
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.44.0(typescript@5.9.2)':
'@typescript-eslint/project-service@8.44.1(typescript@5.9.2)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2)
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2)
'@typescript-eslint/types': 8.44.1
debug: 4.4.1
typescript: 5.9.2
transitivePeerDependencies:
@@ -11845,28 +11849,28 @@ snapshots:
'@typescript-eslint/types': 8.41.0
'@typescript-eslint/visitor-keys': 8.41.0
'@typescript-eslint/scope-manager@8.44.0':
'@typescript-eslint/scope-manager@8.44.1':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/types': 8.44.1
'@typescript-eslint/visitor-keys': 8.44.1
'@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)':
dependencies:
typescript: 5.9.2
'@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.9.2)':
dependencies:
typescript: 5.9.2
'@typescript-eslint/tsconfig-utils@8.44.0(typescript@5.9.2)':
dependencies:
typescript: 5.9.2
'@typescript-eslint/type-utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
'@typescript-eslint/tsconfig-utils@8.44.1(typescript@5.9.2)':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
typescript: 5.9.2
'@typescript-eslint/type-utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/types': 8.44.1
'@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
debug: 4.4.1
eslint: 9.36.0(jiti@2.5.1)
ts-api-utils: 2.1.0(typescript@5.9.2)
@@ -11876,10 +11880,10 @@ snapshots:
'@typescript-eslint/types@8.41.0': {}
'@typescript-eslint/types@8.43.0': {}
'@typescript-eslint/types@8.44.0': {}
'@typescript-eslint/types@8.44.1': {}
'@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)':
dependencies:
'@typescript-eslint/project-service': 8.41.0(typescript@5.9.2)
@@ -11896,12 +11900,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@8.44.0(typescript@5.9.2)':
'@typescript-eslint/typescript-estree@8.44.1(typescript@5.9.2)':
dependencies:
'@typescript-eslint/project-service': 8.44.0(typescript@5.9.2)
'@typescript-eslint/tsconfig-utils': 8.44.0(typescript@5.9.2)
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/visitor-keys': 8.44.0
'@typescript-eslint/project-service': 8.44.1(typescript@5.9.2)
'@typescript-eslint/tsconfig-utils': 8.44.1(typescript@5.9.2)
'@typescript-eslint/types': 8.44.1
'@typescript-eslint/visitor-keys': 8.44.1
debug: 4.4.1
fast-glob: 3.3.3
is-glob: 4.0.3
@@ -11923,12 +11927,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
'@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)':
dependencies:
'@eslint-community/eslint-utils': 4.8.0(eslint@9.36.0(jiti@2.5.1))
'@typescript-eslint/scope-manager': 8.44.0
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
'@typescript-eslint/scope-manager': 8.44.1
'@typescript-eslint/types': 8.44.1
'@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2)
eslint: 9.36.0(jiti@2.5.1)
typescript: 5.9.2
transitivePeerDependencies:
@@ -11939,9 +11943,9 @@ snapshots:
'@typescript-eslint/types': 8.41.0
eslint-visitor-keys: 4.2.1
'@typescript-eslint/visitor-keys@8.44.0':
'@typescript-eslint/visitor-keys@8.44.1':
dependencies:
'@typescript-eslint/types': 8.44.0
'@typescript-eslint/types': 8.44.1
eslint-visitor-keys: 4.2.1
'@ungap/structured-clone@1.2.0': {}
@@ -12547,8 +12551,6 @@ snapshots:
chalk@5.4.1: {}
chalk@5.6.0: {}
change-case@5.4.4: {}
character-entities-html4@2.1.0: {}
@@ -12591,10 +12593,10 @@ snapshots:
dependencies:
restore-cursor: 5.1.0
cli-truncate@4.0.0:
cli-truncate@5.1.0:
dependencies:
slice-ansi: 5.0.0
string-width: 7.2.0
slice-ansi: 7.1.0
string-width: 8.1.0
cliui@8.0.1:
dependencies:
@@ -12638,6 +12640,8 @@ snapshots:
commander@14.0.0: {}
commander@14.0.1: {}
commander@2.20.3: {}
commander@7.2.0: {}
@@ -13517,9 +13521,9 @@ snapshots:
optionalDependencies:
unrs-resolver: 1.10.1
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))):
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))):
dependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
eslint-import-resolver-node@0.3.9:
dependencies:
@@ -13529,7 +13533,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1)):
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.1
@@ -13540,16 +13544,16 @@ snapshots:
tinyglobby: 0.2.14
unrs-resolver: 1.10.1
optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)):
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
eslint: 9.36.0(jiti@2.5.1)
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
@@ -13566,7 +13570,7 @@ snapshots:
dependencies:
htmlparser2: 10.0.0
eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)):
eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)):
dependencies:
'@typescript-eslint/types': 8.41.0
comment-parser: 1.4.1
@@ -13579,12 +13583,12 @@ snapshots:
stable-hash-x: 0.2.0
unrs-resolver: 1.10.1
optionalDependencies:
'@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)):
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -13595,7 +13599,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.36.0(jiti@2.5.1)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -13607,7 +13611,7 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -13995,6 +13999,8 @@ snapshots:
get-east-asian-width@1.2.0: {}
get-east-asian-width@1.4.0: {}
get-intrinsic@1.2.4:
dependencies:
es-errors: 1.3.0
@@ -14510,8 +14516,6 @@ snapshots:
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
is-fullwidth-code-point@5.0.0:
dependencies:
get-east-asian-width: 1.2.0
@@ -14861,28 +14865,21 @@ snapshots:
lilconfig@2.1.0: {}
lilconfig@3.1.3: {}
lines-and-columns@1.2.4: {}
lint-staged@16.1.6:
lint-staged@16.2.0:
dependencies:
chalk: 5.6.0
commander: 14.0.0
debug: 4.4.1
lilconfig: 3.1.3
listr2: 9.0.3
commander: 14.0.1
listr2: 9.0.4
micromatch: 4.0.8
nano-spawn: 1.0.2
nano-spawn: 1.0.3
pidtree: 0.6.0
string-argv: 0.3.2
yaml: 2.8.1
transitivePeerDependencies:
- supports-color
listr2@9.0.3:
listr2@9.0.4:
dependencies:
cli-truncate: 4.0.0
cli-truncate: 5.1.0
colorette: 2.0.20
eventemitter3: 5.0.1
log-update: 6.1.0
@@ -14982,6 +14979,10 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
magic-string@0.30.19:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
make-dir@1.3.0:
dependencies:
pify: 3.0.0
@@ -15290,6 +15291,13 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.5.4
mlly@1.8.0:
dependencies:
acorn: 8.15.0
pathe: 2.0.3
pkg-types: 1.3.1
ufo: 1.6.1
monaco-editor@0.52.2: {}
monaco-languageserver-types@0.4.0:
@@ -15359,7 +15367,7 @@ snapshots:
stacktrace-js: 2.0.2
stylis: 4.3.2
nano-spawn@1.0.2: {}
nano-spawn@1.0.3: {}
nanoid@3.3.11: {}
@@ -15375,20 +15383,20 @@ snapshots:
sax: 1.3.0
optional: true
neostandard@0.12.2(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2):
neostandard@0.12.2(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2):
dependencies:
'@humanwhocodes/gitignore-to-minimatch': 1.0.2
'@stylistic/eslint-plugin': 2.11.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
eslint: 9.36.0(jiti@2.5.1)
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1)))(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-n: 17.23.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
eslint-plugin-promise: 7.2.1(eslint@9.36.0(jiti@2.5.1))
eslint-plugin-react: 7.37.5(eslint@9.36.0(jiti@2.5.1))
find-up: 5.0.0
globals: 15.15.0
peowly: 1.3.2
typescript-eslint: 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
typescript-eslint: 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
transitivePeerDependencies:
- '@typescript-eslint/utils'
- eslint-import-resolver-node
@@ -15743,12 +15751,6 @@ snapshots:
exsolve: 1.0.4
pathe: 2.0.3
pkg-types@2.2.0:
dependencies:
confbox: 0.2.2
exsolve: 1.0.7
pathe: 2.0.3
pkg-types@2.3.0:
dependencies:
confbox: 0.2.2
@@ -16530,11 +16532,6 @@ snapshots:
astral-regex: 2.0.0
is-fullwidth-code-point: 3.0.0
slice-ansi@5.0.0:
dependencies:
ansi-styles: 6.2.1
is-fullwidth-code-point: 4.0.0
slice-ansi@7.1.0:
dependencies:
ansi-styles: 6.2.1
@@ -16636,6 +16633,11 @@ snapshots:
get-east-asian-width: 1.2.0
strip-ansi: 7.1.0
string-width@8.1.0:
dependencies:
get-east-asian-width: 1.4.0
strip-ansi: 7.1.0
string.prototype.matchall@4.0.12:
dependencies:
call-bind: 1.0.8
@@ -16885,7 +16887,7 @@ snapshots:
tapable@2.2.1: {}
tar@7.4.4:
tar@7.5.1:
dependencies:
'@isaacs/fs-minipass': 4.0.1
chownr: 3.0.0
@@ -17088,12 +17090,12 @@ snapshots:
dependencies:
is-typedarray: 1.0.0
typescript-eslint@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2):
typescript-eslint@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2):
dependencies:
'@typescript-eslint/eslint-plugin': 8.44.0(@typescript-eslint/parser@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/parser': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/typescript-estree': 8.44.0(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/eslint-plugin': 8.44.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
'@typescript-eslint/typescript-estree': 8.44.1(typescript@5.9.2)
'@typescript-eslint/utils': 8.44.1(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)
eslint: 9.36.0(jiti@2.5.1)
typescript: 5.9.2
transitivePeerDependencies:
@@ -17129,6 +17131,8 @@ snapshots:
ufo@1.5.4: {}
ufo@1.6.1: {}
unbox-primitive@1.0.2:
dependencies:
call-bind: 1.0.8
@@ -17174,22 +17178,22 @@ snapshots:
trough: 2.2.0
vfile: 6.0.1
unimport@5.2.0:
unimport@5.4.0:
dependencies:
acorn: 8.15.0
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
local-pkg: 1.1.2
magic-string: 0.30.18
mlly: 1.7.4
magic-string: 0.30.19
mlly: 1.8.0
pathe: 2.0.3
picomatch: 4.0.3
pkg-types: 2.2.0
pkg-types: 2.3.0
scule: 1.3.0
strip-literal: 3.0.0
tinyglobby: 0.2.14
tinyglobby: 0.2.15
unplugin: 2.3.10
unplugin-utils: 0.2.4
unplugin-utils: 0.3.0
unique-string@1.0.0:
dependencies:
@@ -17233,13 +17237,13 @@ snapshots:
universalify@2.0.1: {}
unplugin-auto-import@20.1.0:
unplugin-auto-import@20.2.0:
dependencies:
local-pkg: 1.1.2
magic-string: 0.30.18
magic-string: 0.30.19
picomatch: 4.0.3
unimport: 5.2.0
unplugin: 2.3.9
unimport: 5.4.0
unplugin: 2.3.10
unplugin-utils: 0.3.0
unplugin-icons@22.3.0(@svgr/core@8.1.0(typescript@5.9.2)):
@@ -17254,11 +17258,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
unplugin-utils@0.2.4:
dependencies:
pathe: 2.0.3
picomatch: 4.0.3
unplugin-utils@0.3.0:
dependencies:
pathe: 2.0.3
@@ -17271,13 +17270,6 @@ snapshots:
picomatch: 4.0.3
webpack-virtual-modules: 0.6.2
unplugin@2.3.9:
dependencies:
'@jridgewell/remapping': 2.3.5
acorn: 8.15.0
picomatch: 4.0.3
webpack-virtual-modules: 0.6.2
unrs-resolver@1.10.1:
dependencies:
napi-postinstall: 0.3.0
+1 -1
View File
@@ -22,7 +22,7 @@
"fs-extra": "11.3.2",
"octokit": "5.0.3",
"picocolors": "1.1.1",
"tar": "7.4.4",
"tar": "7.5.1",
"telegram": "2.26.22",
"undici": "7.16.0",
"yargs": "18.0.0"
+20
View File
@@ -2,6 +2,26 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [2.44.0](https://github.com/filebrowser/filebrowser/compare/v2.43.0...v2.44.0) (2025-09-25)
### Features
* allow setting ace editor theme ([#3826](https://github.com/filebrowser/filebrowser/issues/3826)) ([b9787c7](https://github.com/filebrowser/filebrowser/commit/b9787c78f3889171f94db19e7655dce68c64b6fb))
* Improved path display in the new file and directory modal ([#5451](https://github.com/filebrowser/filebrowser/issues/5451)) ([d29ad35](https://github.com/filebrowser/filebrowser/commit/d29ad356d1067c87b2821debab91286549f512a0))
* Translate frontend/src/i18n/en.json in no ([dec7a02](https://github.com/filebrowser/filebrowser/commit/dec7a027378fbc6948d203199c44a640a141bcad))
* Updates for project File Browser ([#5446](https://github.com/filebrowser/filebrowser/issues/5446)) ([4ff247e](https://github.com/filebrowser/filebrowser/commit/4ff247e134e4d61668ee656a258ed67f71414e18))
* Updates for project File Browser ([#5450](https://github.com/filebrowser/filebrowser/issues/5450)) ([0eade71](https://github.com/filebrowser/filebrowser/commit/0eade717ce9d04bf48051922f11d983edbc7c2d0))
* Updates for project File Browser ([#5457](https://github.com/filebrowser/filebrowser/issues/5457)) ([1165f00](https://github.com/filebrowser/filebrowser/commit/1165f00bd4dcb0dcfbc084f54f51902ba4b4a714))
### Bug Fixes
* computation of file path ([c472542](https://github.com/filebrowser/filebrowser/commit/c4725428e07da72b855009e2c13c6ed91d32e0b7))
* show login when session token expires ([e6c674b](https://github.com/filebrowser/filebrowser/commit/e6c674b3c616831942c4d4aacab0907d58003e23))
* some formatting issues with i18n files ([949ddff](https://github.com/filebrowser/filebrowser/commit/949ddffef20e38169902c5fd74dca4815dcecf11))
* **upload:** throttle upload speed calculation to 100ms to avoid Infinity MB/s ([#5456](https://github.com/filebrowser/filebrowser/issues/5456)) ([692ca5e](https://github.com/filebrowser/filebrowser/commit/692ca5eaf01e4dcf346ba03f82c5dbd50cce246b))
## [2.43.0](https://github.com/filebrowser/filebrowser/compare/v2.42.5...v2.43.0) (2025-09-13)
+1
View File
@@ -221,6 +221,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode)
fmt.Fprintf(w, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
fmt.Fprintf(w, "\tAce editor syntax highlighting theme:\t%s\n", set.Defaults.AceEditorTheme)
fmt.Fprintf(w, "\tSorting:\n")
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)
fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)
+4 -3
View File
@@ -424,9 +424,10 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) error {
MinimumPasswordLength: settings.DefaultMinimumPasswordLength,
UserHomeBasePath: settings.DefaultUsersHomeBasePath,
Defaults: settings.UserDefaults{
Scope: ".",
Locale: "en",
SingleClick: false,
Scope: ".",
Locale: "en",
SingleClick: false,
AceEditorTheme: getStringParam(flags, "defaults.aceEditorTheme"),
Perm: users.Permissions{
Admin: false,
Execute: true,
+3
View File
@@ -79,6 +79,7 @@ func addUserFlags(flags *pflag.FlagSet) {
flags.Bool("singleClick", false, "use single clicks only")
flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)")
flags.Bool("hideDotfiles", false, "hide dotfiles")
flags.String("aceEditorTheme", "", "ace editor's syntax highlighting theme for users")
}
func getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) {
@@ -110,6 +111,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all
defaults.ViewMode, err = getViewMode(flags)
case "singleClick":
defaults.SingleClick, err = getBool(flags, flag.Name)
case "aceEditorTheme":
defaults.AceEditorTheme, err = getString(flags, flag.Name)
case "perm.admin":
defaults.Perm.Admin, err = getBool(flags, flag.Name)
case "perm.execute":
@@ -0,0 +1,86 @@
<template>
<div>
<div class="path-container" ref="container">
<template v-for="(item, index) in path" :key="index">
/
<span class="path-item">
<span
v-if="isDir === true || index < path.length - 1"
class="material-icons"
>folder
</span>
<span v-else class="material-icons">insert_drive_file</span>
{{ item }}
</span>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch, nextTick, defineProps } from "vue";
import { useRoute } from "vue-router";
import { useFileStore } from "@/stores/file";
import url from "@/utils/url";
const fileStore = useFileStore();
const route = useRoute();
const props = defineProps({
name: {
type: String,
required: true,
},
isDir: {
type: Boolean,
default: false,
},
});
const container = ref<HTMLElement | null>(null);
const path = computed(() => {
let basePath = fileStore.isFiles ? route.path : url.removeLastDir(route.path);
if (!basePath.endsWith("/")) {
basePath += "/";
}
basePath += props.name;
return basePath.split("/").filter(Boolean).splice(1);
});
watch(path, () => {
nextTick(() => {
const lastItem = container.value?.lastElementChild;
lastItem?.scrollIntoView({ behavior: "auto", inline: "end" });
});
});
</script>
<style scoped>
.path-container {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
overflow-x: auto;
max-width: 100%;
scrollbar-width: none;
opacity: 0.5;
}
.path-container::-webkit-scrollbar {
display: none;
}
.path-item {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
white-space: nowrap;
}
.path-item > span {
font-size: 0.9em;
}
</style>
@@ -14,6 +14,7 @@
v-model.trim="name"
tabindex="1"
/>
<CreateFilePath :name="name" :is-dir="true" />
</div>
<div class="card-action">
@@ -48,6 +49,7 @@ import { files as api } from "@/api";
import url from "@/utils/url";
import { useRoute, useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
const $showError = inject<IToastError>("$showError")!;
@@ -13,6 +13,7 @@
@keyup.enter="submit"
v-model.trim="name"
/>
<CreateFilePath :name="name" />
</div>
<div class="card-action">
@@ -42,6 +43,7 @@ import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
import { files as api } from "@/api";
import url from "@/utils/url";
@@ -14,7 +14,7 @@
}}
</h2>
<div class="upload-info">
<div class="upload-speed">{{ speedMbytes }}/s</div>
<div class="upload-speed">{{ speedText }}/s</div>
<div class="upload-eta">{{ formattedETA }} remaining</div>
<div class="upload-percentage">{{ sentPercent }}% Completed</div>
<div class="upload-fraction">
@@ -88,6 +88,7 @@ const uploadStore = useUploadStore();
const { sentBytes, totalBytes } = storeToRefs(uploadStore);
const byteToMbyte = partial({ exponent: 2 });
const byteToKbyte = partial({ exponent: 1 });
const sentPercent = computed(() =>
((uploadStore.sentBytes / uploadStore.totalBytes) * 100).toFixed(2)
@@ -95,11 +96,33 @@ const sentPercent = computed(() =>
const sentMbytes = computed(() => byteToMbyte(uploadStore.sentBytes));
const totalMbytes = computed(() => byteToMbyte(uploadStore.totalBytes));
const speedMbytes = computed(() => byteToMbyte(speed.value));
const speedText = computed(() => {
const bytes = speed.value;
if (bytes < 1024 * 1024) {
const kb = parseFloat(byteToKbyte(bytes));
return `${kb.toFixed(2)} KB`;
} else {
const mb = parseFloat(byteToMbyte(bytes));
return `${mb.toFixed(2)} MB`;
}
});
let lastSpeedUpdate: number = 0;
let recentSpeeds: number[] = [];
let lastThrottleTime = 0;
const throttledCalculateSpeed = (sentBytes: number, oldSentBytes: number) => {
const now = Date.now();
if (now - lastThrottleTime < 100) {
return;
}
lastThrottleTime = now;
calculateSpeed(sentBytes, oldSentBytes);
};
const calculateSpeed = (sentBytes: number, oldSentBytes: number) => {
// Reset the state when the uploads batch is complete
if (sentBytes === 0) {
@@ -149,7 +172,7 @@ const calculateEta = () => {
eta.value = remainingSize / speedBytesPerSecond;
};
watch(sentBytes, calculateSpeed);
watch(sentBytes, throttledCalculateSpeed);
watch(totalBytes, (totalBytes, oldTotalBytes) => {
if (oldTotalBytes !== 0) {
@@ -0,0 +1,24 @@
<template>
<select name="selectAceEditorTheme" v-on:change="change" :value="aceEditorTheme">
<option v-for="theme in themes" :value="theme.theme" :key="theme.theme">
{{ theme.name }}
</option>
</select>
</template>
<script setup lang="ts">
import { type SelectHTMLAttributes } from "vue";
import { themes } from "ace-builds/src-noconflict/ext-themelist";
defineProps<{
aceEditorTheme: string;
}>();
const emit = defineEmits<{
(e: "update:aceEditorTheme", val: string | null): void;
}>();
const change = (event: Event) => {
emit("update:aceEditorTheme", (event.target as SelectHTMLAttributes)?.value);
};
</script>
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "تحديث",
"upload": "رفع",
"openFile": "فتح الملف",
"discardChanges": "إلغاء التغييرات",
"saveChanges": "Save changes"
"discardChanges": "إلغاء التغييرات",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "تحميل الملف",
@@ -158,6 +158,7 @@
"video": "فيديوهات"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "إدارة",
"administrator": "مدير",
"allowCommands": "تنفيذ اﻷوامر",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Actualitzar",
"upload": "Pujar",
"openFile": "Obrir fitxer",
"discardChanges": "Descartar",
"saveChanges": "Save changes"
"discardChanges": "Descartar",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarregar fitxer",
@@ -158,6 +158,7 @@
"video": "Vídeo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandes",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Aktualizovat",
"upload": "Nahrát",
"openFile": "Otevřít soubor",
"discardChanges": "Zrušit změny",
"saveChanges": "Save changes"
"discardChanges": "Zrušit změny",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Stáhnout soubor",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrátor",
"allowCommands": "Povolit příkazy",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Datei öffnen",
"discardChanges": "Verwerfen",
"saveChanges": "Save changes"
"discardChanges": "Verwerfen",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Download Datei",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Befehle ausführen",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Ενημέρωση",
"upload": "Μεταφόρτωση",
"openFile": "Άνοιγμα αρχείου",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Λήψη αρχείου",
@@ -158,6 +158,7 @@
"video": "Βίντεο"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Διαχειριστής",
"administrator": "Διαχειριστής",
"allowCommands": "Εκτέλεση εντολών",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Download File",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Execute commands",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Actualizar",
"upload": "Subir",
"openFile": "Abrir archivo",
"discardChanges": "Discard",
"saveChanges": "Guardar cambios"
"discardChanges": "Discard",
"saveChanges": "Guardar cambios"
},
"download": {
"downloadFile": "Descargar fichero",
@@ -158,6 +158,7 @@
"video": "Vídeo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Ejecutar comandos",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "به روز سانی",
"upload": "آپلود",
"openFile": "باز کردن فایل",
"discardChanges": "لغو کردن",
"saveChanges": "Save changes"
"discardChanges": "لغو کردن",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "دانلود فایل",
@@ -158,6 +158,7 @@
"video": "ویدئو "
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "اجرای دستورات",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Mettre à jour",
"upload": "Importer",
"openFile": "Ouvrir le fichier",
"discardChanges": "Annuler",
"saveChanges": "Save changes"
"discardChanges": "Annuler",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Télécharger le fichier",
@@ -158,6 +158,7 @@
"video": "Vidéo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrateur·ice",
"allowCommands": "Exécuter des commandes",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "עדכון",
"upload": "העלאה",
"openFile": "פתח קובץ",
"discardChanges": "זריקת השינויים",
"saveChanges": "Save changes"
"discardChanges": "זריקת השינויים",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "הורד קובץ",
@@ -158,6 +158,7 @@
"video": "וידאו"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "מנהל",
"administrator": "מנהל ראשי",
"allowCommands": "הפעלת פקודות",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Frissítés",
"upload": "Feltöltés",
"openFile": "Fájl megnyitása",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Fájl letöltése",
@@ -158,6 +158,7 @@
"video": "Videó"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Adminisztrátor",
"allowCommands": "Parancsok futtatása",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Vista",
"upload": "Hlaða upp",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Sækja skjal",
@@ -158,6 +158,7 @@
"video": "Myndbönd"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Stjórnandi",
"administrator": "Stjórnandi",
"allowCommands": "Senda skipanir",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Aggiorna",
"upload": "Carica",
"openFile": "Apri file",
"discardChanges": "Ignora",
"saveChanges": "Save changes"
"discardChanges": "Ignora",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Scarica file",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Amministratore",
"allowCommands": "Esegui comandi",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "更新",
"upload": "アップロード",
"openFile": "ファイルを開く",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "ファイルのダウンロード",
@@ -158,6 +158,7 @@
"video": "動画"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理者",
"administrator": "管理者",
"allowCommands": "コマンドの実行",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "업데이트",
"upload": "업로드",
"openFile": "파일 열기",
"discardChanges": "변경 사항 취소",
"saveChanges": "변경사항 저장"
"discardChanges": "변경 사항 취소",
"saveChanges": "변경사항 저장"
},
"download": {
"downloadFile": "파일 다운로드",
@@ -158,6 +158,7 @@
"video": "비디오"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "관리자",
"administrator": "관리자",
"allowCommands": "명령 실행",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Updaten",
"upload": "Uploaden",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Bestand downloaden",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Commando's uitvoeren",
+4 -3
View File
@@ -42,8 +42,8 @@
"update": "Opptater",
"upload": "Last opp",
"openFile": "Open file",
"discardChanges": "Slett",
"saveChanges": "Lagre Endringane "
"discardChanges": "Slett",
"saveChanges": "Lagre Endringane "
},
"download": {
"downloadFile": "Nedlast filen",
@@ -103,7 +103,7 @@
"usernameTaken": "Brukernavn er allerede i bruk",
"wrongCredentials": "Feil legitimasjon",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
"inactivity": "Du har blitt logget ut på grunn av inaktivitet"
}
},
"permanent": "Permanent",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Utfør kommandoer",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Aktualizuj",
"upload": "Wyślij",
"openFile": "Otwórz plik",
"discardChanges": "Odrzuć",
"saveChanges": "Zapisz zmiany"
"discardChanges": "Odrzuć",
"saveChanges": "Zapisz zmiany"
},
"download": {
"downloadFile": "Pobierz plik",
@@ -158,6 +158,7 @@
"video": "Wideo"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Wykonaj polecenie",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Atualizar",
"upload": "Enviar",
"openFile": "Abrir",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Baixar arquivo",
@@ -158,6 +158,7 @@
"video": "Vídeos"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Atualizar",
"upload": "Enviar",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarregar ficheiro",
@@ -158,6 +158,7 @@
"video": "Vídeos"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Actualizează",
"upload": "Încarcă",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Descarcă fișier",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Execută comenzi",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Обновить",
"upload": "Загрузить",
"openFile": "Открыть файл",
"discardChanges": "Отказаться",
"saveChanges": "Save changes"
"discardChanges": "Отказаться",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Скачать файл",
@@ -158,6 +158,7 @@
"video": "Видео"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Админ",
"administrator": "Администратор",
"allowCommands": "Запуск команд",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Aktualizovať",
"upload": "Nahrať",
"openFile": "Otvoriť súbor",
"discardChanges": "Zahodiť",
"saveChanges": "Save changes"
"discardChanges": "Zahodiť",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Stiahnuť súbor",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administrátor",
"allowCommands": "Vykonávať príkazy",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Uppdatera",
"upload": "Ladda upp",
"openFile": "Open file",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Ladda ner fil",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin",
"administrator": "Administratör",
"allowCommands": "Exekvera kommandon",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Güncelle",
"upload": "Yükle",
"openFile": "Dosyayı aç",
"discardChanges": "Discard",
"saveChanges": "Save changes"
"discardChanges": "Discard",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Dosyayı indir",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Yönetim",
"administrator": "Yönetici",
"allowCommands": "Komutları çalıştır",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Оновити",
"upload": "Вивантажити",
"openFile": "Відкрити файл",
"discardChanges": "Скасувати",
"saveChanges": "Save changes"
"discardChanges": "Скасувати",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Завантажити файл",
@@ -158,6 +158,7 @@
"video": "Відео"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Адмін",
"administrator": "Адміністратор",
"allowCommands": "Запуск команд",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "Cập nhật",
"upload": "Tải lên",
"openFile": "Mở tệp",
"discardChanges": "Hủy bỏ thay đổi",
"saveChanges": "Save changes"
"discardChanges": "Hủy bỏ thay đổi",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "Tải xuống tệp tin",
@@ -158,6 +158,7 @@
"video": "Video"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Quản trị viên",
"administrator": "Người quản trị",
"allowCommands": "Thực thi lệnh",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "更新",
"upload": "上传",
"openFile": "打开文件",
"discardChanges": "放弃更改",
"saveChanges": "Save changes"
"discardChanges": "放弃更改",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "下载文件",
@@ -158,6 +158,7 @@
"video": "视频"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理员",
"administrator": "管理员",
"allowCommands": "执行命令(Shell 命令)",
+3 -2
View File
@@ -42,8 +42,8 @@
"update": "更新",
"upload": "上傳",
"openFile": "開啟檔案",
"discardChanges": "放棄變更",
"saveChanges": "Save changes"
"discardChanges": "放棄變更",
"saveChanges": "Save changes"
},
"download": {
"downloadFile": "下載檔案",
@@ -158,6 +158,7 @@
"video": "影片"
},
"settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理員",
"administrator": "管理員",
"allowCommands": "執行命令",
+1
View File
@@ -21,6 +21,7 @@ interface SettingsDefaults {
commands: any[];
hideDotfiles: boolean;
dateFormat: boolean;
aceEditorTheme: string;
}
interface SettingsBranding {
+1
View File
@@ -13,6 +13,7 @@ interface IUser {
dateFormat: boolean;
viewMode: ViewModeType;
sorting?: Sorting;
aceEditorTheme: string;
}
type ViewModeType = "list" | "mosaic" | "mosaic gallery";
+16
View File
@@ -1,4 +1,6 @@
import { theme } from "./constants";
import "ace-builds";
import { themesByName } from "ace-builds/src-noconflict/ext-themelist";
export const getTheme = (): UserTheme => {
return (document.documentElement.className as UserTheme) || theme;
@@ -32,3 +34,17 @@ export const getMediaPreference = (): UserTheme => {
return "light";
}
};
export const getEditorTheme = (themeName: string) => {
if (!themeName.startsWith("ace/theme/")) {
themeName = `ace/theme/${themeName}`;
}
const themeKey = themeName.replace("ace/theme/", "");
if (themesByName[themeKey] !== undefined) {
return themeName;
} else if (getTheme() === "dark") {
return "ace/theme/twilight";
} else {
return "ace/theme/chrome";
}
};
@@ -69,7 +69,7 @@ import HeaderBar from "@/components/header/HeaderBar.vue";
import { useAuthStore } from "@/stores/auth";
import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout";
import { getTheme } from "@/utils/theme";
import { getEditorTheme } from "@/utils/theme";
import { marked } from "marked";
import { inject, onBeforeUnmount, onMounted, ref, watchEffect } from "vue";
import { useI18n } from "vue-i18n";
@@ -122,7 +122,7 @@ onMounted(() => {
value: fileContent,
showPrintMargin: false,
readOnly: fileStore.req?.type === "textImmutable",
theme: "ace/theme/chrome",
theme: getEditorTheme(authStore.user?.aceEditorTheme ?? ""),
mode: modelist.getModeForPath(fileStore.req!.name).mode,
wrap: true,
enableBasicAutocompletion: true,
@@ -130,10 +130,6 @@ onMounted(() => {
enableSnippets: true,
});
if (getTheme() === "dark") {
editor.value!.setTheme("ace/theme/twilight");
}
editor.value.setFontSize(fontSize.value);
editor.value.focus();
});
@@ -219,6 +215,13 @@ const decreaseFontSize = () => {
};
const close = () => {
if (!editor.value?.session.getUndoManager().isClean()) {
layoutStore.showHover("discardEditorChanges");
return;
}
fileStore.updateRequest(null);
const uri = url.removeLastDir(route.path) + "/";
router.push({ path: uri });
};
@@ -24,6 +24,13 @@
class="input input--block"
v-model:locale="locale"
></languages>
<h3>{{ t("settings.aceEditorTheme") }}</h3>
<AceEditorTheme
class="input input--block"
v-model:aceEditorTheme="aceEditorTheme"
id="aceTheme"
></AceEditorTheme>
</div>
<div class="card-action">
@@ -81,6 +88,7 @@
import { useAuthStore } from "@/stores/auth";
import { useLayoutStore } from "@/stores/layout";
import { users as api } from "@/api";
import AceEditorTheme from "@/components/settings/AceEditorTheme.vue";
import Languages from "@/components/settings/Languages.vue";
import { computed, inject, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n";
@@ -98,6 +106,7 @@ const hideDotfiles = ref<boolean>(false);
const singleClick = ref<boolean>(false);
const dateFormat = ref<boolean>(false);
const locale = ref<string>("");
const aceEditorTheme = ref<string>("");
const passwordClass = computed(() => {
const baseClass = "input input--block";
@@ -113,13 +122,14 @@ const passwordClass = computed(() => {
return `${baseClass} input--red`;
});
onMounted(() => {
onMounted(async () => {
layoutStore.loading = true;
if (authStore.user === null) return false;
locale.value = authStore.user.locale;
hideDotfiles.value = authStore.user.hideDotfiles;
singleClick.value = authStore.user.singleClick;
dateFormat.value = authStore.user.dateFormat;
aceEditorTheme.value = authStore.user.aceEditorTheme;
layoutStore.loading = false;
return true;
});
@@ -163,6 +173,7 @@ const updateSettings = async (event: Event) => {
hideDotfiles: hideDotfiles.value,
singleClick: singleClick.value,
dateFormat: dateFormat.value,
aceEditorTheme: aceEditorTheme.value,
};
await api.update(data, [
@@ -170,6 +181,7 @@ const updateSettings = async (event: Event) => {
"hideDotfiles",
"singleClick",
"dateFormat",
"aceEditorTheme",
]);
authStore.updateUser(data);
$showSuccess(t("settings.settingsUpdated"));
+22 -20
View File
@@ -21,16 +21,17 @@ const (
)
type userInfo struct {
ID uint `json:"id"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
LockPassword bool `json:"lockPassword"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Username string `json:"username"`
ID uint `json:"id"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
LockPassword bool `json:"lockPassword"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Username string `json:"username"`
AceEditorTheme string `json:"aceEditorTheme"`
}
type authToken struct {
@@ -190,16 +191,17 @@ func renewHandler(tokenExpireTime time.Duration) handleFunc {
func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) {
claims := &authToken{
User: userInfo{
ID: user.ID,
Locale: user.Locale,
ViewMode: user.ViewMode,
SingleClick: user.SingleClick,
Perm: user.Perm,
LockPassword: user.LockPassword,
Commands: user.Commands,
HideDotfiles: user.HideDotfiles,
DateFormat: user.DateFormat,
Username: user.Username,
ID: user.ID,
Locale: user.Locale,
ViewMode: user.ViewMode,
SingleClick: user.SingleClick,
Perm: user.Perm,
LockPassword: user.LockPassword,
Commands: user.Commands,
HideDotfiles: user.HideDotfiles,
DateFormat: user.DateFormat,
Username: user.Username,
AceEditorTheme: user.AceEditorTheme,
},
RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(time.Now()),
+11 -9
View File
@@ -8,15 +8,16 @@ import (
// UserDefaults is a type that holds the default values
// for some fields on User.
type UserDefaults struct {
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
Scope string `json:"scope"`
Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
}
// Apply applies the default options to a user.
@@ -30,4 +31,5 @@ func (d *UserDefaults) Apply(u *users.User) {
u.Commands = d.Commands
u.HideDotfiles = d.HideDotfiles
u.DateFormat = d.DateFormat
u.AceEditorTheme = d.AceEditorTheme
}
+2 -1
View File
@@ -3,5 +3,6 @@
"@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0",
"standard-version": "^9.3.2"
}
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}
+16 -15
View File
@@ -20,21 +20,22 @@ const (
// User describes a user.
type User struct {
ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"`
Password string `json:"password"`
Scope string `json:"scope"`
Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"`
Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"`
Fs afero.Fs `json:"-" yaml:"-"`
Rules []rules.Rule `json:"rules"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"`
Password string `json:"password"`
Scope string `json:"scope"`
Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"`
Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"`
Fs afero.Fs `json:"-" yaml:"-"`
Rules []rules.Rule `json:"rules"`
HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
}
// GetRules implements rules.Provider.
+2 -2
View File
@@ -510,7 +510,7 @@
#address-cells = <1>;
#size-cells = <0>;
status = "disable"
status = "disabled";
};
i2c1: i2c1@1fbf8100 {
@@ -524,7 +524,7 @@
#address-cells = <1>;
#size-cells = <0>;
status = "disable"
status = "disabled";
};
snfi: spi@1fa10000 {
@@ -1,76 +0,0 @@
--- a/drivers/mtd/nand/spi/gigadevice.c
+++ b/drivers/mtd/nand/spi/gigadevice.c
@@ -323,6 +323,16 @@
SPINAND_HAS_QE_BIT,
SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops,
gd5fxgq4ufxxg_ecc_get_status)),
+ SPINAND_INFO("GD5F1GQ4UC",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd1),
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(8, 2048),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
SPINAND_INFO("GD5F4GQ4UC",
SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb4, 0x68),
NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
@@ -496,6 +506,56 @@
SPINAND_INFO("GD5F4GM8RExxG",
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85),
NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
+ SPINAND_INFO("GD5F2GQ5xExxH",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
+ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(4, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
+ SPINAND_INFO("GD5F1GQ5RExxH",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x21),
+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(4, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
+ SPINAND_INFO("GD5F1GQ4RExxH",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xc9),
+ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(4, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
+ SPINAND_INFO("GD5F1GM9UExxG",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91, 0x01),
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
+ &write_cache_variants,
+ &update_cache_variants),
+ SPINAND_HAS_QE_BIT,
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
+ gd5fxgq4uexxg_ecc_get_status)),
+ SPINAND_INFO("GD5F1GM9RExxG",
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81, 0x01),
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
NAND_ECCREQ(8, 512),
SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
&write_cache_variants,
@@ -563,7 +563,7 @@
* although the pcie1 phy probes successfully, the controller is unable
* to bring it up. So let's disable it until a solution is found.
*/
status = "disbled"
status = "disabled";
perst-gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
@@ -75,16 +75,16 @@ func (mc *mieruClient) Store(config *ClientConfig) error {
mc.mu.Lock()
defer mc.mu.Unlock()
if config == nil {
return fmt.Errorf("%w: client config is nil", ErrInvalidConfigConfig)
return fmt.Errorf("%w: client config is nil", ErrInvalidClientConfig)
}
if config.Profile == nil {
return fmt.Errorf("%w: client config profile is nil", ErrInvalidConfigConfig)
return fmt.Errorf("%w: client config profile is nil", ErrInvalidClientConfig)
}
if mc.running {
return ErrStoreClientConfigAfterStart
}
if err := appctlcommon.ValidateClientConfigSingleProfile(config.Profile); err != nil {
return fmt.Errorf("%w: %s", ErrInvalidConfigConfig, err.Error())
return fmt.Errorf("%w: %s", ErrInvalidClientConfig, err.Error())
}
mc.config = config
return nil
+2 -2
View File
@@ -26,12 +26,12 @@ import (
var (
ErrNoClientConfig = errors.New("no client config")
ErrInvalidConfigConfig = errors.New("invalid client config")
ErrInvalidClientConfig = errors.New("invalid client config")
ErrClientIsNotRunning = errors.New("client is not running")
ErrStoreClientConfigAfterStart = errors.New("can't store client config after start")
)
// Client contains methods supported by a mieru client.
// Client contains methods supported by a proxy client.
type Client interface {
ClientConfigurationService
ClientLifecycleService
+18
View File
@@ -0,0 +1,18 @@
// Copyright (C) 2025 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// Package server provides mieru server APIs for third party applications
// to integrate mieru protocol.
package server
+73
View File
@@ -0,0 +1,73 @@
// Copyright (C) 2025 mieru authors
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package server
import (
"errors"
"github.com/enfein/mieru/v3/pkg/appctl/appctlpb"
)
var (
ErrNoServerConfig = errors.New("no server config")
ErrInvalidServerConfig = errors.New("invalid server config")
ErrServerIsNotRunning = errors.New("server is not running")
ErrStoreServerConfigAfterStart = errors.New("can't store server config after start")
)
// Server contains methods supported by a proxy server.
type Server interface {
ServerConfigurationService
ServerLifecycleService
ServerNetworkService
}
// ServerConfigurationService contains methods to manage proxy server configuration.
type ServerConfigurationService interface {
// Load returns the server config.
// It returns ErrNoServerConfig if server config is never stored.
Load() (*ServerConfig, error)
// Store saves the server config.
// It returns wrapped ErrInvalidServerConfig error
// if the provided server config is invalid.
// It returns ErrStoreServerConfigAfterStart error
// if it is called after start.
Store(*ServerConfig) error
}
// ServerLifecycleService contains methods to manage proxy server lifecycle.
type ServerLifecycleService interface {
// Start activates the server with the stored configuration.
// Calling Start function more than once has undefined behavior.
Start() error
// Stop deactivates the server.
// Established network connections are NOT terminated.
// After stop, the server can't be reused.
Stop() error
// IsRunning returns true if the server has been started
// and has not been stopped.
IsRunning() bool
}
type ServerNetworkService interface{}
// ServerConfig stores proxy server configuration.
type ServerConfig struct {
Config *appctlpb.ServerConfig
}
@@ -533,6 +533,9 @@ int main(int argc, char* argv[]) {
naive_proxies.push_back(std::move(naive_proxy));
}
if (getenv("TEST_MARK_STARTUP") != nullptr) {
LOG(INFO) << "TEST_MARK_STARTUP";
}
base::RunLoop().Run();
return EXIT_SUCCESS;
+4 -2
View File
@@ -97,7 +97,9 @@ def start_naive(naive_args, config_file):
cmdline = [argv.naive]
cmdline.extend(naive_args)
proc = subprocess.Popen(cmdline, stdout=subprocess.DEVNULL,
env = os.environ.copy()
env["TEST_MARK_STARTUP"] = "yes"
proc = subprocess.Popen(cmdline, stdout=subprocess.DEVNULL, env=env,
stderr=subprocess.PIPE, text=True, encoding='utf-8')
print('subprocess.Popen', ' '.join(cmdline), 'pid:', proc.pid)
@@ -122,7 +124,7 @@ def start_naive(naive_args, config_file):
print('terminate pid', proc.pid)
proc.terminate()
return 'Failed to listen'
elif 'Listening on ' in line:
elif 'TEST_MARK_STARTUP' in line:
timeout.cancel()
return proc
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=filebrowser
PKG_VERSION:=2.43.0
PKG_VERSION:=2.44.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/filebrowser/filebrowser/tar.gz/v${PKG_VERSION}?
PKG_HASH:=9c3acee7567986ceef331e3eea0236b4dd9a41bf3874449fbb9bdc22c00a0aab
PKG_HASH:=b2ceb3c9bbfb6e0e2c31764b8ff1d7788fa965081eb3d43452b6a5065027f71f
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
@@ -1415,15 +1415,12 @@ footer > a {
margin-left: 0;
margin-right: 0;
margin-top: 0rem;
}
.container .alert,
.container .alert-message.error {
position: relative;
top: 0;
transform:translate(-50%, 0);
width: 100%;
}
.lg {
margin: 0;
padding: 0 !important;
@@ -2574,7 +2571,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
padding: 0.5rem;
cursor: auto;
white-space: pre-wrap;
color: var(--gray-dark);
color: var(--dark-primary);
outline: 0;
border-radius: 0.25rem;
border: 1px solid var(--lighter);
@@ -3467,6 +3464,7 @@ pre.command-output {
background: #fb6340 !important;
border-color: #fb6340 !important;
margin-left: 0 !important;
width: 82px !important;
}
/* applyreboot fix */
#applyreboot-container {
@@ -275,16 +275,12 @@ select[multiple="multiple"] {
margin-left: 0;
margin-right: 0;
margin-top: 0rem;
}
.container .alert,
.container .alert-message.error {
position: relative;
top: 0;
transform:translate(-50%, 0);
width: 100%;
}
.lg {
margin: 0;
padding: 0 !important;
@@ -1671,7 +1667,7 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
padding: 0.5rem;
cursor: auto;
white-space: pre-wrap;
color: var(--gray-dark);
color: var(--dark-primary);
outline: 0;
border-radius: 0.25rem;
border: 1px solid var(--lighter);
@@ -362,6 +362,7 @@
background: #fb6340 !important;
border-color: #fb6340 !important;
margin-left: 0 !important;
width: 82px !important;
}
}
@@ -948,4 +949,4 @@ div[style*="display:grid;grid-template-columns:repeat"] {
[data-page^="command-cfg"] .mobile-hide,
[data-page^="command-cfg"] .showSide {
display: none;
}
}
@@ -297,6 +297,14 @@ const trojan_cipher_methods = [
['chacha20-ietf-poly1305', _('chacha20-ietf-poly1305')]
];
const tls_client_auth_types = [
['', _('none')],
['request', _('Request')],
['require-any', _('Require any')],
['verify-if-given', _('Verify if given')],
['require-and-verify', _('Require and verify')]
];
const tls_client_fingerprints = [
['chrome'],
['firefox'],
@@ -1585,6 +1593,16 @@ function validateJson(section_id, value) {
return true;
}
function validateMTLSClientAuth(type_option, section_id, value) {
// If `client-auth-type` is set to "verify-if-given" or "require-and-verify", `client-auth-cert` must not be empty.
const auth_type = this.section.getOption(type_option).formvalue(section_id);
//this.section.getUIElement('tls_client_auth_type').getValue();
if (!value && ["verify-if-given", "require-and-verify"].includes(auth_type))
return _('Expecting: %s').format(_('non-empty value'));
return true;
}
function validateBase64Key(length, section_id, value) {
/* Thanks to luci-proto-wireguard */
if (value)
@@ -1819,6 +1837,7 @@ return baseclass.extend({
shadowsocks_cipher_methods,
shadowsocks_cipher_length,
trojan_cipher_methods,
tls_client_auth_types,
tls_client_fingerprints,
vless_flow,
@@ -1869,6 +1888,7 @@ return baseclass.extend({
validateAuthPassword,
validateCommonPort,
validateJson,
validateMTLSClientAuth,
validateBase64Key,
validateShadowsocksPassword,
validateBytesize,
@@ -546,6 +546,17 @@ return view.extend({
so.datatype = 'file';
so.value('/etc/ssl/acme/example.key');
so = ss.option(form.ListValue, 'tls_client_auth_type', _('API Client Auth type') + _(' (mTLS)'));
so.default = hm.tls_client_auth_types[0][0];
hm.tls_client_auth_types.forEach((res) => {
so.value.apply(so, res);
})
so = ss.option(form.Value, 'tls_client_auth_cert_path', _('API Client Auth Certificate path') + _(' (mTLS)'),
_('The %s public key, in PEM format.').format(_('Client')));
so.value('/etc/fchomo/certs/client_publickey.pem');
so.validate = L.bind(hm.validateMTLSClientAuth, so, 'tls_client_auth_type');
so = ss.option(hm.GenText, 'tls_ech_key', _('API ECH key'));
so.placeholder = '-----BEGIN ECH KEYS-----\nACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK\nmadSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz\ndC5jb20AAA==\n-----END ECH KEYS-----';
so.hm_placeholder = 'outer-sni.any.domain';
@@ -654,6 +654,34 @@ return view.extend({
so.depends({tls: '1', type: /^(http|socks5|vmess|vless|trojan|anytls|hysteria|hysteria2|tuic)$/});
so.modalonly = true;
so = ss.taboption('field_tls', form.Value, 'tls_cert_path', _('Certificate path') + _(' (mTLS)'),
_('The %s public key, in PEM format.').format(_('Client')));
so.value('/etc/fchomo/certs/client_publickey.pem');
so.depends('tls', '1');
so.modalonly = true;
so = ss.taboption('field_tls', form.Button, '_upload_cert', _('Upload certificate') + _(' (mTLS)'),
_('<strong>Save your configuration before uploading files!</strong>'));
so.inputstyle = 'action';
so.inputtitle = _('Upload...');
so.depends({tls: '1', tls_cert_path: '/etc/fchomo/certs/client_publickey.pem'});
so.onclick = L.bind(hm.uploadCertificate, so, _('certificate'), 'client_publickey');
so.modalonly = true;
so = ss.taboption('field_tls', form.Value, 'tls_key_path', _('Key path') + _(' (mTLS)'),
_('The %s private key, in PEM format.').format(_('Client')));
so.value('/etc/fchomo/certs/client_privatekey.pem');
so.depends({tls: '1', tls_cert_path: /.+/});
so.modalonly = true;
so = ss.taboption('field_tls', form.Button, '_upload_key', _('Upload key') + _(' (mTLS)'),
_('<strong>Save your configuration before uploading files!</strong>'));
so.inputstyle = 'action';
so.inputtitle = _('Upload...');
so.depends({tls: '1', tls_key_path: '/etc/fchomo/certs/client_privatekey.pem'});
so.onclick = L.bind(hm.uploadCertificate, so, _('private key'), 'client_privatekey');
so.modalonly = true;
so = ss.taboption('field_tls', form.Flag, 'tls_ech', _('Enable ECH'));
so.default = so.disabled;
so.depends({tls: '1', type: /^(vmess|vless|trojan|anytls|hysteria|hysteria2|tuic)$/});
@@ -343,7 +343,7 @@ return view.extend({
o.modalonly = true;
o = s.taboption('field_tls', form.Value, 'tls_cert_path', _('Certificate path'),
_('The server public key, in PEM format.'));
_('The %s public key, in PEM format.').format(_('Server')));
o.value('/etc/fchomo/certs/server_publickey.pem');
o.depends({tls: '1', tls_reality: '0'});
o.rmempty = false;
@@ -358,7 +358,7 @@ return view.extend({
o.modalonly = true;
o = s.taboption('field_tls', form.Value, 'tls_key_path', _('Key path'),
_('The server private key, in PEM format.'));
_('The %s private key, in PEM format.').format(_('Server')));
o.value('/etc/fchomo/certs/server_privatekey.pem');
o.rmempty = false;
o.depends({tls: '1', tls_cert_path: /.+/});
@@ -372,10 +372,35 @@ return view.extend({
o.onclick = L.bind(hm.uploadCertificate, o, _('private key'), 'server_privatekey');
o.modalonly = true;
o = s.taboption('field_tls', form.ListValue, 'tls_client_auth_type', _('Client Auth type') + _(' (mTLS)'));
o.default = hm.tls_client_auth_types[0][0];
hm.tls_client_auth_types.forEach((res) => {
o.value.apply(o, res);
})
o.depends({tls: '1', type: /^(http|socks|mixed|vmess|vless|trojan|anytls|hysteria2|tuic)$/});
o.modalonly = true;
o = s.taboption('field_tls', form.Value, 'tls_client_auth_cert_path', _('Client Auth Certificate path') + _(' (mTLS)'),
_('The %s public key, in PEM format.').format(_('Client')));
o.value('/etc/fchomo/certs/client_publickey.pem');
o.validate = function(section_id, value) {
return hm.validateMTLSClientAuth.call(this, 'tls_client_auth_type', section_id, value);
}
o.depends({tls: '1', type: /^(http|socks|mixed|vmess|vless|trojan|anytls|hysteria2|tuic)$/});
o.modalonly = true;
o = s.taboption('field_tls', form.Button, '_upload_client_auth_cert', _('Upload certificate') + _(' (mTLS)'),
_('<strong>Save your configuration before uploading files!</strong>'));
o.inputstyle = 'action';
o.inputtitle = _('Upload...');
o.depends({tls: '1', tls_client_auth_cert_path: '/etc/fchomo/certs/client_publickey.pem'});
o.onclick = L.bind(hm.uploadCertificate, o, _('certificate'), 'client_publickey');
o.modalonly = true;
o = s.taboption('field_tls', hm.GenText, 'tls_ech_key', _('ECH key'));
o.placeholder = '-----BEGIN ECH KEYS-----\nACATwY30o/RKgD6hgeQxwrSiApLaCgU+HKh7B6SUrAHaDwBD/g0APwAAIAAgHjzK\nmadSJjYQIf9o1N5GXjkW4DEEeb17qMxHdwMdNnwADAABAAEAAQACAAEAAwAIdGVz\ndC5jb20AAA==\n-----END ECH KEYS-----';
o.hm_placeholder = 'outer-sni.any.domain';
o.cols = 30
o.cols = 30;
o.rows = 2;
o.hm_options = {
type: 'ech-keypair',
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+11 -4
View File
@@ -135,8 +135,15 @@ start_service() {
else
# Set ENV variables for Client
export SAFE_PATHS="$RUN_DIR$(
yq 'with(.tls; .[] |= sub("(/[^/]+$)", ""))
| [.external-ui, .tls.certificate, .tls.private-key] | unique | map(select(. != null))
yq 'with(.external-ui; select(. != null) | . = sub("(/?$)", "/placeholder"))
| [.external-ui, .tls.certificate, .tls.private-key, .tls.client-auth-cert] | unique | map(select(. != null))
| .[] |= sub("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-c.yaml" | tr -d '\n'
)"
export SAFE_PATHS="$SAFE_PATHS$( # mTLS
yq '.proxies | map([.certificate, .private-key][]) | unique | map(select(. != null))
| .[] |= sub("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-c.yaml" | tr -d '\n'
)"
@@ -341,8 +348,8 @@ start_service() {
else
# Set ENV variables for Server
export SAFE_PATHS="$RUN_DIR$(
yq '[.listeners[] | select(.certificate // .private-key) | [.certificate, .private-key][]]
| .[] |= sub("(/[^/]+$)", "") | unique | map(select(. != null))
yq '.listeners | map([.certificate, .private-key, .client-auth-cert][]) | unique | map(select(. != null))
| .[] |= sub("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-s.yaml" | tr -d '\n'
)"
@@ -4,6 +4,9 @@
sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/direct_list.yaml" 2>/dev/null
sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/proxy_list.yaml" 2>/dev/null
# mieru_port_range -> mieru_ports
sed -i 's|^\toption mieru_port_range |\tlist mieru_ports |' /etc/config/fchomo 2>/dev/null
# default_proxy -> client_enabled and MATCH rule
default_proxy=$(uci -q get fchomo.routing.default_proxy)
if [ -n "$default_proxy" ]; then
@@ -47,9 +50,6 @@ if [ -n "$dns_port" ]; then
EOF
fi
# mieru_port_range -> mieru_ports
sed -i 's|^\toption mieru_port_range |\tlist mieru_ports |' /etc/config/fchomo 2>/dev/null
uci commit fchomo
exit 0
@@ -258,6 +258,8 @@ config["global-client-fingerprint"] = uci.get(uciconf, ucitls, 'global_client_fi
config.tls = {
"certificate": uci.get(uciconf, ucitls, 'tls_cert_path'),
"private-key": uci.get(uciconf, ucitls, 'tls_key_path'),
"client-auth-type": uci.get(uciconf, ucitls, 'tls_client_auth_type'),
"client-auth-cert": uci.get(uciconf, ucitls, 'tls_client_auth_cert_path'),
"ech-key": uci.get(uciconf, ucitls, 'tls_ech_key')
};
/* TLS END */
@@ -591,6 +593,8 @@ uci.foreach(uciconf, ucinode, (cfg) => {
fingerprint: cfg.tls_fingerprint,
alpn: cfg.tls_alpn, // Array
"skip-cert-verify": strToBool(cfg.tls_skip_cert_verify),
certificate: cfg.tls_cert_path, // mTLS
"private-key": cfg.tls_key_path, // mTLS
"client-fingerprint": cfg.tls_client_fingerprint,
"ech-opts": cfg.tls_ech === '1' ? {
enable: true,
@@ -159,6 +159,8 @@ uci.foreach(uciconf, uciserver, (cfg) => {
certificate: cfg.tls_cert_path,
"private-key": cfg.tls_key_path
}),
"client-auth-type": cfg.tls_client_auth_type,
"client-auth-cert": cfg.tls_client_auth_cert_path,
"ech-key": cfg.tls_ech_key,
} : {}),
@@ -19,7 +19,7 @@ function wGET(url, header, filepath) {
let ua = 'Wget/1.21 (FullCombo Shark!)';
if (header) {
header = json(trim(header) || {});
header = json(trim(header) || '{}');
header = join(' ', filter(map(keys(header), (k) => {
let v = join(', ', type(header[k]) === 'array' ? filter(header[k], v => v) : []);
@@ -385,9 +385,11 @@ const methods = {
switch (filename) {
case 'client_ca':
case 'server_publickey':
case 'client_publickey':
return writeCertificate(filename, false);
break;
case 'server_privatekey':
case 'client_privatekey':
return writeCertificate(filename, true);
break;
default:
+5 -5
View File
@@ -5,7 +5,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=naiveproxy
PKG_VERSION:=140.0.7339.123-1
PKG_VERSION:=140.0.7339.123-2
PKG_RELEASE:=1
# intel 80386 & riscv64 & cortex-a76
@@ -24,11 +24,11 @@ ifeq ($(ARCH_PACKAGES),aarch64_cortex-a53)
else ifeq ($(ARCH_PACKAGES),aarch64_cortex-a72)
PKG_HASH:=b4d31db433ff3b1e28b0a2d0393317b815a41bdaa69f841516086dcfa4ac52bb
else ifeq ($(ARCH_PACKAGES),aarch64_generic)
PKG_HASH:=3d150e002b54bed3dcd8ee1b3f87ec7bd2142d3272fcd8e7a6615d33689da7ef
PKG_HASH:=eccb7341e5a2a2307e2c7b469adb271fcb76c9b7d96428b5d9216eb91f07bc04
else ifeq ($(ARCH_PACKAGES),arm_arm1176jzf-s_vfp)
PKG_HASH:=c90c564d09648ef7f7b83595b8a0a4635ea8b293c4bfb3ac432d0cc5d003719e
else ifeq ($(ARCH_PACKAGES),arm_arm926ej-s)
PKG_HASH:=8547ed89569709da3a2bfa5b90cad77c6c671da2d721b703a2b1707306013d2f
PKG_HASH:=e6b0f057b719fffd3bc5f201538767c69e6367a1e1480808efe62d4f093e4b55
else ifeq ($(ARCH_PACKAGES),arm_cortex-a15_neon-vfpv4)
PKG_HASH:=4e41da71ed4a588d9da6748857b7063f441275d573c8935b24b41adad6f92136
else ifeq ($(ARCH_PACKAGES),arm_cortex-a5_vfpv4)
@@ -38,13 +38,13 @@ else ifeq ($(ARCH_PACKAGES),arm_cortex-a7)
else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_neon-vfpv4)
PKG_HASH:=a374076612e4ee741c60d57173771bb6b6f2a2710d4d9a637afb6e8ddce98e76
else ifeq ($(ARCH_PACKAGES),arm_cortex-a7_vfpv4)
PKG_HASH:=b2287851d25d4701c16add18a75d52f5ae14312da64b9240fecfd3d9625f973e
PKG_HASH:=0b335809706c8ecbd1a6680adad7f74a0877b74496d11a556dbe6ccb7ab3e7a4
else ifeq ($(ARCH_PACKAGES),arm_cortex-a8_vfpv3)
PKG_HASH:=12cf7be62a5d5fd5c0e886e1a22db445b9ef5f34728c1c788e8a8632ae0105a9
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9)
PKG_HASH:=9977f8a2c023caa4d7a50b8e4f721f9de18879b74f246c050ea2b15b57e6ff3b
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_neon)
PKG_HASH:=9969a31508d64a3c396e3f825fa0ad6ca39609db2752069bfe490ad6455a0377
PKG_HASH:=d72fd69a5a67ee38c066dbed077f93949b2224ea0a5b45271ef60aac838acb31
else ifeq ($(ARCH_PACKAGES),arm_cortex-a9_vfpv3-d16)
PKG_HASH:=3092b1a38b437aef76bbfee69d9a17fcf862907015ef1083e8b2695bfed92723
else ifeq ($(ARCH_PACKAGES),arm_mpcore)
+4 -4
View File
@@ -1,15 +1,15 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=nikki
PKG_VERSION:=2025.08.27
PKG_RELEASE:=2
PKG_VERSION:=2025.09.24
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_VERSION:=v1.19.13
PKG_MIRROR_HASH:=94fdba59d158a4ac28358ab87d6152fe581ed3fbff71ad56b4a2aba462a485d6
PKG_SOURCE_VERSION:=v1.19.14
PKG_MIRROR_HASH:=1b5ad012709ffe6f087a10769be6dea77b07bf8b866cdd9f8e6ab3d98c6d7986
PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>
@@ -0,0 +1,32 @@
using System.Reactive;
namespace ServiceLib.Events;
public static class AppEvents
{
public static readonly EventChannel<Unit> ReloadRequested = new();
public static readonly EventChannel<bool?> ShowHideWindowRequested = new();
public static readonly EventChannel<Unit> AddServerViaScanRequested = new();
public static readonly EventChannel<Unit> AddServerViaClipboardRequested = new();
public static readonly EventChannel<bool> SubscriptionsUpdateRequested = new();
public static readonly EventChannel<Unit> ProfilesRefreshRequested = new();
public static readonly EventChannel<Unit> SubscriptionsRefreshRequested = new();
public static readonly EventChannel<Unit> ProxiesReloadRequested = new();
public static readonly EventChannel<ServerSpeedItem> DispatcherStatisticsRequested = new();
public static readonly EventChannel<string> SendSnackMsgRequested = new();
public static readonly EventChannel<string> SendMsgViewRequested = new();
public static readonly EventChannel<Unit> AppExitRequested = new();
public static readonly EventChannel<bool> ShutdownRequested = new();
public static readonly EventChannel<Unit> AdjustMainLvColWidthRequested = new();
public static readonly EventChannel<string> SetDefaultServerRequested = new();
public static readonly EventChannel<Unit> RoutingsMenuRefreshRequested = new();
public static readonly EventChannel<Unit> TestServerRequested = new();
public static readonly EventChannel<Unit> InboundDisplayRequested = new();
public static readonly EventChannel<ESysProxyType> SysProxyChangeRequested = new();
}
@@ -0,0 +1,29 @@
using System.Reactive;
using System.Reactive.Linq;
using System.Reactive.Subjects;
namespace ServiceLib.Events;
public sealed class EventChannel<T>
{
private readonly ISubject<T> _subject = Subject.Synchronize(new Subject<T>());
public IObservable<T> AsObservable()
{
return _subject.AsObservable();
}
public void Publish(T value)
{
_subject.OnNext(value);
}
public void Publish()
{
if (typeof(T) != typeof(Unit))
{
throw new InvalidOperationException("Publish() without value is only valid for EventChannel<Unit>.");
}
_subject.OnNext((T)(object)Unit.Default);
}
}
+1
View File
@@ -1,6 +1,7 @@
global using ServiceLib.Base;
global using ServiceLib.Common;
global using ServiceLib.Enums;
global using ServiceLib.Events;
global using ServiceLib.Handler;
global using ServiceLib.Helper;
global using ServiceLib.Manager;
@@ -1,33 +0,0 @@
using System.Reactive;
using System.Reactive.Subjects;
namespace ServiceLib.Handler;
public static class AppEvents
{
public static readonly Subject<Unit> ReloadRequested = new();
public static readonly Subject<bool?> ShowHideWindowRequested = new();
public static readonly Subject<Unit> AddServerViaScanRequested = new();
public static readonly Subject<Unit> AddServerViaClipboardRequested = new();
public static readonly Subject<bool> SubscriptionsUpdateRequested = new();
public static readonly Subject<Unit> ProfilesRefreshRequested = new();
public static readonly Subject<Unit> SubscriptionsRefreshRequested = new();
public static readonly Subject<Unit> ProxiesReloadRequested = new();
public static readonly Subject<ServerSpeedItem> DispatcherStatisticsRequested = new();
public static readonly Subject<string> SendSnackMsgRequested = new();
public static readonly Subject<string> SendMsgViewRequested = new();
public static readonly Subject<Unit> AppExitRequested = new();
public static readonly Subject<bool> ShutdownRequested = new();
public static readonly Subject<Unit> AdjustMainLvColWidthRequested = new();
public static readonly Subject<string> SetDefaultServerRequested = new();
public static readonly Subject<Unit> RoutingsMenuRefreshRequested = new();
public static readonly Subject<Unit> TestServerRequested = new();
public static readonly Subject<Unit> InboundDisplayRequested = new();
public static readonly Subject<ESysProxyType> SysProxyChangeRequested = new();
}
@@ -96,7 +96,7 @@ public sealed class AppManager
Logging.SaveLog("AppExitAsync Begin");
await SysProxyHandler.UpdateSysProxy(_config, true);
AppEvents.AppExitRequested.OnNext(Unit.Default);
AppEvents.AppExitRequested.Publish();
await Task.Delay(50); //Wait for AppExitRequested to be processed
await ConfigHandler.SaveConfig(_config);
@@ -119,7 +119,7 @@ public sealed class AppManager
public void Shutdown(bool byUser)
{
AppEvents.ShutdownRequested.OnNext(byUser);
AppEvents.ShutdownRequested.Publish(byUser);
}
public async Task RebootAsAdmin()
@@ -11,7 +11,7 @@ public class NoticeManager
{
return;
}
AppEvents.SendSnackMsgRequested.OnNext(content);
AppEvents.SendSnackMsgRequested.Publish(content);
}
public void SendMessage(string? content)
@@ -20,7 +20,7 @@ public class NoticeManager
{
return;
}
AppEvents.SendMsgViewRequested.OnNext(content);
AppEvents.SendMsgViewRequested.Publish(content);
}
public void SendMessageEx(string? content)
@@ -223,7 +223,7 @@ public class CheckUpdateViewModel : MyReactiveObject
{
if (blReload)
{
AppEvents.ReloadRequested.OnNext(Unit.Default);
AppEvents.ReloadRequested.Publish();
}
else
{
@@ -292,7 +292,7 @@ public class MainWindowViewModel : MyReactiveObject
}
if (_config.UiItem.EnableAutoAdjustMainLvColWidth)
{
AppEvents.AdjustMainLvColWidthRequested.OnNext(Unit.Default);
AppEvents.AdjustMainLvColWidthRequested.Publish();
}
}
}
@@ -303,7 +303,7 @@ public class MainWindowViewModel : MyReactiveObject
{
return;
}
AppEvents.DispatcherStatisticsRequested.OnNext(update);
AppEvents.DispatcherStatisticsRequested.Publish(update);
}
#endregion Actions
@@ -312,14 +312,14 @@ public class MainWindowViewModel : MyReactiveObject
private async Task RefreshServers()
{
AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
AppEvents.ProfilesRefreshRequested.Publish();
await Task.Delay(200);
}
private void RefreshSubscriptions()
{
AppEvents.SubscriptionsRefreshRequested.OnNext(Unit.Default);
AppEvents.SubscriptionsRefreshRequested.Publish();
}
#endregion Servers && Groups
@@ -451,7 +451,7 @@ public class MainWindowViewModel : MyReactiveObject
var ret = await _updateView?.Invoke(EViewAction.OptionSettingWindow, null);
if (ret == true)
{
AppEvents.InboundDisplayRequested.OnNext(Unit.Default);
AppEvents.InboundDisplayRequested.Publish();
await Reload();
}
}
@@ -462,7 +462,7 @@ public class MainWindowViewModel : MyReactiveObject
if (ret == true)
{
await ConfigHandler.InitBuiltinRouting(_config);
AppEvents.RoutingsMenuRefreshRequested.OnNext(Unit.Default);
AppEvents.RoutingsMenuRefreshRequested.Publish();
await Reload();
}
}
@@ -530,12 +530,12 @@ public class MainWindowViewModel : MyReactiveObject
await SysProxyHandler.UpdateSysProxy(_config, false);
await Task.Delay(1000);
});
AppEvents.TestServerRequested.OnNext(Unit.Default);
AppEvents.TestServerRequested.Publish();
var showClashUI = _config.IsRunningCore(ECoreType.sing_box);
if (showClashUI)
{
AppEvents.ProxiesReloadRequested.OnNext(Unit.Default);
AppEvents.ProxiesReloadRequested.Publish();
}
RxApp.MainThreadScheduler.Schedule(() => ReloadResult(showClashUI));
@@ -565,7 +565,7 @@ public class MainWindowViewModel : MyReactiveObject
{
if (_config.UiItem.AutoHideStartup)
{
AppEvents.ShowHideWindowRequested.OnNext(false);
AppEvents.ShowHideWindowRequested.Publish(false);
}
await Task.CompletedTask;
}
@@ -578,7 +578,7 @@ public class MainWindowViewModel : MyReactiveObject
{
await ConfigHandler.ApplyRegionalPreset(_config, type);
await ConfigHandler.InitRouting(_config);
AppEvents.RoutingsMenuRefreshRequested.OnNext(Unit.Default);
AppEvents.RoutingsMenuRefreshRequested.Publish();
await ConfigHandler.SaveConfig(_config);
await new UpdateService().UpdateGeoFileAll(_config, UpdateTaskHandler);
@@ -275,7 +275,7 @@ public class ProfilesViewModel : MyReactiveObject
private void Reload()
{
AppEvents.ReloadRequested.OnNext(Unit.Default);
AppEvents.ReloadRequested.Publish();
}
public async Task SetSpeedTestResult(SpeedTestResult result)
@@ -361,7 +361,7 @@ public class ProfilesViewModel : MyReactiveObject
public async Task RefreshServers()
{
AppEvents.ProfilesRefreshRequested.OnNext(Unit.Default);
AppEvents.ProfilesRefreshRequested.Publish();
await Task.Delay(200);
}
@@ -148,17 +148,17 @@ public class StatusBarViewModel : MyReactiveObject
NotifyLeftClickCmd = ReactiveCommand.CreateFromTask(async () =>
{
AppEvents.ShowHideWindowRequested.OnNext(null);
AppEvents.ShowHideWindowRequested.Publish(null);
await Task.CompletedTask;
});
ShowWindowCmd = ReactiveCommand.CreateFromTask(async () =>
{
AppEvents.ShowHideWindowRequested.OnNext(true);
AppEvents.ShowHideWindowRequested.Publish(true);
await Task.CompletedTask;
});
HideWindowCmd = ReactiveCommand.CreateFromTask(async () =>
{
AppEvents.ShowHideWindowRequested.OnNext(false);
AppEvents.ShowHideWindowRequested.Publish(false);
await Task.CompletedTask;
});
@@ -274,19 +274,19 @@ public class StatusBarViewModel : MyReactiveObject
private async Task AddServerViaClipboard()
{
AppEvents.AddServerViaClipboardRequested.OnNext(Unit.Default);
AppEvents.AddServerViaClipboardRequested.Publish();
await Task.Delay(1000);
}
private async Task AddServerViaScan()
{
AppEvents.AddServerViaScanRequested.OnNext(Unit.Default);
AppEvents.AddServerViaScanRequested.Publish();
await Task.Delay(1000);
}
private async Task UpdateSubscriptionProcess(bool blProxy)
{
AppEvents.SubscriptionsUpdateRequested.OnNext(blProxy);
AppEvents.SubscriptionsUpdateRequested.Publish(blProxy);
await Task.Delay(1000);
}
@@ -348,7 +348,7 @@ public class StatusBarViewModel : MyReactiveObject
{
return;
}
AppEvents.SetDefaultServerRequested.OnNext(SelectedServer.ID);
AppEvents.SetDefaultServerRequested.Publish(SelectedServer.ID);
}
public async Task TestServerAvailability()
@@ -449,7 +449,7 @@ public class StatusBarViewModel : MyReactiveObject
if (await ConfigHandler.SetDefaultRouting(_config, item) == 0)
{
NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting);
AppEvents.ReloadRequested.OnNext(Unit.Default);
AppEvents.ReloadRequested.Publish();
_updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null);
}
}
@@ -496,7 +496,7 @@ public class StatusBarViewModel : MyReactiveObject
}
}
await ConfigHandler.SaveConfig(_config);
AppEvents.ReloadRequested.OnNext(Unit.Default);
AppEvents.ReloadRequested.Publish();
}
private bool AllowEnableTun()
+1 -1
View File
@@ -54,7 +54,7 @@ public partial class App : Application
{
if (desktop.MainWindow != null)
{
AppEvents.AddServerViaClipboardRequested.OnNext(Unit.Default);
AppEvents.AddServerViaClipboardRequested.Publish();
await Task.Delay(1000);
}
}
@@ -2,6 +2,7 @@ global using ServiceLib;
global using ServiceLib.Base;
global using ServiceLib.Common;
global using ServiceLib.Enums;
global using ServiceLib.Events;
global using ServiceLib.Handler;
global using ServiceLib.Manager;
global using ServiceLib.Models;
@@ -253,7 +253,7 @@ public partial class MainWindow : WindowBase<MainWindowViewModel>
case EGlobalHotkey.SystemProxySet:
case EGlobalHotkey.SystemProxyUnchanged:
case EGlobalHotkey.SystemProxyPac:
AppEvents.SysProxyChangeRequested.OnNext((ESysProxyType)((int)e - 1));
AppEvents.SysProxyChangeRequested.Publish((ESysProxyType)((int)e - 1));
break;
}
}
+1
View File
@@ -2,6 +2,7 @@ global using ServiceLib;
global using ServiceLib.Base;
global using ServiceLib.Common;
global using ServiceLib.Enums;
global using ServiceLib.Events;
global using ServiceLib.Handler;
global using ServiceLib.Manager;
global using ServiceLib.Models;
@@ -241,7 +241,7 @@ public partial class MainWindow
case EGlobalHotkey.SystemProxySet:
case EGlobalHotkey.SystemProxyUnchanged:
case EGlobalHotkey.SystemProxyPac:
AppEvents.SysProxyChangeRequested.OnNext((ESysProxyType)((int)e - 1));
AppEvents.SysProxyChangeRequested.Publish((ESysProxyType)((int)e - 1));
break;
}
}