From 144e46a9efd0e05ca4096689e5ca9ad0b71ea5c3 Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Mon, 2 Sep 2024 20:34:11 +0200 Subject: [PATCH] Update On Mon Sep 2 20:34:11 CEST 2024 --- .github/update.log | 1 + clash-meta-android/build.gradle.kts | 4 +- .../golang/clash/.github/workflows/build.yml | 8 +- .../clash/component/updater/update_ui.go | 42 +- .../src/foss/golang/clash/config/config.go | 37 +- .../golang/clash/hub/executor/executor.go | 8 +- .../src/foss/golang/clash/hub/route/groups.go | 12 +- .../foss/golang/clash/hub/route/upgrade.go | 13 +- .../core/src/foss/golang/go.mod | 1 - .../core/src/foss/golang/go.sum | 2 - clash-meta/component/updater/update_ui.go | 42 +- clash-meta/config/config.go | 37 +- clash-meta/hub/executor/executor.go | 8 +- clash-meta/hub/route/groups.go | 12 +- clash-meta/hub/route/upgrade.go | 13 +- clash-nyanpasu/.cargo/config.toml | 2 - clash-nyanpasu/.github/workflows/ci.yml | 2 +- .../.github/workflows/deps-build-linux.yaml | 39 +- clash-nyanpasu/.github/workflows/stale.yml | 23 + .../.github/workflows/target-dev-build.yaml | 23 +- clash-nyanpasu/.gitignore | 2 + clash-nyanpasu/backend/Cargo.lock | 1 + clash-nyanpasu/backend/Cross.toml | 16 + clash-nyanpasu/backend/tauri/Cargo.toml | 5 + clash-nyanpasu/backend/tauri/build.rs | 82 +++- clash-nyanpasu/backend/tauri/tauri.conf.json | 4 +- clash-nyanpasu/frontend/nyanpasu/package.json | 2 +- clash-nyanpasu/frontend/ui/package.json | 2 +- clash-nyanpasu/package.json | 7 +- clash-nyanpasu/pnpm-lock.yaml | 257 +++++------ clash-nyanpasu/scripts/generate-git-info.ts | 31 ++ clash-nyanpasu/scripts/telegram-notify.ts | 2 + clash-nyanpasu/scripts/utils/env.ts | 5 + echo/internal/conn/relay_conn.go | 18 +- echo/internal/transporter/base.go | 8 - echo/internal/transporter/raw.go | 4 +- echo/internal/transporter/ws.go | 2 + echo/internal/web/js/metrics.js | 393 ++++++++++++++++ echo/internal/web/server.go | 10 +- echo/internal/web/templates/_head.html | 6 +- echo/internal/web/templates/_metrics.html | 419 +++--------------- echo/internal/web/templates/_navbar.html | 29 +- ...Add-support-for-OrangePi-R1-Plus-LTS.patch | 6 +- mihomo/component/updater/update_ui.go | 42 +- mihomo/config/config.go | 37 +- mihomo/hub/executor/executor.go | 8 +- mihomo/hub/route/groups.go | 12 +- mihomo/hub/route/upgrade.go | 13 +- .../root/usr/share/passwall/app.sh | 75 ++-- .../root/usr/share/passwall/iptables.sh | 58 ++- .../root/usr/share/passwall/nftables.sh | 58 ++- ryujinx/Directory.Packages.props | 8 +- .../GraphicsDriver/DriverUtilities.cs | 24 +- .../src/Ryujinx.Common/Utilities/OsUtils.cs | 24 + .../Engine/Threed/ThreedClassState.cs | 8 +- .../Image/TextureCache.cs | 8 +- .../Ryujinx.Graphics.Vulkan/BarrierBatch.cs | 39 +- .../Ryujinx.Graphics.Vulkan/BufferHolder.cs | 6 +- .../Ryujinx.Graphics.Vulkan/BufferManager.cs | 2 +- .../Ryujinx.Graphics.Vulkan/BufferState.cs | 5 +- .../CommandBufferPool.cs | 8 +- .../DescriptorSetCollection.cs | 14 +- .../DescriptorSetManager.cs | 2 +- .../DescriptorSetUpdater.cs | 64 ++- .../FeedbackLoopAspects.cs | 12 + .../FramebufferParams.cs | 23 +- .../HardwareCapabilities.cs | 6 + .../HostMemoryAllocator.cs | 2 +- .../MemoryAllocatorBlockList.cs | 2 +- .../MoltenVK/MVKInitialization.cs | 18 + .../Ryujinx.Graphics.Vulkan/PipelineBase.cs | 126 +++++- .../PipelineConverter.cs | 2 +- .../PipelineDynamicState.cs | 34 +- .../Ryujinx.Graphics.Vulkan/PipelineFull.cs | 4 +- .../PipelineLayoutFactory.cs | 2 +- .../Ryujinx.Graphics.Vulkan/PipelineState.cs | 38 +- .../Queries/BufferedQuery.cs | 2 +- .../RenderPassHolder.cs | 2 +- .../Ryujinx.Graphics.Vulkan/SamplerHolder.cs | 2 +- ryujinx/src/Ryujinx.Graphics.Vulkan/Shader.cs | 2 +- .../Ryujinx.Graphics.Vulkan/TextureCopy.cs | 12 +- .../Ryujinx.Graphics.Vulkan/TextureStorage.cs | 82 +++- .../Ryujinx.Graphics.Vulkan/TextureView.cs | 46 +- ryujinx/src/Ryujinx.Graphics.Vulkan/Vendor.cs | 8 +- .../VulkanInitialization.cs | 54 +++ .../Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 34 ++ ryujinx/src/Ryujinx.Graphics.Vulkan/Window.cs | 12 +- ryujinx/src/Ryujinx.Gtk3/Program.cs | 26 +- ryujinx/src/Ryujinx.Headless.SDL2/Program.cs | 9 + ryujinx/src/Ryujinx/Program.cs | 10 +- .../resources/view/homeproxy/client.js | 4 +- .../resources/view/homeproxy/node.js | 29 +- .../po/templates/homeproxy.pot | 110 ++--- .../po/zh_Hans/homeproxy.po | 110 ++--- .../etc/homeproxy/scripts/firewall_post.ut | 19 +- small/v2ray-geodata/Makefile | 4 +- .../Handler/CoreConfig/CoreConfigV2ray.cs | 2 +- .../v2rayN/v2rayN.Desktop/Views/MsgView.axaml | 4 +- .../v2rayN.Desktop/Views/MsgView.axaml.cs | 23 +- v2rayn/v2rayN/v2rayN/Views/MsgView.xaml.cs | 16 +- yass/.circleci/config.yml | 18 +- yass/.cirrus.yml | 2 +- yass/.github/workflows/releases-mingw.yml | 2 +- yass/.github/workflows/sanitizers.yml | 1 + yass/CMakeLists.txt | 2 +- yass/debian/rules | 1 + yass/flatpak/io.github.chilledheart.yass.yml | 1 + yass/src/net/network.cpp | 4 +- yass/src/qt6/Makefile | 30 ++ .../abseil-cpp/absl/base/internal/sysinfo.cc | 4 + .../absl/base/internal/unscaledcycleclock.cc | 2 +- .../internal/stacktrace_win32-inl.inc | 2 +- .../absl/debugging/symbolize_win32.inc | 6 + .../internal/cctz/src/time_zone_format.cc | 2 + yass/tools/build.go | 13 +- yass/yass.spec.in | 3 +- yt-dlp/.github/workflows/build.yml | 2 +- yt-dlp/yt_dlp/extractor/_extractors.py | 1 + yt-dlp/yt_dlp/extractor/kika.py | 126 ++++++ yt-dlp/yt_dlp/extractor/mdr.py | 51 +-- yt-dlp/yt_dlp/extractor/vimeo.py | 208 ++++++--- 121 files changed, 2249 insertions(+), 1278 deletions(-) delete mode 100644 clash-nyanpasu/.cargo/config.toml create mode 100644 clash-nyanpasu/.github/workflows/stale.yml create mode 100644 clash-nyanpasu/backend/Cross.toml create mode 100644 clash-nyanpasu/scripts/generate-git-info.ts create mode 100644 echo/internal/web/js/metrics.js create mode 100644 ryujinx/src/Ryujinx.Common/Utilities/OsUtils.cs create mode 100644 ryujinx/src/Ryujinx.Graphics.Vulkan/FeedbackLoopAspects.cs create mode 100644 yass/src/qt6/Makefile create mode 100644 yt-dlp/yt_dlp/extractor/kika.py diff --git a/.github/update.log b/.github/update.log index 827d475170..c51707d5c9 100644 --- a/.github/update.log +++ b/.github/update.log @@ -751,3 +751,4 @@ Update On Wed Aug 28 20:33:23 CEST 2024 Update On Fri Aug 30 20:32:59 CEST 2024 Update On Sat Aug 31 20:34:23 CEST 2024 Update On Sun Sep 1 20:30:49 CEST 2024 +Update On Mon Sep 2 20:34:00 CEST 2024 diff --git a/clash-meta-android/build.gradle.kts b/clash-meta-android/build.gradle.kts index 2f8749e1fc..b949cc3274 100644 --- a/clash-meta-android/build.gradle.kts +++ b/clash-meta-android/build.gradle.kts @@ -40,8 +40,8 @@ subprojects { minSdk = 21 targetSdk = 31 - versionName = "2.10.3" - versionCode = 210003 + versionName = "2.10.4" + versionCode = 210004 resValue("string", "release_name", "v$versionName") resValue("integer", "release_code", "$versionCode") diff --git a/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml b/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml index b62e982000..5ba2ef6f9e 100644 --- a/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml +++ b/clash-meta-android/core/src/foss/golang/clash/.github/workflows/build.yml @@ -387,18 +387,18 @@ jobs: git fetch --tags echo "PREVERSION=$(git describe --tags --abbrev=0 HEAD)" >> $GITHUB_ENV - - name: Merge Alpha branch into Meta + - name: Force push Alpha branch to Meta run: | git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.name "github-actions[bot]" git fetch origin Alpha:Alpha - git merge Alpha - git push origin Meta + git push origin Alpha:Meta --force env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Tag the commit + - name: Tag the commit on Alpha run: | + git checkout Alpha git tag ${{ github.event.inputs.version }} git push origin ${{ github.event.inputs.version }} env: diff --git a/clash-meta-android/core/src/foss/golang/clash/component/updater/update_ui.go b/clash-meta-android/core/src/foss/golang/clash/component/updater/update_ui.go index a43648a9c6..b29bee9f90 100644 --- a/clash-meta-android/core/src/foss/golang/clash/component/updater/update_ui.go +++ b/clash-meta-android/core/src/foss/golang/clash/component/updater/update_ui.go @@ -2,7 +2,6 @@ package updater import ( "archive/zip" - "errors" "fmt" "io" "os" @@ -12,23 +11,26 @@ import ( "sync" C "github.com/metacubex/mihomo/constant" + "github.com/metacubex/mihomo/log" ) var ( - ExternalUIURL string - ExternalUIPath string - ExternalUIFolder string - ExternalUIName string -) -var ( - ErrIncompleteConf = errors.New("ExternalUI configure incomplete") + ExternalUIURL string + ExternalUIPath string + AutoUpdateUI bool ) + var xdMutex sync.Mutex func UpdateUI() error { xdMutex.Lock() defer xdMutex.Unlock() + err := prepareUIPath() + if err != nil { + return fmt.Errorf("prepare UI path failed: %w", err) + } + data, err := downloadForBytes(ExternalUIURL) if err != nil { return fmt.Errorf("can't download file: %w", err) @@ -40,7 +42,7 @@ func UpdateUI() error { } defer os.Remove(saved) - err = cleanup(ExternalUIFolder) + err = cleanup(ExternalUIPath) if err != nil { if !os.IsNotExist(err) { return fmt.Errorf("cleanup exist file error: %w", err) @@ -52,27 +54,19 @@ func UpdateUI() error { return fmt.Errorf("can't extract zip file: %w", err) } - err = os.Rename(unzipFolder, ExternalUIFolder) + err = os.Rename(unzipFolder, ExternalUIPath) if err != nil { - return fmt.Errorf("can't rename folder: %w", err) + return fmt.Errorf("rename UI folder failed: %w", err) } return nil } -func PrepareUIPath() error { - if ExternalUIPath == "" || ExternalUIURL == "" { - return ErrIncompleteConf - } - - if ExternalUIName != "" { - ExternalUIFolder = filepath.Clean(path.Join(ExternalUIPath, ExternalUIName)) - if _, err := os.Stat(ExternalUIPath); os.IsNotExist(err) { - if err := os.MkdirAll(ExternalUIPath, os.ModePerm); err != nil { - return err - } +func prepareUIPath() error { + if _, err := os.Stat(ExternalUIPath); os.IsNotExist(err) { + log.Infoln("dir %s does not exist, creating", ExternalUIPath) + if err := os.MkdirAll(ExternalUIPath, os.ModePerm); err != nil { + log.Warnln("create dir %s error: %s", ExternalUIPath, err) } - } else { - ExternalUIFolder = ExternalUIPath } return nil } diff --git a/clash-meta-android/core/src/foss/golang/clash/config/config.go b/clash-meta-android/core/src/foss/golang/clash/config/config.go index ed30bfe452..4490ebf6b2 100644 --- a/clash-meta-android/core/src/foss/golang/clash/config/config.go +++ b/clash-meta-android/core/src/foss/golang/clash/config/config.go @@ -7,7 +7,6 @@ import ( "net" "net/netip" "net/url" - "os" "path" "regexp" "strings" @@ -704,33 +703,23 @@ func parseGeneral(cfg *RawConfig) (*General, error) { } N.DisableKeepAlive = cfg.DisableKeepAlive - updater.ExternalUIPath = cfg.ExternalUI // checkout externalUI exist - if updater.ExternalUIPath != "" { - updater.ExternalUIPath = C.Path.Resolve(updater.ExternalUIPath) - if _, err := os.Stat(updater.ExternalUIPath); os.IsNotExist(err) { - defaultUIpath := path.Join(C.Path.HomeDir(), "ui") - log.Warnln("external-ui: %s does not exist, creating folder in %s", updater.ExternalUIPath, defaultUIpath) - if err := os.MkdirAll(defaultUIpath, os.ModePerm); err != nil { - return nil, err - } - updater.ExternalUIPath = defaultUIpath - cfg.ExternalUI = defaultUIpath - } - } - // checkout UIpath/name exist - if cfg.ExternalUIName != "" { - updater.ExternalUIName = cfg.ExternalUIName + if cfg.ExternalUI != "" { + updater.AutoUpdateUI = true + updater.ExternalUIPath = C.Path.Resolve(cfg.ExternalUI) } else { - updater.ExternalUIFolder = updater.ExternalUIPath - } - if cfg.ExternalUIURL != "" { - updater.ExternalUIURL = cfg.ExternalUIURL + // default externalUI path + updater.ExternalUIPath = path.Join(C.Path.HomeDir(), "ui") } - err := updater.PrepareUIPath() - if err != nil { - log.Errorln("PrepareUIPath error: %s", err) + // checkout UIpath/name exist + if cfg.ExternalUIName != "" { + updater.AutoUpdateUI = true + updater.ExternalUIPath = path.Join(updater.ExternalUIPath, cfg.ExternalUIName) + } + + if cfg.ExternalUIURL != "" { + updater.ExternalUIURL = cfg.ExternalUIURL } return &General{ diff --git a/clash-meta-android/core/src/foss/golang/clash/hub/executor/executor.go b/clash-meta-android/core/src/foss/golang/clash/hub/executor/executor.go index e7e9b72c4c..c83b254c96 100644 --- a/clash-meta-android/core/src/foss/golang/clash/hub/executor/executor.go +++ b/clash-meta-android/core/src/foss/golang/clash/hub/executor/executor.go @@ -381,12 +381,12 @@ func updateTunnels(tunnels []LC.Tunnel) { } func initExternalUI() { - if updater.ExternalUIFolder != "" { - dirEntries, _ := os.ReadDir(updater.ExternalUIFolder) + if updater.AutoUpdateUI { + dirEntries, _ := os.ReadDir(updater.ExternalUIPath) if len(dirEntries) > 0 { - log.Infoln("UI already exists") + log.Infoln("UI already exists, skip downloading") } else { - log.Infoln("UI not exists, downloading") + log.Infoln("External UI downloading ...") updater.UpdateUI() } } diff --git a/clash-meta-android/core/src/foss/golang/clash/hub/route/groups.go b/clash-meta-android/core/src/foss/golang/clash/hub/route/groups.go index 30dec5f0bb..c4e9501f2d 100644 --- a/clash-meta-android/core/src/foss/golang/clash/hub/route/groups.go +++ b/clash-meta-android/core/src/foss/golang/clash/hub/route/groups.go @@ -60,9 +60,15 @@ func getGroupDelay(w http.ResponseWriter, r *http.Request) { return } - if proxy.(*adapter.Proxy).Type() == C.URLTest { - URLTestGroup := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.URLTest) - URLTestGroup.ForceSet("") + switch proxy.(*adapter.Proxy).Type() { + case C.URLTest: + if urlTestGroup, ok := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.URLTest); ok { + urlTestGroup.ForceSet("") + } + case C.Fallback: + if fallbackGroup, ok := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.Fallback); ok { + fallbackGroup.ForceSet("") + } } if proxy.(*adapter.Proxy).Type() != C.Selector { diff --git a/clash-meta-android/core/src/foss/golang/clash/hub/route/upgrade.go b/clash-meta-android/core/src/foss/golang/clash/hub/route/upgrade.go index db00af5c8a..76ac26a10f 100644 --- a/clash-meta-android/core/src/foss/golang/clash/hub/route/upgrade.go +++ b/clash-meta-android/core/src/foss/golang/clash/hub/route/upgrade.go @@ -1,7 +1,6 @@ package route import ( - "errors" "fmt" "net/http" "os" @@ -50,15 +49,9 @@ func upgradeCore(w http.ResponseWriter, r *http.Request) { func updateUI(w http.ResponseWriter, r *http.Request) { err := updater.UpdateUI() if err != nil { - if errors.Is(err, updater.ErrIncompleteConf) { - log.Warnln("%s", err) - render.Status(r, http.StatusNotImplemented) - render.JSON(w, r, newError(fmt.Sprintf("%s", err))) - } else { - log.Warnln("%s", err) - render.Status(r, http.StatusInternalServerError) - render.JSON(w, r, newError(fmt.Sprintf("%s", err))) - } + log.Warnln("%s", err) + render.Status(r, http.StatusInternalServerError) + render.JSON(w, r, newError(fmt.Sprintf("%s", err))) return } diff --git a/clash-meta-android/core/src/foss/golang/go.mod b/clash-meta-android/core/src/foss/golang/go.mod index b79a292d79..19b9021947 100644 --- a/clash-meta-android/core/src/foss/golang/go.mod +++ b/clash-meta-android/core/src/foss/golang/go.mod @@ -107,7 +107,6 @@ require ( golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.24.0 // indirect google.golang.org/protobuf v1.34.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.3.0 // indirect ) diff --git a/clash-meta-android/core/src/foss/golang/go.sum b/clash-meta-android/core/src/foss/golang/go.sum index 23e05d6416..edb7b0ae3d 100644 --- a/clash-meta-android/core/src/foss/golang/go.sum +++ b/clash-meta-android/core/src/foss/golang/go.sum @@ -267,8 +267,6 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/clash-meta/component/updater/update_ui.go b/clash-meta/component/updater/update_ui.go index a43648a9c6..b29bee9f90 100644 --- a/clash-meta/component/updater/update_ui.go +++ b/clash-meta/component/updater/update_ui.go @@ -2,7 +2,6 @@ package updater import ( "archive/zip" - "errors" "fmt" "io" "os" @@ -12,23 +11,26 @@ import ( "sync" C "github.com/metacubex/mihomo/constant" + "github.com/metacubex/mihomo/log" ) var ( - ExternalUIURL string - ExternalUIPath string - ExternalUIFolder string - ExternalUIName string -) -var ( - ErrIncompleteConf = errors.New("ExternalUI configure incomplete") + ExternalUIURL string + ExternalUIPath string + AutoUpdateUI bool ) + var xdMutex sync.Mutex func UpdateUI() error { xdMutex.Lock() defer xdMutex.Unlock() + err := prepareUIPath() + if err != nil { + return fmt.Errorf("prepare UI path failed: %w", err) + } + data, err := downloadForBytes(ExternalUIURL) if err != nil { return fmt.Errorf("can't download file: %w", err) @@ -40,7 +42,7 @@ func UpdateUI() error { } defer os.Remove(saved) - err = cleanup(ExternalUIFolder) + err = cleanup(ExternalUIPath) if err != nil { if !os.IsNotExist(err) { return fmt.Errorf("cleanup exist file error: %w", err) @@ -52,27 +54,19 @@ func UpdateUI() error { return fmt.Errorf("can't extract zip file: %w", err) } - err = os.Rename(unzipFolder, ExternalUIFolder) + err = os.Rename(unzipFolder, ExternalUIPath) if err != nil { - return fmt.Errorf("can't rename folder: %w", err) + return fmt.Errorf("rename UI folder failed: %w", err) } return nil } -func PrepareUIPath() error { - if ExternalUIPath == "" || ExternalUIURL == "" { - return ErrIncompleteConf - } - - if ExternalUIName != "" { - ExternalUIFolder = filepath.Clean(path.Join(ExternalUIPath, ExternalUIName)) - if _, err := os.Stat(ExternalUIPath); os.IsNotExist(err) { - if err := os.MkdirAll(ExternalUIPath, os.ModePerm); err != nil { - return err - } +func prepareUIPath() error { + if _, err := os.Stat(ExternalUIPath); os.IsNotExist(err) { + log.Infoln("dir %s does not exist, creating", ExternalUIPath) + if err := os.MkdirAll(ExternalUIPath, os.ModePerm); err != nil { + log.Warnln("create dir %s error: %s", ExternalUIPath, err) } - } else { - ExternalUIFolder = ExternalUIPath } return nil } diff --git a/clash-meta/config/config.go b/clash-meta/config/config.go index ed30bfe452..4490ebf6b2 100644 --- a/clash-meta/config/config.go +++ b/clash-meta/config/config.go @@ -7,7 +7,6 @@ import ( "net" "net/netip" "net/url" - "os" "path" "regexp" "strings" @@ -704,33 +703,23 @@ func parseGeneral(cfg *RawConfig) (*General, error) { } N.DisableKeepAlive = cfg.DisableKeepAlive - updater.ExternalUIPath = cfg.ExternalUI // checkout externalUI exist - if updater.ExternalUIPath != "" { - updater.ExternalUIPath = C.Path.Resolve(updater.ExternalUIPath) - if _, err := os.Stat(updater.ExternalUIPath); os.IsNotExist(err) { - defaultUIpath := path.Join(C.Path.HomeDir(), "ui") - log.Warnln("external-ui: %s does not exist, creating folder in %s", updater.ExternalUIPath, defaultUIpath) - if err := os.MkdirAll(defaultUIpath, os.ModePerm); err != nil { - return nil, err - } - updater.ExternalUIPath = defaultUIpath - cfg.ExternalUI = defaultUIpath - } - } - // checkout UIpath/name exist - if cfg.ExternalUIName != "" { - updater.ExternalUIName = cfg.ExternalUIName + if cfg.ExternalUI != "" { + updater.AutoUpdateUI = true + updater.ExternalUIPath = C.Path.Resolve(cfg.ExternalUI) } else { - updater.ExternalUIFolder = updater.ExternalUIPath - } - if cfg.ExternalUIURL != "" { - updater.ExternalUIURL = cfg.ExternalUIURL + // default externalUI path + updater.ExternalUIPath = path.Join(C.Path.HomeDir(), "ui") } - err := updater.PrepareUIPath() - if err != nil { - log.Errorln("PrepareUIPath error: %s", err) + // checkout UIpath/name exist + if cfg.ExternalUIName != "" { + updater.AutoUpdateUI = true + updater.ExternalUIPath = path.Join(updater.ExternalUIPath, cfg.ExternalUIName) + } + + if cfg.ExternalUIURL != "" { + updater.ExternalUIURL = cfg.ExternalUIURL } return &General{ diff --git a/clash-meta/hub/executor/executor.go b/clash-meta/hub/executor/executor.go index e7e9b72c4c..c83b254c96 100644 --- a/clash-meta/hub/executor/executor.go +++ b/clash-meta/hub/executor/executor.go @@ -381,12 +381,12 @@ func updateTunnels(tunnels []LC.Tunnel) { } func initExternalUI() { - if updater.ExternalUIFolder != "" { - dirEntries, _ := os.ReadDir(updater.ExternalUIFolder) + if updater.AutoUpdateUI { + dirEntries, _ := os.ReadDir(updater.ExternalUIPath) if len(dirEntries) > 0 { - log.Infoln("UI already exists") + log.Infoln("UI already exists, skip downloading") } else { - log.Infoln("UI not exists, downloading") + log.Infoln("External UI downloading ...") updater.UpdateUI() } } diff --git a/clash-meta/hub/route/groups.go b/clash-meta/hub/route/groups.go index 30dec5f0bb..c4e9501f2d 100644 --- a/clash-meta/hub/route/groups.go +++ b/clash-meta/hub/route/groups.go @@ -60,9 +60,15 @@ func getGroupDelay(w http.ResponseWriter, r *http.Request) { return } - if proxy.(*adapter.Proxy).Type() == C.URLTest { - URLTestGroup := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.URLTest) - URLTestGroup.ForceSet("") + switch proxy.(*adapter.Proxy).Type() { + case C.URLTest: + if urlTestGroup, ok := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.URLTest); ok { + urlTestGroup.ForceSet("") + } + case C.Fallback: + if fallbackGroup, ok := proxy.(*adapter.Proxy).ProxyAdapter.(*outboundgroup.Fallback); ok { + fallbackGroup.ForceSet("") + } } if proxy.(*adapter.Proxy).Type() != C.Selector { diff --git a/clash-meta/hub/route/upgrade.go b/clash-meta/hub/route/upgrade.go index db00af5c8a..76ac26a10f 100644 --- a/clash-meta/hub/route/upgrade.go +++ b/clash-meta/hub/route/upgrade.go @@ -1,7 +1,6 @@ package route import ( - "errors" "fmt" "net/http" "os" @@ -50,15 +49,9 @@ func upgradeCore(w http.ResponseWriter, r *http.Request) { func updateUI(w http.ResponseWriter, r *http.Request) { err := updater.UpdateUI() if err != nil { - if errors.Is(err, updater.ErrIncompleteConf) { - log.Warnln("%s", err) - render.Status(r, http.StatusNotImplemented) - render.JSON(w, r, newError(fmt.Sprintf("%s", err))) - } else { - log.Warnln("%s", err) - render.Status(r, http.StatusInternalServerError) - render.JSON(w, r, newError(fmt.Sprintf("%s", err))) - } + log.Warnln("%s", err) + render.Status(r, http.StatusInternalServerError) + render.JSON(w, r, newError(fmt.Sprintf("%s", err))) return } diff --git a/clash-nyanpasu/.cargo/config.toml b/clash-nyanpasu/.cargo/config.toml deleted file mode 100644 index 3c32d251c5..0000000000 --- a/clash-nyanpasu/.cargo/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc" diff --git a/clash-nyanpasu/.github/workflows/ci.yml b/clash-nyanpasu/.github/workflows/ci.yml index 21aec4463d..459c0115de 100644 --- a/clash-nyanpasu/.github/workflows/ci.yml +++ b/clash-nyanpasu/.github/workflows/ci.yml @@ -75,7 +75,7 @@ jobs: run: pnpm install --no-frozen-lockfile - name: Prepare fronend - run: pnpm -r build # Build frontend + run: pnpm -r build && mkdir -p ./backend/tauri/.tmp/dist # Build frontend - name: Prepare sidecar and resources run: pnpm check - name: Lint diff --git a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml index 5890754135..0a6ffab4f2 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml @@ -51,31 +51,15 @@ jobs: run: | rustup install stable --profile minimal --no-self-update rustup default stable - - - name: Setup aarch64 Toolchain + - name: Setup Cargo binstall + if: ${{ inputs.aarch64 == true }} + uses: cargo-bins/cargo-binstall@main + - name: Setup Cross Toolchain if: ${{ inputs.aarch64 == true }} run: | - rustup target add aarch64-unknown-linux-gnu - sudo apt install gcc-aarch64-linux-gnu -y - sudo dpkg --add-architecture arm64 - cat < = String::from_utf8(output.stdout) - .unwrap() - .replace('\'', "") - .split(',') - .map(String::from) - .collect(); - println!("cargo:rustc-env=COMMIT_HASH={}", command_args[0]); - println!("cargo:rustc-env=COMMIT_AUTHOR={}", command_args[1]); - let commit_date = DateTime::parse_from_rfc3339(command_args[2].as_str()) + let (commit_hash, commit_author, commit_date) = if let Ok(true) = exists("./.tmp/git-info.json") + { + let mut git_info = read("./.tmp/git-info.json").unwrap(); + let git_info: GitInfo = simd_json::from_slice(&mut git_info).unwrap(); + (git_info.hash, git_info.author, git_info.time) + } else { + let output = Command::new("git") + .args([ + "show", + "--pretty=format:'%H,%cn,%cI'", + "--no-patch", + "--no-notes", + ]) + .output() + .expect("Failed to execute git command"); + // println!("{}", String::from_utf8(output.stderr.clone()).unwrap()); + let command_args: Vec = String::from_utf8(output.stdout) + .unwrap() + .replace('\'', "") + .split(',') + .map(String::from) + .collect(); + ( + command_args[0].clone(), + command_args[1].clone(), + command_args[2].clone(), + ) + }; + println!("cargo:rustc-env=COMMIT_HASH={}", commit_hash); + println!("cargo:rustc-env=COMMIT_AUTHOR={}", commit_author); + let commit_date = DateTime::parse_from_rfc3339(&commit_date) .unwrap() .with_timezone(&Utc) .to_rfc3339_opts(SecondsFormat::Millis, true); diff --git a/clash-nyanpasu/backend/tauri/tauri.conf.json b/clash-nyanpasu/backend/tauri/tauri.conf.json index 3b1d84a2c3..fa41e4cbe2 100644 --- a/clash-nyanpasu/backend/tauri/tauri.conf.json +++ b/clash-nyanpasu/backend/tauri/tauri.conf.json @@ -4,10 +4,10 @@ "version": "1.6.0" }, "build": { - "distDir": "../../frontend/nyanpasu/dist", + "distDir": "./.tmp/dist", "devPath": "http://localhost:3000/", "beforeDevCommand": "pnpm run web:dev", - "beforeBuildCommand": "pnpm run web:build" + "beforeBuildCommand": "pnpm run-p web:build generate:git-info && echo $(pwd) && rm -rf ./tauri/.tmp/dist && mv ../frontend/nyanpasu/dist ./tauri/.tmp/dist" }, "tauri": { "systemTray": { diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index ebe264759b..f37b32ec1f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -56,7 +56,7 @@ "@vitejs/plugin-react-swc": "3.7.0", "clsx": "2.1.1", "sass": "1.77.8", - "shiki": "1.15.2", + "shiki": "1.16.1", "tailwindcss-textshadow": "2.1.3", "unplugin-auto-import": "0.18.2", "unplugin-icons": "0.19.2", diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index fcb1de7b07..9575b6f267 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -44,6 +44,6 @@ "sass": "1.77.8", "tailwind-merge": "2.5.2", "typescript-plugin-css-modules": "5.1.0", - "vite-plugin-dts": "4.0.3" + "vite-plugin-dts": "4.1.0" } } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 9e17ab60ff..9a978777aa 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -43,6 +43,7 @@ "publish": "tsx scripts/publish.ts", "portable": "tsx scripts/portable.ts", "upload:osx-aarch64": "tsx scripts/osx-aarch64-upload.ts", + "generate:git-info": "tsx scripts/generate-git-info.ts", "generate:manifest": "run-p generate:manifest:*", "generate:manifest:latest-version": "tsx scripts/generate-latest-version.ts", "prepare": "husky", @@ -61,7 +62,7 @@ "@tauri-apps/cli": "1.6.1", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", - "@types/node": "22.5.1", + "@types/node": "22.5.2", "@typescript-eslint/eslint-plugin": "8.3.0", "@typescript-eslint/parser": "8.3.0", "autoprefixer": "10.4.20", @@ -80,10 +81,10 @@ "eslint-plugin-react": "7.35.0", "eslint-plugin-react-compiler": "0.0.0-experimental-f8a5409-20240829", "eslint-plugin-react-hooks": "4.6.2", - "knip": "5.28.0", + "knip": "5.29.1", "lint-staged": "15.2.9", "npm-run-all2": "6.2.2", - "postcss": "8.4.42", + "postcss": "8.4.44", "postcss-html": "1.7.0", "postcss-import": "16.1.0", "postcss-scss": "4.0.9", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index f9de9bdfb7..bc6ac7ed6c 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.4.1 - version: 19.4.1(@types/node@22.5.1)(typescript@5.5.4) + version: 19.4.1(@types/node@22.5.2)(typescript@5.5.4) '@commitlint/config-conventional': specifier: 19.4.1 version: 19.4.1 @@ -41,8 +41,8 @@ importers: specifier: 4.17.12 version: 4.17.12 '@types/node': - specifier: 22.5.1 - version: 22.5.1 + specifier: 22.5.2 + version: 22.5.2 '@typescript-eslint/eslint-plugin': specifier: 8.3.0 version: 8.3.0(@typescript-eslint/parser@8.3.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -51,7 +51,7 @@ importers: version: 8.3.0(eslint@8.57.0)(typescript@5.5.4) autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.4.42) + version: 10.4.20(postcss@8.4.44) conventional-changelog-conventionalcommits: specifier: 8.0.0 version: 8.0.0 @@ -98,8 +98,8 @@ importers: specifier: 4.6.2 version: 4.6.2(eslint@8.57.0) knip: - specifier: 5.28.0 - version: 5.28.0(@types/node@22.5.1)(typescript@5.5.4) + specifier: 5.29.1 + version: 5.29.1(@types/node@22.5.2)(typescript@5.5.4) lint-staged: specifier: 15.2.9 version: 15.2.9 @@ -107,17 +107,17 @@ importers: specifier: 6.2.2 version: 6.2.2 postcss: - specifier: 8.4.42 - version: 8.4.42 + specifier: 8.4.44 + version: 8.4.44 postcss-html: specifier: 1.7.0 version: 1.7.0 postcss-import: specifier: 16.1.0 - version: 16.1.0(postcss@8.4.42) + version: 16.1.0(postcss@8.4.44) postcss-scss: specifier: 4.0.9 - version: 4.0.9(postcss@8.4.42) + version: 4.0.9(postcss@8.4.44) prettier: specifier: 3.3.3 version: 3.3.3 @@ -199,7 +199,7 @@ importers: version: 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@generouted/react-router': specifier: 1.19.6 - version: 1.19.6(react-router-dom@6.26.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 1.19.6(react-router-dom@6.26.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) '@juggle/resize-observer': specifier: 3.4.0 version: 3.4.0 @@ -311,10 +311,10 @@ importers: version: types-react-dom@19.0.0-rc.1 '@vitejs/plugin-react': specifier: 4.3.1 - version: 4.3.1(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 4.3.1(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) '@vitejs/plugin-react-swc': specifier: 3.7.0 - version: 3.7.0(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 3.7.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) clsx: specifier: 2.1.1 version: 2.1.1 @@ -322,8 +322,8 @@ importers: specifier: 1.77.8 version: 1.77.8 shiki: - specifier: 1.15.2 - version: 1.15.2 + specifier: 1.16.1 + version: 1.16.1 tailwindcss-textshadow: specifier: 2.1.3 version: 2.1.3 @@ -335,19 +335,19 @@ importers: version: 0.19.2(@svgr/core@8.1.0(typescript@5.5.4)) vite: specifier: 5.4.2 - version: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + version: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) vite-plugin-monaco-editor: specifier: npm:vite-plugin-monaco-editor-new@1.1.3 version: vite-plugin-monaco-editor-new@1.1.3(monaco-editor@0.51.0) vite-plugin-sass-dts: specifier: 1.3.25 - version: 1.3.25(postcss@8.4.42)(prettier@3.3.3)(sass@1.77.8)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 1.3.25(postcss@8.4.44)(prettier@3.3.3)(sass@1.77.8)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) vite-plugin-svgr: specifier: 4.2.0 - version: 4.2.0(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 4.2.0(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) frontend/ui: dependencies: @@ -380,7 +380,7 @@ importers: version: types-react@19.0.0-rc.1 '@vitejs/plugin-react': specifier: 4.3.1 - version: 4.3.1(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 4.3.1(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) ahooks: specifier: 3.8.1 version: 3.8.1(react@19.0.0-rc-e948a5ac-20240807) @@ -404,10 +404,10 @@ importers: version: 17.5.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807) vite: specifier: 5.4.2 - version: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + version: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) vite-tsconfig-paths: specifier: 5.0.1 - version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + version: 5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) devDependencies: '@emotion/react': specifier: 11.13.3 @@ -431,8 +431,8 @@ importers: specifier: 5.1.0 version: 5.1.0(typescript@5.5.4) vite-plugin-dts: - specifier: 4.0.3 - version: 4.0.3(@types/node@22.5.1)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + specifier: 4.1.0 + version: 4.1.0(@types/node@22.5.2)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) scripts: dependencies: @@ -2048,8 +2048,11 @@ packages: '@rushstack/ts-command-line@4.22.3': resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} - '@shikijs/core@1.15.2': - resolution: {integrity: sha512-hi6XZuwHYn6bU4wtXZxST8ynM55aiU2+rVU9aPIrSxqKmEKl4d65puwGsggwcZWTET+7zGXKe7AUj46iQ8Aq8w==} + '@shikijs/core@1.16.1': + resolution: {integrity: sha512-aI0hBtw+a6KsJp2jcD4YuQqKpeCbURMZbhHVozDknJpm+KJqeMRkEnfBC8BaKE/5XC+uofPgCLsa/TkTk0Ba0w==} + + '@shikijs/vscode-textmate@9.2.0': + resolution: {integrity: sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -2492,8 +2495,8 @@ packages: '@types/node@22.5.0': resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} - '@types/node@22.5.1': - resolution: {integrity: sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==} + '@types/node@22.5.2': + resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4623,8 +4626,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - knip@5.28.0: - resolution: {integrity: sha512-3nlqKCHFCfXp4VDP570ly7HLCyIM3JyLM+msr2l3HtQJ1NeraBrj6AQE80SFIyu8nOJZZpiZQWmiXq5RSczqsQ==} + knip@5.29.1: + resolution: {integrity: sha512-l8qFtRqNpCk8xf46VOwhBUva7LBwanoGPJ4KQNwVRl6hmEXStf1BJlfbYRZ+yQpbilbIV6LN+ztX6LaGtyd4TQ==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: @@ -5465,8 +5468,8 @@ packages: resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.42: - resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==} + postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -5931,8 +5934,8 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - shiki@1.15.2: - resolution: {integrity: sha512-M+7QZQZiZw/cZeizrC/yryG3eeG8pTUhu7ZaHxVyzPNFIRIlN46YBciquoNPCiXiwLnx6JB62f3lSuSYQrus1w==} + shiki@1.16.1: + resolution: {integrity: sha512-tCJIMaxDVB1mEIJ5TvfZU7kCPB5eo9fli5+21Olc/bmyv+w8kye3JOp+LZRmGkAyT71hrkefQhTiY+o9mBikRQ==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -6581,8 +6584,8 @@ packages: vue: optional: true - vite-plugin-dts@4.0.3: - resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==} + vite-plugin-dts@4.1.0: + resolution: {integrity: sha512-sRlmt9k2q8MrX4F2058N3KmB6WyJ3Ao6QaExOv1X99F3j0GhPziEz1zscWQ1q2r1PeFc96L7GIUu8Pl2DPr2Hg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -7130,11 +7133,11 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@commitlint/cli@19.4.1(@types/node@22.5.1)(typescript@5.5.4)': + '@commitlint/cli@19.4.1(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@commitlint/format': 19.3.0 '@commitlint/lint': 19.4.1 - '@commitlint/load': 19.4.0(@types/node@22.5.1)(typescript@5.5.4) + '@commitlint/load': 19.4.0(@types/node@22.5.2)(typescript@5.5.4) '@commitlint/read': 19.4.0 '@commitlint/types': 19.0.3 execa: 8.0.1 @@ -7181,7 +7184,7 @@ snapshots: '@commitlint/rules': 19.4.1 '@commitlint/types': 19.0.3 - '@commitlint/load@19.4.0(@types/node@22.5.1)(typescript@5.5.4)': + '@commitlint/load@19.4.0(@types/node@22.5.2)(typescript@5.5.4)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 @@ -7189,7 +7192,7 @@ snapshots: '@commitlint/types': 19.0.3 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.5.4) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.1)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.2)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -7647,13 +7650,13 @@ snapshots: postcss: 7.0.32 purgecss: 2.3.0 - '@generouted/react-router@1.19.6(react-router-dom@6.26.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': + '@generouted/react-router@1.19.6(react-router-dom@6.26.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': dependencies: fast-glob: 3.3.2 - generouted: 1.19.6(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) + generouted: 1.19.6(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)) react: 19.0.0-rc-e948a5ac-20240807 react-router-dom: 6.26.1(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807) - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) '@humanwhocodes/config-array@0.11.14': dependencies: @@ -7739,23 +7742,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@microsoft/api-extractor-model@7.29.4(@types/node@22.5.1)': + '@microsoft/api-extractor-model@7.29.4(@types/node@22.5.2)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.1) + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.2) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.4(@types/node@22.5.1)': + '@microsoft/api-extractor@7.47.4(@types/node@22.5.2)': dependencies: - '@microsoft/api-extractor-model': 7.29.4(@types/node@22.5.1) + '@microsoft/api-extractor-model': 7.29.4(@types/node@22.5.2) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.1) + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.2) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.13.3(@types/node@22.5.1) - '@rushstack/ts-command-line': 4.22.3(@types/node@22.5.1) + '@rushstack/terminal': 0.13.3(@types/node@22.5.2) + '@rushstack/ts-command-line': 4.22.3(@types/node@22.5.2) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -8311,7 +8314,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true - '@rushstack/node-core-library@5.5.1(@types/node@22.5.1)': + '@rushstack/node-core-library@5.5.1(@types/node@22.5.2)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -8322,33 +8325,36 @@ snapshots: resolve: 1.22.8 semver: 7.5.4 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.13.3(@types/node@22.5.1)': + '@rushstack/terminal@0.13.3(@types/node@22.5.2)': dependencies: - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.1) + '@rushstack/node-core-library': 5.5.1(@types/node@22.5.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 - '@rushstack/ts-command-line@4.22.3(@types/node@22.5.1)': + '@rushstack/ts-command-line@4.22.3(@types/node@22.5.2)': dependencies: - '@rushstack/terminal': 0.13.3(@types/node@22.5.1) + '@rushstack/terminal': 0.13.3(@types/node@22.5.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@shikijs/core@1.15.2': + '@shikijs/core@1.16.1': dependencies: + '@shikijs/vscode-textmate': 9.2.0 '@types/hast': 3.0.4 + '@shikijs/vscode-textmate@9.2.0': {} + '@sindresorhus/is@4.6.0': {} '@snyk/github-codeowners@1.1.0': @@ -8600,12 +8606,12 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/responselike': 1.0.3 '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/d3-array@3.2.1': {} @@ -8741,7 +8747,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/geojson@7946.0.14': {} @@ -8757,11 +8763,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/lodash-es@4.17.12': dependencies: @@ -8781,7 +8787,7 @@ snapshots: dependencies: undici-types: 6.19.6 - '@types/node@22.5.1': + '@types/node@22.5.2': dependencies: undici-types: 6.19.6 @@ -8789,11 +8795,11 @@ snapshots: '@types/postcss-modules-local-by-default@4.0.2': dependencies: - postcss: 8.4.42 + postcss: 8.4.44 '@types/postcss-modules-scope@3.0.4': dependencies: - postcss: 8.4.42 + postcss: 8.4.44 '@types/prop-types@15.7.12': {} @@ -8803,7 +8809,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 '@types/unist@2.0.10': {} @@ -8811,7 +8817,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 optional: true '@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': @@ -8897,21 +8903,21 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': + '@vitejs/plugin-react-swc@3.7.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': dependencies: '@swc/core': 1.6.1 - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.1(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': + '@vitejs/plugin-react@4.3.1(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) transitivePeerDependencies: - supports-color @@ -9170,14 +9176,14 @@ snapshots: dependencies: tslib: 2.6.2 - autoprefixer@10.4.20(postcss@8.4.42): + autoprefixer@10.4.20(postcss@8.4.44): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001646 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.42 + postcss: 8.4.44 postcss-value-parser: 4.2.0 autoprefixer@9.8.8: @@ -9475,9 +9481,9 @@ snapshots: dependencies: toggle-selection: 1.0.6 - cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.1)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): + cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.2)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): dependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 cosmiconfig: 9.0.0(typescript@5.5.4) jiti: 1.21.6 typescript: 5.5.4 @@ -10560,9 +10566,9 @@ snapshots: functions-have-names@1.2.3: {} - generouted@1.19.6(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): + generouted@1.19.6(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): dependencies: - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) gensync@1.0.0-beta.2: {} @@ -11173,11 +11179,11 @@ snapshots: kind-of@6.0.3: {} - knip@5.28.0(@types/node@22.5.1)(typescript@5.5.4): + knip@5.29.1(@types/node@22.5.2)(typescript@5.5.4): dependencies: '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 22.5.1 + '@types/node': 22.5.2 easy-table: 1.2.0 enhanced-resolve: 5.17.1 fast-glob: 3.3.2 @@ -11996,19 +12002,19 @@ snapshots: dependencies: htmlparser2: 8.0.2 js-tokens: 9.0.0 - postcss: 8.4.42 - postcss-safe-parser: 6.0.0(postcss@8.4.42) + postcss: 8.4.44 + postcss-safe-parser: 6.0.0(postcss@8.4.44) - postcss-import@15.1.0(postcss@8.4.42): + postcss-import@15.1.0(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.1.0(postcss@8.4.42): + postcss-import@16.1.0(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 @@ -12018,10 +12024,10 @@ snapshots: camelcase-css: 2.0.1 postcss: 7.0.39 - postcss-js@4.0.1(postcss@8.4.42): + postcss-js@4.0.1(postcss@8.4.44): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.42 + postcss: 8.4.44 postcss-load-config@3.1.4(postcss@8.4.38): dependencies: @@ -12030,12 +12036,12 @@ snapshots: optionalDependencies: postcss: 8.4.38 - postcss-load-config@4.0.2(postcss@8.4.42): + postcss-load-config@4.0.2(postcss@8.4.44): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-media-query-parser@0.2.3: {} @@ -12060,24 +12066,24 @@ snapshots: postcss: 7.0.39 postcss-selector-parser: 6.1.2 - postcss-nested@6.0.1(postcss@8.4.42): + postcss-nested@6.0.1(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-selector-parser: 6.1.2 postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@6.0.0(postcss@8.4.42): + postcss-safe-parser@6.0.0(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 - postcss-safe-parser@7.0.0(postcss@8.4.42): + postcss-safe-parser@7.0.0(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 - postcss-scss@4.0.9(postcss@8.4.42): + postcss-scss@4.0.9(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-selector-parser@6.0.16: dependencies: @@ -12099,9 +12105,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sorting@8.0.2(postcss@8.4.42): + postcss-sorting@8.0.2(postcss@8.4.44): dependencies: - postcss: 8.4.42 + postcss: 8.4.44 postcss-value-parser@3.3.1: {} @@ -12136,7 +12142,7 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 - postcss@8.4.42: + postcss@8.4.44: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -12593,9 +12599,10 @@ snapshots: shell-quote@1.8.1: {} - shiki@1.15.2: + shiki@1.16.1: dependencies: - '@shikijs/core': 1.15.2 + '@shikijs/core': 1.16.1 + '@shikijs/vscode-textmate': 9.2.0 '@types/hast': 3.0.4 side-channel@1.0.6: @@ -12814,8 +12821,8 @@ snapshots: stylelint-order@6.0.4(stylelint@16.9.0(typescript@5.5.4)): dependencies: - postcss: 8.4.42 - postcss-sorting: 8.0.2(postcss@8.4.42) + postcss: 8.4.44 + postcss-sorting: 8.0.2(postcss@8.4.44) stylelint: 16.9.0(typescript@5.5.4) stylelint-scss@6.5.1(stylelint@16.9.0(typescript@5.5.4)): @@ -12858,9 +12865,9 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.42 + postcss: 8.4.44 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.0(postcss@8.4.42) + postcss-safe-parser: 7.0.0(postcss@8.4.44) postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -12999,11 +13006,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.42 - postcss-import: 15.1.0(postcss@8.4.42) - postcss-js: 4.0.1(postcss@8.4.42) - postcss-load-config: 4.0.2(postcss@8.4.42) - postcss-nested: 6.0.1(postcss@8.4.42) + postcss: 8.4.44 + postcss-import: 15.1.0(postcss@8.4.44) + postcss-js: 4.0.1(postcss@8.4.44) + postcss-load-config: 4.0.2(postcss@8.4.44) + postcss-nested: 6.0.1(postcss@8.4.44) postcss-selector-parser: 6.1.1 resolve: 1.22.8 sucrase: 3.35.0 @@ -13389,9 +13396,9 @@ snapshots: react: 19.0.0-rc-e948a5ac-20240807 react-dom: 19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807) - vite-plugin-dts@4.0.3(@types/node@22.5.1)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): + vite-plugin-dts@4.1.0(@types/node@22.5.2)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): dependencies: - '@microsoft/api-extractor': 7.47.4(@types/node@22.5.1) + '@microsoft/api-extractor': 7.47.4(@types/node@22.5.2) '@rollup/pluginutils': 5.1.0(rollup@4.21.0) '@volar/typescript': 2.4.0 '@vue/language-core': 2.0.29(typescript@5.5.4) @@ -13403,7 +13410,7 @@ snapshots: typescript: 5.5.4 vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) transitivePeerDependencies: - '@types/node' - rollup @@ -13414,43 +13421,43 @@ snapshots: esbuild: 0.19.12 monaco-editor: 0.51.0 - vite-plugin-sass-dts@1.3.25(postcss@8.4.42)(prettier@3.3.3)(sass@1.77.8)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): + vite-plugin-sass-dts@1.3.25(postcss@8.4.44)(prettier@3.3.3)(sass@1.77.8)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): dependencies: - postcss: 8.4.42 - postcss-js: 4.0.1(postcss@8.4.42) + postcss: 8.4.44 + postcss-js: 4.0.1(postcss@8.4.44) prettier: 3.3.3 sass: 1.77.8 - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) - vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): + vite-plugin-svgr@4.2.0(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.21.0) '@svgr/core': 8.1.0(typescript@5.5.4) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.4)) - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): + vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0)): dependencies: debug: 4.3.6 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.4) optionalDependencies: - vite: 5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.2(@types/node@22.5.1)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0): + vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(sass@1.77.8)(stylus@0.62.0): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.21.0 optionalDependencies: - '@types/node': 22.5.1 + '@types/node': 22.5.2 fsevents: 2.3.3 less: 4.2.0 sass: 1.77.8 diff --git a/clash-nyanpasu/scripts/generate-git-info.ts b/clash-nyanpasu/scripts/generate-git-info.ts new file mode 100644 index 0000000000..710a29d673 --- /dev/null +++ b/clash-nyanpasu/scripts/generate-git-info.ts @@ -0,0 +1,31 @@ +import { execSync } from "node:child_process"; +import fs from "fs-extra"; +import { GIT_SUMMARY_INFO_PATH, TAURI_APP_TEMP_DIR } from "./utils/env"; +import { consola } from "./utils/logger"; + +async function main() { + const [hash, author, time] = execSync( + "git show --pretty=format:'%H,%cn,%cI' --no-patch --no-notes", + { + cwd: process.cwd(), + }, + ) + .toString() + .replace(/'/g, "") + .split(","); + + const summary = { + hash, + author, + time, + }; + consola.info(summary); + if (!(await fs.exists(TAURI_APP_TEMP_DIR))) { + await fs.mkdir(TAURI_APP_TEMP_DIR); + } + + await fs.writeJSON(GIT_SUMMARY_INFO_PATH, summary, { spaces: 2 }); + consola.success("Git summary info generated"); +} + +main().catch(consola.error); diff --git a/clash-nyanpasu/scripts/telegram-notify.ts b/clash-nyanpasu/scripts/telegram-notify.ts index e93cee9b71..f9b5f73f62 100644 --- a/clash-nyanpasu/scripts/telegram-notify.ts +++ b/clash-nyanpasu/scripts/telegram-notify.ts @@ -44,6 +44,8 @@ const resourceFormats = [ "amd64.deb", "x64.dmg", "aarch64.dmg", + "aarch64.rpm", + "arm64.deb", ]; const isValidFormat = (fileName: string): boolean => { diff --git a/clash-nyanpasu/scripts/utils/env.ts b/clash-nyanpasu/scripts/utils/env.ts index 27f6161b95..701b7342ae 100644 --- a/clash-nyanpasu/scripts/utils/env.ts +++ b/clash-nyanpasu/scripts/utils/env.ts @@ -7,3 +7,8 @@ export const GITHUB_PROXY = "https://mirror.ghproxy.com/"; export const GITHUB_TOKEN = process.env.GITHUB_TOKEN; export const TEMP_DIR = path.join(cwd, "node_modules/.verge"); export const MANIFEST_VERSION_PATH = path.join(MANIFEST_DIR, "version.json"); +export const TAURI_APP_TEMP_DIR = path.join(TAURI_APP_DIR, ".tmp"); +export const GIT_SUMMARY_INFO_PATH = path.join( + TAURI_APP_TEMP_DIR, + "git-info.json", +); diff --git a/echo/internal/conn/relay_conn.go b/echo/internal/conn/relay_conn.go index ed7d27733e..f0e110377b 100644 --- a/echo/internal/conn/relay_conn.go +++ b/echo/internal/conn/relay_conn.go @@ -64,12 +64,11 @@ type relayConnImpl struct { EndTime time.Time `json:"end_time,omitempty"` // options set those fields - l *zap.SugaredLogger - remote *lb.Node - HandshakeDuration time.Duration - RelayLabel string `json:"relay_label"` - ConnType string `json:"conn_type"` - Options *conf.Options + l *zap.SugaredLogger + remote *lb.Node + RelayLabel string `json:"relay_label"` + ConnType string `json:"conn_type"` + Options *conf.Options } func WithRelayLabel(relayLabel string) RelayConnOption { @@ -78,12 +77,6 @@ func WithRelayLabel(relayLabel string) RelayConnOption { } } -func WithHandshakeDuration(duration time.Duration) RelayConnOption { - return func(rci *relayConnImpl) { - rci.HandshakeDuration = duration - } -} - func WithConnType(connType string) RelayConnOption { return func(rci *relayConnImpl) { rci.ConnType = connType @@ -93,6 +86,7 @@ func WithConnType(connType string) RelayConnOption { func WithRemote(remote *lb.Node) RelayConnOption { return func(rci *relayConnImpl) { rci.remote = remote + rci.Stats.HandShakeLatency = remote.HandShakeDuration } } diff --git a/echo/internal/transporter/base.go b/echo/internal/transporter/base.go index bea3927fc4..e41be343f4 100644 --- a/echo/internal/transporter/base.go +++ b/echo/internal/transporter/base.go @@ -44,9 +44,6 @@ func newBaseRelayServer(cfg *conf.Config, cmgr cmgr.Cmgr) (*BaseRelayServer, err } func (b *BaseRelayServer) RelayTCPConn(ctx context.Context, c net.Conn, remote *lb.Node) error { - if remote == nil { - remote = b.remotes.Next().Clone() - } metrics.CurConnectionCount.WithLabelValues(remote.Label, metrics.METRIC_CONN_TYPE_TCP).Inc() defer metrics.CurConnectionCount.WithLabelValues(remote.Label, metrics.METRIC_CONN_TYPE_TCP).Dec() @@ -66,15 +63,11 @@ func (b *BaseRelayServer) RelayTCPConn(ctx context.Context, c net.Conn, remote * return fmt.Errorf("handshake error: %w", err) } defer rc.Close() - b.l.Infof("RelayTCPConn from %s to %s", c.LocalAddr(), remote.Address) return b.handleRelayConn(c, rc, remote, metrics.METRIC_CONN_TYPE_TCP) } func (b *BaseRelayServer) RelayUDPConn(ctx context.Context, c net.Conn, remote *lb.Node) error { - if remote == nil { - remote = b.remotes.Next().Clone() - } metrics.CurConnectionCount.WithLabelValues(remote.Label, metrics.METRIC_CONN_TYPE_UDP).Inc() defer metrics.CurConnectionCount.WithLabelValues(remote.Label, metrics.METRIC_CONN_TYPE_UDP).Dec() @@ -144,7 +137,6 @@ func (b *BaseRelayServer) handleRelayConn(c, rc net.Conn, remote *lb.Node, connT conn.WithConnType(connType), conn.WithRelayLabel(b.cfg.Label), conn.WithRelayOptions(b.cfg.Options), - conn.WithHandshakeDuration(remote.HandShakeDuration), } relayConn := conn.NewRelayConn(c, rc, opts...) if b.cmgr != nil { diff --git a/echo/internal/transporter/raw.go b/echo/internal/transporter/raw.go index e03a3eeef9..c9b7ac77bc 100644 --- a/echo/internal/transporter/raw.go +++ b/echo/internal/transporter/raw.go @@ -99,7 +99,7 @@ func (s *RawServer) ListenAndServe(ctx context.Context) error { } go func(c net.Conn) { defer c.Close() - if err := s.RelayTCPConn(ctx, c, nil); err != nil { + if err := s.RelayTCPConn(ctx, c, s.remotes.Next()); err != nil { s.l.Errorf("RelayTCPConn meet error: %s", err.Error()) } }(c) @@ -118,7 +118,7 @@ func (s *RawServer) listenUDP(ctx context.Context) error { return err } go func() { - if err := s.RelayUDPConn(ctx, c, nil); err != nil { + if err := s.RelayUDPConn(ctx, c, s.remotes.Next()); err != nil { s.l.Errorf("RelayUDPConn meet error: %s", err.Error()) } }() diff --git a/echo/internal/transporter/ws.go b/echo/internal/transporter/ws.go index fca4850e91..d281a79151 100644 --- a/echo/internal/transporter/ws.go +++ b/echo/internal/transporter/ws.go @@ -98,6 +98,8 @@ func (s *WsServer) handleRequest(w http.ResponseWriter, req *http.Request) { var remote *lb.Node if addr := req.URL.Query().Get(conf.WS_QUERY_REMOTE_ADDR); addr != "" { remote = &lb.Node{Address: addr, Label: addr} + } else { + remote = s.remotes.Next() } if req.URL.Query().Get("type") == "udp" { diff --git a/echo/internal/web/js/metrics.js b/echo/internal/web/js/metrics.js new file mode 100644 index 0000000000..b6b53d41ad --- /dev/null +++ b/echo/internal/web/js/metrics.js @@ -0,0 +1,393 @@ +const MetricsModule = (function () { + // Constants + const API_BASE_URL = '/api/v1'; + const NODE_METRICS_PATH = '/node_metrics/'; + const BYTE_TO_MB = 1024 * 1024; + + const handleError = (error) => { + console.error('Error:', error); + }; + + // API functions + const fetchData = async (path, params = {}) => { + const url = new URL(API_BASE_URL + path, window.location.origin); + Object.entries(params).forEach(([key, value]) => url.searchParams.append(key, value)); + try { + const response = await fetch(url.toString()); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); + } catch (error) { + handleError(error); + return null; + } + }; + + const fetchLatestMetric = () => fetchData(NODE_METRICS_PATH, { latest: true }).then((data) => data?.data[0]); + const fetchMetrics = (startTs, endTs) => fetchData(NODE_METRICS_PATH, { start_ts: startTs, end_ts: endTs }).then((data) => data?.data); + + // Chart functions + const initChart = (canvasId, type, datasets, legendPosition = '', yDisplayText = '', title = '', unit = '') => { + const ctx = $(`#${canvasId}`)[0].getContext('2d'); + const colors = { + cpu: 'rgba(255, 99, 132, 1)', + memory: 'rgba(54, 162, 235, 1)', + disk: 'rgba(255, 206, 86, 1)', + receive: 'rgba(0, 150, 255, 1)', + transmit: 'rgba(255, 140, 0, 1)', + }; + + const getDatasetConfig = (label) => { + const color = colors[label.toLowerCase()] || 'rgba(0, 0, 0, 1)'; + return { + label, + borderColor: color, + backgroundColor: color.replace('1)', '0.2)'), + borderWidth: 2, + pointRadius: 2, + pointHoverRadius: 2, + fill: true, + data: [], + }; + }; + + const data = { + labels: [], + datasets: $.isArray(datasets) ? datasets.map((dataset) => getDatasetConfig(dataset.label)) : [getDatasetConfig(datasets.label)], + }; + + return new Chart(ctx, { + type, + data, + options: { + line: { + spanGaps: false, // 设置为 false,不连接空值 + }, + responsive: true, + plugins: { + legend: { position: legendPosition }, + title: { + display: !!title, + text: title, + position: 'bottom', + font: { size: 14, weight: 'bold' }, + }, + tooltip: { + callbacks: { + title: function (tooltipItems) { + return new Date(tooltipItems[0].label).toLocaleString(); + }, + label: function (context) { + let label = context.dataset.label || ''; + if (label) { + label += ': '; + } + if (context.parsed.y !== null) { + label += context.parsed.y.toFixed(2) + ' ' + unit; + } + return label; + }, + }, + }, + }, + scales: { + x: { + type: 'time', + time: { + unit: 'minute', + displayFormats: { + minute: 'HH:mm', + }, + }, + ticks: { + maxRotation: 0, + autoSkip: true, + maxTicksLimit: 10, + }, + adapters: { + date: { + locale: 'en', + }, + }, + }, + y: { + beginAtZero: true, + title: { display: true, text: yDisplayText, font: { weight: 'bold' } }, + }, + }, + elements: { line: { tension: 0.4 } }, + downsample: { + enabled: true, + threshold: 200, + }, + }, + }); + }; + + const updateChart = (chart, newData, labels) => { + if (!newData || !labels) { + console.error('Invalid data or labels provided'); + return; + } + + if ($.isArray(newData) && $.isArray(newData[0])) { + $.each(chart.data.datasets, (index, dataset) => { + if (newData[index]) { + dataset.data = newData[index].map((value, i) => ({ x: moment(labels[i]), y: value })); + } + }); + } else { + chart.data.datasets[0].data = newData.map((value, i) => ({ x: moment(labels[i]), y: value })); + } + + chart.options.scales.x.min = moment(labels[0]); + chart.options.scales.x.max = moment(labels[labels.length - 1]); + chart.update(); + }; + + const updateCharts = (charts, metrics, startTs, endTs) => { + console.log('Raw metrics data:', metrics); + + const generateTimestamps = (start, end) => { + const timestamps = []; + let current = moment.unix(start); + const endMoment = moment.unix(end); + while (current.isSameOrBefore(endMoment)) { + timestamps.push(current.toISOString()); + current.add(1, 'minute'); + } + return timestamps; + }; + + const timestamps = generateTimestamps(startTs, endTs); + + const processData = (dataKey) => { + const data = new Array(timestamps.length).fill(null); + metrics.forEach((metric) => { + const index = Math.floor((metric.timestamp - startTs) / 60); + if (index >= 0 && index < data.length) { + data[index] = metric[dataKey]; + } + }); + return data; + }; + + updateChart(charts.cpu, processData('cpu_usage'), timestamps); + updateChart(charts.memory, processData('memory_usage'), timestamps); + updateChart(charts.disk, processData('disk_usage'), timestamps); + updateChart( + charts.network, + [ + processData('network_in').map((v) => (v === null ? null : v / BYTE_TO_MB)), + processData('network_out').map((v) => (v === null ? null : v / BYTE_TO_MB)), + ], + timestamps + ); + }; + + const addLatestDataToCharts = (charts, latestMetric) => { + console.log('Raw latestMetric data:', latestMetric); + const timestamp = moment.unix(latestMetric.timestamp); + + $.each(charts, (key, chart) => { + // 检查是否已经有这个时间戳的数据 + const existingDataIndex = chart.data.labels.findIndex((label) => label.isSame(timestamp)); + + if (existingDataIndex === -1) { + // 如果是新数据,添加到末尾 + chart.data.labels.push(timestamp); + if (key === 'network') { + chart.data.datasets[0].data.push({ x: timestamp, y: latestMetric.network_in / BYTE_TO_MB }); + chart.data.datasets[1].data.push({ x: timestamp, y: latestMetric.network_out / BYTE_TO_MB }); + } else { + chart.data.datasets[0].data.push({ x: timestamp, y: latestMetric[`${key}_usage`] }); + } + + // 更新x轴范围,但保持一定的时间窗口 + const timeWindow = moment.duration(30, 'minutes'); // 设置显示的时间窗口,例如30分钟 + const oldestAllowedTime = moment(timestamp).subtract(timeWindow); + + chart.options.scales.x.min = oldestAllowedTime; + chart.options.scales.x.max = timestamp; + + // 开启图表的平移和缩放功能 + chart.options.plugins.zoom = { + pan: { + enabled: true, + mode: 'x', + }, + zoom: { + wheel: { + enabled: true, + }, + pinch: { + enabled: true, + }, + mode: 'x', + }, + }; + + chart.update(); + } + // 如果数据已存在,我们不做任何操作,保持现有数据 + }); + }; + + // Chart initialization + const initializeCharts = async () => { + const metric = await fetchLatestMetric(); + if (!metric) return null; + return { + cpu: initChart('cpuChart', 'line', { label: 'CPU' }, 'top', 'Usage (%)', `CPU`, '%'), + memory: initChart('memoryChart', 'line', { label: 'Memory' }, 'top', 'Usage (%)', `Memory`, '%'), + disk: initChart('diskChart', 'line', { label: 'Disk' }, 'top', 'Usage (%)', `Disk`, '%'), + network: initChart( + 'networkChart', + 'line', + [{ label: 'Receive' }, { label: 'Transmit' }], + 'top', + 'Rate (MB/s)', + 'Network Rate', + 'MB/s' + ), + }; + }; + + // Date range functions + const setupDateRangeDropdown = (charts) => { + const $dateRangeDropdown = $('#dateRangeDropdown'); + const $dateRangeButton = $('#dateRangeButton'); + const $dateRangeText = $('#dateRangeText'); + const $dateRangeInput = $('#dateRangeInput'); + + $dateRangeDropdown.find('.dropdown-item[data-range]').on('click', function (e) { + e.preventDefault(); + const range = $(this).data('range'); + const now = new Date(); + let start, end; + switch (range) { + case '30m': + start = new Date(now - 30 * 60 * 1000); + break; + case '1h': + start = new Date(now - 60 * 60 * 1000); + break; + case '3h': + start = new Date(now - 3 * 60 * 60 * 1000); + break; + case '6h': + start = new Date(now - 6 * 60 * 60 * 1000); + break; + case '12h': + start = new Date(now - 12 * 60 * 60 * 1000); + break; + case '24h': + start = new Date(now - 24 * 60 * 60 * 1000); + break; + case '7d': + start = new Date(now - 7 * 24 * 60 * 60 * 1000); + break; + } + end = now; + + const startTs = Math.floor(start.getTime() / 1000); + const endTs = Math.floor(end.getTime() / 1000); + fetchDataForRange(charts, startTs, endTs); + $dateRangeText.text($(this).text()); + $dateRangeDropdown.removeClass('is-active'); + }); + + $dateRangeButton.on('click', (event) => { + event.stopPropagation(); + $dateRangeDropdown.toggleClass('is-active'); + }); + + $(document).on('click', (event) => { + if (!$dateRangeDropdown.has(event.target).length) { + $dateRangeDropdown.removeClass('is-active'); + } + }); + + const picker = flatpickr($dateRangeInput[0], { + mode: 'range', + enableTime: true, + dateFormat: 'Y-m-d H:i', + onChange: function (selectedDates) { + if (selectedDates.length === 2) { + const startTs = Math.floor(selectedDates[0].getTime() / 1000); + const endTs = Math.floor(selectedDates[1].getTime() / 1000); + fetchDataForRange(charts, startTs, endTs); + + const formattedStart = selectedDates[0].toLocaleString(); + const formattedEnd = selectedDates[1].toLocaleString(); + $dateRangeText.text(`${formattedStart} - ${formattedEnd}`); + + // 关闭下拉菜单 + $dateRangeDropdown.removeClass('is-active'); + } + }, + onClose: function () { + // 确保在日期选择器关闭时也关闭下拉菜单 + $dateRangeDropdown.removeClass('is-active'); + }, + }); + + // 防止点击日期选择器时关闭下拉菜单 + $dateRangeInput.on('click', (event) => { + event.stopPropagation(); + }); + }; + + const fetchDataForRange = async (charts, startTs, endTs) => { + const metrics = await fetchMetrics(startTs, endTs); + if (metrics) { + console.log('Raw metrics data:', metrics); + updateCharts(charts, metrics, startTs, endTs); + } + }; + + // Auto refresh functions + const setupAutoRefresh = (charts) => { + let autoRefreshInterval; + let isAutoRefreshing = false; + $('#refreshButton').click(function () { + if (isAutoRefreshing) { + clearInterval(autoRefreshInterval); + $(this).removeClass('is-info'); + $(this).find('span:last').text('Auto Refresh'); + isAutoRefreshing = false; + } else { + $(this).addClass('is-info'); + $(this).find('span:last').text('Stop Refresh'); + isAutoRefreshing = true; + refreshData(charts); + autoRefreshInterval = setInterval(() => refreshData(charts), 5000); + } + }); + }; + + const refreshData = async (charts) => { + const latestMetric = await fetchLatestMetric(); + if (latestMetric) { + addLatestDataToCharts(charts, latestMetric); + } + }; + + // Main initialization function + const init = async () => { + const charts = await initializeCharts(); + if (charts) { + setupDateRangeDropdown(charts); + setupAutoRefresh(charts); + } + }; + + // Public API + return { + init: init, + }; +})(); + +// Initialize when the DOM is ready +document.addEventListener('DOMContentLoaded', MetricsModule.init); diff --git a/echo/internal/web/server.go b/echo/internal/web/server.go index 4efca1eab8..72263fba7e 100644 --- a/echo/internal/web/server.go +++ b/echo/internal/web/server.go @@ -22,7 +22,7 @@ import ( "github.com/Ehco1996/ehco/internal/metrics" ) -//go:embed templates/*.html +//go:embed templates/*.html js/*.js var templatesFS embed.FS const ( @@ -70,7 +70,7 @@ func NewServer( return nil, errors.Wrap(err, "failed to setup middleware") } - if err := setupTemplates(e, l); err != nil { + if err := setupTemplates(e, l, cfg); err != nil { return nil, errors.Wrap(err, "failed to setup templates") } @@ -128,10 +128,13 @@ func setupMiddleware(e *echo.Echo, cfg *config.Config, l *zap.SugaredLogger) err return nil } -func setupTemplates(e *echo.Echo, l *zap.SugaredLogger) error { +func setupTemplates(e *echo.Echo, l *zap.SugaredLogger, cfg *config.Config) error { funcMap := template.FuncMap{ "sub": func(a, b int) int { return a - b }, "add": func(a, b int) int { return a + b }, + "CurrentCfg": func() *config.Config { + return cfg + }, } tmpl, err := template.New("").Funcs(funcMap).ParseFS(templatesFS, "templates/*.html") if err != nil { @@ -158,6 +161,7 @@ func setupMetrics(cfg *config.Config) error { func setupRoutes(s *Server) { e := s.e + e.StaticFS("/js", echo.MustSubFS(templatesFS, "js")) e.GET(metricsPath, echo.WrapHandler(promhttp.Handler())) e.GET("/debug/pprof/*", echo.WrapHandler(http.DefaultServeMux)) diff --git a/echo/internal/web/templates/_head.html b/echo/internal/web/templates/_head.html index 0e30406b1d..2a32cdcaae 100644 --- a/echo/internal/web/templates/_head.html +++ b/echo/internal/web/templates/_head.html @@ -1,5 +1,5 @@ - Ehco Web + Ehco Web({{ (CurrentCfg).NodeLabel}}) @@ -7,7 +7,9 @@ + - + + diff --git a/echo/internal/web/templates/_metrics.html b/echo/internal/web/templates/_metrics.html index 0e96f45508..ee5f920204 100644 --- a/echo/internal/web/templates/_metrics.html +++ b/echo/internal/web/templates/_metrics.html @@ -1,374 +1,57 @@
-
-

Node Metrics

-
- - +
+

Node Metrics

+
+
-
- +
- +
+ +
+
+
+ + + diff --git a/echo/internal/web/templates/_navbar.html b/echo/internal/web/templates/_navbar.html index fba5d64d36..d615dc4a78 100644 --- a/echo/internal/web/templates/_navbar.html +++ b/echo/internal/web/templates/_navbar.html @@ -4,7 +4,7 @@

Ehco Relay

- -