From 7faa28a89d98dbeeb947ea8c8b255506b429fdd9 Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Tue, 28 Jan 2025 23:57:53 +0100 Subject: [PATCH] separate frontend repository --- backend/.gitignore => .dockerignore | 1 + .github/dependabot.yml | 4 - .github/workflows/docker.yml | 5 +- .github/workflows/release.yml | 9 +- .gitignore | 2 + .gitmodules | 4 + Dockerfile | 2 +- README.md | 41 +- {backend/api => api}/api.go | 0 {backend/api => api}/session.go | 0 {backend/api => api}/utils.go | 0 {backend/app => app}/app.go | 0 build.sh | 5 +- {backend/cmd => cmd}/admin.go | 0 {backend/cmd => cmd}/cmd.go | 0 {backend/cmd => cmd}/migration/1_1.go | 0 {backend/cmd => cmd}/migration/1_2.go | 0 {backend/cmd => cmd}/migration/main.go | 0 {backend/cmd => cmd}/setting.go | 0 {backend/config => config}/config.go | 0 {backend/config => config}/name | 0 {backend/config => config}/version | 0 {backend/core => core}/box.go | 0 {backend/core => core}/conntracker.go | 0 {backend/core => core}/endpoint.go | 0 {backend/core => core}/log.go | 0 {backend/core => core}/main.go | 0 {backend/core => core}/register.go | 0 {backend/cronjob => cronjob}/checkCoreJob.go | 0 {backend/cronjob => cronjob}/cronJob.go | 0 {backend/cronjob => cronjob}/delStatsJob.go | 0 {backend/cronjob => cronjob}/depleteJob.go | 0 {backend/cronjob => cronjob}/statsJob.go | 0 {backend/database => database}/backup.go | 0 {backend/database => database}/db.go | 0 .../database => database}/model/endpoints.go | 0 .../database => database}/model/inbounds.go | 0 {backend/database => database}/model/model.go | 0 .../database => database}/model/outbounds.go | 0 frontend | 1 + frontend/.browserslistrc | 4 - frontend/.editorconfig | 5 - frontend/.eslintrc.js | 14 - frontend/.gitignore | 23 - frontend/README.md | 69 - frontend/index.html | 22 - frontend/package-lock.json | 3852 ----------------- frontend/package.json | 42 - frontend/public/assets/favicon.ico | Bin 1562 -> 0 bytes frontend/src/App.vue | 34 - .../src/assets/Vazirmatn-UI-NL-Regular.woff2 | Bin 21840 -> 0 bytes frontend/src/assets/logo.png | Bin 763 -> 0 bytes frontend/src/assets/logo.svg | 24 - frontend/src/components/Addr.vue | 73 - frontend/src/components/DateTime.vue | 146 - frontend/src/components/Dial.vue | 215 - frontend/src/components/Headers.vue | 99 - frontend/src/components/Listen.vue | 118 - frontend/src/components/Main.vue | 237 - frontend/src/components/Multiplex.vue | 129 - frontend/src/components/Network.vue | 29 - frontend/src/components/OutJson.vue | 123 - frontend/src/components/Rule.vue | 382 -- frontend/src/components/SubJsonExt.vue | 450 -- frontend/src/components/Transport.vue | 51 - frontend/src/components/UoT.vue | 29 - frontend/src/components/Users.vue | 42 - frontend/src/components/WgPeer.vue | 81 - frontend/src/components/message.vue | 38 - frontend/src/components/protocols/Direct.vue | 43 - frontend/src/components/protocols/Http.vue | 50 - .../src/components/protocols/Hysteria.vue | 159 - .../src/components/protocols/Hysteria2.vue | 206 - frontend/src/components/protocols/Naive.vue | 22 - .../src/components/protocols/OutShadowTls.vue | 44 - .../src/components/protocols/Selector.vue | 46 - .../src/components/protocols/ShadowTls.vue | 152 - .../src/components/protocols/Shadowsocks.vue | 67 - frontend/src/components/protocols/Socks.vue | 59 - frontend/src/components/protocols/Ssh.vue | 151 - frontend/src/components/protocols/TProxy.vue | 22 - frontend/src/components/protocols/Tor.vue | 33 - frontend/src/components/protocols/Trojan.vue | 24 - frontend/src/components/protocols/Tuic.vue | 89 - frontend/src/components/protocols/Tun.vue | 62 - frontend/src/components/protocols/UrlTest.vue | 121 - frontend/src/components/protocols/Vless.vue | 48 - frontend/src/components/protocols/Vmess.vue | 72 - frontend/src/components/protocols/Warp.vue | 156 - .../src/components/protocols/Wireguard.vue | 181 - frontend/src/components/tiles/Gauge.vue | 110 - frontend/src/components/tiles/History.vue | 200 - frontend/src/components/tls/Acme.vue | 252 -- frontend/src/components/tls/Ech.vue | 163 - frontend/src/components/tls/InTLS.vue | 26 - frontend/src/components/tls/OutTLS.vue | 336 -- frontend/src/components/transports/Http.vue | 82 - .../src/components/transports/HttpUpgrade.vue | 31 - .../src/components/transports/WebSocket.vue | 69 - frontend/src/components/transports/gRPC.vue | 65 - frontend/src/layouts/default/AppBar.vue | 26 - frontend/src/layouts/default/Default.vue | 35 - frontend/src/layouts/default/Drawer.vue | 67 - frontend/src/layouts/default/View.vue | 14 - frontend/src/layouts/modals/Admin.vue | 97 - frontend/src/layouts/modals/Backup.vue | 91 - frontend/src/layouts/modals/Changes.vue | 145 - frontend/src/layouts/modals/Client.vue | 280 -- frontend/src/layouts/modals/ClientBulk.vue | 193 - frontend/src/layouts/modals/Endpoint.vue | 158 - frontend/src/layouts/modals/Inbound.vue | 266 -- frontend/src/layouts/modals/Logs.vue | 90 - frontend/src/layouts/modals/Outbound.vue | 199 - frontend/src/layouts/modals/QrCode.vue | 144 - frontend/src/layouts/modals/Rule.vue | 320 -- frontend/src/layouts/modals/Ruleset.vue | 133 - frontend/src/layouts/modals/Stats.vue | 218 - frontend/src/layouts/modals/Tls.vue | 547 --- frontend/src/locales/en.ts | 434 -- frontend/src/locales/fa.ts | 434 -- frontend/src/locales/index.ts | 30 - frontend/src/locales/ru.ts | 434 -- frontend/src/locales/vi.ts | 435 -- frontend/src/locales/zhcn.ts | 434 -- frontend/src/locales/zhtw.ts | 435 -- frontend/src/main.ts | 55 - frontend/src/plugins/api.ts | 57 - frontend/src/plugins/httputil.ts | 88 - frontend/src/plugins/index.ts | 10 - frontend/src/plugins/randomUtil.ts | 49 - frontend/src/plugins/utils.ts | 104 - frontend/src/plugins/vuetify.ts | 58 - frontend/src/router/index.ts | 113 - frontend/src/store/index.ts | 5 - frontend/src/store/modules/data.ts | 87 - frontend/src/styles/settings.scss | 39 - frontend/src/types/brutal.ts | 5 - frontend/src/types/clients.ts | 134 - frontend/src/types/config.ts | 103 - frontend/src/types/dial.ts | 14 - frontend/src/types/endpoints.ts | 62 - frontend/src/types/inbounds.ts | 235 - frontend/src/types/multiplex.ts | 14 - frontend/src/types/outbounds.ts | 255 -- frontend/src/types/rules.ts | 76 - frontend/src/types/tls.ts | 123 - frontend/src/types/transport.ts | 48 - frontend/src/views/Admins.vue | 140 - frontend/src/views/Basics.vue | 312 -- frontend/src/views/Clients.vue | 420 -- frontend/src/views/Endpoints.vue | 166 - frontend/src/views/Home.vue | 7 - frontend/src/views/Inbounds.vue | 191 - frontend/src/views/Login.vue | 86 - frontend/src/views/Outbounds.vue | 170 - frontend/src/views/Rules.vue | 309 -- frontend/src/views/Settings.vue | 295 -- frontend/src/views/Tls.vue | 141 - frontend/src/vite-env.d.ts | 7 - frontend/tsconfig.json | 25 - frontend/tsconfig.node.json | 10 - frontend/vite.config.mts | 63 - backend/go.mod => go.mod | 9 +- backend/go.sum => go.sum | 8 +- {backend/logger => logger}/logger.go | 0 backend/main.go => main.go | 0 .../domainValidator.go | 0 .../network => network}/auto_https_conn.go | 0 .../auto_https_listener.go | 0 package-lock.json | 6 + {backend/service => service}/client.go | 0 {backend/service => service}/config.go | 0 {backend/service => service}/endpoints.go | 0 {backend/service => service}/inbounds.go | 0 {backend/service => service}/outbounds.go | 0 {backend/service => service}/panel.go | 0 {backend/service => service}/server.go | 0 {backend/service => service}/setting.go | 0 {backend/service => service}/stats.go | 0 {backend/service => service}/tls.go | 0 {backend/service => service}/user.go | 0 {backend/service => service}/warp.go | 0 {backend/sub => sub}/jsonService.go | 0 {backend/sub => sub}/linkService.go | 0 {backend/sub => sub}/sub.go | 0 {backend/sub => sub}/subHandler.go | 0 {backend/sub => sub}/subService.go | 0 {backend/util => util}/base64.go | 0 {backend/util => util}/common/err.go | 0 {backend/util => util}/common/random.go | 0 {backend/util => util}/genLink.go | 0 {backend/util => util}/linkToJson.go | 0 {backend/util => util}/outJson.go | 0 {backend/web => web}/web.go | 0 194 files changed, 48 insertions(+), 19256 deletions(-) rename backend/.gitignore => .dockerignore (97%) create mode 100644 .gitmodules rename {backend/api => api}/api.go (100%) rename {backend/api => api}/session.go (100%) rename {backend/api => api}/utils.go (100%) rename {backend/app => app}/app.go (100%) rename {backend/cmd => cmd}/admin.go (100%) rename {backend/cmd => cmd}/cmd.go (100%) rename {backend/cmd => cmd}/migration/1_1.go (100%) rename {backend/cmd => cmd}/migration/1_2.go (100%) rename {backend/cmd => cmd}/migration/main.go (100%) rename {backend/cmd => cmd}/setting.go (100%) rename {backend/config => config}/config.go (100%) rename {backend/config => config}/name (100%) rename {backend/config => config}/version (100%) rename {backend/core => core}/box.go (100%) rename {backend/core => core}/conntracker.go (100%) rename {backend/core => core}/endpoint.go (100%) rename {backend/core => core}/log.go (100%) rename {backend/core => core}/main.go (100%) rename {backend/core => core}/register.go (100%) rename {backend/cronjob => cronjob}/checkCoreJob.go (100%) rename {backend/cronjob => cronjob}/cronJob.go (100%) rename {backend/cronjob => cronjob}/delStatsJob.go (100%) rename {backend/cronjob => cronjob}/depleteJob.go (100%) rename {backend/cronjob => cronjob}/statsJob.go (100%) rename {backend/database => database}/backup.go (100%) rename {backend/database => database}/db.go (100%) rename {backend/database => database}/model/endpoints.go (100%) rename {backend/database => database}/model/inbounds.go (100%) rename {backend/database => database}/model/model.go (100%) rename {backend/database => database}/model/outbounds.go (100%) create mode 160000 frontend delete mode 100644 frontend/.browserslistrc delete mode 100644 frontend/.editorconfig delete mode 100644 frontend/.eslintrc.js delete mode 100644 frontend/.gitignore delete mode 100644 frontend/README.md delete mode 100644 frontend/index.html delete mode 100644 frontend/package-lock.json delete mode 100644 frontend/package.json delete mode 100644 frontend/public/assets/favicon.ico delete mode 100644 frontend/src/App.vue delete mode 100644 frontend/src/assets/Vazirmatn-UI-NL-Regular.woff2 delete mode 100644 frontend/src/assets/logo.png delete mode 100644 frontend/src/assets/logo.svg delete mode 100644 frontend/src/components/Addr.vue delete mode 100644 frontend/src/components/DateTime.vue delete mode 100644 frontend/src/components/Dial.vue delete mode 100644 frontend/src/components/Headers.vue delete mode 100644 frontend/src/components/Listen.vue delete mode 100644 frontend/src/components/Main.vue delete mode 100644 frontend/src/components/Multiplex.vue delete mode 100644 frontend/src/components/Network.vue delete mode 100644 frontend/src/components/OutJson.vue delete mode 100644 frontend/src/components/Rule.vue delete mode 100644 frontend/src/components/SubJsonExt.vue delete mode 100644 frontend/src/components/Transport.vue delete mode 100644 frontend/src/components/UoT.vue delete mode 100644 frontend/src/components/Users.vue delete mode 100644 frontend/src/components/WgPeer.vue delete mode 100644 frontend/src/components/message.vue delete mode 100644 frontend/src/components/protocols/Direct.vue delete mode 100644 frontend/src/components/protocols/Http.vue delete mode 100644 frontend/src/components/protocols/Hysteria.vue delete mode 100644 frontend/src/components/protocols/Hysteria2.vue delete mode 100644 frontend/src/components/protocols/Naive.vue delete mode 100644 frontend/src/components/protocols/OutShadowTls.vue delete mode 100644 frontend/src/components/protocols/Selector.vue delete mode 100644 frontend/src/components/protocols/ShadowTls.vue delete mode 100644 frontend/src/components/protocols/Shadowsocks.vue delete mode 100644 frontend/src/components/protocols/Socks.vue delete mode 100644 frontend/src/components/protocols/Ssh.vue delete mode 100644 frontend/src/components/protocols/TProxy.vue delete mode 100644 frontend/src/components/protocols/Tor.vue delete mode 100644 frontend/src/components/protocols/Trojan.vue delete mode 100644 frontend/src/components/protocols/Tuic.vue delete mode 100644 frontend/src/components/protocols/Tun.vue delete mode 100644 frontend/src/components/protocols/UrlTest.vue delete mode 100644 frontend/src/components/protocols/Vless.vue delete mode 100644 frontend/src/components/protocols/Vmess.vue delete mode 100644 frontend/src/components/protocols/Warp.vue delete mode 100644 frontend/src/components/protocols/Wireguard.vue delete mode 100644 frontend/src/components/tiles/Gauge.vue delete mode 100644 frontend/src/components/tiles/History.vue delete mode 100644 frontend/src/components/tls/Acme.vue delete mode 100644 frontend/src/components/tls/Ech.vue delete mode 100644 frontend/src/components/tls/InTLS.vue delete mode 100644 frontend/src/components/tls/OutTLS.vue delete mode 100644 frontend/src/components/transports/Http.vue delete mode 100644 frontend/src/components/transports/HttpUpgrade.vue delete mode 100644 frontend/src/components/transports/WebSocket.vue delete mode 100644 frontend/src/components/transports/gRPC.vue delete mode 100644 frontend/src/layouts/default/AppBar.vue delete mode 100644 frontend/src/layouts/default/Default.vue delete mode 100644 frontend/src/layouts/default/Drawer.vue delete mode 100644 frontend/src/layouts/default/View.vue delete mode 100644 frontend/src/layouts/modals/Admin.vue delete mode 100644 frontend/src/layouts/modals/Backup.vue delete mode 100644 frontend/src/layouts/modals/Changes.vue delete mode 100644 frontend/src/layouts/modals/Client.vue delete mode 100644 frontend/src/layouts/modals/ClientBulk.vue delete mode 100644 frontend/src/layouts/modals/Endpoint.vue delete mode 100644 frontend/src/layouts/modals/Inbound.vue delete mode 100644 frontend/src/layouts/modals/Logs.vue delete mode 100644 frontend/src/layouts/modals/Outbound.vue delete mode 100644 frontend/src/layouts/modals/QrCode.vue delete mode 100644 frontend/src/layouts/modals/Rule.vue delete mode 100644 frontend/src/layouts/modals/Ruleset.vue delete mode 100644 frontend/src/layouts/modals/Stats.vue delete mode 100644 frontend/src/layouts/modals/Tls.vue delete mode 100644 frontend/src/locales/en.ts delete mode 100644 frontend/src/locales/fa.ts delete mode 100644 frontend/src/locales/index.ts delete mode 100644 frontend/src/locales/ru.ts delete mode 100644 frontend/src/locales/vi.ts delete mode 100644 frontend/src/locales/zhcn.ts delete mode 100644 frontend/src/locales/zhtw.ts delete mode 100644 frontend/src/main.ts delete mode 100644 frontend/src/plugins/api.ts delete mode 100644 frontend/src/plugins/httputil.ts delete mode 100644 frontend/src/plugins/index.ts delete mode 100644 frontend/src/plugins/randomUtil.ts delete mode 100644 frontend/src/plugins/utils.ts delete mode 100644 frontend/src/plugins/vuetify.ts delete mode 100644 frontend/src/router/index.ts delete mode 100644 frontend/src/store/index.ts delete mode 100644 frontend/src/store/modules/data.ts delete mode 100644 frontend/src/styles/settings.scss delete mode 100644 frontend/src/types/brutal.ts delete mode 100644 frontend/src/types/clients.ts delete mode 100644 frontend/src/types/config.ts delete mode 100644 frontend/src/types/dial.ts delete mode 100644 frontend/src/types/endpoints.ts delete mode 100644 frontend/src/types/inbounds.ts delete mode 100644 frontend/src/types/multiplex.ts delete mode 100644 frontend/src/types/outbounds.ts delete mode 100644 frontend/src/types/rules.ts delete mode 100644 frontend/src/types/tls.ts delete mode 100644 frontend/src/types/transport.ts delete mode 100644 frontend/src/views/Admins.vue delete mode 100644 frontend/src/views/Basics.vue delete mode 100644 frontend/src/views/Clients.vue delete mode 100644 frontend/src/views/Endpoints.vue delete mode 100644 frontend/src/views/Home.vue delete mode 100644 frontend/src/views/Inbounds.vue delete mode 100644 frontend/src/views/Login.vue delete mode 100644 frontend/src/views/Outbounds.vue delete mode 100644 frontend/src/views/Rules.vue delete mode 100644 frontend/src/views/Settings.vue delete mode 100644 frontend/src/views/Tls.vue delete mode 100644 frontend/src/vite-env.d.ts delete mode 100644 frontend/tsconfig.json delete mode 100644 frontend/tsconfig.node.json delete mode 100644 frontend/vite.config.mts rename backend/go.mod => go.mod (99%) rename backend/go.sum => go.sum (97%) rename {backend/logger => logger}/logger.go (100%) rename backend/main.go => main.go (100%) rename {backend/middleware => middleware}/domainValidator.go (100%) rename {backend/network => network}/auto_https_conn.go (100%) rename {backend/network => network}/auto_https_listener.go (100%) create mode 100644 package-lock.json rename {backend/service => service}/client.go (100%) rename {backend/service => service}/config.go (100%) rename {backend/service => service}/endpoints.go (100%) rename {backend/service => service}/inbounds.go (100%) rename {backend/service => service}/outbounds.go (100%) rename {backend/service => service}/panel.go (100%) rename {backend/service => service}/server.go (100%) rename {backend/service => service}/setting.go (100%) rename {backend/service => service}/stats.go (100%) rename {backend/service => service}/tls.go (100%) rename {backend/service => service}/user.go (100%) rename {backend/service => service}/warp.go (100%) rename {backend/sub => sub}/jsonService.go (100%) rename {backend/sub => sub}/linkService.go (100%) rename {backend/sub => sub}/sub.go (100%) rename {backend/sub => sub}/subHandler.go (100%) rename {backend/sub => sub}/subService.go (100%) rename {backend/util => util}/base64.go (100%) rename {backend/util => util}/common/err.go (100%) rename {backend/util => util}/common/random.go (100%) rename {backend/util => util}/genLink.go (100%) rename {backend/util => util}/linkToJson.go (100%) rename {backend/util => util}/outJson.go (100%) rename {backend/web => web}/web.go (100%) diff --git a/backend/.gitignore b/.dockerignore similarity index 97% rename from backend/.gitignore rename to .dockerignore index d9c57cc..7b13414 100644 --- a/backend/.gitignore +++ b/.dockerignore @@ -3,6 +3,7 @@ dist/ release/ backup/ bin/ +db/ sui web/html main diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f25e629..5445036 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,9 +1,5 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - package-ecosystem: "gomod" directory: "/" schedule: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 95bdda1..f907950 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -10,7 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4.1.1 + with: + submodules: recursive - name: Docker meta id: meta diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a992777..d639dd1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,6 +22,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4.1.1 + with: + submodules: recursive - name: Setup Go uses: actions/setup-go@v5 @@ -58,7 +60,8 @@ jobs: npm install npm run build cd .. - mv frontend/dist backend/web/html + mv frontend/dist web/html + rm -fr frontend - name: Build s-ui run: | @@ -89,9 +92,7 @@ jobs: fi ### Build s-ui - cd backend - go build -ldflags="-w -s" -tags "with_quic,with_grpc,with_ech,with_utls,with_reality_server,with_acme,with_gvisor" -o ../sui main.go - cd .. + go build -ldflags="-w -s" -tags "with_quic,with_grpc,with_ech,with_utls,with_reality_server,with_acme,with_gvisor" -o sui main.go mkdir s-ui cp sui s-ui/ diff --git a/.gitignore b/.gitignore index ff60407..35e1c36 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,12 @@ backup/ bin/ db/ sui +web/html main tmp .sync* *.tar.gz +frontend/ # local env files .env.local diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..89c4063 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "frontend"] + path = frontend + url = https://github.com/alireza0/s-ui-frontend + branch = main diff --git a/Dockerfile b/Dockerfile index eb54353..3ddad7a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ ENV CGO_CFLAGS="-D_LARGEFILE64_SOURCE" ENV CGO_ENABLED=1 ENV GOARCH=$TARGETARCH RUN apk update && apk --no-cache --update add build-base gcc wget unzip -COPY backend/ ./ +COPY --exclude=frontend . . COPY --from=front-builder /app/dist/ /app/web/html/ RUN go build -ldflags="-w -s" -tags "with_quic,with_grpc,with_ech,with_utls,with_reality_server,with_acme,with_gvisor" -o sui main.go diff --git a/README.md b/README.md index b86a63d..444e6b0 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ ![](https://img.shields.io/github/v/release/alireza0/s-ui.svg) ![S-UI Docker pull](https://img.shields.io/docker/pulls/alireza7/s-ui.svg) ![S-UI-Singbox Docker pull](https://img.shields.io/docker/pulls/alireza7/s-ui-singbox.svg) +[![Go Report Card](https://goreportcard.com/badge/github.com/alireza0/s-ui)](https://goreportcard.com/report/github.com/alireza0/s-ui) [![Downloads](https://img.shields.io/github/downloads/alireza0/s-ui/total.svg)](https://img.shields.io/github/downloads/alireza0/s-ui/total.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0.en.html) @@ -63,16 +64,13 @@ VERSION=1.0.0 && bash <(curl -Ls https://raw.githubusercontent.com/alireza0/s-ui ```sh sudo -i -systemctl disable sing-box --now systemctl disable s-ui --now -rm -f /etc/systemd/system/s-ui.service rm -f /etc/systemd/system/sing-box.service systemctl daemon-reload rm -fr /usr/local/s-ui rm /usr/bin/s-ui - ``` ## Install using Docker @@ -98,7 +96,7 @@ wget -q https://raw.githubusercontent.com/alireza0/s-ui/master/docker-compose.ym docker compose up -d ``` -> Use docker for s-ui only +> Use docker ```shell mkdir s-ui && cd s-ui @@ -113,6 +111,8 @@ docker run -itd \ > Build your own image ```shell +git clone https://github.com/alireza0/s-ui +git submodule update --init --recursive docker build -t s-ui . ``` @@ -128,37 +128,30 @@ docker build -t s-ui . ./runSUI.sh ``` +### Clone the repository +```shell +# clone repository +git clone https://github.com/alireza0/s-ui +# clone submodules +git submodule update --init --recursive +``` + + ### - Frontend -Frontend codes are in `frontend` folder in the root of repository. - -To run it locally for instant development you can use (apply automatic changes on file save): -```shell -cd frontend -npm run dev -``` -> By this command it will run a `vite` web server on separate port `3000`, with backend proxy to `http://localhost:2095`. You can change it in `frontend/vite.config.mts`. - -To build frontend: -```shell -cd frontend -npm run build -``` +Visit [s-ui-frontend](https://github.com/alireza0/s-ui-frontend) for frontend code ### - Backend -Backend codes are in `backend` folder in the root of repository. > Please build frontend once before! To build backend: ```shell -cd backend - # remove old frontend compiled files rm -fr web/html/* # apply new frontend compiled files -cp -R ../frontend/dist/ web/html/ +cp -R frontend/dist/ web/html/ # build -go build -o ../sui main.go +go build -o sui main.go ``` To run backend (from root folder of repository): @@ -182,7 +175,7 @@ To run backend (from root folder of repository): - Supported protocols: - General: Mixed, SOCKS, HTTP, HTTPS, Direct, Redirect, TProxy - V2Ray based: VLESS, VMess, Trojan, Shadowsocks - - Other protocols: ShadowTLS, Hysteria, Hysteri2, Naive, TUIC + - Other protocols: ShadowTLS, Hysteria, Hysteria2, Naive, TUIC - Supports XTLS protocols - An advanced interface for routing traffic, incorporating PROXY Protocol, External, and Transparent Proxy, SSL Certificate, and Port - An advanced interface for inbound and outbound configuration diff --git a/backend/api/api.go b/api/api.go similarity index 100% rename from backend/api/api.go rename to api/api.go diff --git a/backend/api/session.go b/api/session.go similarity index 100% rename from backend/api/session.go rename to api/session.go diff --git a/backend/api/utils.go b/api/utils.go similarity index 100% rename from backend/api/utils.go rename to api/utils.go diff --git a/backend/app/app.go b/app/app.go similarity index 100% rename from backend/app/app.go rename to app/app.go diff --git a/build.sh b/build.sh index e18494a..d36b167 100755 --- a/build.sh +++ b/build.sh @@ -5,11 +5,10 @@ npm i npm run build cd .. -cd backend echo "Backend" mkdir -p web/html rm -fr web/html/* -cp -R ../frontend/dist/* web/html/ +cp -R frontend/dist/* web/html/ -go build -tags "with_quic,with_grpc,with_ech,with_utls,with_reality_server,with_acme,with_gvisor" -o ../sui main.go +go build -ldflags "-w -s" -tags "with_quic,with_grpc,with_ech,with_utls,with_reality_server,with_acme,with_gvisor" -o sui main.go diff --git a/backend/cmd/admin.go b/cmd/admin.go similarity index 100% rename from backend/cmd/admin.go rename to cmd/admin.go diff --git a/backend/cmd/cmd.go b/cmd/cmd.go similarity index 100% rename from backend/cmd/cmd.go rename to cmd/cmd.go diff --git a/backend/cmd/migration/1_1.go b/cmd/migration/1_1.go similarity index 100% rename from backend/cmd/migration/1_1.go rename to cmd/migration/1_1.go diff --git a/backend/cmd/migration/1_2.go b/cmd/migration/1_2.go similarity index 100% rename from backend/cmd/migration/1_2.go rename to cmd/migration/1_2.go diff --git a/backend/cmd/migration/main.go b/cmd/migration/main.go similarity index 100% rename from backend/cmd/migration/main.go rename to cmd/migration/main.go diff --git a/backend/cmd/setting.go b/cmd/setting.go similarity index 100% rename from backend/cmd/setting.go rename to cmd/setting.go diff --git a/backend/config/config.go b/config/config.go similarity index 100% rename from backend/config/config.go rename to config/config.go diff --git a/backend/config/name b/config/name similarity index 100% rename from backend/config/name rename to config/name diff --git a/backend/config/version b/config/version similarity index 100% rename from backend/config/version rename to config/version diff --git a/backend/core/box.go b/core/box.go similarity index 100% rename from backend/core/box.go rename to core/box.go diff --git a/backend/core/conntracker.go b/core/conntracker.go similarity index 100% rename from backend/core/conntracker.go rename to core/conntracker.go diff --git a/backend/core/endpoint.go b/core/endpoint.go similarity index 100% rename from backend/core/endpoint.go rename to core/endpoint.go diff --git a/backend/core/log.go b/core/log.go similarity index 100% rename from backend/core/log.go rename to core/log.go diff --git a/backend/core/main.go b/core/main.go similarity index 100% rename from backend/core/main.go rename to core/main.go diff --git a/backend/core/register.go b/core/register.go similarity index 100% rename from backend/core/register.go rename to core/register.go diff --git a/backend/cronjob/checkCoreJob.go b/cronjob/checkCoreJob.go similarity index 100% rename from backend/cronjob/checkCoreJob.go rename to cronjob/checkCoreJob.go diff --git a/backend/cronjob/cronJob.go b/cronjob/cronJob.go similarity index 100% rename from backend/cronjob/cronJob.go rename to cronjob/cronJob.go diff --git a/backend/cronjob/delStatsJob.go b/cronjob/delStatsJob.go similarity index 100% rename from backend/cronjob/delStatsJob.go rename to cronjob/delStatsJob.go diff --git a/backend/cronjob/depleteJob.go b/cronjob/depleteJob.go similarity index 100% rename from backend/cronjob/depleteJob.go rename to cronjob/depleteJob.go diff --git a/backend/cronjob/statsJob.go b/cronjob/statsJob.go similarity index 100% rename from backend/cronjob/statsJob.go rename to cronjob/statsJob.go diff --git a/backend/database/backup.go b/database/backup.go similarity index 100% rename from backend/database/backup.go rename to database/backup.go diff --git a/backend/database/db.go b/database/db.go similarity index 100% rename from backend/database/db.go rename to database/db.go diff --git a/backend/database/model/endpoints.go b/database/model/endpoints.go similarity index 100% rename from backend/database/model/endpoints.go rename to database/model/endpoints.go diff --git a/backend/database/model/inbounds.go b/database/model/inbounds.go similarity index 100% rename from backend/database/model/inbounds.go rename to database/model/inbounds.go diff --git a/backend/database/model/model.go b/database/model/model.go similarity index 100% rename from backend/database/model/model.go rename to database/model/model.go diff --git a/backend/database/model/outbounds.go b/database/model/outbounds.go similarity index 100% rename from backend/database/model/outbounds.go rename to database/model/outbounds.go diff --git a/frontend b/frontend new file mode 160000 index 0000000..0cb2994 --- /dev/null +++ b/frontend @@ -0,0 +1 @@ +Subproject commit 0cb2994dee3817ee89e5d25d4bd447658d1140ca diff --git a/frontend/.browserslistrc b/frontend/.browserslistrc deleted file mode 100644 index dc3bc09..0000000 --- a/frontend/.browserslistrc +++ /dev/null @@ -1,4 +0,0 @@ -> 1% -last 2 versions -not dead -not ie 11 diff --git a/frontend/.editorconfig b/frontend/.editorconfig deleted file mode 100644 index 7053c49..0000000 --- a/frontend/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -[*.{js,jsx,ts,tsx,vue}] -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js deleted file mode 100644 index 5f3949b..0000000 --- a/frontend/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - }, - extends: [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/eslint-config-typescript', - ], - rules: { - 'vue/multi-word-component-names': 'off', - }, -} diff --git a/frontend/.gitignore b/frontend/.gitignore deleted file mode 100644 index 1b57351..0000000 --- a/frontend/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -.DS_Store -node_modules -/dist -/bin - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/frontend/README.md b/frontend/README.md deleted file mode 100644 index cea000b..0000000 --- a/frontend/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# base - -## Project setup - -``` -# yarn -yarn - -# npm -npm install - -# pnpm -pnpm install - -# bun -bun install -``` - -### Compiles and hot-reloads for development - -``` -# yarn -yarn dev - -# npm -npm run dev - -# pnpm -pnpm dev - -# bun -pnpm run dev -``` - -### Compiles and minifies for production - -``` -# yarn -yarn build - -# npm -npm run build - -# pnpm -pnpm build - -# bun -pnpm run build -``` - -### Lints and fixes files - -``` -# yarn -yarn lint - -# npm -npm run lint - -# pnpm -pnpm lint - -# bun -pnpm run lint -``` - -### Customize configuration - -See [Configuration Reference](https://vitejs.dev/config/). diff --git a/frontend/index.html b/frontend/index.html deleted file mode 100644 index cafa407..0000000 --- a/frontend/index.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - S-UI - - - -
- - - - diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index a13b82b..0000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,3852 +0,0 @@ -{ - "name": "frontend", - "version": "1.2.0-beta.3", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "1.2.0-beta.3", - "dependencies": { - "@mdi/font": "7.4.47", - "axios": "^1.7.9", - "chart.js": "^4.4.7", - "clipboard": "^2.0.11", - "core-js": "^3.40.0", - "moment": "^2.30.1", - "notivue": "^2.4.5", - "pinia": "^2.3.0", - "qrcode.vue": "^3.6.0", - "roboto-fontface": "^0.10.0", - "vue": "^3.5.13", - "vue-chartjs": "^5.3.2", - "vue-i18n": "^11.0.1", - "vue-router": "^4.5.0", - "vue3-persian-datetime-picker": "^1.2.2", - "vuetify": "^3.7.6" - }, - "devDependencies": { - "@babel/types": "^7.26.5", - "@types/node": "^22.10.7", - "@vitejs/plugin-vue": "^5.2.1", - "eslint-plugin-vue": "^9.32.0", - "material-design-icons-iconfont": "^6.7.0", - "sass": "1.83.4", - "typescript": "^5.7.3", - "unplugin-fonts": "^1.3.1", - "vite": "^6.0.7", - "vite-plugin-vuetify": "^2.0.4", - "vue-tsc": "^2.2.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", - "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.10.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@intlify/core-base": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-11.0.1.tgz", - "integrity": "sha512-NAmhw1l/llM0HZRpagR/ChJTNymW4ll6/4EDSJML5c8L5Hl/+k6UyF8EIgE6DeHpfheQujkSRngauViHqq6jJQ==", - "license": "MIT", - "dependencies": { - "@intlify/message-compiler": "11.0.1", - "@intlify/shared": "11.0.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/message-compiler": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-11.0.1.tgz", - "integrity": "sha512-5RFH8x+Mn3mbjcHXnb6KCXGiczBdiQkWkv99iiA0JpKrNuTAQeW59Pjq/uObMB0eR0shnKYGTkIJxum+DbL3sw==", - "license": "MIT", - "dependencies": { - "@intlify/shared": "11.0.1", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/shared": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-11.0.1.tgz", - "integrity": "sha512-lH164+aDDptHZ3dBDbIhRa1dOPQUp+83iugpc+1upTOWCnwyC1PVis6rSWNMMJ8VQxvtHQB9JMib48K55y0PvQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "node_modules/@mdi/font": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", - "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==", - "license": "Apache-2.0" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz", - "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz", - "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz", - "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz", - "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz", - "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz", - "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz", - "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz", - "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz", - "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz", - "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz", - "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz", - "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz", - "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz", - "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz", - "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz", - "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz", - "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz", - "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz", - "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", - "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.11" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", - "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", - "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.11", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" - }, - "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", - "license": "MIT" - }, - "node_modules/@vuetify/loader-shared": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.0.3.tgz", - "integrity": "sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "upath": "^2.0.1" - }, - "peerDependencies": { - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0", - "peer": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", - "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "license": "MIT", - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/core-js": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", - "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "devOptional": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", - "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.18.0", - "@eslint/plugin-kit": "^0.2.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz", - "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", - "license": "MIT", - "dependencies": { - "delegate": "^3.1.2" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/jalaali-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.7.tgz", - "integrity": "sha512-gE+YHWSbygYAoJa+Xg8LWxGILqFOxZSBQQw39ghel01fVFUxV7bjL0x1JFsHcLQ3uPjvn81HQMa+kxwyPWnxGQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/material-design-icons-iconfont": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/material-design-icons-iconfont/-/material-design-icons-iconfont-6.7.0.tgz", - "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-jalaali": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.9.6.tgz", - "integrity": "sha512-v8wXjQplvk5ez+sUqgsWIrafwIf1BEXXvzTYwsg1wHcqh27nSgKPCJ6FnZRrCz03MoNyB9N31L0oms+vE8Rq7g==", - "license": "MIT", - "dependencies": { - "jalaali-js": "^1.1.0", - "moment": "^2.22.2", - "moment-timezone": "^0.5.21", - "rimraf": "^3.0.2" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.46", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", - "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/notivue": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/notivue/-/notivue-2.4.5.tgz", - "integrity": "sha512-7yBdaKesUZIwdcQP3nv1oWYyisI2bURkZ+D9KfLgeNqguHUzkQ1WdhGcTj59PBZa8mqa1/K5Mh8YsphSToMKcQ==", - "license": "MIT", - "peerDependencies": { - "@nuxt/kit": ">=3.5.0", - "@nuxt/schema": ">=3.5.0", - "defu": ">=6" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@nuxt/schema": { - "optional": true - }, - "defu": { - "optional": true - } - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pinia": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.0.tgz", - "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode.vue": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.6.0.tgz", - "integrity": "sha512-vQcl2fyHYHMjDO1GguCldJxepq2izQjBkDEEu9NENgfVKP6mv/e2SU62WbqYHGwTgWXLhxZ1NCD1dAZKHQq1fg==", - "license": "MIT", - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roboto-fontface": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==", - "license": "Apache-2.0" - }, - "node_modules/rollup": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz", - "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.31.0", - "@rollup/rollup-android-arm64": "4.31.0", - "@rollup/rollup-darwin-arm64": "4.31.0", - "@rollup/rollup-darwin-x64": "4.31.0", - "@rollup/rollup-freebsd-arm64": "4.31.0", - "@rollup/rollup-freebsd-x64": "4.31.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.31.0", - "@rollup/rollup-linux-arm-musleabihf": "4.31.0", - "@rollup/rollup-linux-arm64-gnu": "4.31.0", - "@rollup/rollup-linux-arm64-musl": "4.31.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.31.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0", - "@rollup/rollup-linux-riscv64-gnu": "4.31.0", - "@rollup/rollup-linux-s390x-gnu": "4.31.0", - "@rollup/rollup-linux-x64-gnu": "4.31.0", - "@rollup/rollup-linux-x64-musl": "4.31.0", - "@rollup/rollup-win32-arm64-msvc": "4.31.0", - "@rollup/rollup-win32-ia32-msvc": "4.31.0", - "@rollup/rollup-win32-x64-msvc": "4.31.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sass": { - "version": "1.83.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", - "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unplugin": { - "version": "2.0.0-beta.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.0.0-beta.1.tgz", - "integrity": "sha512-2qzQo5LN2DmUZXkWDHvGKLF5BP0WN+KthD6aPnPJ8plRBIjv4lh5O07eYcSxgO2znNw9s4MNhEO1sB+JDllDbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unplugin-fonts": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unplugin-fonts/-/unplugin-fonts-1.3.1.tgz", - "integrity": "sha512-GmaJWPAWH6lBI4fP8xKdbMZJwTgsnr8PGJOfQE52jlod8QkqSO4M529Nox2L8zYapjB5hox2wCu4N3c/LOal/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "unplugin": "2.0.0-beta.1" - }, - "peerDependencies": { - "@nuxt/kit": "^3.0.0", - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-vuetify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.0.4.tgz", - "integrity": "sha512-A4cliYUoP/u4AWSRVRvAPKgpgR987Pss7LpFa7s1GvOe8WjgDq92Rt3eVXrvgxGCWvZsPKziVqfHHdCMqeDhfw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@vuetify/loader-shared": "^2.0.3", - "debug": "^4.3.3", - "upath": "^2.0.1" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": ">=5", - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-chartjs": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz", - "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==", - "license": "MIT", - "peerDependencies": { - "chart.js": "^4.1.1", - "vue": "^3.0.0-0 || ^2.7.0" - } - }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-i18n": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.0.1.tgz", - "integrity": "sha512-pWAT8CusK8q9/EpN7V3oxwHwxWm6+Kp2PeTZmRGvdZTkUzMQDpbbmHp0TwQ8xw04XKm23cr6B4GL72y3W8Yekg==", - "license": "MIT", - "dependencies": { - "@intlify/core-base": "11.0.1", - "@intlify/shared": "11.0.1", - "@vue/devtools-api": "^6.5.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz", - "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "~2.4.11", - "@vue/language-core": "2.2.0" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vue3-persian-datetime-picker": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vue3-persian-datetime-picker/-/vue3-persian-datetime-picker-1.2.2.tgz", - "integrity": "sha512-d7nkj5vgtUvEXZboSdRmP1uwBfXvXgXqdvsOOMQb34jiMZU/aBDrTYWTEe1N+XKF9pvTTJn8Rws9ttJmyhK/hw==", - "license": "MIT", - "dependencies": { - "moment-jalaali": "^0.9.4" - } - }, - "node_modules/vuetify": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.6.tgz", - "integrity": "sha512-lol0Va5HtMIqZfjccSD5DLv5v31R/asJXzc6s7ULy51PHr1DjXxWylZejhq0kVpMGW64MiV1FmA/p8eYQfOWfQ==", - "license": "MIT", - "engines": { - "node": "^12.20 || >=14.13" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" - }, - "peerDependencies": { - "typescript": ">=4.7", - "vite-plugin-vuetify": ">=1.0.0", - "vue": "^3.3.0", - "webpack-plugin-vuetify": ">=2.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vite-plugin-vuetify": { - "optional": true - }, - "webpack-plugin-vuetify": { - "optional": true - } - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/frontend/package.json b/frontend/package.json deleted file mode 100644 index e1e399a..0000000 --- a/frontend/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "frontend", - "version": "1.2.0-beta.3", - "private": true, - "scripts": { - "dev": "vite --host", - "build": "vue-tsc --noEmit && vite build", - "preview": "vite preview", - "lint": "eslint . --fix --ignore-path .gitignore" - }, - "dependencies": { - "@mdi/font": "7.4.47", - "axios": "^1.7.9", - "chart.js": "^4.4.7", - "clipboard": "^2.0.11", - "core-js": "^3.40.0", - "moment": "^2.30.1", - "notivue": "^2.4.5", - "pinia": "^2.3.0", - "qrcode.vue": "^3.6.0", - "roboto-fontface": "^0.10.0", - "vue": "^3.5.13", - "vue-chartjs": "^5.3.2", - "vue-i18n": "^11.0.1", - "vue-router": "^4.5.0", - "vue3-persian-datetime-picker": "^1.2.2", - "vuetify": "^3.7.6" - }, - "devDependencies": { - "@babel/types": "^7.26.5", - "@types/node": "^22.10.7", - "@vitejs/plugin-vue": "^5.2.1", - "eslint-plugin-vue": "^9.32.0", - "material-design-icons-iconfont": "^6.7.0", - "sass": "1.83.4", - "typescript": "^5.7.3", - "unplugin-fonts": "^1.3.1", - "vite": "^6.0.7", - "vite-plugin-vuetify": "^2.0.4", - "vue-tsc": "^2.2.0" - } -} diff --git a/frontend/public/assets/favicon.ico b/frontend/public/assets/favicon.ico deleted file mode 100644 index 2e250185d002727a6f100d6d9a2366bc46d53473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1562 zcmV+#2Ictx0096204^^80096X00agA02TlM0EtjeM-2)Z3IG5A4M|8uQUCw|E&u=k zF9-$z005lj_>uqs1j?jS0rtI@n^wP&LCq;)CZtz#yR}On z2P;@Q9h?G(K(cr|-Y0;szyMg!nfGzqx3We-Qnba7NTjLbt%AtoEJe~AoN{azN1Zy^ zmN`Hd6fNm@WgV=uv$Gs0{{Z|Aa;X{Uye+PW%Hk6A#&saL1PAulFjx$3dL93fjOuF0v1*vi*MlF0bN0 zslsz}b1nHGcepJPBsSCR7>I1bWug_nX3aICAVYs}#U=L-u9w{!TEZ~-*fd;;Ra$bYNI?Gs$mz%M)s z%ZmV)sh!{qAfXrvar$QH^VZhZ$FOfb7!>4*v*3MjmqI)VT(;%Wv?0~zH6LVxbJpl9 zewfaq8V%3!LinLD;z2H#TX5V8aDY3kcmcnH7ZmcbR6#&Kcn>J66nU}V3G%i6c!R6M zB3p2!hPVZNd!=YTn~>83CI$Ix;2ZF$N=#?N@e4sCxPGhS;-8EBGf;5_ov(9!p_ft-#{x$)3cEH*R8yT&*z)K5Pvf}JKK_{=6M*b zRR~j?ZUVjblBg8t52-g(r#n?!TWfk1w+I9RlT}q!!JM2N>jEwrp*c@HpZ9K%WrPN` zt@K{vrWO}=ilcT3dD&f$Cy*(Qzyn+$=o@YptD7rvVdn(=)cu&wdTur%$O{%17h9Ew zn$H>y7kzPSD=I45+|trA9_?=*^Al^(3Ohe>CC&%NR#a338XFr&qbZO1&y^V!7Xp@} zjeb#6Q!|LtC%xft(R7}had9Dt%4aXWv9EFB&ppZyg2l5U&SBGK48MYbU*JtsZ>}R_ z`>crzp-Z@&(Eyf-d(%F2=93YMAB>7Pf>xUmu6ZEyNic4eHyob|BDsJ?4%yD)ICvcx z62i`dj0oiK$TdUL*!`N~>s*QBz(j}8C)|h&^1T}3nQq0ubO_CLE6&*)G{m>L6_>3Q zTGV?H=lp-dh`*>KPV?o>w%`ee(3heh9coRZ>s4+ zyxT##Uy_x=e&o4S_2F*Jn>!_eG&fnLBdsC+mxFkgkg<$>#4lBKGP;4t!0pyKNnp9I zw39e;);dVjW0n|d!{8mBG198meBF~SZfk2h?WUS&i2EGGY2HH%LC3<~P$)Muw4yrQ z`|0M_t2lDrP)WD9x9`9)pBlo=y6X*r&x`U1|D&Oy;bAx84$>o-S+*OY<%f-iV)e_7 z{8M6G_xt^mb#-+g>5Ai+2SBS#8d*Jgd3kidNl!NxMn%{rPeXNqcv7FwH{Q|FL5~RE z25F}7*bo0t#9b0qp?$J30nKg*cl*?i>G_fC2LzE^Ks?xLhMu_TOqN8(AiN(JMD3Us zh0| zRz)ywFYP6BrBJVP&-EsZzO;OHnP2I>-jjv7+<5e*(e6@2qh5sDe=h=tB^^g}N&o-= M07*qoM6N<$f;H>)5&!@I diff --git a/frontend/src/App.vue b/frontend/src/App.vue deleted file mode 100644 index 0ec30e4..0000000 --- a/frontend/src/App.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/assets/Vazirmatn-UI-NL-Regular.woff2 b/frontend/src/assets/Vazirmatn-UI-NL-Regular.woff2 deleted file mode 100644 index 3ce577ae8add0f5496932a4953764c669a0fc679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21840 zcmV)5K*_&%Pew8T0RR91098-`4*&oF0NPXl095k;Appey00000000000000000000 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⪼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 - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/frontend/src/components/Addr.vue b/frontend/src/components/Addr.vue deleted file mode 100644 index cc30b5a..0000000 --- a/frontend/src/components/Addr.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/DateTime.vue b/frontend/src/components/DateTime.vue deleted file mode 100644 index 0a73ea7..0000000 --- a/frontend/src/components/DateTime.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/Dial.vue b/frontend/src/components/Dial.vue deleted file mode 100644 index c24604c..0000000 --- a/frontend/src/components/Dial.vue +++ /dev/null @@ -1,215 +0,0 @@ - - - diff --git a/frontend/src/components/Headers.vue b/frontend/src/components/Headers.vue deleted file mode 100644 index 62a75c6..0000000 --- a/frontend/src/components/Headers.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Listen.vue b/frontend/src/components/Listen.vue deleted file mode 100644 index d037edb..0000000 --- a/frontend/src/components/Listen.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue deleted file mode 100644 index 4c26aab..0000000 --- a/frontend/src/components/Main.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - diff --git a/frontend/src/components/Multiplex.vue b/frontend/src/components/Multiplex.vue deleted file mode 100644 index 1f94517..0000000 --- a/frontend/src/components/Multiplex.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Network.vue b/frontend/src/components/Network.vue deleted file mode 100644 index d050bbe..0000000 --- a/frontend/src/components/Network.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/OutJson.vue b/frontend/src/components/OutJson.vue deleted file mode 100644 index e5f97e9..0000000 --- a/frontend/src/components/OutJson.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Rule.vue b/frontend/src/components/Rule.vue deleted file mode 100644 index 1ccdb58..0000000 --- a/frontend/src/components/Rule.vue +++ /dev/null @@ -1,382 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/SubJsonExt.vue b/frontend/src/components/SubJsonExt.vue deleted file mode 100644 index c74c19b..0000000 --- a/frontend/src/components/SubJsonExt.vue +++ /dev/null @@ -1,450 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Transport.vue b/frontend/src/components/Transport.vue deleted file mode 100644 index decdd18..0000000 --- a/frontend/src/components/Transport.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/UoT.vue b/frontend/src/components/UoT.vue deleted file mode 100644 index b6dc292..0000000 --- a/frontend/src/components/UoT.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Users.vue b/frontend/src/components/Users.vue deleted file mode 100644 index fdf958d..0000000 --- a/frontend/src/components/Users.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/WgPeer.vue b/frontend/src/components/WgPeer.vue deleted file mode 100644 index 1051c79..0000000 --- a/frontend/src/components/WgPeer.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/message.vue b/frontend/src/components/message.vue deleted file mode 100644 index ef28851..0000000 --- a/frontend/src/components/message.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Direct.vue b/frontend/src/components/protocols/Direct.vue deleted file mode 100644 index 95b68d9..0000000 --- a/frontend/src/components/protocols/Direct.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Http.vue b/frontend/src/components/protocols/Http.vue deleted file mode 100644 index e8969f2..0000000 --- a/frontend/src/components/protocols/Http.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Hysteria.vue b/frontend/src/components/protocols/Hysteria.vue deleted file mode 100644 index 4be9ca2..0000000 --- a/frontend/src/components/protocols/Hysteria.vue +++ /dev/null @@ -1,159 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Hysteria2.vue b/frontend/src/components/protocols/Hysteria2.vue deleted file mode 100644 index c364a2e..0000000 --- a/frontend/src/components/protocols/Hysteria2.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Naive.vue b/frontend/src/components/protocols/Naive.vue deleted file mode 100644 index 005ef19..0000000 --- a/frontend/src/components/protocols/Naive.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/OutShadowTls.vue b/frontend/src/components/protocols/OutShadowTls.vue deleted file mode 100644 index 024ef86..0000000 --- a/frontend/src/components/protocols/OutShadowTls.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Selector.vue b/frontend/src/components/protocols/Selector.vue deleted file mode 100644 index 7e28131..0000000 --- a/frontend/src/components/protocols/Selector.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/ShadowTls.vue b/frontend/src/components/protocols/ShadowTls.vue deleted file mode 100644 index a411095..0000000 --- a/frontend/src/components/protocols/ShadowTls.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Shadowsocks.vue b/frontend/src/components/protocols/Shadowsocks.vue deleted file mode 100644 index 11303c4..0000000 --- a/frontend/src/components/protocols/Shadowsocks.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Socks.vue b/frontend/src/components/protocols/Socks.vue deleted file mode 100644 index f39b28b..0000000 --- a/frontend/src/components/protocols/Socks.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Ssh.vue b/frontend/src/components/protocols/Ssh.vue deleted file mode 100644 index 97a8964..0000000 --- a/frontend/src/components/protocols/Ssh.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/TProxy.vue b/frontend/src/components/protocols/TProxy.vue deleted file mode 100644 index 036bde7..0000000 --- a/frontend/src/components/protocols/TProxy.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Tor.vue b/frontend/src/components/protocols/Tor.vue deleted file mode 100644 index b3e8326..0000000 --- a/frontend/src/components/protocols/Tor.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Trojan.vue b/frontend/src/components/protocols/Trojan.vue deleted file mode 100644 index b3637b8..0000000 --- a/frontend/src/components/protocols/Trojan.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Tuic.vue b/frontend/src/components/protocols/Tuic.vue deleted file mode 100644 index 99fd707..0000000 --- a/frontend/src/components/protocols/Tuic.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Tun.vue b/frontend/src/components/protocols/Tun.vue deleted file mode 100644 index 49edabc..0000000 --- a/frontend/src/components/protocols/Tun.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/UrlTest.vue b/frontend/src/components/protocols/UrlTest.vue deleted file mode 100644 index 298c97e..0000000 --- a/frontend/src/components/protocols/UrlTest.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Vless.vue b/frontend/src/components/protocols/Vless.vue deleted file mode 100644 index 0d7b559..0000000 --- a/frontend/src/components/protocols/Vless.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Vmess.vue b/frontend/src/components/protocols/Vmess.vue deleted file mode 100644 index 04d6690..0000000 --- a/frontend/src/components/protocols/Vmess.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Warp.vue b/frontend/src/components/protocols/Warp.vue deleted file mode 100644 index 932a150..0000000 --- a/frontend/src/components/protocols/Warp.vue +++ /dev/null @@ -1,156 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/protocols/Wireguard.vue b/frontend/src/components/protocols/Wireguard.vue deleted file mode 100644 index 6a357fe..0000000 --- a/frontend/src/components/protocols/Wireguard.vue +++ /dev/null @@ -1,181 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tiles/Gauge.vue b/frontend/src/components/tiles/Gauge.vue deleted file mode 100644 index ce8f7e4..0000000 --- a/frontend/src/components/tiles/Gauge.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/frontend/src/components/tiles/History.vue b/frontend/src/components/tiles/History.vue deleted file mode 100644 index 4069e5b..0000000 --- a/frontend/src/components/tiles/History.vue +++ /dev/null @@ -1,200 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tls/Acme.vue b/frontend/src/components/tls/Acme.vue deleted file mode 100644 index 7d389f2..0000000 --- a/frontend/src/components/tls/Acme.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tls/Ech.vue b/frontend/src/components/tls/Ech.vue deleted file mode 100644 index 7e21844..0000000 --- a/frontend/src/components/tls/Ech.vue +++ /dev/null @@ -1,163 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tls/InTLS.vue b/frontend/src/components/tls/InTLS.vue deleted file mode 100644 index 5763141..0000000 --- a/frontend/src/components/tls/InTLS.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/tls/OutTLS.vue b/frontend/src/components/tls/OutTLS.vue deleted file mode 100644 index 8bdc9ff..0000000 --- a/frontend/src/components/tls/OutTLS.vue +++ /dev/null @@ -1,336 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/transports/Http.vue b/frontend/src/components/transports/Http.vue deleted file mode 100644 index c6f8b0b..0000000 --- a/frontend/src/components/transports/Http.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/transports/HttpUpgrade.vue b/frontend/src/components/transports/HttpUpgrade.vue deleted file mode 100644 index cfc3c90..0000000 --- a/frontend/src/components/transports/HttpUpgrade.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/transports/WebSocket.vue b/frontend/src/components/transports/WebSocket.vue deleted file mode 100644 index cf9f669..0000000 --- a/frontend/src/components/transports/WebSocket.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/transports/gRPC.vue b/frontend/src/components/transports/gRPC.vue deleted file mode 100644 index 3fc80d7..0000000 --- a/frontend/src/components/transports/gRPC.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/default/AppBar.vue b/frontend/src/layouts/default/AppBar.vue deleted file mode 100644 index 27bff40..0000000 --- a/frontend/src/layouts/default/AppBar.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/frontend/src/layouts/default/Default.vue b/frontend/src/layouts/default/Default.vue deleted file mode 100644 index 677235e..0000000 --- a/frontend/src/layouts/default/Default.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/layouts/default/Drawer.vue b/frontend/src/layouts/default/Drawer.vue deleted file mode 100644 index 13e8943..0000000 --- a/frontend/src/layouts/default/Drawer.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/default/View.vue b/frontend/src/layouts/default/View.vue deleted file mode 100644 index f17623b..0000000 --- a/frontend/src/layouts/default/View.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Admin.vue b/frontend/src/layouts/modals/Admin.vue deleted file mode 100644 index 8344503..0000000 --- a/frontend/src/layouts/modals/Admin.vue +++ /dev/null @@ -1,97 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Backup.vue b/frontend/src/layouts/modals/Backup.vue deleted file mode 100644 index e3228b7..0000000 --- a/frontend/src/layouts/modals/Backup.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Changes.vue b/frontend/src/layouts/modals/Changes.vue deleted file mode 100644 index 6c2bf30..0000000 --- a/frontend/src/layouts/modals/Changes.vue +++ /dev/null @@ -1,145 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Client.vue b/frontend/src/layouts/modals/Client.vue deleted file mode 100644 index badf8a3..0000000 --- a/frontend/src/layouts/modals/Client.vue +++ /dev/null @@ -1,280 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/ClientBulk.vue b/frontend/src/layouts/modals/ClientBulk.vue deleted file mode 100644 index a77e7f8..0000000 --- a/frontend/src/layouts/modals/ClientBulk.vue +++ /dev/null @@ -1,193 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Endpoint.vue b/frontend/src/layouts/modals/Endpoint.vue deleted file mode 100644 index 36af78d..0000000 --- a/frontend/src/layouts/modals/Endpoint.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Inbound.vue b/frontend/src/layouts/modals/Inbound.vue deleted file mode 100644 index af0e3c3..0000000 --- a/frontend/src/layouts/modals/Inbound.vue +++ /dev/null @@ -1,266 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Logs.vue b/frontend/src/layouts/modals/Logs.vue deleted file mode 100644 index f9c3ec9..0000000 --- a/frontend/src/layouts/modals/Logs.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Outbound.vue b/frontend/src/layouts/modals/Outbound.vue deleted file mode 100644 index 6685953..0000000 --- a/frontend/src/layouts/modals/Outbound.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/QrCode.vue b/frontend/src/layouts/modals/QrCode.vue deleted file mode 100644 index 0753e1b..0000000 --- a/frontend/src/layouts/modals/QrCode.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Rule.vue b/frontend/src/layouts/modals/Rule.vue deleted file mode 100644 index 1416402..0000000 --- a/frontend/src/layouts/modals/Rule.vue +++ /dev/null @@ -1,320 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Ruleset.vue b/frontend/src/layouts/modals/Ruleset.vue deleted file mode 100644 index a1842d6..0000000 --- a/frontend/src/layouts/modals/Ruleset.vue +++ /dev/null @@ -1,133 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Stats.vue b/frontend/src/layouts/modals/Stats.vue deleted file mode 100644 index 09d16be..0000000 --- a/frontend/src/layouts/modals/Stats.vue +++ /dev/null @@ -1,218 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/layouts/modals/Tls.vue b/frontend/src/layouts/modals/Tls.vue deleted file mode 100644 index d91fb3e..0000000 --- a/frontend/src/layouts/modals/Tls.vue +++ /dev/null @@ -1,547 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/locales/en.ts b/frontend/src/locales/en.ts deleted file mode 100644 index 6095e5e..0000000 --- a/frontend/src/locales/en.ts +++ /dev/null @@ -1,434 +0,0 @@ -export default { - message: "Welcome", - success: "success", - failed: "failed", - enable: "Enable", - disable: "Disable", - none: "None", - all: "All", - filter: "Filter", - loading: "Loading...", - confirm: "Are you sure ?", - yes: "yes", - no: "no", - unlimited: "infinite", - remained: "Remained", - type: "Type", - protocol: "Protocol", - submit: "Submit", - reset: "Reset", - now: "Now", - network: "Network", - copyToClipboard: "Copy to clipboard", - noData: "No data!", - invalidLogin: "Invalid Login!", - online: "Online", - version: "Version", - email: "Email", - commaSeparated: "(comma separated)", - count: "Count", - template: "Template", - error: { - dplData: "Duplicate Data", - core: "Sing-Box Error", - }, - pages: { - login: "Login", - home: "Home", - inbounds: "Inbounds", - outbounds: "Outbounds", - endpoints: "Endpoints", - clients: "Clients", - rules: "Rules", - tls: "TLS Settings", - basics: "Basics", - admins: "Admins", - settings: "Settings", - }, - main: { - tiles: "Tiles", - gauges: "Gauges", - charts: "Charts", - infos: "Information", - gauge: { - cpu: "CPU Gauge", - mem: "RAM Gauge", - }, - chart: { - cpu: "CPU Monitor", - mem: "RAM Monitor", - net: "Network Bandwidth", - pnet: "Network Packets", - }, - info: { - sys: "System Info", - sbd: "Sing-Box Info", - host: "Host", - cpu: "CPU", - core: "Core", - uptime: "Uptime", - threads: "Threads", - memory: "Memory", - running: "Running" - }, - backup: { - title: "Backup & Restore", - backup: "Download Backup", - restore: "Restore", - exclStats: "Exclude graphs", - exclChanges: "Exclude changes", - } - }, - objects: { - inbound: "Inbound", - client: "Client", - outbound: "Outbound", - endpoint: "Endpoint", - config: "Config", - rule: "Rule", - user: "User", - tag: "Tag", - listen: "Listen", - dial: "Dial", - tls: "TLS", - multiplex: "Multiplex", - transport: "Transport", - headers: "Headers", - key: "Key", - value: "Value", - }, - actions: { - action: "Action", - add: "Add", - addbulk: "Add Bulk", - new: "New", - edit: "Edit", - del: "Delete", - clone: "Clone", - save: "Save", - update: "Update", - submit: "Submit", - set: "Set", - generate: "Generate", - disable: "Disable", - close: "Close", - restartApp: "Restart App", - restartSb: "Restart Singbox", - }, - login: { - title: "Login", - username: "Username", - unRules: "Username can not be empty", - password: "Password", - pwRules: "Password can not be empty", - }, - menu: { - logout: "Logout", - }, - admin: { - changeCred: "Change credentials", - oldPass: "Current Password", - newUname: "New Username", - newPass: "New Password", - lastLogin: "Last login", - date: "Date", - time: "Time", - changes: "Changes", - actor: "Actor", - key: "Key", - action: "Action", - }, - setting: { - interface: "Interface", - sub: "Subscription", - addr: "Address", - port: "Port", - webPath: "Base URI", - domain: "Domain", - sslKey: "SSL Key Path", - sslCert: "SSL Certificate Path", - webUri: "Panel URI", - sessionAge: "Session Maximum Age", - trafficAge: "Traffic Maximum Age", - timeLoc: "Timezone Location", - subEncode: "Enable Encoding", - subInfo: "Enable Client Info", - path: "Default Path", - update: "Automatic Update Time", - subUri: "Subscription URI", - jsonSub: "JSON Subscription", - toDirect: "Route to Direct", - toBlock: "Route to Block", - timestamp: "Timestamp", - globalDns: "Global DNS", - directDns: "Direct DNS", - toDirectDns: "Route to Direct DNS", - jsonSubOptions: "Other Options", - excludePkg: "Exclude Packages", - }, - client: { - name: "Name", - desc: "Description", - group: "Group", - inboundTags: "Inbound Tags", - basics: "Basics", - config: "Config", - links: "Links", - external: "External Link", - sub: "External Subscription", - }, - bulk: { - order: "Order", - random: "Random", - }, - types: { - un: "Username", - pw: "Password", - direct: { - overrideAddr: "Override Address", - overridePort: "Override Port", - }, - hy: { - obfs: "Obfuscated Password", - auth: "Authentication Password", - hyOptions: "Hysteria Options", - hy2Options: "Hysteria2 Options", - ignoreBw: "Ignore Client Bandwidth", - }, - shdwTls: { - hs: "Handshake Server", - addHS: "Add Handshake Server", - }, - ssh: { - passphrase: "Passphrase", - hostKey: "Host Keys", - algorithm: "Key Algorithms", - clientVer: "Client Version", - options: "SSH Options", - }, - tor: { - execPath: "Executable File Path", - dataDir: "Data Directory", - extArgs: "Extra Args", - }, - tuic: { - congControl: "Congestion Control", - authTimeout: "Authentication Timeout", - hb: "Heartbeat", - }, - tun: { - addr: "Addresses", - ifName: "Interface Name", - }, - vless: { - flow: "Flow", - udpEnc: "UDP Packet Encoding", - }, - vmess: { - security: "Security", - globalPadding: "Global Padding", - authLen: "Encryptrd Length", - }, - wg: { - privKey: "Private Key", - pubKey: "Peer Public Key", - psk: "Pre-Shared Key", - localIp: "Local IPs", - worker: "Workers", - ifName: "Interface Name", - sysIf: "System Interface", - options: "Wireguard Options", - multiPeer: "Multi Peer", - allowedIp: "Allowed IPs", - peer: "Peer", - peers: "Peers", - }, - lb: { - defaultOut: "Default Outbound", - interruptConn: "Interrupt exist connections", - testUrl: "Test URL", - interval: "Interval", - tolerance: "Tolerance", - urlTestOptions: "URLTest Options" - } - }, - in: { - addr: "Address", - port: "Port", - clients: "Enable Clients", - ssMethod: "Method", - sSide: "Server Side", - cSide: "Client Side", - multiDomain: "Multi Domain", - remark: "Remark", - mdOption: "Multi Domain Options", - }, - listen: { - options: "Listen Options", - tcpOptions: "TCP Options", - udpOptions: "UDP Options", - detour: "Detour", - detourText: "Forward to inbound", - domainStrategy: "Domain Strategy", - }, - dial: { - bindIf: "Bind to Network Interface", - bindIp4: "Bind to IPv4", - bindIp6: "Bind to IPv6", - reuseAddr: "Reuse Listener Address", - connTimeout: "Connection Timeout", - fbTimeout: "Fallback Timeout", - options: "Dial Options", - detourText: "Forward to outbound", - }, - transport: { - enable: "Enable Transport", - host: "Host", - hosts: "Hosts", - path: "Path", - httpMethod: "Request Method", - idleTimeout: "Idle Timeout", - pingTimeout: "Ping Timeout", - grpcServiceName: "Service Name", - grpcPws: "Permit Without Stream", - }, - mux: { - enable: "Enable Multiplex", - maxConn: "Max Connections", - minStr: "Min Streams", - maxStr: "Max Streams", - padding: "Only padding", - enableBrutal: "Enable Brutal", - }, - out: { - addr: "Server Address", - port: "Server Port", - }, - rule: { - add: "Add Rule", - simple: "Simple", - logical: "Logical", - mode: "Mode", - invert: "Invert", - ipVer: "IP Version", - domain: "Domains", - domainSufix: "Domain Suffixes", - domainKw: "Domain Keywords", - domainRgx: "Domain Regexes", - ip: "IP CIDRs", - privateIp: "Invalid IP Ranges", - port: "Ports", - portRange: "Port Ranges", - srcCidr: "Source IP CIDRs", - srcPrivateIp: "Invalid Source IPs", - srcPort: "Source Ports", - srcPortRange: "Source Port Ranges", - ruleset: "Rulesets", - rulesetMatchSrc: "Ruleset IPcidr Match Source", - options: "Rule Options", - domainRules: "Domain/IP", - srcIpRules: "Source IP", - srcPortRules: "Source Port", - udpDisableDomainUnmapping: "UDP Disable Domain Unmapping", - udpConnect: "UDP Connect", - udpTimeout: "UDP Timeout", - method: "Method", - noDrop: "No Drop", - sniffer: "Sniffer", - timeout: "Timeout", - strategy: "Strategy", - }, - ruleset: { - add: "Add Ruleset", - format: "Data Format", - interval: "Update Intervals", - remote: "Remote", - local: "Local", - }, - basic: { - log: { - title: "Logs", - level: "Level", - output: "Output", - timestamp: "Enable Timestamp", - }, - dns: { - final: "Final", - server: "Server", - firstServer: "First Server", - addrResolver: "Address Resolver", - }, - routing: { - title: "Routing", - defaultOut: "Default Outbound", - defaultIf: "Default NIC", - defaultRm: "Default Routing Mark", - autoBind: "Auto Bind NIC", - }, - exp: { - storeFakeIp: "Store Fake IP", - }, - }, - tls: { - enable: "Enable TLS", - usePath: "Use Path", - useText: "Use Text", - certPath: "Certificate File Path", - keyPath: "Key File Path", - cert: "Certificate", - key: "Key", - options: "TLS Options", - minVer: "Minimum Version", - maxVer: "Maximum Version", - cs: "Cipher suits", - privKey: "Private Key", - pubKey: "Public Key", - disableSni: "Disable SNI", - insecure: "Allow Insecure", - acme: { - options: "ACME Options", - dataDir: "Data Directory", - defaultDomain: "Default Domain", - disableChallenges: "Disable Challenges", - httpChallenge: "Disable HTTP Challenge", - tlsChallenge: "Disable TLS Challenge", - altPorts: "Alternative Ports", - altHport: "Alternative HTTP Port", - altTport: "Alternative TLS Port", - caProvider: "CA Provider", - customCa: "Custom CA Provider", - extAcc: "External Account", - dns01: "DNS01 Challenge", - dns01Provider: "DNS01 Challenge Provider", - }, - }, - stats: { - upload: "Upload", - download: "Download", - volume: "Volume", - usage: "Usage", - graphTitle: "Traffic Chart", - B: "B", - KB: "KB", - MB: "MB", - GB: "GB", - TB: "TB", - PB: "PB", - p: "p", - Kp: "Kp", - Mp: "Mp", - Gb: "Gb", - bps: "bps", - Kbps: "Kbps", - Mbps: "Mbps", - }, - date: { - expiry: "Expiry", - expired: "Expired", - d: "d", - h: "h", - m: "m", - s: "s", - ms: "ms", - }, -} \ No newline at end of file diff --git a/frontend/src/locales/fa.ts b/frontend/src/locales/fa.ts deleted file mode 100644 index 206d596..0000000 --- a/frontend/src/locales/fa.ts +++ /dev/null @@ -1,434 +0,0 @@ -export default { - message: "خوش آمدید", - success: "موفق", - failed: "خطا", - enable: "فعال", - disable: "غیرفعال", - none: "هیچ", - all: "همه", - filter: "فیلتر", - loading: "در حال بارگذاری...", - confirm: "آیا مطمئن هستید ؟", - yes: "بله", - no: "خیر", - unlimited: "نامحدود", - remained: "باقیمانده", - type: "مدل", - protocol: "پروتکل", - submit: "تایید", - reset: "ریست", - now: "اکنون", - network: "شبکه", - copyToClipboard: "کپی در حافظه", - noData: "بدون داده!", - invalidLogin: "ورود نامعتبر!", - online: "آنلاین", - version: "نسخه", - email: "ایمیل", - commaSeparated: "(جداشده با کاما)", - count: "تعداد", - template: "الگو", - error: { - dplData: "داده تکراری", - core: "خطا در سینگ‌باکس", - }, - pages: { - login: "ورود", - home: "خانه", - inbounds: "ورودی‌ها", - outbounds: "خروجی‌ها", - endpoints: "درگاه‌ها", - clients: "کاربران", - rules: "قوانین", - tls: "رمزنگاری‌ها", - basics: "ترازها", - admins: "ادمین‌ها", - settings: "پیکربندی", - }, - main: { - tiles: "کاشی‌ها", - gauges: "سنجش‌ها", - charts: "نمودارها", - infos: "داده‌ها", - gauge: { - cpu: "سنجش پردازنده", - mem: "سنجش حافظه", - }, - chart: { - cpu: "نمودار پردازنده", - mem: "نمودار حافظه", - net: "ترافیک شبکه", - pnet: "بسته‌های شبکه", - }, - info: { - sys: "داده‌های سیستم", - sbd: "داده‌های سینگ‌باکس", - host: "نام", - cpu: "پردازنده", - core: "هسته", - uptime: "مدت‌", - threads: "نخ‌ها", - memory: "حافظه", - running: "اجرا" - }, - backup: { - title: "پشتیبان‌گیری و بازیابی", - backup: "دریافت پشتیبان", - restore: "بازیابی", - exclStats: "بدون گراف‌ها", - exclChanges: "بدون تغییرات", - }, - }, - objects: { - inbound: "ورودی‌", - client: "کاربر", - outbound: "خروجی‌", - endpoint: "درگاه", - config: "پیکربندی", - rule: "قانون", - user: "کاربر", - tag: "برچسب", - listen: "گوش‌دادن", - dial: "تماس", - tls: "رمزنگاری", - multiplex: "تسهیم", - transport: "انتقال", - headers: "سربرگ‌ها", - key: "نام", - value: "مقدار", - }, - actions: { - action: "فرمان", - add: "ایجاد", - addbulk: "ایجاد انبوه", - new: "جدید", - edit: "ویرایش", - del: "حذف", - clone: "شبیه‌سازی", - save: "ذخیره", - update: "بروزرسانی", - submit: "ارسال", - set: "تنظیم", - generate: "تولید", - disable: "غیرفعال", - close: "بستن", - restartApp: "ریستارت پنل", - restartSb: "ریستارت سینگ‌باکس", - }, - login: { - title: "ورود", - username: "نام کاربری", - unRules: "نام کاربری نمی‌تواند خالی باشد", - password: "کلمه عبور", - pwRules: "کلمه عبور نمی‌تواند خالی باشد", - }, - menu: { - logout: "خروج", - }, - admin: { - changeCred: "ویرایش داده‌ها", - oldPass: "رمز کنونی", - newUname: "نام کاربری جدید", - newPass: "رمز جدید", - lastLogin: "آخرین ورود", - date: "تاریخ", - time: "ساعت", - changes: "تغییرات", - actor: "مجری", - key: "کلید", - action: "عمل", - }, - setting: { - interface: "نما", - sub: "سابسکریپشن", - addr: "آدرس", - port: "پورت", - webPath: "مسیر پایه", - domain: "دامنه", - sslKey: "مسیر فایل کلید", - sslCert: "مسیر فایل گواهی", - webUri: "آدرس نهایی پنل", - sessionAge: "بیشینه زمان لاگین ماندن", - trafficAge: "بیشینه زمان ذخیره ترافیک", - timeLoc: "منطقه زمانی", - subEncode: "رمزگذاری", - subInfo: "نمایش اطلاعات کاربر", - path: "مسیر پیشفرض", - update: "زمان بروزرسانی خودکار", - subUri: "آدرس نهایی سابسکریپشن", - jsonSub: "سابسکریپشن JSON", - toDirect: "هدایت مستقیم", - toBlock: "بستن مسیر", - timestamp: "نمایش زمان", - globalDns: "DNS کلی", - directDns: "DNS مستقیم", - toDirectDns: "هدایت به DNS مستقیم", - jsonSubOptions: "گزینه‌های دیگر", - excludePkg: "نرم‌افزارهای استثنا", - }, - client: { - name: "نام", - desc: "شرح", - group: "گروه", - inboundTags: "برچسب‌های ورودی", - basics: "پایه", - config: "تنظیم", - links: "لینک‌ها", - external: "لینک‌ خارجی", - sub: "سابسکریپشن خارجی", - }, - bulk: { - order: "ترتیب", - random: "تصادفی", - }, - types: { - un: "نام کاربری", - pw: "رمز", - direct: { - overrideAddr: "جایگزین آدرس", - overridePort: "جایگزین پورت", - }, - hy: { - obfs: "رمز مبهم کننده", - auth: "رمز احراز هویت", - hyOptions: "گزینه‌های Hysteria", - hy2Options: "گزینه‌های Hysteria2", - ignoreBw: "نادیده‌گرفتن پهنای‌باند کاربر", - }, - shdwTls: { - hs: "سرور دست‌تکانی", - addHS: "افزودن سرور دست‌تکانی", - }, - ssh: { - passphrase: "عبارت عبور", - hostKey: "کلیدهای هاست‌ها", - algorithm: "الگوریتم‌ها", - clientVer: "نسخه کلاینت", - options: "گزینه‌های SSH", - }, - tor: { - execPath: "مسیر فایل اجرایی", - dataDir: "پوشه داده‌ها", - extArgs: "آرگومان‌های اضافی", - }, - tuic: { - congControl: "کنترل ازدحام", - authTimeout: "مهلت احراز هویت", - hb: "ضربان قلب", - }, - tun: { - addr: "آدرس‌ها", - ifName: "نام اینترفیس", - }, - vless: { - flow: "جریان", - udpEnc: "کدگذاری بسته UDP", - }, - vmess: { - security: "امنیت", - globalPadding: "لایه بندی کلی", - authLen: "رمزگذاری اندازه بسته", - }, - wg: { - privKey: "کلید خصوصی", - pubKey: "کلید عمومی همتا", - psk: "کلید مشترک", - localIp: "آدرس‌های محلی", - worker: "عملگرها", - ifName: "نام اینترفیس", - sysIf: "استفاده از اینترفیس سیستم", - options: "گزینه‌های Wireguard", - multiPeer: "چند همتایی", - allowedIp: "آدرس‌های مجاز", - peer: "همتا", - peers: "همتاها", - }, - lb: { - defaultOut: "خروجی پیش‌فرض", - interruptConn: "قطع ارتباط موجود", - testUrl: "URL تست", - interval: "فاصله زمانی", - tolerance: "تحمل", - urlTestOptions: "گزینه‌های URLTest" - } - }, - in: { - addr: "آدرس", - port: "پورت", - clients: "فعال‌سازی کاربران", - ssMethod: "روش", - sSide: "سمت سرور", - cSide: "سمت کاربر", - multiDomain: "دامنه چندگانه", - remark: "شرح", - mdOption: "گزینه‌های دامنه چندگانه", - }, - listen: { - options: "گزینه‌های گوش‌دادن", - tcpOptions: "گزینه‌های TCP", - udpOptions: "گزینه‌های UDP", - detour: "انحراف مسیر", - detourText: "ارسال به ورودی دیگر", - domainStrategy: "استراتژی دامنه", - }, - dial: { - bindIf: "اتصال به کارت شبکه", - bindIp4: "اتصال به IPv4", - bindIp6: "اتصال به IPv6", - reuseAddr: "استفاده مجدد از آدرس", - connTimeout: "مهلت ارتباط", - fbTimeout: "مهلت فالبک", - options: "گزینه‌های تماس", - detourText: "ارسال به خروجی دیگر", - }, - transport: { - enable: "فعال‌سازی انتقال", - host: "دامنه", - hosts: "دامنه‌ها", - path: "مسیر", - httpMethod: "متد درخواست", - idleTimeout: "مهلت بیکاری", - pingTimeout: "مهلت پینگ", - grpcServiceName: "نام سرویس", - grpcPws: "حفظ ارتباط بدون دیتا", - }, - mux: { - enable: "فعال‌سازی تسهیم", - maxConn: "بیشینه ارتباطات", - minStr: "کمینه استریم", - maxStr: "بیشینه استریم", - padding: "فقط با پدینگ", - enableBrutal: "فعال‌سازی شدت", - }, - out: { - addr: "آدرس سرور", - port: "پورت سرور", - }, - rule: { - add: "ایجاد قانون", - simple: "ساده", - logical: "منطقی", - mode: "حالت", - invert: "برعکس", - ipVer: "نسخه IP", - domain: "دامنه‌ها", - domainSufix: "پسوند‌های دامنه", - domainKw: "کلمات کلیدی دامنه", - domainRgx: "رجکس دامنه", - ip: "محدوده‌های IP", - privateIp: "آدرس های IP نامعتبر", - port: "پورت‌ها", - portRange: "محدوده‌های پورت", - srcCidr: "محدوده‌های آدرس IP مبدا", - srcPrivateIp: "آدرس‌های IP مبدا نامعتبر", - srcPort: "پورت‌های مبدا", - srcPortRange: "محدوده پورتهای منبع", - ruleset: "مجموعه‌ها", - rulesetMatchSrc: "تطابق آدرس‌های مبدا با مجموعه قوانین", - options: "گزینه‌های قوانین", - domainRules: "دامنه/آدرس", - srcIpRules: "آدرس مبدا", - srcPortRules: "پورت مبدا", - udpDisableDomainUnmapping: "عدم تبدیل مسیریابی دامنه", - udpConnect: "اتصال UDP", - udpTimeout: "مهلت UDP", - method: "روش", - noDrop: "عدم رهاکردن", - sniffer: "شنود کننده", - timeout: "مهلت", - strategy: "استراتژی", - }, - ruleset: { - add: "ایجاد مجموعه", - format: "فرمت داده‌ها", - interval: "بازه بروزرسانی‌ها", - remote: "راه دور", - local: "محلی", - }, - basic: { - log: { - title: "گزارش‌ها", - level: "سطح", - output: "خروجی", - timestamp: "فعال‌سازی ثبت زمان", - }, - dns: { - final: "سرور نهایی", - server: "سرور", - firstServer: "سرور نخست", - addrResolver: "حل کننده دامنه", - }, - routing: { - title: "مسیریابی", - defaultOut: "خروجی پیش‌فرض", - defaultIf: "کارت شبکه پیش‌فرض", - defaultRm: "Routing Mark پیش‌فرض", - autoBind: "انتخاب اتوماتیک کارت شبکه", - }, - exp: { - storeFakeIp: "ذخیره آدرس‌های نامعتبر", - }, - }, - tls: { - enable: "فعالسازی رمزنگاری", - usePath: "مسیر فایل", - useText: "متن گواهی", - certPath: "مسیر فایل گواهی", - keyPath: "مسیر فایل کلید", - cert: "گواهی", - key: "کلید", - options: "گزینه‌های رمز‌نگاری", - minVer: "کمینه نسخه", - maxVer: "بیشینه نسخه", - cs: "مدل‌های رمزنگاری", - privKey: "کلید خصوصی", - pubKey: "کلید عمومی", - disableSni: "غیرفعال‌سازی SNI", - insecure: "تایید ارتباط ناامن", - acme: { - options: "گزینه‌های ACME", - dataDir: "مسیر داده‌ها", - defaultDomain: "دامنه پیش‌فرض", - disableChallenges: "بستن چالش‌ها", - httpChallenge: "بستن چالش HTTP", - tlsChallenge: "بستن چالش TLS", - altPorts: "پورت‌های جایگزین", - altHport: "پورت جایگزین HTTP", - altTport: "پورت جایگزین TLS", - caProvider: "فراهم کننده گواهی", - customCa: "فراهم کننده دیگر", - extAcc: "حساب خارجی", - dns01: "چالش DNS01", - dns01Provider: "فراهم کننده چالش DNS01", - }, - }, - stats: { - upload: "آپلود", - download: "دانلود", - volume: "حجم", - usage: "استفاده", - graphTitle: "نمودار ترافیک", - B: "ب", - KB: "ک‌ب", - MB: "م‌ب", - GB: "گ‌ب", - TB: "ت‌ب", - PB: "پ‌ب", - p: "پ", - Kp: "ک‌پ", - Mp: "م‌پ", - Gp: "گ‌پ", - bps: "ب/ث", - Kbps: "ک‌ب/ث", - Mbps: "م‌ب/ث", - }, - date: { - expiry: "انقضا", - expired: "منقضی", - d: "ر", - h: "س", - m: "د", - s: "ث", - ms: "م‌ث", - } -} \ No newline at end of file diff --git a/frontend/src/locales/index.ts b/frontend/src/locales/index.ts deleted file mode 100644 index 7049e4d..0000000 --- a/frontend/src/locales/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createI18n } from 'vue-i18n' -import en from './en' -import fa from './fa' -import vi from './vi' -import zhcn from './zhcn' -import zhtw from './zhtw' -import ru from './ru' - -export const i18n = createI18n({ - legacy: false, - locale: localStorage.getItem("locale") ?? 'en', - fallbackLocale: 'en', - messages: { - en: en, - fa: fa, - vi: vi, - zhHans: zhcn, - zhHant: zhtw, - ru: ru - }, -}) - -export const languages = [ - { title: 'English', value: 'en' }, - { title: 'فارسی', value: 'fa' }, - { title: 'Tiếng Việt', value: 'vi' }, - { title: '简体中文', value: 'zhHans' }, - { title: '繁體中文', value: 'zhHant' }, - { title: 'Русский', value: 'ru' }, -] diff --git a/frontend/src/locales/ru.ts b/frontend/src/locales/ru.ts deleted file mode 100644 index e0de775..0000000 --- a/frontend/src/locales/ru.ts +++ /dev/null @@ -1,434 +0,0 @@ -export default { - message: "Добро пожаловать", - success: "успех", - failed: "ошибка", - enable: "Включить", - disable: "Отключить", - none: "Никакие", - all: "Все", - filter: "Фильтр", - loading: "Загрузка...", - confirm: "Вы уверены?", - yes: "да", - no: "нет", - unlimited: "бесконечный", - remained: "Осталось", - type: "Тип", - protocol: "Протокол", - submit: "Отправить", - reset: "Сбросить", - now: "Сейчас", - network: "Сеть", - copyToClipboard: "Копировать в буфер обмена", - noData: "Нет данных!", - invalidLogin: "Неверный логин!", - online: "В сети", - version: "Версия", - email: "Электронная почта", - commaSeparated: "(разделено запятыми)", - count: "Количество", - template: "Шаблон", - error: { - dplData: "Дублирующие данные", - core: "Ошибка Sing-Box", - }, - pages: { - login: "Вход", - home: "Главная", - inbounds: "Входящие", - outbounds: "Исходящие", - endpoints: "Эндпоинты", - clients: "Клиенты", - rules: "Правила", - tls: "Настройки TLS", - basics: "Основы", - admins: "Администраторы", - settings: "Настройки", - }, - main: { - tiles: "Плитки", - gauges: "Датчики", - charts: "Графики", - infos: "Информация", - gauge: { - cpu: "Загрузка ЦП", - mem: "Загрузка ОЗУ", - }, - chart: { - cpu: "Мониторинг ЦП", - mem: "Мониторинг ОЗУ", - net: "Сетевой трафик", - pnet: "Сетевые пакеты", - }, - info: { - sys: "Информация о системе", - sbd: "Информация о Sing-Box", - host: "Хост", - cpu: "ЦП", - core: "Ядро", - uptime: "Время работы", - threads: "Потоки", - memory: "Память", - running: "Работает" - }, - backup: { - title: "Резервное копирование и восстановление", - backup: "Скачать резервную копию", - restore: "Восстановить", - exclStats: "Исключить графики", - exclChanges: "Исключить изменения", - } - }, - objects: { - inbound: "Входящий", - client: "Клиент", - outbound: "Исходящий", - endpoint: "Точка входа", - config: "Настройки", - rule: "Правило", - user: "Пользователь", - tag: "Тег", - listen: "Прослушивание", - dial: "Звонок", - tls: "TLS", - multiplex: "Мультиплекс", - transport: "Транспорт", - headers: "Заголовки", - key: "Ключ", - value: "Значение", - }, - actions: { - action: "Действие", - add: "Добавить", - addbulk: "Добавить пакетно", - new: "Новый", - edit: "Редактировать", - del: "Удалить", - clone: "Клонировать", - save: "Сохранить", - update: "Обновить", - submit: "Отправить", - set: "Установить", - generate: "Генерировать", - disable: "Отключить", - close: "Закрыть", - restartApp: "Перезапустить приложение", - restartSb: "Перезапустить Singbox", - }, - login: { - title: "Вход", - username: "Имя пользователя", - unRules: "Имя пользователя не может быть пустым", - password: "Пароль", - pwRules: "Пароль не может быть пустым", - }, - menu: { - logout: "Выйти", - }, - admin: { - changeCred: "Изменить учетные данные", - oldPass: "Текущий пароль", - newUname: "Новое имя пользователя", - newPass: "Новый пароль", - lastLogin: "Последний вход", - date: "Дата", - time: "Время", - changes: "Изменения", - actor: "Исполнитель", - key: "Ключ", - action: "Действие", - }, - setting: { - interface: "Интерфейс", - sub: "Подписка", - addr: "Адрес", - port: "Порт", - webPath: "Базовый URI", - domain: "Домен", - sslKey: "Путь к SSL ключу", - sslCert: "Путь к SSL сертификату", - webUri: "URI панели", - sessionAge: "Максимальная длительность сессии", - trafficAge: "Максимальная длительность трафика", - timeLoc: "Часовой пояс", - subEncode: "Включить кодирование", - subInfo: "Включить информацию о клиенте", - path: "Путь по умолчанию", - update: "Время автоматического обновления", - subUri: "URI подписки", - jsonSub: "JSON подписка", - toDirect: "Маршрутизация на Direct", - toBlock: "Маршрутизация на Block", - timestamp: "Метка времени", - globalDns: "Глобальный DNS", - directDns: "Прямой DNS", - toDirectDns: "Маршрутизация на Direct DNS", - jsonSubOptions: "Другие параметры", - excludePkg: "Исключить пакеты", - }, - client: { - name: "Имя", - desc: "Описание", - group: "Группа", - inboundTags: "Теги входящих", - basics: "Основы", - config: "Конфигурация", - links: "Ссылки", - external: "Внешняя ссылка", - sub: "Внешняя подписка", - }, - bulk: { - order: "Порядок", - random: "Случайный", - }, - types: { - un: "Имя пользователя", - pw: "Пароль", - direct: { - overrideAddr: "Переопределить адрес", - overridePort: "Переопределить порт", - }, - hy: { - obfs: "Обфусцированный пароль", - auth: "Пароль аутентификации", - hyOptions: "Параметры Hysteria", - hy2Options: "Параметры Hysteria2", - ignoreBw: "Игнорировать пропускную способность клиента", - }, - shdwTls: { - hs: "Сервер рукопожатий", - addHS: "Добавить сервер рукопожатий", - }, - ssh: { - passphrase: "Парольная фраза", - hostKey: "Ключи хоста", - algorithm: "Алгоритмы ключей", - clientVer: "Версия клиента", - options: "Параметры SSH", - }, - tor: { - execPath: "Путь к исполняемому файлу", - dataDir: "Каталог данных", - extArgs: "Дополнительные аргументы", - }, - tuic: { - congControl: "Контроль перегрузок", - authTimeout: "Таймаут аутентификации", - hb: "Сердцебиение", - }, - tun: { - addr: "Адреса", - ifName: "Имя интерфейса", - }, - vless: { - flow: "Поток", - udpEnc: "Кодирование UDP пакетов", - }, - vmess: { - security: "Безопасность", - globalPadding: "Глобальная подкладка", - authLen: "Длина шифрования", - }, - wg: { - privKey: "Приватный ключ", - pubKey: "Публичный ключ пира", - psk: "Предварительно разделенный ключ", - localIp: "Локальные IP", - worker: "Работники", - ifName: "Имя интерфейса", - sysIf: "Системный интерфейс", - options: "Параметры Wireguard", - multiPeer: "Множественный пир", - allowedIp: "Разрешенные IP", - peer: "Пир", - peers: "Пиры", - }, - lb: { - defaultOut: "Исходящий по умолчанию", - interruptConn: "Прервать существующие соединения", - testUrl: "Тестовый URL", - interval: "Интервал", - tolerance: "Толерантность", - urlTestOptions: "Параметры теста URL" - } - }, - in: { - addr: "Адрес", - port: "Порт", - clients: "Включить клиентов", - ssMethod: "Метод", - sSide: "Сторона сервера", - cSide: "Сторона клиента", - multiDomain: "Мультидомен", - remark: "Примечание", - mdOption: "Параметры мультидомена", - }, - listen: { - options: "Параметры прослушивания", - tcpOptions: "Параметры TCP", - udpOptions: "Параметры UDP", - detour: "Обход", - detourText: "Переадресация на входящий", - domainStrategy: "Стратегия домена", - }, - dial: { - bindIf: "Привязка к сетевому интерфейсу", - bindIp4: "Привязка к IPv4", - bindIp6: "Привязка к IPv6", - reuseAddr: "Повторное использование адреса слушателя", - connTimeout: "Таймаут подключения", - fbTimeout: "Таймаут возврата", - options: "Параметры вызова", - detourText: "Переадресация на исходящий", - }, - transport: { - enable: "Включить транспорт", - host: "Хост", - hosts: "Хосты", - path: "Путь", - httpMethod: "Метод запроса", - idleTimeout: "Таймаут бездействия", - pingTimeout: "Таймаут пинга", - grpcServiceName: "Имя службы", - grpcPws: "Разрешить без потока", - }, - mux: { - enable: "Включить мультиплекс", - maxConn: "Максимальное количество соединений", - minStr: "Минимальное количество потоков", - maxStr: "Максимальное количество потоков", - padding: "Только подкладка", - enableBrutal: "Включить Brutal", - }, - out: { - addr: "Адрес сервера", - port: "Порт сервера", - }, - rule: { - add: "Добавить правило", - simple: "Простое", - logical: "Логическое", - mode: "Режим", - invert: "Инвертировать", - ipVer: "Версия IP", - domain: "Домены", - domainSufix: "Суффиксы доменов", - domainKw: "Ключевые слова домена", - domainRgx: "Регулярные выражения домена", - ip: "CIDR IP", - privateIp: "Недействительные диапазоны IP", - port: "Порты", - portRange: "Диапазоны портов", - srcCidr: "CIDR исходного IP", - srcPrivateIp: "Недействительные исходные IP", - srcPort: "Исходные порты", - srcPortRange: "Диапазоны исходных портов", - ruleset: "Наборы правил", - rulesetMatchSrc: "Набор правил для соответствия источника IPcidr", - options: "Параметры правила", - domainRules: "Домен/IP", - srcIpRules: "Источник IP", - srcPortRules: "Источник порта", - udpDisableDomainUnmapping: "Отключить перенос доменных имен", - udpConnect: "Подключение UDP", - udpTimeout: "Таймаут UDP", - method: "Метод", - noDrop: "Не сбрасывать", - sniffer: "Обнаружение", - timeout: "Таймаут", - strategy: "Стратегия", - }, - ruleset: { - add: "Добавить набор правил", - format: "Формат данных", - interval: "Интервалы обновления", - remote: "Удаленный", - local: "Локальный", - }, - basic: { - log: { - title: "Журналы", - level: "Уровень", - output: "Вывод", - timestamp: "Включить метку времени", - }, - dns: { - final: "Итоговый", - server: "Сервер", - firstServer: "Первый сервер", - addrResolver: "Разрешение адреса", - }, - routing: { - title: "Маршрутизация", - defaultOut: "Исходящий по умолчанию", - defaultIf: "Сетевой интерфейс по умолчанию", - defaultRm: "Маршрут по умолчанию", - autoBind: "Автопривязка сетевого интерфейса", - }, - exp: { - storeFakeIp: "Хранить поддельный IP", - }, - }, - tls: { - enable: "Включить TLS", - usePath: "Использовать путь", - useText: "Использовать текст", - certPath: "Путь к файлу сертификата", - keyPath: "Путь к файлу ключа", - cert: "Сертификат", - key: "Ключ", - options: "Параметры TLS", - minVer: "Минимальная версия", - maxVer: "Максимальная версия", - cs: "Наборы шифров", - privKey: "Приватный ключ", - pubKey: "Публичный ключ", - disableSni: "Отключить SNI", - insecure: "Разрешить небезопасное", - acme: { - options: "Параметры ACME", - dataDir: "Каталог данных", - defaultDomain: "Домен по умолчанию", - disableChallenges: "Отключить вызовы", - httpChallenge: "Отключить HTTP вызов", - tlsChallenge: "Отключить TLS вызов", - altPorts: "Альтернативные порты", - altHport: "Альтернативный HTTP порт", - altTport: "Альтернативный TLS порт", - caProvider: "Поставщик CA", - customCa: "Пользовательский поставщик CA", - extAcc: "Внешний аккаунт", - dns01: "DNS01 вызов", - dns01Provider: "Поставщик DNS01 вызова", - }, - }, - stats: { - upload: "Загрузка", - download: "Скачивание", - volume: "Объем", - usage: "Использование", - graphTitle: "График трафика", - B: "Б", - KB: "КБ", - MB: "МБ", - GB: "ГБ", - TB: "ТБ", - PB: "ПБ", - p: "п", - Kp: "Кп", - Mp: "Мп", - Gb: "Гб", - bps: "б/с", - Kbps: "Кб/с", - Mbps: "Мб/с", - }, - date: { - expiry: "Срок действия", - expired: "Истек", - d: "д", - h: "ч", - m: "м", - s: "с", - ms: "мс", - }, -} diff --git a/frontend/src/locales/vi.ts b/frontend/src/locales/vi.ts deleted file mode 100644 index 656dd58..0000000 --- a/frontend/src/locales/vi.ts +++ /dev/null @@ -1,435 +0,0 @@ -export default { - message: "Chào mừng OHB", - success: "Thành công", - failed: "Thất bại", - enable: "Kích hoạt", - disable: "Vô hiệu hóa", - none: "Không", - all: "Tất cả", - filter: "Bộ lọc", - loading: "Đang tải...", - confirm: "Bạn chắc chắn chứ?", - yes: "có", - no: "không", - unlimited: "vô hạn", - remained: "Còn lại", - type: "Loại", - protocol: "Giao thức", - submit: "Gửi", - reset: "Đặt lại", - now: "Hiện tại", - network: "Mạng", - copyToClipboard: "Sao chép vào clipboard", - noData: "Không có dữ liệu!", - invalidLogin: "Đăng nhập không hợp lệ!", - online: "Trực tuyến", - version: "Phiên bản", - email: "Email", - commaSeparated: "(được phân tách bằng dấu phẩy)", - count: "Đếm", - template: "Mẫu", - error: { - dplData: "Dữ liệu trùng lặp", - core: "Lỗi Sing-Box", - }, - pages: { - login: "Đăng nhập", - home: "Trang chủ", - inbounds: "Đầu Vào", - outbounds: "Đầu ra", - endpoints: "Câu hình", - clients: "Khách hàng", - rules: "Quy tắc", - tls: "Cài đặt TLS", - basics: "Cơ bản", - admins: "Quản trị viên", - settings: "Cài đặt", - }, - main: { - tiles: "OHB", - gauges: "Đồng hồ đo", - charts: "Biểu đồ", - infos: "Thông tin", - gauge: { - cpu: "Đồng hồ CPU", - mem: "Đồng hồ RAM", - }, - chart: { - cpu: "Máy theo dõi CPU", - mem: "Máy theo dõi RAM", - net: "Băng thông mạng", - pnet: "Gói mạng", - }, - info: { - sys: "Thông tin hệ thống", - sbd: "Thông tin Sing-Box", - host: "Máy chủ", - cpu: "CPU", - core: "Nhân", - uptime: "Thời gian hoạt động", - threads: "Luồng", - memory: "Bộ nhớ", - running: "Đang chạy" - }, - backup: { - title: "Sao lưu và khôi phục", - backup: "Tải xuống bản sao lưu", - restore: "Khôi phục", - exclStats: "Loại trừ các biểu đồ", - exclChanges: "Loại trừ các thay đổi", - } - }, - objects: { - inbound: "Đầu Vào", - client: "Máy Khách hàng", - outbound: "Đầu Ra", - endpoint: "Điểm cuối", - config: "Câu hình", - rule: "Quy tắc", - user: "Người dùng", - tag: "Thẻ", - listen: "Nghe", - dial: "Quay số", - tls: "TLS", - multiplex: "Ghép đa truyền thông ", - transport: "Giao thông", - headers: "Tiêu đề", - key: "Chìa khóa", - value: "Giá trị", - }, - actions: { - action: "Hành động", - add: "Thêm", - addbulk: "Thêm Hàng loạt", - new: "Mới", - edit: "Chỉnh sửa", - del: "Xóa", - clone: "Nhân bản", - save: "Lưu", - update: "Cập nhật", - submit: "Gửi", - set: "Đặt", - generate: "Tạo ra", - disable: "Vô hiệu hóa", - close: "Đóng", - restartApp: "Khởi động lại ứng dụng", - restartSb: "Khởi động lại Singbox", - }, - login: { - title: "Đăng nhập", - username: "Tên người dùng", - unRules: "Tên người dùng không thể trống", - password: "Mật khẩu", - pwRules: "Mật khẩu không thể trống", - }, - menu: { - logout: "Đăng xuất", - }, - admin: { - changeCred: "Thay đổi thông tin đăng nhập", - oldPass: "Mật khẩu hiện tại", - newUname: "Tên người dùng mới", - newPass: "Mật khẩu mới", - lastLogin: "Lân đăng nhập cuôi", - date: "Ngày", - time: "Thời gian", - changes: "Thay đổi", - actor: "Diễn viên", - key: "Khóa", - action: "Hành động", - }, - setting: { - interface: "Giao diện", - sub: "Đăng ký", - addr: "Địa chỉ", - port: "Cổng", - webPath: "Đường dẫn gốc", - domain: "Miền", - sslKey: "Đường dẫn khóa SSL", - sslCert: "Đường dẫn chứng chỉ SSL", - webUri: "URI bảng điều khiển", - sessionAge: "Tuổi tối đa của phiên", - trafficAge: "Tuổi lưu thông tối đa", - timeLoc: "Vị trí múi giờ", - subEncode: "Kích hoạt mã hóa", - subInfo: "Kích hoạt thông tin khách hàng", - path: "Đường dẫn mặc định", - update: "Thời gian cập nhật tự động", - subUri: "URI đăng ký", - jsonSub: "Đăng ký JSON", - toDirect: "Chuyển hướng tới Trực tiếp", - toBlock: "Chuyển hướng tới Chặn", - timestamp: "Dấu thời gian", - globalDns: "DNS Toàn cầu", - directDns: "DNS Trực tiếp", - toDirectDns: "Chuyển hướng tới DNS Trực tiếp", - jsonSubOptions: "Tùy chọn Khác", - excludePkg: "Loại trừ Gói", - }, - client: { - name: "Tên", - desc: "Mô tả", - group: "Nhóm", - inboundTags: "Thẻ đầu vào", - basics: "Cơ bản", - config: "Cấu hình", - links: "Liên kết", - external: "Liên kết bên ngoài", - sub: "Đăng ký bên ngoài", - }, - bulk: { - order: "Sắp xếp", - random: "Ngẫu nhiên", - }, - types: { - un: "Tên người dùng", - pw: "Mật khẩu", - direct: { - overrideAddr: "Ghi đè Địa chỉ", - overridePort: "Ghi đè Cổng", - }, - hy: { - obfs: "Mật khẩu đã được Ẩn", - auth: "Mật khẩu Xác thực", - hyOptions: "Tùy chọn Hysteria", - hy2Options: "Tùy chọn Hysteria2", - ignoreBw: "Bỏ qua Băng thông của Client", - }, - shdwTls: { - hs: "Máy chủ Handshake", - addHS: "Thêm Máy chủ Handshake", - }, - ssh: { - passphrase: "Cụm từ mật khẩu", - hostKey: "Khóa Máy chủ", - algorithm: "Thuật toán Khóa", - clientVer: "Phiên bản Client", - options: "Tùy chọn SSH", - }, - tor: { - execPath: "Đường dẫn File thực thi", - dataDir: "Thư mục Dữ liệu", - extArgs: "Đối số Bổ sung", - }, - tuic: { - congControl: "Kiểm soát Tắc nghẽn", - authTimeout: "Thời gian chờ Xác thực", - hb: "Nhịp tim", - }, - tun: { - addr: "Địa chỉ", - ifName: "Tên Giao diện", - }, - vless: { - flow: "Luồng", - udpEnc: "Mã hóa Gói UDP", - }, - vmess: { - security: "Bảo mật", - globalPadding: "Đệm Toàn cầu", - authLen: "Chiều dài Mã hóa", - }, - wg: { - privKey: "Khóa Riêng tư", - pubKey: "Khóa Công khai của Đối tác", - psk: "Khóa được Chia sẻ trước", - localIp: "IPs Cục bộ", - worker: "Công nhân", - ifName: "Tên Giao diện", - sysIf: "Giao diện Hệ thống", - options: "Tùy chọn Wireguard", - multiPeer: "Nhiều Đối tác", - allowedIp: "IPs được Phép", - peer: "Đối tác", - peers: "Đối tác", - }, - lb: { - defaultOut: "Đầu ra Mặc định", - interruptConn: "Ngắt kết nối hiện tại", - testUrl: "URL Kiểm tra", - interval: "Khoảng thời gian", - tolerance: "Sự dung hòa", - urlTestOptions: "Tùy chọn Kiểm tra URL", - } - }, - in: { - addr: "Địa chỉ", - port: "Cổng", - clients: "Kích hoạt khách hàng", - ssMethod: "Phương thức", - sSide: "Phía Máy chủ", - cSide: "Phía Khách hàng", - multiDomain: "Nhiều Tên miền", - remark: "Ghi chú", - mdOption: "Tùy chọn Nhiều Tên miền", - }, - listen: { - options: "Tùy chọn Nghe", - tcpOptions: "Tùy chọn TCP", - udpOptions: "Tùy chọn UDP", - detour: "Lạc đạo", - detourText: "Chuyển tiếp tới đầu vào", - domainStrategy: "Chiến lược Domain", - }, - dial: { - bindIf: "Ràng buộc tới Giao diện Mạng", - bindIp4: "Ràng buộc tới IPv4", - bindIp6: "Ràng buộc tới IPv6", - reuseAddr: "Sử dụng lại Địa chỉ Nghe", - connTimeout: "Thời gian Chờ Kết nối", - fbTimeout: "Thời gian Chờ Fallback", - options: "Tùy chọn Gọi", - detourText: "Chuyển tiếp tới thư đi", - }, - transport: { - enable: "Kích hoạt vận chuyển", - host: "Máy chủ", - hosts: "Máy chủ", - path: "Đường dẫn", - httpMethod: "Phương thức Yêu cầu", - idleTimeout: "Thời gian Chờ Chờ đợi", - pingTimeout: "Thời gian Chờ Ping", - grpcServiceName: "Tên Dịch vụ", - grpcPws: "Cho phép mà không Có Luồng", - }, - mux: { - enable: "Bật Multiplex", - maxConn: "Số kết nối Tối đa", - minStr: "Số Luồng Tối thiểu", - maxStr: "Số Luồng Tối đa", - padding: "Chỉ đệm", - enableBrutal: "Bật Brutal", - }, - out: { - addr: "Địa chỉ Máy chủ", - port: "Cổng Máy chủ", - }, - rule: { - add: "Thêm Quy tắc", - simple: "Đơn giản", - logical: "Logic", - mode: "Chế độ", - invert: "Nghịch đảo", - ipVer: "Phiên bản IP", - domain: "Tên miền", - domainSufix: "Hậu tố Miền", - domainKw: "Từ khóa Miền", - domainRgx: "Regex Miền", - ip: "CIDRs IP", - privateIp: "Dải IP Không hợp lệ", - port: "Cổng", - portRange: "Dải Cổng", - srcCidr: "CIDRs IP Nguồn", - srcPrivateIp: "IP Nguồn Không hợp lệ", - srcPort: "Cổng Nguồn", - srcPortRange: "Dải Cổng Nguồn", - ruleset: "Bộ quy tắc", - rulesetMatchSrc: "Bộ quy tắc IPcidr Phù hợp Nguồn", - options: "Tùy chọn Quy tắc", - domainRules: "Tên miền/IP", - srcIpRules: "IP Nguồn", - srcPortRules: "Cổng Nguồn", - udpDisableDomainUnmapping: "Không màm mạng tiền lập tên miền", - udpFallbackDelay: "Thời gian Chờ Fallback", - udpConnect: "Kết nối UDP", - udpTimeout: "Thời gian Chờ UDP", - method: "Phương pháp", - noDrop: "Không Tháp", - sniffer: "Kiểm tra Sniffer", - timeout: "Thời gian Chờ Sniffing", - strategy: "Chiến lệ", - }, - ruleset: { - add: "Thêm Bộ quy tắc", - format: "Định dạng Dữ liệu", - interval: "Khoảng cách Cập nhật", - remote: "Xa", - local: "Cục bộ", - }, - basic: { - log: { - title: "Nhật ký", - level: "Mức độ", - output: "Đầu ra", - timestamp: "Bật Dấu thời gian", - }, - dns: { - final: "Cuối cùng", - server: "Máy chủ", - firstServer: "Máy chủ Đầu tiên", - addrResolver: "Trình phân giải địa chỉ", - }, - routing: { - title: "Định tuyến", - defaultOut: "Ra ngoài Mặc định", - defaultIf: "NIC Mặc định", - defaultRm: "Đánh dấu Định tuyến Mặc định", - autoBind: "Tự động Ràng buộc NIC", - }, - exp: { - storeFakeIp: "Lưu IP Giả mạo", - }, - }, - tls : { - enable: "Kích hoạt TLS", - usePath: "Sử dụng đường dẫn", - useText: "Sử dụng văn bản", - certPath: "Đường dẫn tệp chứng chỉ", - keyPath: "Đường dẫn tệp khóa", - cert: "Chứng chỉ", - key: "Khóa", - options: "Tùy chọn TLS", - minVer: "Phiên bản Tối thiểu", - maxVer: "Phiên bản Tối đa", - cs: "Các bộ mã hóa", - privKey: "Khóa riêng", - pubKey: "Khóa Công khai", - disableSni: "Tắt SNI", - insecure: "Cho phép Không an toàn", - acme: { - options: "Tùy chọn ACME", - dataDir: "Thư mục Dữ liệu", - defaultDomain: "Tên miền Mặc định", - disableChallenges: "Vô hiệu hóa Thách thức", - httpChallenge: "Vô hiệu hóa Thách thức HTTP", - tlsChallenge: "Vô hiệu hóa Thách thức TLS", - altPorts: "Cổng Thay thế", - altHport: "Cổng HTTP Thay thế", - altTport: "Cổng TLS Thay thế", - caProvider: "Nhà cung cấp CA", - customCa: "Nhà cung cấp CA Tùy chỉnh", - extAcc: "Tài khoản Bên ngoài", - dns01: "Thách thức DNS01", - dns01Provider: "Nhà cung cấp Thách thức DNS01" - }, - }, - stats: { - upload: "Tải lên", - download: "Tải xuống", - volume: "Thể tích", - usage: "Sử dụng", - graphTitle: "Biểu đồ lưu lượng", - B: "B", - KB: "KB", - MB: "MB", - GB: "GB", - TB: "TB", - PB: "PB", - p: "ph", - Kp: "Kph", - Mp: "Mph", - Gb: "Gb", - bps: "bps", - Kbps: "Kbps", - Mbps: "Mbps", - }, - date: { - expiry: "Hết hạn", - expired: "Đã hết hạn", - d: "ng", - h: "g", - m: "p", - s: "s", - ms: "ms", - }, -} diff --git a/frontend/src/locales/zhcn.ts b/frontend/src/locales/zhcn.ts deleted file mode 100644 index e7926a6..0000000 --- a/frontend/src/locales/zhcn.ts +++ /dev/null @@ -1,434 +0,0 @@ -export default { - message: "欢迎", - success: "成功", - failed: "失败", - enable: "启用", - disable: "禁用", - none: "无", - all: "全部", - filter: "过滤器", - loading: "加载中...", - confirm: "是否确定?", - yes: "确认", - no: "取消", - unlimited: "无限", - remained: "剩余", - type: "类型", - protocol: "协议", - submit: "提交", - reset: "重置", - now: "当前", - network: "网络", - copyToClipboard: "复制到剪贴板", - noData: "无数据!", - invalidLogin: "登录无效!", - online: "在线", - version: "版本", - email: "电子邮件", - commaSeparated: "(逗号分隔)", - count: "计数", - template: "模板", - error: { - dplData: "重复数据", - core: "Sing-Box 错误", - }, - pages: { - login: "登录", - home: "主页", - inbounds: "入站管理", - outbounds: "出站管理", - endpoints: "节点管理", - clients: "用户管理", - rules: "路由列表", - tls: "TLS 设置", - basics: "基础信息", - admins: "管理员", - settings: "设置", - }, - main: { - tiles: "信息卡", - gauges: "仪表板", - charts: "图表", - infos: "信息", - gauge: { - cpu: "CPU 仪表", - mem: "RAM 仪表", - }, - chart: { - cpu: "CPU 监视器", - mem: "RAM 监视器", - net: "网络带宽", - pnet: "网络数据包", - }, - info: { - sys: "系统信息", - sbd: "运行信息", - host: "主机", - cpu: "CPU", - core: "核心", - uptime: "运行时间", - threads: "线程", - memory: "内存", - running: "运行状态" - }, - backup: { - title: "备份与恢复", - backup: "下载备份", - restore: "恢复", - exclStats: "排除图表数据", - exclChanges: "排除变更数据", - }, - }, - objects: { - inbound: "入站", - client: "客户端", - outbound: "出站", - endpoint: "节点", - config: "配置", - rule: "规则", - user: "用户", - tag: "标签", - listen: "监听", - dial: "拨号", - tls: "TLS", - multiplex: "多路复用", - transport: "传输", - headers: "标头", - key: "键", - value: "值", - }, - actions: { - action: "操作", - add: "添加", - addbulk: "批量添加", - new: "新建", - edit: "编辑", - del: "删除", - clone: "克隆", - save: "保存", - update: "更新", - submit: "提交", - set: "设置", - generate: "生成", - disable: "禁用", - close: "关闭", - restartApp: "重启面板", - restartSb: "重启 Singbox", - }, - login: { - title: "登录", - username: "用户名", - unRules: "用户名不能为空", - password: "密码", - pwRules: "密码不能为空", - }, - menu: { - logout: "退出登录", - }, - admin: { - changeCred: "更改凭据", - oldPass: "当前密码", - newUname: "新用户名", - newPass: "新密码", - lastLogin: "上次登录", - date: "日期", - time: "时间", - changes: "更改", - actor: "执行者", - key: "键", - action: "操作", - }, - setting: { - interface: "界面", - sub: "订阅", - addr: "地址", - port: "端口", - webPath: "面板路径", - domain: "域名", - sslKey: "SSL 密钥 (Key) 路径", - sslCert: "SSL 证书 (cert) 路径", - webUri: "面板 URI", - sessionAge: "会话超时时限", - trafficAge: "流量过期时限", - timeLoc: "时区", - subEncode: "启用 Base64 编码", - subInfo: "启用用户信息", - path: "默认路径", - update: "自动更新时间", - subUri: "订阅 URI", - jsonSub: "JSON 订阅", - toDirect: "路由到直连", - toBlock: "路由到阻止", - timestamp: "时间戳", - globalDns: "全局 DNS", - directDns: "直连 DNS", - toDirectDns: "路由到直连 DNS", - jsonSubOptions: "其他选项", - excludePkg: "排除包", - }, - client: { - name: "名称", - desc: "描述", - group: "组", - inboundTags: "入站标签", - basics: "基础", - config: "配置", - links: "链接", - external: "外部链接", - sub: "外部订阅", - }, - bulk: { - order: "排序", - random: "随机", - }, - types: { - un: "用户名", - pw: "密码", - direct: { - overrideAddr: "覆盖地址", - overridePort: "覆盖端口", - }, - hy: { - obfs: "混淆密码", - auth: "认证密码", - hyOptions: "Hysteria 选项", - hy2Options: "Hysteria2 选项", - ignoreBw: "忽略客户端带宽", - }, - shdwTls: { - hs: "握手服务器", - addHS: "添加握手服务器", - }, - ssh: { - passphrase: "密码短语", - hostKey: "主机密钥", - algorithm: "密钥算法", - clientVer: "客户端版本", - options: "SSH 选项", - }, - tor: { - execPath: "可执行文件路径", - dataDir: "数据目录", - extArgs: "额外参数", - }, - tuic: { - congControl: "拥塞控制", - authTimeout: "认证超时", - hb: "心跳包", - }, - tun: { - addr: "地址", - ifName: "接口名称", - }, - vless: { - flow: "流控", - udpEnc: "UDP 数据包编码", - }, - vmess: { - security: "安全性", - globalPadding: "全局填充", - authLen: "加密长度", - }, - wg: { - privKey: "私钥", - pubKey: "对等方公钥", - psk: "预共享密钥", - localIp: "本地 IP 地址", - worker: "工作线程", - ifName: "接口名称", - sysIf: "系统接口", - options: "WireGuard 选项", - multiPeer: "多对等体", - allowedIp: "允许的 IP 地址", - peer: "对等体", - peers: "对等体", - }, - lb: { - defaultOut: "默认出站", - interruptConn: "中断现有连接", - testUrl: "测试 URL", - interval: "间隔", - tolerance: "容错", - urlTestOptions: "URL 测试选项", - } - }, - in: { - addr: "地址", - port: "端口", - clients: "启用客户端", - ssMethod: "方法", - sSide: "服务器端", - cSide: "客户端", - multiDomain: "多域名", - remark: "备注", - mdOption: "多域名选项", - }, - listen: { - options: "监听选项", - tcpOptions: "TCP 选项", - udpOptions: "UDP 选项", - detour: "转发", - detourText: "转发到入站", - domainStrategy: "域名解析策略", - }, - dial: { - bindIf: "绑定到网络接口", - bindIp4: "绑定到 IPv4", - bindIp6: "绑定到 IPv6", - reuseAddr: "重用监听地址", - connTimeout: "连接超时", - fbTimeout: "回退超时", - options: "拨号选项", - detourText: "转发至出站", - }, - transport: { - enable: "启用传输", - host: "主机域名", - hosts: "主机域名列表", - path: "HTTP 请求路径", - httpMethod: "HTTP 请求方法", - idleTimeout: "空闲超时", - pingTimeout: "Ping 超时", - grpcServiceName: "gRPC 服务名称", - grpcPws: "允许无流时保持连接", - }, - mux: { - enable: "启用多路复用", - maxConn: "最大连接数", - minStr: "最小流数", - maxStr: "最大流数", - padding: "仅允许填充连接", - enableBrutal: "启用 TCP Brutal", - }, - out: { - addr: "服务器地址", - port: "服务器端口", - }, - rule: { - add: "添加规则", - simple: "简单", - logical: "逻辑", - mode: "模式", - invert: "反选结果", - ipVer: "IP 版本", - domain: "域名", - domainSufix: "域名后缀", - domainKw: "域名关键词", - domainRgx: "域名正则表达式", - ip: "IP CIDR", - privateIp: "匹配非公开 IP", - port: "端口", - portRange: "端口范围", - srcCidr: "源 IP CIDR", - srcPrivateIp: "匹配非公开源 IP", - srcPort: "源端口", - srcPortRange: "源端口范围", - ruleset: "规则集", - rulesetMatchSrc: "规则集 IP CIDR 匹配源 IP", - options: "规则选项", - domainRules: "域名/IP", - srcIpRules: "源 IP", - srcPortRules: "源端口", - udpDisableDomainUnmapping: "禁用域名解析映射", - udpConnect: "启用 UDP 连接", - udpTimeout: "UDP 超时", - method: "方法", - noDrop: "不丢弃", - sniffer: "嗅探", - timeout: "超时", - strategy: "策略", - }, - ruleset: { - add: "添加规则集", - format: "数据格式", - interval: "更新间隔", - remote: "远程", - local: "本地", - }, - basic: { - log: { - title: "日志", - level: "级别", - output: "输出", - timestamp: "启用时间戳", - }, - dns: { - final: "最终", - server: "服务器", - firstServer: "首选服务器", - addrResolver: "地址解析器", - }, - routing: { - title: "路由", - defaultOut: "默认出站", - defaultIf: "默认网卡", - defaultRm: "默认路由标记", - autoBind: "自动绑定网卡", - }, - exp: { - storeFakeIp: "持久化 Fake-IP", - }, - }, - tls : { - enable: "启用 TLS", - usePath: "使用外部路径", - useText: "使用文件内容", - certPath: "证书文件路径", - keyPath: "私钥文件路径", - cert: "证书文件内容", - key: "私钥文件内容", - options: "TLS 选项", - minVer: "最低版本", - maxVer: "最高版本", - cs: "密码套件", - privKey: "私钥", - pubKey: "公钥", - disableSni: "禁用 SNI", - insecure: "允许不安全", - acme: { - options: "ACME 选项", - dataDir: "数据目录", - defaultDomain: "默认域名", - disableChallenges: "禁用挑战", - httpChallenge: "禁用 HTTP 挑战", - tlsChallenge: "禁用 TLS 挑战", - altPorts: "替代端口", - altHport: "替代 HTTP 端口", - altTport: "替代 TLS 端口", - caProvider: "CA 提供商", - customCa: "自定义 CA 提供商", - extAcc: "外部账户", - dns01: "DNS01 挑战", - dns01Provider: "DNS01 挑战提供商" - }, - }, - stats: { - upload: "上传", - download: "下载", - volume: "流量", - usage: "已用", - graphTitle: "流量图表", - B: "B", - KB: "KB", - MB: "MB", - GB: "GB", - TB: "TB", - PB: "PB", - p: "p", - Kp: "Kp", - Mp: "Mp", - Gb: "Gb", - bps: "bps", - Kbps: "Kbps", - Mbps: "Mbps", - }, - date: { - expiry: "到期", - expired: "已到期", - d: "天", - h: "时", - m: "分", - s: "秒", - ms: "毫秒", - }, -} diff --git a/frontend/src/locales/zhtw.ts b/frontend/src/locales/zhtw.ts deleted file mode 100644 index 8b3903c..0000000 --- a/frontend/src/locales/zhtw.ts +++ /dev/null @@ -1,435 +0,0 @@ -export default { - open: "打開", - message: "歡迎", - success: "成功", - failed: "失敗", - enable: "啟用", - disable: "禁用", - none: "無", - all: "全部", - filter: "過濾器", - loading: "加載中...", - confirm: "是否確定?", - yes: "確認", - no: "取消", - unlimited: "無限", - remained: "剩余", - type: "類型", - protocol: "協定", - submit: "提交", - reset: "重置", - now: "當前", - network: "網絡", - copyToClipboard: "復製到剪貼板", - noData: "無數據!", - invalidLogin: "登錄無效!", - online: "在線", - version: "版本", - email: "電子郵件", - commaSeparated: "(逗號分隔)", - count: "計數", - template: "模板", - error: { - dplData: "重複數據", - core: "Sing-Box 錯誤", - }, - pages: { - login: "登錄", - home: "主頁", - inbounds: "入站管理", - outbounds: "出站管理", - endpoints: "端點管理", - clients: "用戶管理", - rules: "路由列表", - tls: "TLS 設置", - basics: "基礎信息", - admins: "管理員", - settings: "設置", - }, - main: { - tiles: "信息卡", - gauges: "儀表板", - charts: "圖表", - infos: "信息", - gauge: { - cpu: "CPU 儀表", - mem: "RAM 儀表", - }, - chart: { - cpu: "CPU 監視器", - mem: "RAM 監視器", - net: "網絡帶寬", - pnet: "網絡數據包", - }, - info: { - sys: "系統信息", - sbd: "運行信息", - host: "主機", - cpu: "CPU", - core: "核心", - uptime: "運行時間", - threads: "線程", - memory: "內存", - running: "運行狀態" - }, - backup: { - title: "備份與恢復", - backup: "下載備份", - restore: "恢復", - exclStats: "排除圖表記錄", - exclChanges: "排除更改記錄", - }, - }, - objects: { - inbound: "入站", - client: "客戶端", - outbound: "出站", - endpoint: "端點", - config: "配置", - rule: "規則", - user: "用戶", - tag: "標簽", - listen: "聽", - dial: "撥號", - tls: "TLS", - multiplex: "多路復用", - transport: "傳輸", - headers: "方法", - key: "鑰匙", - value: "價值", - }, - actions: { - action: "操作", - add: "添加", - addbulk: "批量添加", - new: "新建", - edit: "編輯", - del: "刪除", - clone: "克隆", - save: "保存", - update: "更新", - submit: "提交", - set: "設置", - generate: "生成", - disable: "禁用", - close: "關閉", - restartApp: "重啟面板", - restartSb: "重啟 Singbox", - }, - login: { - title: "登錄", - username: "用戶名", - unRules: "用戶名不能為空", - password: "密碼", - pwRules: "密碼不能為空", - }, - menu: { - logout: "退出登錄", - }, - admin: { - changeCred: "更改憑據", - oldPass: "當前密碼", - newUname: "新用戶名", - newPass: "新密碼", - lastLogin: "上次登入", - date: "日期", - time: "時間", - changes: "更改", - actor: "執行者", - key: "鍵", - action: "操作", - }, - setting: { - interface: "界面", - sub: "訂閱", - addr: "地址", - port: "端口", - webPath: "基本 URI", - domain: "域名", - sslKey: "SSL 密鑰 (Key) 路徑", - sslCert: "SSL 證書 (cert) 路徑", - webUri: "面板 URI", - sessionAge: "會話最大連接數", - trafficAge: "流量最大年齡", - timeLoc: "時區", - subEncode: "啟用編碼", - subInfo: "啟用用戶信息", - path: "默認路徑", - update: "自動更新時間", - subUri: "訂閱 URL", - jsonSub: "JSON 訂閱", - toDirect: "路由到直連", - toBlock: "路由到阻止", - timestamp: "時間戳", - globalDns: "全局 DNS", - directDns: "直連 DNS", - toDirectDns: "路由到直連 DNS", - jsonSubOptions: "其他選項", - excludePkg: "排除包", - }, - client: { - name: "名稱", - desc: "描述", - group: "組", - inboundTags: "入站標簽", - basics: "基礎", - config: "配置", - links: "鏈接", - external: "外部鏈接", - sub: "外部訂閱", - }, - bulk: { - order: "排序", - random: "隨機", - }, - types: { - un: "用戶名", - pw: "密碼", - direct: { - overrideAddr: "覆蓋地址", - overridePort: "覆蓋端口", - }, - hy: { - obfs: "混淆密碼", - auth: "驗證密碼", - hyOptions: "Hysteria 選項", - hy2Options: "Hysteria2 選項", - ignoreBw: "忽略客戶端帶寬", - }, - shdwTls: { - hs: "握手服務器", - addHS: "添加握手服務器", - }, - ssh: { - passphrase: "密語", - hostKey: "主機密鑰", - algorithm: "密鑰算法", - clientVer: "客戶端版本", - options: "SSH 選項", - }, - tor: { - execPath: "可執行文件路徑", - dataDir: "數據目錄", - extArgs: "額外參數", - }, - tuic: { - congControl: "擁塞控制", - authTimeout: "身份驗證超時", - hb: "心跳", - }, - tun: { - addr: "地址", - ifName: "介面名稱", - }, - vless: { - flow: "流量", - udpEnc: "UDP 封包編碼", - }, - vmess: { - security: "安全性", - globalPadding: "全局填充", - authLen: "加密長度", - }, - wg: { - privKey: "私鑰", - pubKey: "對等方公鑰", - psk: "預共享密鑰", - localIp: "本地 IP", - worker: "工作線程", - ifName: "介面名稱", - sysIf: "系統介面", - options: "Wireguard 選項", - multiPeer: "多對等方", - allowedIp: "允許的 IP", - peer: "對等方", - peers: "對等方", - }, - lb: { - defaultOut: "默認外部", - interruptConn: "中斷現有連接", - testUrl: "測試 URL", - interval: "間隔", - tolerance: "容忍度", - urlTestOptions: "URL 測試選項" - } - }, - in: { - addr: "地址", - port: "端口", - clients: "啟用客戶端", - ssMethod: "方法", - sSide: "服務器端", - cSide: "客戶端", - multiDomain: "多域名", - remark: "備註", - mdOption: "多域名選項", - }, - listen: { - options: "監聽選項", - tcpOptions: "TCP 選項", - udpOptions: "UDP 選項", - detour: "繞道", - detourText: "轉發到入站", - domainStrategy: "域名策略", - }, - dial: { - bindIf: "綁定到網路接口", - bindIp4: "綁定到 IPv4", - bindIp6: "綁定到 IPv6", - reuseAddr: "重用監聽地址", - connTimeout: "連接超時", - fbTimeout: "回退超時", - options: "撥號選項", - detourText: "轉寄至出站", - }, - transport: { - enable: "啟用傳輸", - host: "主機", - hosts: "主機列表", - path: "路徑", - httpMethod: "請求方法", - idleTimeout: "閒置超時", - pingTimeout: "Ping 超時", - grpcServiceName: "服務名稱", - grpcPws: "允許無流", - }, - mux: { - enable: "啟用多路徑", - maxConn: "最大連接數", - minStr: "最小串流數", - maxStr: "最大串流數", - padding: "僅填充", - enableBrutal: "啟用暴力", - }, - out: { - addr: "伺服器地址", - port: "伺服器端口", - }, - rule: { - add: "添加規則", - simple: "簡單", - logical: "邏輯", - mode: "模式", - invert: "反轉", - ipVer: "IP 版本", - domain: "域名", - domainSufix: "域名後綴", - domainKw: "域名關鍵詞", - domainRgx: "域名正則表達式", - ip: "IP CIDR", - privateIp: "無效 IP 範圍", - port: "端口", - portRange: "端口範圍", - srcCidr: "源 IP CIDR", - srcPrivateIp: "無效源 IP", - srcPort: "源端口", - srcPortRange: "源端口範圍", - ruleset: "規則集", - rulesetMatchSrc: "規則集 IP 範圍匹配源", - options: "規則選項", - domainRules: "域名/IP", - srcIpRules: "源 IP", - srcPortRules: "源端口", - udpDisableDomainUnmapping: "禁用域名解析映射", - udpConnect: "啟用 UDP 連接", - udpTimeout: "UDP 超時", - method: "方法", - noDrop: "不丟弃", - sniffer: "嗅探", - timeout: "超時", - strategy: "策略", - }, - ruleset: { - add: "添加規則集", - format: "數據格式", - interval: "更新間隔", - remote: "遠端", - local: "本地", - }, - basic: { - log: { - title: "日誌", - level: "級別", - output: "輸出", - timestamp: "啟用時間戳記", - }, - dns: { - final: "最終", - server: "服務器", - firstServer: "首選服務器", - addrResolver: "地址解析器", - }, - routing: { - title: "路由", - defaultOut: "默認外部", - defaultIf: "默認網卡", - defaultRm: "默認路由標記", - autoBind: "自動綁定網卡", - }, - exp: { - storeFakeIp: "存儲假 IP", - }, - }, - tls : { - enable: "啟用 TLS", - usePath: "使用外部路徑", - useText: "使用文件內容", - certPath: "證書文件路徑", - keyPath: "私鑰文件路徑", - cert: "證書文件內容", - key: "私鑰文件內容", - options: "TLS 選項", - minVer: "最低版本", - maxVer: "最高版本", - cs: "加密套件", - privKey: "私鑰", - pubKey: "公鑰", - disableSni: "停用 SNI", - insecure: "允許不安全連線", - acme: { - options: "ACME 選項", - dataDir: "數據目錄", - defaultDomain: "默認域名", - disableChallenges: "禁用挑戰", - httpChallenge: "禁用 HTTP 挑戰", - tlsChallenge: "禁用 TLS 挑戰", - altPorts: "替代端口", - altHport: "替代 HTTP 端口", - altTport: "替代 TLS 端口", - caProvider: "CA 提供商", - customCa: "自定義 CA 提供商", - extAcc: "外部賬戶", - dns01: "DNS01 挑戰", - dns01Provider: "DNS01 挑戰提供商" - }, - }, - stats: { - upload: "上傳", - download: "下載", - volume: "流量", - usage: "已用", - graphTitle: "流量圖表", - B: "B", - KB: "KB", - MB: "MB", - GB: "GB", - TB: "TB", - PB: "PB", - p: "p", - Kp: "Kp", - Mp: "Mp", - Gb: "Gb", - bps: "bps", - Kbps: "Kbps", - Mbps: "Mbps", - }, - date: { - expiry: "到期", - expired: "已到期", - d: "天", - h: "時", - m: "分", - s: "秒", - ms: "毫秒", - }, -} diff --git a/frontend/src/main.ts b/frontend/src/main.ts deleted file mode 100644 index 9af2edb..0000000 --- a/frontend/src/main.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * main.ts - * - * Bootstraps Vuetify and other plugins then mounts the App` - */ - -// Composables -import { createApp, ref } from 'vue' - -// Components -import App from './App.vue' - -// Use router -import router from './router' - -// Store -import store from './store' - -// Plugins -import { registerPlugins } from '@/plugins' - -// Locale -import { i18n } from '@/locales' -import Vue3PersianDatetimePicker from 'vue3-persian-datetime-picker' - -// Notivue -import { createNotivue } from 'notivue' -import 'notivue/notification.css' -import 'notivue/animations.css' -const notivue = createNotivue({ - position: 'bottom-center', - limit: 4, - enqueue: false, - avoidDuplicates: true, - notifications: { - global: { - duration: 3000 - } - }, -}) - -const loading = ref(false) - -const app = createApp(App) -app.provide('loading', loading) - -registerPlugins(app) - -app - .use(router) - .use(store) - .use(i18n) - .use(notivue) - .component('DatePicker', Vue3PersianDatetimePicker) - .mount('#app') diff --git a/frontend/src/plugins/api.ts b/frontend/src/plugins/api.ts deleted file mode 100644 index 8e562b3..0000000 --- a/frontend/src/plugins/api.ts +++ /dev/null @@ -1,57 +0,0 @@ -import axios from 'axios' - -axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8' -axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest' - -axios.defaults.baseURL = "./" -const pendingRequests = new Map() - -axios.interceptors.request.use( - (config) => { - // Generate a unique key for the request - const requestKey = `${config.method}:${config.url}` - - // Check if there is already a pending request with the same key - if (pendingRequests.has(requestKey)) { - const cancelSource = pendingRequests.get(requestKey) - cancelSource.cancel('Duplicate request cancelled') - } - - // Create a new cancel token for the request - const cancelSource = axios.CancelToken.source() - config.cancelToken = cancelSource.token - - // Store the cancel token in the pending requests map - pendingRequests.set(requestKey, cancelSource) - - if (config.data instanceof FormData) { - config.headers['Content-Type'] = 'multipart/form-data' - } - return config - }, - (error) => Promise.reject(error), -) - -axios.interceptors.response.use( - (response) => { - // Remove the request from the pending requests map - const requestKey = `${response.config.method}:${response.config.url}` - pendingRequests.delete(requestKey) - return response - }, - (error) => { - if (axios.isCancel(error)) { - // Handle duplicate request cancellation here if needed - console.warn(error.message) - } else { - // Remove the request from the pending requests map on error - const requestKey = `${error.config.method}:${error.config.url}` - pendingRequests.delete(requestKey) - } - return Promise.reject(error) - } -) - -const api = axios.create() - -export default api diff --git a/frontend/src/plugins/httputil.ts b/frontend/src/plugins/httputil.ts deleted file mode 100644 index a823c1c..0000000 --- a/frontend/src/plugins/httputil.ts +++ /dev/null @@ -1,88 +0,0 @@ -import api from './api' -import { i18n } from '@/locales' -import router from '@/router' -import { push } from 'notivue' - -export interface Msg { - success: boolean - msg: string - obj: any | null -} - -function _handleMsg(msg: any): void { - if (!isMsg(msg)) { - return - } - if(msg.msg){ - if (!msg.success && msg.msg == "Invalid login") { - push.error({ - title: i18n.global.t('invalidLogin'), - }) - logout() - return - } - if (msg.success) { - push.success({ - message: i18n.global.t('success') + ": " + i18n.global.t('actions.' + msg.msg), - }) - } else { - push.error({ - title: i18n.global.t('failed'), - message: msg.msg - }) - } - } -} - -export const logout = async () => { - const response = await HttpUtils.get('api/logout') - if(response.success){ - router.push('/login') - } -} - -function _respToMsg(resp: any): Msg { - const data = resp.data - if (data == null) { - return { success: true, msg: "", obj: null } - } else if (isMsg(data)) { - if (data.hasOwnProperty('success')) { - return { success: data.success, msg: data.msg, obj: data.obj || null } - } else { - return data - } - } else { - return { success: false, msg: `unknown data: ${data}`, obj: null } - } -} - -function isMsg(obj: any): obj is Msg { - return Object.hasOwn(obj,'success') && Object.hasOwn(obj,'msg') && Object.hasOwn(obj, 'obj') -} - -const HttpUtils = { - async get(url: string, data: object = {}, options: any[] = []): Promise { - let msg: Msg - try { - const resp = await api.get(url, { params: data, ...options }) - msg = _respToMsg(resp) - } catch (e: any) { - msg = { success: false, msg: e.toString(), obj: null } - } - _handleMsg(msg) - return msg - }, - async post(url: string, data: object | null, options: any = undefined): Promise { - let msg: Msg - try { - const resp = await api.post(url, data, options) - msg = _respToMsg(resp) - } catch (e: any) { - msg = { success: false, msg: e.toString(), obj: null } - } - _handleMsg(msg) - return msg - }, -} - -export default HttpUtils \ No newline at end of file diff --git a/frontend/src/plugins/index.ts b/frontend/src/plugins/index.ts deleted file mode 100644 index 9d76810..0000000 --- a/frontend/src/plugins/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Plugins -import vuetify from './vuetify' - -// Types -import type { App } from 'vue' - -export function registerPlugins (app: App) { - app - .use(vuetify) -} diff --git a/frontend/src/plugins/randomUtil.ts b/frontend/src/plugins/randomUtil.ts deleted file mode 100644 index f9da01f..0000000 --- a/frontend/src/plugins/randomUtil.ts +++ /dev/null @@ -1,49 +0,0 @@ -const seq = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('') - -const RandomUtil = { - randomIntRange(min: number, max: number): number { - return parseInt((Math.random() * (max - min) + min).toString(), 10) - }, - randomInt(n: number) { - return this.randomIntRange(0, n) - }, - randomSeq(count: number): string { - let str = '' - for (let i = 0; i < count; ++i) { - str += seq[this.randomInt(62)] - } - return str - }, - randomLowerAndNum(count: number): string { - let str = '' - for (let i = 0; i < count; ++i) { - str += seq[this.randomInt(36)] - } - return str - }, - randomUUID(): string { - let d = new Date().getTime() - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - let r = (d + Math.random() * 16) % 16 | 0 - d = Math.floor(d / 16) - return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16) - }) - }, - randomShadowsocksPassword(n: number): string { - const array = new Uint8Array(n) - window.crypto.getRandomValues(array) - return btoa(String.fromCharCode(...array)) - }, - randomShortId(): string[] { - let shortIds = new Array(24).fill('') - for (var ii = 1; ii < 24; ii++) { - for (var jj = 0; jj <= this.randomInt(7); jj++){ - let randomNum = this.randomInt(256) - shortIds[ii] += ('0' + randomNum.toString(16)).slice(-2) - } - } - return shortIds - } -} - -export default RandomUtil \ No newline at end of file diff --git a/frontend/src/plugins/utils.ts b/frontend/src/plugins/utils.ts deleted file mode 100644 index 8c109cd..0000000 --- a/frontend/src/plugins/utils.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { i18n } from "@/locales" - -type OBJ = { - [key: string]: any -} - -export const FindDiff = { - deepCompare(obj1: any, obj2: any): boolean { - // Check if the types of both objects are the same - if (typeof obj1 !== typeof obj2) { - return false - } - - // Check if both objects are arrays - if (Array.isArray(obj1) && Array.isArray(obj2)) { - if (obj1.length !== obj2.length) { - return false - } - - for (let i = 0; i < obj1.length; i++) { - if (!this.deepCompare(obj1[i], obj2[i])) { - return false - } - } - return true - } - - // Check if both objects are plain objects - if (typeof obj1 === 'object' && typeof obj2 === 'object' && obj1 !== null && obj2 !== null) { - const keys1 = Object.keys(obj1).filter(key => obj1[key] !== undefined) - const keys2 = Object.keys(obj2).filter(key => obj2[key] !== undefined) - - if (keys1.length !== keys2.length) { - return false - } - - for (const key of keys1) { - if (!keys2.includes(key) || !this.deepCompare(obj1[key], obj2[key])) { - return false - } - } - return true - } - - // Check primitive values - return obj1 === obj2 - } -} - -const ONE_KB = 1024 -const ONE_MB = ONE_KB * 1024 -const ONE_GB = ONE_MB * 1024 -const ONE_TB = ONE_GB * 1024 -const ONE_PB = ONE_TB * 1024 - -export const HumanReadable = { - sizeFormat(size:number, fix:number=2) { - if (!size || size<0) return "-" - if (size < ONE_KB) { - return size.toFixed(0) + " " + i18n.global.t('stats.B') - } else if (size < ONE_MB) { - return (size / ONE_KB).toFixed(fix) + " " + i18n.global.t('stats.KB') - } else if (size < ONE_GB) { - return (size / ONE_MB).toFixed(fix) + " " + i18n.global.t('stats.MB') - } else if (size < ONE_TB) { - return (size / ONE_GB).toFixed(fix) + " " + i18n.global.t('stats.GB') - } else if (size < ONE_PB) { - return (size / ONE_TB).toFixed(fix) + " " + i18n.global.t('stats.TB') - } else { - return (size / ONE_PB).toFixed(fix) + " " + i18n.global.t('stats.PB') - } - }, - packetFormat(size:number, fix:number=2) { - if (!size || size<0) return "-" - if (size < 1000) { - return size.toFixed(0) + " " + i18n.global.t('stats.p') - } else if (size < 1000000) { - return (size / 1000).toFixed(fix) + " " + i18n.global.t('stats.Kp') - } else if (size < 1000000000) { - return (size / 1000000).toFixed(fix) + " " + i18n.global.t('stats.Mp') - } else { - return (size / 1000000000).toFixed(fix) + " " + i18n.global.t('stats.Gp') - } - }, - formatSecond(second:number): string { - if (!second || second<0) return "-" - if (second < 60) { - return second.toFixed(0) + i18n.global.t('date.s') - } else if (second < 3600) { - return (second / 60).toFixed(0) + i18n.global.t('date.m') - } else if (second < 3600 * 24) { - return (second / 3600).toFixed(0) + i18n.global.t('date.h') - } - const day = Math.floor(second / 3600 / 24) - const remain = Math.floor((second/3600) - (day*24)) - return day + i18n.global.t('date.d') + (remain > 0 ? ' ' + remain + i18n.global.t('date.h') : '') - }, - remainedDays(exp:number): string { - if (exp == 0) return i18n.global.t('unlimited') - const now = Date.now()/1000 - if (exp < now) return i18n.global.t('date.expired') - return Math.floor((exp - now) / (3600*24)) + " " + i18n.global.t('date.d') - } -} \ No newline at end of file diff --git a/frontend/src/plugins/vuetify.ts b/frontend/src/plugins/vuetify.ts deleted file mode 100644 index 4bebe1d..0000000 --- a/frontend/src/plugins/vuetify.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * plugins/vuetify.ts - * - * Framework documentation: https://vuetifyjs.com` - */ - -// Styles -import '@mdi/font/css/materialdesignicons.css' -import 'vuetify/styles' - -import colors from 'vuetify/util/colors' -import { fa, en, vi, zhHans, zhHant, ru } from 'vuetify/locale' - -// Composables -import { createVuetify } from 'vuetify' - -// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides -export default createVuetify({ - defaults: { - VRow: { dense: true } // Apply dense to v-row as default - }, - theme: { - defaultTheme: localStorage.getItem('theme') ?? 'light', - themes: { - light: { - colors: { - primary: '#1867C0', - secondary: '#5CBBF6', - tertiary: '#E57373', - accent: '#005CAF', - error: colors.red.accent3, - warning: colors.amber.base, - info: colors.teal.darken1, - success: colors.green.base, - background: colors.grey.lighten4, - }, - }, - dark: { - colors: { - primary: colors.blue.darken4, - secondary: colors.grey.darken3, - accent: colors.pink.darken3, - error: colors.red.accent3, - warning: colors.amber.darken3, - info: colors.teal.lighten1, - success: colors.green.darken2, - surface: colors.grey.darken3, - background: colors.grey.darken4, - }, - }, - }, - }, - locale: { - locale: localStorage.getItem("locale") ?? 'en', - fallback: 'en', - messages: { en, fa, vi, zhHans, zhHant, ru }, - }, -}) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts deleted file mode 100644 index 56b6ac1..0000000 --- a/frontend/src/router/index.ts +++ /dev/null @@ -1,113 +0,0 @@ -// Composables -import { createRouter, createWebHistory } from 'vue-router' -import Login from '@/views/Login.vue' -import Data from '@/store/modules/data' - -const routes = [ - { - path: '/login', - name: 'pages.login', - component: Login, - }, - { - path: '/', - component: () => import('@/layouts/default/Default.vue'), - meta: { requiresAuth: true }, - children: [ - { - path: '/', - name: 'pages.home', - component: () => import('@/views/Home.vue'), - }, - { - path: '/inbounds', - name: 'pages.inbounds', - component: () => import('@/views/Inbounds.vue'), - }, - { - path: '/clients', - name: 'pages.clients', - component: () => import('@/views/Clients.vue'), - }, - { - path: '/outbounds', - name: 'pages.outbounds', - component: () => import('@/views/Outbounds.vue'), - }, - { - path: '/endpoints', - name: 'pages.endpoints', - component: () => import('@/views/Endpoints.vue'), - }, - { - path: '/rules', - name: 'pages.rules', - component: () => import('@/views/Rules.vue'), - }, - { - path: '/tls', - name: 'pages.tls', - component: () => import('@/views/Tls.vue'), - }, - { - path: '/basics', - name: 'pages.basics', - component: () => import('@/views/Basics.vue'), - }, - { - path: '/admins', - name: 'pages.admins', - component: () => import('@/views/Admins.vue'), - }, - { - path: '/settings', - name: 'pages.settings', - component: () => import('@/views/Settings.vue'), - }, - ], - }, -] - -const router = createRouter({ - history: createWebHistory((window as any).BASE_URL), - routes, -}) - -const DEFAULT_TITLE = 'S-UI' -let intervalId:any - -// Navigation guard to check authentication state -router.beforeEach((to, from, next) => { - // Check the session cookie - const sessionCookie = document.cookie.split(';').find(cookie => cookie.trim().startsWith('s-ui=')) - const isAuthenticated = !!sessionCookie - - // If the route requires authentication and the user is not authenticated, redirect to /login - if (to.meta.requiresAuth && !isAuthenticated) { - next('/login') - } else if (to.path === '/login' && isAuthenticated) { - // If already authenticated and visiting /route, redirect to '/' - next('/') - } else { - // Load default data - if(to.path != '/login'){ - loadDataInterval() - } else { - if (intervalId) { - clearInterval(intervalId) - intervalId = undefined - } - } - next() - } -}) - -const loadDataInterval = () => { - if (intervalId) return - Data().loadData() - intervalId = setInterval(() => { - Data().loadData() - }, 10000) -} - -export default router diff --git a/frontend/src/store/index.ts b/frontend/src/store/index.ts deleted file mode 100644 index e90ba41..0000000 --- a/frontend/src/store/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createPinia } from 'pinia' - -const pinia = createPinia() - -export default pinia \ No newline at end of file diff --git a/frontend/src/store/modules/data.ts b/frontend/src/store/modules/data.ts deleted file mode 100644 index 7fd93a6..0000000 --- a/frontend/src/store/modules/data.ts +++ /dev/null @@ -1,87 +0,0 @@ -import HttpUtils from '@/plugins/httputil' -import { defineStore } from 'pinia' -import { push } from 'notivue' -import { i18n } from '@/locales' -import { Inbound } from '@/types/inbounds' -import { Client } from '@/types/clients' - -const Data = defineStore('Data', { - state: () => ({ - lastLoad: 0, - reloadItems: localStorage.getItem("reloadItems")?.split(',')?? [], - subURI: "", - onlines: {inbound: [], outbound: [], user: []}, - config: {}, - inbounds: [], - outbounds: [], - endpoints: [], - clients: [], - tlsConfigs: [], - }), - actions: { - async loadData() { - const msg = await HttpUtils.get('api/load', this.lastLoad >0 ? {lu: this.lastLoad} : {} ) - if(msg.success) { - this.onlines = msg.obj.onlines - if (msg.obj.lastLog) { - push.error({ - title: i18n.global.t('error.core'), - duration: 5000, - message: msg.obj.lastLog - }) - } - - if (msg.obj.config) { - this.setNewData(msg.obj) - } - } - }, - setNewData(data: any) { - this.lastLoad = Math.floor((new Date()).getTime()/1000) - if (data.subURI) this.subURI = data.subURI - if (data.config) this.config = data.config - if (data.clients) this.clients = data.clients - if (data.inbounds) this.inbounds = data.inbounds - if (data.outbounds) this.outbounds = data.outbounds - if (data.endpoints) this.endpoints = data.endpoints - if (data.tls) this.tlsConfigs = data.tls - }, - async loadInbounds(ids: number[]): Promise { - const options = ids.length > 0 ? {id: ids.join(",")} : {} - const msg = await HttpUtils.get('api/inbounds', options) - if(msg.success) { - return msg.obj.inbounds - } - return [] - }, - async loadClients(id: number): Promise { - const options = id > 0 ? {id: id} : {} - const msg = await HttpUtils.get('api/clients', options) - if(msg.success) { - return msg.obj.clients[0]??{} - } - return {} - }, - async save (object: string, action: string, data: any, initUsers?: number[]): Promise { - let postData = { - object: object, - action: action, - data: JSON.stringify(data, null, 2), - initUsers: initUsers?.join(',') ?? undefined - } - const msg = await HttpUtils.post('api/save', postData) - if (msg.success) { - const objectName = ['tls', 'config'].includes(object) ? object : object.substring(0, object.length - 1) - push.success({ - title: i18n.global.t('success'), - duration: 5000, - message: i18n.global.t('actions.' + action) + " " + i18n.global.t('objects.' + objectName) - }) - this.setNewData(msg.obj) - } - return msg.success - } - } -}) - -export default Data \ No newline at end of file diff --git a/frontend/src/styles/settings.scss b/frontend/src/styles/settings.scss deleted file mode 100644 index 3b4d288..0000000 --- a/frontend/src/styles/settings.scss +++ /dev/null @@ -1,39 +0,0 @@ -/** - * src/styles/settings.scss - * - * Configures SASS variables and Vuetify overwrites - */ - -// https://vuetifyjs.com/features/sass-variables/` -// @use 'vuetify/settings' with ( -// $color-pack: false -// ); -@font-face { - font-display: swap; - font-family: 'Vazirmatn'; - font-style: normal; - font-weight: 400; - src: url('@/assets/Vazirmatn-UI-NL-Regular.woff2') format('woff2'); - unicode-range: U+0600-06FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE80-FEFC, U+0030-0039; -} -$body-font-family: "Vazirmatn"; - -$typoOptions: text-h1, text-sm-h1, text-md-h1, text-lg-h1, text-h2, text-sm-h2, - text-md-h2, text-lg-h2, text-h3, text-sm-h3, text-md-h3, text-lg-h3, text-h4, - text-sm-h4, text-md-h4, text-lg-h4, text-h5, text-sm-h5, text-md-h5, - text-lg-h5, text-h6, text-sm-h6, text-md-h6, text-lg-h6, headline, title, - subtitle-1, subtitle-2, text-body-1, text-sm-body-1, text-md-body-1, - text-lg-body-1, text-body-2, text-sm-body-2, text-md-body-2, text-lg-body-2, - text-caption; -body { - font-family: -apple-system, BlinkMacSystemFont, $body-font-family, sans-serif !important; - @each $typoOption in $typoOptions { - .#{$typoOption} { - font-family: -apple-system, BlinkMacSystemFont, $body-font-family, sans-serif !important; - } - } -} - -.v-btn { - letter-spacing: 0; -} \ No newline at end of file diff --git a/frontend/src/types/brutal.ts b/frontend/src/types/brutal.ts deleted file mode 100644 index f05f562..0000000 --- a/frontend/src/types/brutal.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface Brutal { - enabled: boolean - up_mbps: number - down_mbps: number -} \ No newline at end of file diff --git a/frontend/src/types/clients.ts b/frontend/src/types/clients.ts deleted file mode 100644 index 4da3391..0000000 --- a/frontend/src/types/clients.ts +++ /dev/null @@ -1,134 +0,0 @@ -import RandomUtil from "@/plugins/randomUtil" - -export interface Link { - type: "local" | "external" | "sub" - remark?: string - uri: string -} - -export interface Client { - id?: number - enable: boolean - name: string - config?: Config - inbounds: number[] - links?: Link[] - volume: number - expiry: number - up: number - down: number - desc: string - group: string -} - -const defaultClient: Client = { - enable: true, - name: "", - config: {}, - inbounds: [], - links: [], - volume: 0, - expiry: 0, - up: 0, - down: 0, - desc: "", - group: "", -} - -type Config = { - [key: string]: { - name?: string - username?: string - [key: string]: any - } -} - -export function updateConfigs(configs: Config, newUserName: string): Config { - - for (const key in configs) { - if (configs.hasOwnProperty(key)) { - const config = configs[key] - if (config.hasOwnProperty("name")) { - config.name = newUserName - } else if (config.hasOwnProperty("username")) { - config.username = newUserName - } - } - } - - return configs -} - -export function randomConfigs(user: string): Config { - const mixedPassword = RandomUtil.randomSeq(10) - const ssPassword16 = RandomUtil.randomShadowsocksPassword(16) - const ssPassword32 = RandomUtil.randomShadowsocksPassword(32) - const uuid = RandomUtil.randomUUID() - return { - mixed: { - username: user, - password: mixedPassword, - }, - socks: { - username: user, - password: mixedPassword, - }, - http: { - username: user, - password: mixedPassword, - }, - shadowsocks: { - name: user, - password: ssPassword32, - }, - shadowsocks16: { - name: user, - password: ssPassword16, - }, - shadowtls: { - name: user, - password: ssPassword32, - }, - vmess: { - name: user, - uuid: uuid, - alterId: 0, - }, - vless: { - name: user, - uuid: uuid, - flow: "xtls-rprx-vision", - }, - trojan: { - name: user, - password: mixedPassword, - }, - naive: { - username: user, - password: mixedPassword, - }, - hysteria: { - name: user, - auth_str: mixedPassword, - }, - tuic: { - name: user, - uuid: uuid, - password: mixedPassword, - }, - hysteria2: { - name: user, - password: mixedPassword, - }, - } -} - -export function createClient(json?: Partial): Client { - defaultClient.name = RandomUtil.randomSeq(8) - const defaultObject: Client = { ...defaultClient, ...(json || {}) } - - // Add missing config - defaultObject.config = { ...randomConfigs(defaultObject.name), ...defaultObject.config } - - return defaultObject -} diff --git a/frontend/src/types/config.ts b/frontend/src/types/config.ts deleted file mode 100644 index ce15038..0000000 --- a/frontend/src/types/config.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Inbound } from './inbounds' -import { Dial, Outbound } from './outbounds' - -interface Log { - disabled?: boolean - level?: string - output?: string - timestamp?: boolean -} - -interface Dns { - servers: DnsServer[] - final?: string - strategy?: string -} - -interface DnsServer{ - tag?: string, - address: string, - address_resolver?: string, - address_strategy?: string, - strategy?: string, - detour?: string -} - -export interface Ntp extends Dial{ - enabled?: boolean - server: string - server_port?: number - interval?: string -} - -interface Route { - rules: RouteRule[] | RouteRuleLogical[] - rule_set: RouteRuleSet[] - final?: string, - auto_detect_interface?: boolean - default_interface?: string - default_mark?: number -} - -interface RouteRule { - inbound?: string[] | string - ip_version?: 4 | 6, - network?: "tcp" | "udp" - auth_user?: string[] - protocol?: string[] | string - domain?: string[] | string - domain_suffix?: string[] | string - domain_keyword?: string[] | string - domain_regex?: string[] | string - source_ip_cidr?: string[] | string - source_ip_is_private?: boolean - ip_cidr?: string[] | string - ip_is_private?: boolean - source_port?: number[] | number - source_port_range?: string[] | string - port?: number[] | number - port_range?: string[] | string - clash_mode?: string - rule_set?: string[] | string - invert?: boolean - outbound: string -} - -interface RouteRuleLogical { - type: "logical" - mode: "and" | "or" - rules: RouteRule[] - invert?: boolean - outbound: string -} - -interface RouteRuleSet { - type: string - tag: string - format: string - path?: string - url?: string - download_detour?: string - update_interval?: string -} - -interface Experimental { - cache_file?: CacheFile -} - -interface CacheFile { - enabled?: boolean - path?: string - cache_id?: string - store_fakeip?: boolean -} - -export interface Config { - log: Log - dns: Dns - ntp?: Ntp - inbounds: Inbound[] - outbounds: Outbound[] - route: Route - experimental: Experimental -} \ No newline at end of file diff --git a/frontend/src/types/dial.ts b/frontend/src/types/dial.ts deleted file mode 100644 index 06a2670..0000000 --- a/frontend/src/types/dial.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface Dial { - detour?: string - bind_interface?: string - inet4_bind_address?: string - inet6_bind_address?:string - routing_mark?: number - reuse_addr?: boolean - connect_timeout?: string - tcp_fast_open?: boolean - tcp_multi_path?: boolean - udp_fragment?: boolean - domain_strategy?: string - fallback_delay?: string -} \ No newline at end of file diff --git a/frontend/src/types/endpoints.ts b/frontend/src/types/endpoints.ts deleted file mode 100644 index 6bcddfd..0000000 --- a/frontend/src/types/endpoints.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Dial } from "./outbounds" - -export const EpTypes = { - Wireguard: 'wireguard', - Warp: 'warp', -} - -type EpType = typeof EpTypes[keyof typeof EpTypes] - -interface EndpointBasics { - id: number - type: EpType - tag: string -} - -export interface WgPeer { - address: string - port: number - public_key: string - pre_shared_key?: string - allowed_ips?: string[] - persistent_keepalive_interval?: number - reserved?: number[] -} - -export interface WireGuard extends EndpointBasics, Dial { - system?: boolean - name?: string - mtu?: number - address: string[] - private_key: string - listen_port: number, - peers: WgPeer[] - udp_timeout?: string, - workers?: number -} - -export interface Warp extends WireGuard { - ext: any -} - -// Create interfaces dynamically based on EpTypes keys -type InterfaceMap = { - [Key in keyof typeof EpTypes]: { - type: string - [otherProperties: string]: any // You can add other properties as needed - } -} - -// Create union type from InterfaceMap -export type Endpoint = InterfaceMap[keyof InterfaceMap] - -// Create defaultValues object dynamically -const defaultValues: Record = { - wireguard: { type: EpTypes.Wireguard, address: ['10.0.0.2/32','fe80::2/128'], private_key: '', listen_port: 0, peers: [{ address: '', port: 0, public_key: ''}] }, - warp: { type: EpTypes.Warp, address: [], private_key: '', listen_port: 0, mtu: 1420, peers: [{ address: '', port: 0, public_key: ''}] }, -} - -export function createEndpoint(type: string,json?: Partial): Endpoint { - const defaultObject: Endpoint = { ...defaultValues[type], ...(json || {}) } - return defaultObject -} \ No newline at end of file diff --git a/frontend/src/types/inbounds.ts b/frontend/src/types/inbounds.ts deleted file mode 100644 index 50b6e0f..0000000 --- a/frontend/src/types/inbounds.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { iMultiplex } from "./multiplex" -import { iTls } from "./tls" -import { Dial } from "./outbounds" -import { Transport } from "./transport" - -export const InTypes = { - Direct: 'direct', - Mixed: 'mixed', - SOCKS: 'socks', - HTTP: 'http', - Shadowsocks: 'shadowsocks', - VMess: 'vmess', - Trojan: 'trojan', - Naive: 'naive', - Hysteria: 'hysteria', - ShadowTLS: 'shadowtls', - TUIC: 'tuic', - Hysteria2: 'hysteria2', - VLESS: 'vless', - Tun: 'tun', - Redirect: 'redirect', - TProxy: 'tproxy', -} - -type InType = typeof InTypes[keyof typeof InTypes] - -export interface Addr { - server: string - server_port: number - tls?: boolean - insecure?: boolean - server_name?: string - remark?: string -} - -export interface Listen { - listen: string - listen_port: number - tcp_fast_open?: boolean - tcp_multi_path?: boolean - udp_fragment?: boolean - udp_timeout?: string - detour?: string -} - -interface InboundBasics extends Listen { - id: number - type: InType - tag: string - tls_id: number - addrs?: Addr[] - out_json?: any -} - -interface ShadowTLSHandShake extends Dial { - server: string - server_port: number -} - -export interface Direct extends InboundBasics { - network?: "udp" | "tcp" - override_address?: string - override_port?: number -} -export interface Mixed extends InboundBasics {} -export interface SOCKS extends InboundBasics {} -export interface HTTP extends InboundBasics {} -export interface Shadowsocks extends InboundBasics { - method: string - password: string - network?: "udp" | "tcp" - multiplex?: iMultiplex -} -export interface VMess extends InboundBasics { - tls: iTls - multiplex?: iMultiplex - transport?: Transport -} -export interface Trojan extends InboundBasics { - tls: iTls - fallback?: { - server: string - server_port: number - } - multiplex?: iMultiplex - transport?: Transport -} -export interface Naive extends InboundBasics { - tls: iTls, -} -export interface Hysteria extends InboundBasics { - up_mbps: number - down_mbps: number - obfs?: string - recv_window_conn?: number - recv_window_client?: number - max_conn_client?: number - disable_mtu_discovery?: boolean -} -export interface ShadowTLS extends InboundBasics { - version: 1|2|3 - password?: string - handshake: ShadowTLSHandShake - handshake_for_server_name?: { - [server_name: string]: ShadowTLSHandShake - } - strict_mode?: boolean -} -export interface VLESS extends InboundBasics { - multiplex?: iMultiplex - transport?: Transport -} -export interface TUIC extends InboundBasics { - congestion_control: ""|"cubic"|"new_reno"|"bbr" - auth_timeout?: string - zero_rtt_handshake?: boolean - heartbeat?: string -} -export interface Hysteria2 extends InboundBasics { - up_mbps?: number - down_mbps?: number - obfs?: { - type?: "salamander" - password: string - } - ignore_client_bandwidth?: boolean - masquerade?: string | { - type: string - directory?: string - url?: string - rewrite_host?: boolean - status_code?: number - headers?: Headers[] - content?: string - } - brutal_debug?: boolean -} -export interface Tun extends InboundBasics { - interface_name?: string - address?: string[] - mtu?: number - endpoint_independent_nat?: boolean - udp_timeout?: string - stack?: string - auto_route?: boolean - // strict_route?: boolean - // iproute2_table_index?: number - // iproute2_rule_index?: number - // auto_redirect?: boolean - // auto_redirect_input_mark?: string - // auto_redirect_output_mark?: string - // route_address?: string[] - // route_exclude_address?: string[] - // include_interface?: string[] - // exclude_interface?: string[] - // include_uid?: string[] - // include_uid_range?: string[] - // exclude_uid?: number[] - // exclude_uid_range?: string[] - // include_android_user?: number[] - // include_package?: string[] - // exclude_package?: string[] -} -export interface Redirect extends InboundBasics {} -export interface TProxy extends InboundBasics { - network?: "udp" | "tcp" -} - -// Create interfaces dynamically based on InTypes keys -type InterfaceMap = { - direct: Direct - mixed: Mixed - socks: SOCKS - http: SOCKS - shadowsocks: Shadowsocks - vmess: VMess - trojan: Trojan - naive: Naive - hysteria: Hysteria - shadowtls: ShadowTLS - tuic: TUIC - hysteria2: Hysteria2 - vless: VLESS - tun: Tun - redirect: Redirect - tproxy: TProxy -} - -// Create union type from InterfaceMap -export type Inbound = InterfaceMap[keyof InterfaceMap] - -type userEnabledTypes = { - mixed: Mixed - socks: SOCKS - http: SOCKS - shadowsocks: Shadowsocks - vmess: VMess - trojan: Trojan - naive: Naive - hysteria: Hysteria - shadowtls: ShadowTLS - tuic: TUIC - hysteria2: Hysteria2 - vless: VLESS -} - -export const inboundWithUsers = ['mixed', 'socks', 'http', 'shadowsocks', 'vmess', 'trojan', 'naive', 'hysteria', 'shadowtls', 'tuic', 'hysteria2', 'vless'] - -// Create union type from userEnabledTypes -type InboundWithUser = userEnabledTypes[keyof userEnabledTypes] - -// Create defaultValues object dynamically -const defaultValues: Record = { - direct: { type: InTypes.Direct }, - mixed: { type: InTypes.Mixed }, - socks: { type: InTypes.SOCKS }, - http: { type: InTypes.HTTP, tls_id: 0 }, - shadowsocks: { type: InTypes.Shadowsocks, method: 'none', multiplex: {} }, - vmess: { type: InTypes.VMess, tls_id: 0, multiplex: {}, transport: {} }, - trojan: { type: InTypes.Trojan, tls_id: 0, multiplex: {}, transport: {} }, - naive: { type: InTypes.Naive, tls_id: 0 }, - hysteria: { type: InTypes.Hysteria, up_mbps: 100, down_mbps: 100, tls_id: 0 }, - shadowtls: { type: InTypes.ShadowTLS, version: 3, handshake: {}, handshake_for_server_name: {} }, - tuic: { type: InTypes.TUIC, congestion_control: "cubic", tls_id: 0 }, - hysteria2: { type: InTypes.Hysteria2, tls_id: 0 }, - vless: { type: InTypes.VLESS, tls_id: 0, multiplex: {}, transport: {} }, - tun: { type: InTypes.Tun, mtu: 9000, stack: 'system', udp_timeout: '5m', auto_route: false }, - redirect: { type: InTypes.Redirect }, - tproxy: { type: InTypes.TProxy }, -} - -export function createInbound(type: InType,json?: Partial): Inbound { - const defaultObject: Inbound = { ...defaultValues[type] ?? {}, ...(json ?? {}) } - return defaultObject -} \ No newline at end of file diff --git a/frontend/src/types/multiplex.ts b/frontend/src/types/multiplex.ts deleted file mode 100644 index 720daf8..0000000 --- a/frontend/src/types/multiplex.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Brutal } from "./brutal" - -export interface iMultiplex{ - enabled: boolean - padding?: boolean - brutal?: Brutal -} - -export interface oMultiplex extends iMultiplex{ - protocol?: "smux" | "yamux" | "h2mux" - max_connections?: number - min_streams?: number - max_streams?: number -} \ No newline at end of file diff --git a/frontend/src/types/outbounds.ts b/frontend/src/types/outbounds.ts deleted file mode 100644 index c211dd7..0000000 --- a/frontend/src/types/outbounds.ts +++ /dev/null @@ -1,255 +0,0 @@ -import { oTls } from "./tls" -import { oMultiplex } from "./multiplex" -import { Transport } from "./transport" - -export const OutTypes = { - Direct: 'direct', - SOCKS: 'socks', - HTTP: 'http', - Shadowsocks: 'shadowsocks', - VMess: 'vmess', - Trojan: 'trojan', - Hysteria: 'hysteria', - VLESS: 'vless', - ShadowTLS: 'shadowtls', - TUIC: 'tuic', - Hysteria2: 'hysteria2', - Tor: 'tor', - SSH: 'ssh', - Selector: 'selector', - URLTest: 'urltest', -} - -type OutType = typeof OutTypes[keyof typeof OutTypes] - -export interface Dial { - detour?: string - bind_interface?: string - inet4_bind_address?: string - inet6_bind_address?: string - routing_mark?: number - reuse_addr?: boolean - connect_timeout?: string - tcp_fast_open?: boolean - tcp_multi_path?: boolean - udp_fragment?: boolean - domain_strategy?: string - fallback_delay?: string -} - -interface OutboundBasics { - id: number - type: OutType - tag: string -} - -export interface WgPeer { - server: string - server_port: number - public_key: string - pre_shared_key?: string - allowed_ips?: string[] - reserved?: number[] -} - -export interface Direct extends OutboundBasics, Dial {} - -export interface SOCKS extends OutboundBasics, Dial { - server: string - server_port: number - version?: "4" | "4a" | "5" - username?: string - password?: string - network?: "udp" | "tcp" - udp_over_tcp?: false | { - enabled: true - version?: number - } -} - -export interface HTTP extends OutboundBasics, Dial { - server: string - server_port: number - username?: string - password?: string - path?: string - headers?: { - [key: string]: string - } - tls?: oTls -} - -export interface Shadowsocks extends OutboundBasics, Dial { - server: string - server_port: number - method: string - password: string - network?: "udp" | "tcp" - udp_over_tcp?: false | { - enabled: true - version?: number - } - multiplex?: oMultiplex -} - -export interface VMESS extends OutboundBasics, Dial { - server: string - server_port: number - uuid: string - security?: string - alter_id: 0 - global_padding?: boolean - authenticated_length?: boolean - network?: "udp" | "tcp" - packet_encoding?: string - tls?: oTls - multiplex?: oMultiplex - transport?: Transport -} - -export interface Trojan extends OutboundBasics, Dial { - server: string - server_port: number - password: string - network?: "udp" | "tcp" - tls?: oTls - multiplex?: oMultiplex - transport?: Transport -} - -export interface Hysteria extends OutboundBasics, Dial { - server: string - server_port: number - up_mbps: number - down_mbps: number - obfs?: string - auth_str?: string - recv_window_conn?: number - recv_window?: number - disable_mtu_discovery?: boolean - network?: "udp" | "tcp" - tls: oTls -} - -export interface ShadowTLS extends OutboundBasics, Dial { - server: string - server_port: number - version: 1|2|3 - password?: string - tls: oTls -} - -export interface VLESS extends OutboundBasics, Dial { - server: string - server_port: number - uuid: string - flow?: string - network?: "udp" | "tcp" - packet_encoding?: string - tls?: oTls - multiplex?: oMultiplex - transport?: Transport -} - -export interface TUIC extends OutboundBasics, Dial { - server: string - server_port: number - uuid: string - password?: string - congestion_control?: "cubic"|"new_reno"|"bbr" - udp_relay_mode?: "native" | "quic" - udp_over_stream?: boolean - zero_rtt_handshake?: boolean - heartbeat?: string - network?: "udp" | "tcp" - tls: oTls -} - -export interface Hysteria2 extends OutboundBasics, Dial { - server: string - server_port: number - server_ports?: string[] - hop_interval: string - up_mbps?: number - down_mbps?: number - obfs?: { - type?: "salamander" - password: string - } - password?: string - network?: "udp" | "tcp" - tls: oTls - brutal_debug?: boolean -} - -export interface Tor extends OutboundBasics, Dial { - executable_path?: string - extra_args?: string[] - data_directory: string - torrc?: { - ClientOnly: 0 | 1 - } -} - -export interface SSH extends OutboundBasics, Dial { - server: string - server_port?: number - user?: string - password?: string - private_key?: string - private_key_path?: string - private_key_passphrase?: string - host_key?: string[] - host_key_algorithms?: string[] - client_version?: string -} - -export interface Selector extends OutboundBasics { - outbounds: string[] - url?: string - interval?: string - tolerance?: number - idle_timeout?: string - interrupt_exist_connections?: boolean -} - -export interface URLTest extends OutboundBasics { - outbounds: string[] - default?: string - interrupt_exist_connections?: boolean -} - -// Create interfaces dynamically based on OutTypes keys -type InterfaceMap = { - [Key in keyof typeof OutTypes]: { - type: string - [otherProperties: string]: any // You can add other properties as needed - } -} - -// Create union type from InterfaceMap -export type Outbound = InterfaceMap[keyof InterfaceMap] - -// Create defaultValues object dynamically -const defaultValues: Record = { - direct: { type: OutTypes.Direct }, - socks: { type: OutTypes.SOCKS, version: "5" }, - http: { type: OutTypes.HTTP, tls: {} }, - shadowsocks: { type: OutTypes.Shadowsocks, method: 'none', multiplex: {} }, - vmess: { type: OutTypes.VMess, tls: {}, multiplex: {}, transport: {}, security: 'auto', global_padding: false }, - trojan: { type: OutTypes.Trojan, tls: {}, multiplex: {}, transport: {} }, - hysteria: { type: OutTypes.Hysteria, up_mbps: 100, down_mbps: 100, tls: { enabled: true } }, - shadowtls: { type: OutTypes.ShadowTLS, version: 3, tls: { enabled: true } }, - vless: { type: OutTypes.VLESS, tls: {}, multiplex: {}, transport: {} }, - tuic: { type: OutTypes.TUIC, congestion_control: 'cubic', tls: { enabled: true } }, - hysteria2: { type: OutTypes.Hysteria2, tls: { enabled: true } }, - tor: { type: OutTypes.Tor, executable_path: './tor', data_directory: '$HOME/.cache/tor', torrc: { ClientOnly: 1 } }, - ssh: { type: OutTypes.SSH }, - selector: { type: OutTypes.Selector }, - urltest: { type: OutTypes.URLTest }, -} - -export function createOutbound(type: string,json?: Partial): Outbound { - const defaultObject: Outbound = { ...defaultValues[type], ...(json || {}) } - return defaultObject -} \ No newline at end of file diff --git a/frontend/src/types/rules.ts b/frontend/src/types/rules.ts deleted file mode 100644 index ce9e4e3..0000000 --- a/frontend/src/types/rules.ts +++ /dev/null @@ -1,76 +0,0 @@ -interface generalRule { - invert: boolean - action: 'route' | 'route-options' | 'reject' | 'hijack-dns' | 'sniff' | 'resolve' - outbound?: string - override_address?: string - override_port?: number - udp_disable_domain_unmapping?: boolean - udp_connect?: boolean - udp_timeout?: string - method?: string - no_drop?: boolean - sniffer: string[] - timeout: string - strategy: string - server: string -} - -export const actionKeys = [ - 'invert', - 'action', - 'outbound', - 'override_address', - 'override_port', - 'udp_disable_domain_unmapping', - 'udp_connect', - 'udp_timeout', - 'method', - 'no_drop', - 'sniffer', - 'timeout', - 'strategy', - 'server' -] -export interface logicalRule extends generalRule { - type: 'logical' | 'simple' - mode: 'and' | 'or' - rules: rule[] -} - -export interface rule extends generalRule { - inbound?: string[] - ip_version?: 4 | 6 - network?: string[] - auth_user?: string[] - protocol?: string[] - domain?: string[] - domain_suffix?: string[] - domain_keyword?: string[] - domain_regex?: string[] - source_ip_cidr?: string[] - source_ip_is_private?: boolean - ip_cidr?: string[] - ip_is_private?: boolean - source_port?: number[] - source_port_range?: string[] - port?: number[] - port_range?: string[] - process_name?: string[] - process_path?: string[] - package_name?: string[] - user?: string[] - user_id?: number[] - clash_mode?: string - rule_set?: string[] - rule_set_ipcidr_match_source?: boolean -} - -export interface ruleset { - type: 'local' | 'remote' - tag: string - format: 'source' | 'binary' - path?: string - url?: string - download_detour?: string - update_interval?: string -} \ No newline at end of file diff --git a/frontend/src/types/tls.ts b/frontend/src/types/tls.ts deleted file mode 100644 index 4b4af2f..0000000 --- a/frontend/src/types/tls.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Dial } from "./dial" - -export interface tls { - id: number - name: string - server: iTls - client: oTls -} - -export interface iTls { - enabled?: boolean - server_name?: string - alpn?: string[] - min_version?: string - max_version?: string - cipher_suites?: string[] - certificate?: string[] - certificate_path?: string - key?: string[] - key_path?: string - acme?: acme - ech?: ech - reality?: reality -} - -export interface acme { - domain: string[] - data_directory?: string - default_server_name?: string - email?: string - provider?: string - disable_http_challenge?: boolean - disable_tls_alpn_challenge?: boolean - alternative_http_port?: number - alternative_tls_port?: number - external_account?: { - key_id: string - mac_key: string - } - dns01_challenge?: { - provider: string - [key: string]: string - } -} - -export interface ech { - enabled: boolean - pq_signature_schemes_enabled?: boolean - dynamic_record_sizing_disabled?: boolean - key?: string[] - key_path?: string -} - -interface realityHanshake extends Dial { - server: string - server_port: number -} - -export interface reality { - enabled: boolean - handshake: realityHanshake - private_key: string - short_id: string[] - max_time_difference?: string -} - -export const defaultInTls: iTls = { - alpn: ['h3', 'h2', 'http/1.1'], - min_version: "1.2", - max_version: "1.3", - cipher_suites: [], -} - -export interface oTls { - enabled?: boolean - disable_sni?: boolean - server_name?: string - insecure?: boolean - alpn?: string[] - min_version?: string - max_version?: string - cipher_suites?: string[] - certificate?: string - certificate_path?: string - ech?: { - enabled: boolean - pq_signature_schemes_enabled?: boolean - dynamic_record_sizing_disabled?: boolean - config?: string[], - config_path?: string - }, - utls?: { - enabled: boolean - fingerprint: string - }, - reality?: { - enabled: boolean - public_key: string - short_id: string - } -} - -export const defaultOutTls: oTls = { - alpn: ['h3', 'h2', 'http/1.1'], - min_version: "1.2", - max_version: "1.3", - cipher_suites: [], - utls: { - enabled: true, - fingerprint: "chrome", - }, - reality: { - enabled: true, - public_key: "", - short_id: "", - }, - ech: { - enabled: true, - pq_signature_schemes_enabled: false, - dynamic_record_sizing_disabled: false, - config_path: "", - } -} \ No newline at end of file diff --git a/frontend/src/types/transport.ts b/frontend/src/types/transport.ts deleted file mode 100644 index 7805c66..0000000 --- a/frontend/src/types/transport.ts +++ /dev/null @@ -1,48 +0,0 @@ -export const TrspTypes = { - HTTP: 'http', - WebSocket: 'ws', - QUIC: 'quic', - gRPC: 'grpc', - HTTPUpgrade: "httpupgrade" -} - -export type TrspType = typeof TrspTypes[keyof typeof TrspTypes] - -export type Transport = HTTP|WebSocket|QUIC|gRPC|HTTPUpgrade - -interface TransportBasics { - type: TrspType -} - -export interface HTTP extends TransportBasics { - host?: string[] - path?: string - method?: string - headers?: {} - idle_timeout?: string - ping_timeout?: string -} - -export interface WebSocket extends TransportBasics { - path: string - headers?: { - Host: string - } - max_early_data?: number - early_data_header_name?: string -} - -export interface QUIC extends TransportBasics {} - -export interface gRPC extends TransportBasics { - service_name?: string - idle_timeout?: string - ping_timeout?: string - permit_without_stream?: boolean -} - -export interface HTTPUpgrade extends TransportBasics { - host?: string - path?: string - headers?: {} -} diff --git a/frontend/src/views/Admins.vue b/frontend/src/views/Admins.vue deleted file mode 100644 index 702970e..0000000 --- a/frontend/src/views/Admins.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Basics.vue b/frontend/src/views/Basics.vue deleted file mode 100644 index b1d4d45..0000000 --- a/frontend/src/views/Basics.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Clients.vue b/frontend/src/views/Clients.vue deleted file mode 100644 index 4d5d0ae..0000000 --- a/frontend/src/views/Clients.vue +++ /dev/null @@ -1,420 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/src/views/Endpoints.vue b/frontend/src/views/Endpoints.vue deleted file mode 100644 index a271231..0000000 --- a/frontend/src/views/Endpoints.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue deleted file mode 100644 index 365ad93..0000000 --- a/frontend/src/views/Home.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/frontend/src/views/Inbounds.vue b/frontend/src/views/Inbounds.vue deleted file mode 100644 index 1f83a84..0000000 --- a/frontend/src/views/Inbounds.vue +++ /dev/null @@ -1,191 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue deleted file mode 100644 index 87e0c39..0000000 --- a/frontend/src/views/Login.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - \ No newline at end of file diff --git a/frontend/src/views/Outbounds.vue b/frontend/src/views/Outbounds.vue deleted file mode 100644 index c5674d9..0000000 --- a/frontend/src/views/Outbounds.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Rules.vue b/frontend/src/views/Rules.vue deleted file mode 100644 index d760a0b..0000000 --- a/frontend/src/views/Rules.vue +++ /dev/null @@ -1,309 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue deleted file mode 100644 index 3e1443c..0000000 --- a/frontend/src/views/Settings.vue +++ /dev/null @@ -1,295 +0,0 @@ - - - diff --git a/frontend/src/views/Tls.vue b/frontend/src/views/Tls.vue deleted file mode 100644 index ec373b1..0000000 --- a/frontend/src/views/Tls.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts deleted file mode 100644 index 323c78a..0000000 --- a/frontend/src/vite-env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// - -declare module '*.vue' { - import type { DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json deleted file mode 100644 index e57bb25..0000000 --- a/frontend/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "jsx": "preserve", - "resolveJsonModule": true, - "isolatedModules": true, - "esModuleInterop": true, - "lib": ["ESNext", "DOM"], - "skipLibCheck": true, - "noEmit": true, - "paths": { - "@/*": [ - "src/*" - ] - } - }, - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], - "references": [{ "path": "./tsconfig.node.json" }], - "exclude": ["node_modules"], -} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json deleted file mode 100644 index 2634672..0000000 --- a/frontend/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.mts"], - "exclude": [] -} diff --git a/frontend/vite.config.mts b/frontend/vite.config.mts deleted file mode 100644 index 3165ca1..0000000 --- a/frontend/vite.config.mts +++ /dev/null @@ -1,63 +0,0 @@ -// Plugins -import vue from '@vitejs/plugin-vue' -import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' - -// Utilities -import { defineConfig } from 'vite' -import { fileURLToPath, URL } from 'node:url' -import { randomBytes } from 'crypto'; - -function getUniqueFileName(template) { - if (template.includes('.js') || template.includes('.css')) { - const hash = randomBytes(8).toString('hex'); - return template.replace('[name]', hash); - } - return template; -} - -export default defineConfig({ - base: '', - plugins: [ - vue({ - template: { transformAssetUrls }, - }), - vuetify({ - autoImport: true, - styles: { - configFile: 'src/styles/settings.scss', - }, - }) - ], - build: { - manifest: false, - outDir: 'dist', - chunkSizeWarningLimit: 1600, - rollupOptions: { - output: { - inlineDynamicImports: true, - entryFileNames: getUniqueFileName('assets/[name].js'), - chunkFileNames: getUniqueFileName('assets/[name].js'), - assetFileNames: (assetInfo) => { - if (assetInfo.name == "index.css") return getUniqueFileName('assets/[name].css'); - return 'assets/' + assetInfo.name; - }, - }, - } - }, - define: { 'process.env': {} }, - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)), - }, - extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue'], - }, - server: { - port: 3000, - proxy: { - '/app/api': { - target: 'http://localhost:2095', - changeOrigin: true, - }, - }, - } -}) diff --git a/backend/go.mod b/go.mod similarity index 99% rename from backend/go.mod rename to go.mod index efae577..b935fc1 100644 --- a/backend/go.mod +++ b/go.mod @@ -8,18 +8,13 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/robfig/cron/v3 v3.0.1 github.com/sagernet/sing v0.6.0-beta.12 - github.com/sagernet/sing-box v1.11.0-beta.24 + github.com/sagernet/sing-box v1.11.0-rc.1 github.com/sagernet/sing-dns v0.4.0-beta.2 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 gorm.io/driver/sqlite v1.5.7 gorm.io/gorm v1.25.12 ) -require ( - github.com/ebitengine/purego v0.8.1 // indirect - google.golang.org/grpc v1.67.1 // indirect -) - require ( github.com/ajg/form v1.5.1 // indirect github.com/andybalholm/brotli v1.0.6 // indirect @@ -30,6 +25,7 @@ require ( github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/iasm v0.2.0 // indirect github.com/cretz/bine v0.2.0 // indirect + github.com/ebitengine/purego v0.8.1 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gin-contrib/sessions v1.0.1 @@ -123,6 +119,7 @@ require ( golang.org/x/tools v0.24.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.67.1 // indirect google.golang.org/protobuf v1.35.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.3.0 // indirect diff --git a/backend/go.sum b/go.sum similarity index 97% rename from backend/go.sum rename to go.sum index 15d3f4b..12932e1 100644 --- a/backend/go.sum +++ b/go.sum @@ -170,14 +170,10 @@ github.com/sagernet/quic-go v0.48.2-beta.1/go.mod h1:1WgdDIVD1Gybp40JTWketeSfKA/ github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= -github.com/sagernet/sing v0.6.0-beta.11 h1:jWCNlZI1Vdj8lQeBrjRZIQfNwlqMk0ZRqMJuPfTJupI= -github.com/sagernet/sing v0.6.0-beta.11/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= github.com/sagernet/sing v0.6.0-beta.12 h1:2DnTJcvypK3/PM/8JjmgG8wVK48gdcpRwU98c4J/a7s= github.com/sagernet/sing v0.6.0-beta.12/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= -github.com/sagernet/sing-box v1.11.0-beta.22 h1:UQrhqbUyJUZ1GvT3yNu4ANdZC8s1YdgN92jtvPd559g= -github.com/sagernet/sing-box v1.11.0-beta.22/go.mod h1:CYFqT0KvhmGhs3hp6htI8x6DugWZgdiAde+Fyufxmek= -github.com/sagernet/sing-box v1.11.0-beta.24 h1:6rUl8t6Cb0p9ML1eUobWgODL75c5iszxNvVABcWCivU= -github.com/sagernet/sing-box v1.11.0-beta.24/go.mod h1:DmL1WKyrfaAEu5z88CtUeQBfELaEdUyQzLS5nzmRg8o= +github.com/sagernet/sing-box v1.11.0-rc.1 h1:iJbMP+dcKOEbvjv0rBXkFndmJQCPAACrYmanYPPuIgk= +github.com/sagernet/sing-box v1.11.0-rc.1/go.mod h1:DmL1WKyrfaAEu5z88CtUeQBfELaEdUyQzLS5nzmRg8o= github.com/sagernet/sing-dns v0.4.0-beta.2 h1:HW94bUEp7K/vf5DlYz646LTZevQtJ0250jZa/UZRlbY= github.com/sagernet/sing-dns v0.4.0-beta.2/go.mod h1:8wuFcoFkWM4vJuQyg8e97LyvDwe0/Vl7G839WLcKDs8= github.com/sagernet/sing-mux v0.3.0-alpha.1 h1:IgNX5bJBpL41gGbp05pdDOvh/b5eUQ6cv9240+Ngipg= diff --git a/backend/logger/logger.go b/logger/logger.go similarity index 100% rename from backend/logger/logger.go rename to logger/logger.go diff --git a/backend/main.go b/main.go similarity index 100% rename from backend/main.go rename to main.go diff --git a/backend/middleware/domainValidator.go b/middleware/domainValidator.go similarity index 100% rename from backend/middleware/domainValidator.go rename to middleware/domainValidator.go diff --git a/backend/network/auto_https_conn.go b/network/auto_https_conn.go similarity index 100% rename from backend/network/auto_https_conn.go rename to network/auto_https_conn.go diff --git a/backend/network/auto_https_listener.go b/network/auto_https_listener.go similarity index 100% rename from backend/network/auto_https_listener.go rename to network/auto_https_listener.go diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0cfbd30 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "s-ui", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/backend/service/client.go b/service/client.go similarity index 100% rename from backend/service/client.go rename to service/client.go diff --git a/backend/service/config.go b/service/config.go similarity index 100% rename from backend/service/config.go rename to service/config.go diff --git a/backend/service/endpoints.go b/service/endpoints.go similarity index 100% rename from backend/service/endpoints.go rename to service/endpoints.go diff --git a/backend/service/inbounds.go b/service/inbounds.go similarity index 100% rename from backend/service/inbounds.go rename to service/inbounds.go diff --git a/backend/service/outbounds.go b/service/outbounds.go similarity index 100% rename from backend/service/outbounds.go rename to service/outbounds.go diff --git a/backend/service/panel.go b/service/panel.go similarity index 100% rename from backend/service/panel.go rename to service/panel.go diff --git a/backend/service/server.go b/service/server.go similarity index 100% rename from backend/service/server.go rename to service/server.go diff --git a/backend/service/setting.go b/service/setting.go similarity index 100% rename from backend/service/setting.go rename to service/setting.go diff --git a/backend/service/stats.go b/service/stats.go similarity index 100% rename from backend/service/stats.go rename to service/stats.go diff --git a/backend/service/tls.go b/service/tls.go similarity index 100% rename from backend/service/tls.go rename to service/tls.go diff --git a/backend/service/user.go b/service/user.go similarity index 100% rename from backend/service/user.go rename to service/user.go diff --git a/backend/service/warp.go b/service/warp.go similarity index 100% rename from backend/service/warp.go rename to service/warp.go diff --git a/backend/sub/jsonService.go b/sub/jsonService.go similarity index 100% rename from backend/sub/jsonService.go rename to sub/jsonService.go diff --git a/backend/sub/linkService.go b/sub/linkService.go similarity index 100% rename from backend/sub/linkService.go rename to sub/linkService.go diff --git a/backend/sub/sub.go b/sub/sub.go similarity index 100% rename from backend/sub/sub.go rename to sub/sub.go diff --git a/backend/sub/subHandler.go b/sub/subHandler.go similarity index 100% rename from backend/sub/subHandler.go rename to sub/subHandler.go diff --git a/backend/sub/subService.go b/sub/subService.go similarity index 100% rename from backend/sub/subService.go rename to sub/subService.go diff --git a/backend/util/base64.go b/util/base64.go similarity index 100% rename from backend/util/base64.go rename to util/base64.go diff --git a/backend/util/common/err.go b/util/common/err.go similarity index 100% rename from backend/util/common/err.go rename to util/common/err.go diff --git a/backend/util/common/random.go b/util/common/random.go similarity index 100% rename from backend/util/common/random.go rename to util/common/random.go diff --git a/backend/util/genLink.go b/util/genLink.go similarity index 100% rename from backend/util/genLink.go rename to util/genLink.go diff --git a/backend/util/linkToJson.go b/util/linkToJson.go similarity index 100% rename from backend/util/linkToJson.go rename to util/linkToJson.go diff --git a/backend/util/outJson.go b/util/outJson.go similarity index 100% rename from backend/util/outJson.go rename to util/outJson.go diff --git a/backend/web/web.go b/web/web.go similarity index 100% rename from backend/web/web.go rename to web/web.go